1 /*
2 * Copyright (c) 2019, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 #if (defined BUFFER_0) || (defined BUFFER_1) || (defined BUFFER_2) || (defined BUFFER_3)
23 vector <ushort, 16> LoadMaskTemp = (TempMask0.select<1, 1, 16, 1>(0, 0) != 0);
24 #elif (defined BUFFER_4) || (defined BUFFER_5)
25 uchar sec_half_shift = (Layer_Index >> 7) * 8;
26 vector <ushort, 16> LoadMaskTemp = (TempMask.select<16, 1>(0) != 0);
27 #endif
28 
29 #if defined BUFFER_0
30 Buffer_Index = 0;
31 #elif defined BUFFER_1
32 Buffer_Index = 1;
33 #elif defined BUFFER_2
34 Buffer_Index = 2;
35 #elif defined BUFFER_3
36 Buffer_Index = 3;
37 #elif defined BUFFER_4
38 Buffer_Index = 4;
39 #elif defined BUFFER_5
40 Buffer_Index = 5;
41 #endif
42 
43 ushort LoadMask = cm_pack_mask(LoadMaskTemp);
44 CalculationMask = LoadMask == 0 ? 0x00 : 0xFF;
45 
46 if (CalculationMask != 0)
47 {
48     float StartX;
49     float StartY;
50     float DeltaX;
51     float DeltaY;
52     bool IefBypass = true;
53     SamplerIndex Src_Sampler(MDF_FC_AVS_SI_Y);
54 
55     /*
56     AVS Sampler 16x4 write back buffer layout for R/V, G/Y, B/U channel, each box stands for 8x1 ushort write back pixel
57     16x4 pixle deviding to 8 8x1 pixel block
58     _________________________________________________
59     |_______Block0__________|_______Block1__________|
60     |_______Block2__________|_______Block3__________|
61     |_______Block4__________|_______Block5__________|
62     |_______Block6__________|_______Block7__________|
63 
64     Write back buffer layout correlate to the block number#, each box stands for 1 GRF
65     _______________________________________________
66     |____R0_________R2_____|____R4_________R6_____|
67     |____G0_________G2_____|____G4_________G6_____|
68     |____B0_________B2_____|____B4_________B6_____|
69     |____A0_________A2_____|____A4_________A6_____|
70     |____R1_________R3_____|____R5_________R7_____|
71     |____G1_________G3_____|____G5_________G7_____|
72     |____B1_________B3_____|____B5_________B7_____|
73     |____A1_________A3_____|____A5_________A7_____|
74     */
75 #if (defined BUFFER_0) || (defined BUFFER_1)
76     StartX = Start_X(0);
77     StartY = Start_Y(0);
78     DeltaX = Delta_X(0);
79     DeltaY = Delta_Y(0);
80 
81     StartX += DstX * DeltaX;
82     StartY  = StartY + DstY * DeltaY;
83 #elif (defined BUFFER_2) || (defined BUFFER_3)
84     StartX = Start_X(0);
85     StartY = Start_Y(0);
86     DeltaX = Delta_X(0);
87     DeltaY = Delta_Y(0);
88 
89     StartX += DstX * DeltaX;
90     StartY  = StartY + (DstY + 8) * DeltaY;
91 #endif
92 
93 #ifdef BUFFER_0
94 #define WriteBackBuffer DataBuffer0
95     SurfaceIndex Src_Surface(MDF_FC_INPUT_BTI_START);
96     cm_avs_sampler(
97         DataBuffer0,
98         CM_ABGR_ENABLE,
99         Src_Surface,
100         Src_Sampler,
101         StartX,
102         StartY,
103         DeltaX,
104         2 * DeltaY,
105         0,
106         0,
107         0,
108         CM_16_FULL,
109         0,
110         CM_AVS_16x4,
111         IefBypass);
112 
113 #endif
114 #ifdef BUFFER_1
115 #define WriteBackBuffer DataBuffer1
116     SurfaceIndex Src_Surface(MDF_FC_INPUT_BTI_F2);
117     cm_avs_sampler(
118         DataBuffer1,
119         CM_ABGR_ENABLE,
120         Src_Surface,
121         Src_Sampler,
122         StartX,
123         StartY,
124         DeltaX,
125         2 * DeltaY,
126         0,
127         0,
128         0,
129         CM_16_FULL,
130         0,
131         CM_AVS_16x4,
132         IefBypass);
133 
134 #endif
135 #ifdef BUFFER_2
136 #define WriteBackBuffer DataBuffer2
137     SurfaceIndex Src_Surface(MDF_FC_INPUT_BTI_START);
138     cm_avs_sampler(
139         DataBuffer2,
140         CM_ABGR_ENABLE,
141         Src_Surface,
142         Src_Sampler,
143         StartX,
144         StartY,
145         DeltaX,
146         2 * DeltaY,
147         0,
148         0,
149         0,
150         CM_16_FULL,
151         0,
152         CM_AVS_16x4,
153         IefBypass);
154 
155 #endif
156 #ifdef BUFFER_3
157 #define WriteBackBuffer DataBuffer3
158     SurfaceIndex Src_Surface(MDF_FC_INPUT_BTI_F2);
159     cm_avs_sampler(
160         DataBuffer3,
161         CM_ABGR_ENABLE,
162         Src_Surface,
163         Src_Sampler,
164         StartX,
165         StartY,
166         DeltaX,
167         2 * DeltaY,
168         0,
169         0,
170         0,
171         CM_16_FULL,
172         0,
173         CM_AVS_16x4,
174         IefBypass);
175 
176 #endif
177 
178     // Shuffle the write back of sampler
179     /*
180     Buffer layout after shuffle
181     _________________________________________________
182     |_______Block0__________|_______Block1__________|
183     |_______Block2__________|_______Block3__________|
184     |_______Block4__________|_______Block5__________|
185     |_______Block6__________|_______Block7__________|
186 
187     Write back buffer layout correlate to the block number#, each box stands for 1 GRF
188     _______________________________________________
189     |____R0_________R1_____|____R2_________R3_____|
190     |____G0_________G1_____|____G2_________G3_____|
191     |____B0_________B1_____|____B2_________B3_____|
192     |____A0_________A1_____|____A2_________A3_____|
193     |____R4_________R5_____|____R6_________R7_____|
194     |____G4_________G5_____|____G6_________G7_____|
195     |____B4_________B5_____|____B6_________B7_____|
196     |____A4_________A5_____|____A6_________A7_____|
197     */
198 #undef WriteBackBuffer
199 }