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 }