1+ /*
2+ * Copyright 2021 Xilinx, Inc.
3+ *
4+ * Licensed under the Apache License, Version 2.0 (the "License");
5+ * you may not use this file except in compliance with the License.
6+ * You may obtain a copy of the License at
7+ *
8+ * http://www.apache.org/licenses/LICENSE-2.0
9+ *
10+ * Unless required by applicable law or agreed to in writing, software
11+ * distributed under the License is distributed on an "AS IS" BASIS,
12+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+ * See the License for the specific language governing permissions and
14+ * limitations under the License.
15+ */
16+
17+ #ifndef __XF_PIXELWISE_SELECT_
18+ #define __XF_PIXELWISE_SELECT_
19+
20+ #include < adf.h>
21+ #include < algorithm>
22+ #include < aie_api/utils.hpp>
23+ #include < aie_api/aie.hpp>
24+
25+ #include < common/xf_aie_hw_utils.hpp>
26+
27+ namespace xf {
28+ namespace cv {
29+ namespace aie {
30+
31+ class PixelwiseSelect {
32+ public:
33+ void runImpl (adf::input_buffer<uint8_t >& frame,
34+ adf::input_buffer<uint8_t >& mask,
35+ adf::output_buffer<uint8_t >& output);
36+ void runImpl (adf::input_buffer<uint8_t >& in_frame,
37+ adf::input_buffer<uint8_t >& mask,
38+ adf::input_buffer<uint8_t >& bg_frame,
39+ adf::output_buffer<uint8_t >& output);
40+ void xf_pixel_wise_select (uint8_t * frame, uint8_t * mask, int16 height, int16 width, uint8_t * output);
41+ void xf_pixel_wise_select (
42+ uint8_t * in_frame, uint8_t * mask, uint8_t * bg_frame, int16 height, int16 width, uint8_t * output);
43+ };
44+
45+ __attribute__ ((noinline)) void PixelwiseSelect::xf_pixel_wise_select (
46+ uint8_t * frame, uint8_t * mask, int16 height, int16 width, uint8_t * output) {
47+ const int16 image_width = width;
48+ const int16 image_height = height;
49+
50+ uint8_t * restrict _frame = (uint8_t *)(frame);
51+ uint8_t * restrict _mask = (uint8_t *)(mask);
52+ uint8_t * restrict _output = (uint8_t *)(output);
53+ int16_t num_vectors = image_width >> 5 ;
54+
55+ ::aie::vector<uint8_t , 32 > vec_x;
56+ ::aie::vector<uint8_t , 32 > vec_x1;
57+ ::aie::vector<uint8_t , 32 > ones = ::aie::broadcast<uint8, 32 >(1 );
58+ ::aie::vector<uint8_t , 32 > t1;
59+
60+ ::aie::accum<acc32, 32 > acc_x;
61+
62+ for (int i = 0 ; i < image_height * num_vectors; i++) chess_prepare_for_pipelining chess_loop_range (1 , ) {
63+ vec_x = ::aie::load_v<32 >(_frame);
64+ vec_x1 = ::aie::load_v<32 >(_mask);
65+ acc_x = ::aie::mul (vec_x, vec_x1);
66+ ::aie::store_v (_output, acc_x.template to_vector<uint8>(0 ));
67+ _frame += 32 ;
68+ _mask += 32 ;
69+ _output += 32 ;
70+ }
71+ }
72+
73+ __attribute__ ((noinline)) void PixelwiseSelect::xf_pixel_wise_select (
74+ uint8_t * in_frame, uint8_t * mask, uint8_t * bg_frame, int16 height, int16 width, uint8_t * output) {
75+ const int16 image_width = width;
76+ const int16 image_height = height;
77+
78+ uint8_t * restrict _in_frame = (uint8_t *)(in_frame);
79+ uint8_t * restrict _bg_frame = (uint8_t *)(bg_frame);
80+ uint8_t * restrict _mask = (uint8_t *)(mask);
81+ uint8_t * restrict _output = (uint8_t *)(output);
82+ int16_t num_vectors = image_width >> 5 ;
83+
84+ ::aie::vector<uint8_t , 32 > vec_in;
85+ ::aie::vector<uint8_t , 32 > vec_bg;
86+ ::aie::vector<uint8_t , 32 > vec_m;
87+ ::aie::vector<uint8_t , 32 > vec_out;
88+
89+ for (int i = 0 ; i < image_height * num_vectors; i++) chess_prepare_for_pipelining chess_loop_range (1 , ) {
90+ vec_in = ::aie::load_v<32 >(_in_frame);
91+ vec_bg = ::aie::load_v<32 >(_bg_frame);
92+ vec_m = ::aie::load_v<32 >(_mask);
93+ auto mask_val = ::aie::gt (vec_m, (uint8_t )0 );
94+ vec_out = ::aie::select (vec_bg, vec_in, mask_val);
95+ ::aie::store_v (_output, vec_out);
96+ _in_frame += 32 ;
97+ _bg_frame += 32 ;
98+ _mask += 32 ;
99+ _output += 32 ;
100+ }
101+ }
102+
103+ void PixelwiseSelect::runImpl (adf::input_buffer<uint8_t >& frame,
104+ adf::input_buffer<uint8_t >& mask,
105+ adf::output_buffer<uint8_t >& output) {
106+ uint8_t * f = (uint8_t *)::aie::begin (frame);
107+ uint8_t * m = (uint8_t *)::aie::begin (mask);
108+ uint8_t * o = (uint8_t *)::aie::begin (output);
109+
110+ int height = xfGetTileHeight (f);
111+ int width = xfGetTileWidth (f);
112+
113+ xfCopyMetaData (f, o);
114+
115+ uint8_t * f_ptr = (uint8_t *)xfGetImgDataPtr (f);
116+ uint8_t * m_ptr = (uint8_t *)xfGetImgDataPtr (m);
117+ uint8_t * o_ptr = (uint8_t *)xfGetImgDataPtr (o);
118+
119+ ::aie::vector<int16, 16 > vv = ::aie::broadcast<int16, 16 >(width);
120+ ::aie::print (vv, true , " width:" );
121+
122+ vv = ::aie::broadcast<int16, 16 >(height);
123+ ::aie::print (vv, true , " height:" );
124+ xf_pixel_wise_select (f_ptr, m_ptr, height, width, o_ptr);
125+ }
126+
127+ void PixelwiseSelect::runImpl (adf::input_buffer<uint8_t >& in_frame,
128+ adf::input_buffer<uint8_t >& mask,
129+ adf::input_buffer<uint8_t >& bg_frame,
130+ adf::output_buffer<uint8_t >& output) {
131+ uint8_t * f = (uint8_t *)::aie::begin (in_frame);
132+ uint8_t * m = (uint8_t *)::aie::begin (mask);
133+ uint8_t * b = (uint8_t *)::aie::begin (bg_frame);
134+ uint8_t * o = (uint8_t *)::aie::begin (output);
135+
136+ int height = xfGetTileHeight (f);
137+ int width = xfGetTileWidth (f);
138+
139+ xfCopyMetaData (f, o);
140+
141+ uint8_t * f_ptr = (uint8_t *)xfGetImgDataPtr (f);
142+ uint8_t * m_ptr = (uint8_t *)xfGetImgDataPtr (m);
143+ uint8_t * b_ptr = (uint8_t *)xfGetImgDataPtr (b);
144+ uint8_t * o_ptr = (uint8_t *)xfGetImgDataPtr (o);
145+
146+ xf_pixel_wise_select (f_ptr, m_ptr, b_ptr, height, width, o_ptr);
147+ }
148+
149+ } // namespace aie
150+ } // namespace cv
151+ } // namespace xf
152+
153+ #endif
0 commit comments