1 /* 2 * Copyright (c) 2017, 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 //! 23 //! \file codechal_encode_csc_ds_g11.h 24 //! \brief Gen11 class for CSC and Downscaling. 25 //! 26 27 #ifndef __CodechalEncodeCscDsG11__ 28 #define __CodechalEncodeCscDsG11__ 29 30 #include "codechal_encode_csc_ds.h" 31 32 class CodechalEncodeCscDsG11 : public CodechalEncodeCscDs 33 { 34 public: 35 //! 36 //! \brief Extension params used only by HEVC 37 //! 38 struct HevcExtKernelParams 39 { 40 bool bHevcEncHistorySum = false; 41 bool bUseLCU32 = false; 42 PMOS_RESOURCE presHistoryBuffer = nullptr; 43 uint32_t dwSizeHistoryBuffer = 0; 44 uint32_t dwOffsetHistoryBuffer = 0; 45 PMOS_RESOURCE presHistorySumBuffer = nullptr; 46 uint32_t dwSizeHistorySumBuffer = 0; 47 uint32_t dwOffsetHistorySumBuffer = 0; 48 PMOS_RESOURCE presMultiThreadTaskBuffer = nullptr; 49 uint32_t dwSizeMultiThreadTaskBuffer = 0; 50 uint32_t dwOffsetMultiThreadTaskBuffer = 0; 51 }; 52 53 //! 54 //! \brief 4xDS kernel Curbe data 55 //! 56 struct Ds4xKernelCurbeData 57 { Ds4xKernelCurbeDataDs4xKernelCurbeData58 Ds4xKernelCurbeData() 59 { 60 DW0 = 0; 61 DW1 = ds4xSrcYPlane; 62 DW2 = ds4xDstYPlane; 63 DW3_InputYBTIBottomField = 64 DW4_OutputYBTIBottomField = 65 DW5_FlatnessThreshold = 66 DW6 = 67 DW7_Reserved = 0; 68 DW8 = ds4xDstMbVProc; 69 DW9_MBVProcStatsBTIBottomField = 0; 70 DW10_Reserved = 71 DW11_Reserved = 72 DW12_Reserved = 73 DW13_Reserved = 74 DW14_Reserved = 75 DW15_Reserved = 0; 76 } 77 78 // DW0 79 union 80 { 81 struct 82 { 83 uint32_t DW0_InputPictureWidth : MOS_BITFIELD_RANGE(0, 15); 84 uint32_t DW0_InputPictureHeight : MOS_BITFIELD_RANGE(16, 31); 85 }; 86 uint32_t DW0; 87 }; 88 89 // DW1 90 union 91 { 92 struct 93 { 94 uint32_t DW1_InputYBTIFrame; 95 }; 96 struct 97 { 98 uint32_t DW1_InputYBTITopField; 99 }; 100 uint32_t DW1; 101 }; 102 103 // DW2 104 union 105 { 106 struct 107 { 108 uint32_t DW2_OutputYBTIFrame; 109 }; 110 struct 111 { 112 uint32_t DW2_OutputYBTITopField; 113 }; 114 uint32_t DW2; 115 }; 116 117 // DW3 118 uint32_t DW3_InputYBTIBottomField; 119 120 // DW4 121 uint32_t DW4_OutputYBTIBottomField; 122 123 // DW5 124 uint32_t DW5_FlatnessThreshold; 125 126 // DW6 127 union 128 { 129 struct 130 { 131 uint32_t DW6_EnableMBFlatnessCheck : MOS_BITFIELD_BIT(0); 132 uint32_t DW6_EnableMBVarianceOutput : MOS_BITFIELD_BIT(1); 133 uint32_t DW6_EnableMBPixelAverageOutput : MOS_BITFIELD_BIT(2); 134 uint32_t DW6_EnableBlock8x8StatisticsOutput : MOS_BITFIELD_BIT(3); 135 uint32_t: MOS_BITFIELD_RANGE(4, 31); 136 }; 137 uint32_t DW6; 138 }; 139 140 // DW7 141 uint32_t DW7_Reserved; 142 143 // DW8 144 union 145 { 146 struct 147 { 148 uint32_t DW8_MBVProcStatsBTIFrame; 149 }; 150 struct 151 { 152 uint32_t DW8_MBVProcStatsBTITopField; 153 }; 154 uint32_t DW8; 155 }; 156 157 // DW9 158 uint32_t DW9_MBVProcStatsBTIBottomField; 159 160 // DW10 161 uint32_t DW10_Reserved; 162 163 // DW11 164 uint32_t DW11_Reserved; 165 166 //DW12 167 uint32_t DW12_Reserved; 168 169 //DW13 170 uint32_t DW13_Reserved; 171 172 //DW14 173 uint32_t DW14_Reserved; 174 175 //DW15 176 uint32_t DW15_Reserved; 177 178 }; 179 C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(Ds4xKernelCurbeData)) == 16); 180 181 //! 182 //! \brief Constructor 183 //! 184 CodechalEncodeCscDsG11(CodechalEncoderState* encoder); 185 186 //! 187 //! \brief Destructor 188 //! 189 ~CodechalEncodeCscDsG11(); 190 191 virtual uint8_t GetBTCount() const override; 192 193 protected: 194 virtual MOS_STATUS AllocateSurfaceCsc() override; 195 virtual MOS_STATUS InitKernelStateDS() override; 196 virtual MOS_STATUS SetCurbeDS4x() override; 197 198 private: 199 //! 200 //! \brief CSC kernel binding table 201 //! 202 enum CscKernelBTI 203 { 204 cscSrcYPlane = 0, 205 cscSrcUVPlane = 1, 206 cscDstConvYPlane = 2, 207 cscDstConvUVlane = 3, 208 cscDst4xDs = 4, 209 cscDstMbStats = 5, 210 cscDst2xDs = 6, 211 cscDstHistBuffer = 7, 212 cscDstHistSum = 8, 213 cscDstMultiTask = 9, 214 cscNumSurfaces = 10, 215 }; 216 217 //! 218 //! \brief Csc kernel Curbe data 219 //! 220 struct CscKernelCurbeData 221 { CscKernelCurbeDataCscKernelCurbeData222 CscKernelCurbeData() 223 { 224 DW0 = 225 DW1 = 226 DW2 = 227 DW3_MBFlatnessThreshold = 228 DW4_CSC_Coefficient_C0 = 229 DW4_CSC_Coefficient_C1 = 230 DW5_CSC_Coefficient_C2 = 231 DW5_CSC_Coefficient_C3 = 232 DW6_CSC_Coefficient_C4 = 233 DW6_CSC_Coefficient_C5 = 234 DW7_CSC_Coefficient_C6 = 235 DW7_CSC_Coefficient_C7 = 236 DW8_CSC_Coefficient_C8 = 237 DW8_CSC_Coefficient_C9 = 238 DW9_CSC_Coefficient_C10 = 239 DW9_CSC_Coefficient_C11 = 0; 240 DW10_BTI_InputSurface = cscSrcYPlane; 241 DW11_BTI_Enc8BitSurface = cscDstConvYPlane; 242 DW12_BTI_4xDsSurface = cscDst4xDs; 243 DW13_BTI_MbStatsSurface = cscDstMbStats; 244 DW14_BTI_2xDsSurface = cscDst2xDs; 245 DW15_BTI_HistoryBuffer = cscDstHistBuffer; 246 DW16_BTI_HistorySumBuffer = cscDstHistSum; 247 DW17_BTI_MultiTaskBuffer = cscDstMultiTask; 248 } 249 250 union 251 { 252 struct 253 { 254 // DWORD 0 255 uint32_t DW0_Reserved_0 : MOS_BITFIELD_RANGE(0, 7); 256 uint32_t DW0_Reserved_1 : MOS_BITFIELD_RANGE(8, 15); 257 uint32_t DW0_OutputBitDepthForChroma : MOS_BITFIELD_RANGE(16, 23); 258 uint32_t DW0_OutputBitDepthForLuma : MOS_BITFIELD_RANGE(24, 30); 259 uint32_t DW0_RoundingEnable : MOS_BITFIELD_BIT(31); 260 }; 261 uint32_t DW0; 262 }; 263 264 union 265 { 266 struct 267 { 268 // DWORD 1 269 uint32_t DW1_PictureFormat : MOS_BITFIELD_RANGE(0, 7); 270 uint32_t DW1_ConvertFlag : MOS_BITFIELD_BIT(8); 271 uint32_t DW1_DownscaleStage : MOS_BITFIELD_RANGE(9, 11); 272 uint32_t DW1_MbStatisticsDumpFlag : MOS_BITFIELD_BIT(12); 273 uint32_t DW1_YUY2ConversionFlag : MOS_BITFIELD_BIT(13); 274 uint32_t DW1_HevcEncHistorySum : MOS_BITFIELD_BIT(14); 275 uint32_t DW1_LCUSize : MOS_BITFIELD_BIT(15); 276 uint32_t DW1_ChromaSitingLocation : MOS_BITFIELD_RANGE(16, 23); 277 uint32_t DW1_Reserved_0 : MOS_BITFIELD_RANGE(24, 31); 278 }; 279 uint32_t DW1; 280 }; 281 282 union 283 { 284 struct 285 { 286 // DWORD 2 287 uint32_t DW2_OriginalPicWidthInSamples : MOS_BITFIELD_RANGE(0, 15); 288 uint32_t DW2_OriginalPicHeightInSamples : MOS_BITFIELD_RANGE(16, 31); 289 }; 290 uint32_t DW2; 291 }; 292 293 // DWORD 3 294 uint32_t DW3_MBFlatnessThreshold; 295 296 // DWORD 4 297 uint32_t DW4_CSC_Coefficient_C0 : MOS_BITFIELD_RANGE(0, 15); 298 uint32_t DW4_CSC_Coefficient_C1 : MOS_BITFIELD_RANGE(16, 31); 299 300 // DWORD 5 301 uint32_t DW5_CSC_Coefficient_C2 : MOS_BITFIELD_RANGE(0, 15); 302 uint32_t DW5_CSC_Coefficient_C3 : MOS_BITFIELD_RANGE(16, 31); 303 304 // DWORD 6 305 uint32_t DW6_CSC_Coefficient_C4 : MOS_BITFIELD_RANGE(0, 15); 306 uint32_t DW6_CSC_Coefficient_C5 : MOS_BITFIELD_RANGE(16, 31); 307 308 // DWORD 7 309 uint32_t DW7_CSC_Coefficient_C6 : MOS_BITFIELD_RANGE(0, 15); 310 uint32_t DW7_CSC_Coefficient_C7 : MOS_BITFIELD_RANGE(16, 31); 311 312 // DWORD 8 313 uint32_t DW8_CSC_Coefficient_C8 : MOS_BITFIELD_RANGE(0, 15); 314 uint32_t DW8_CSC_Coefficient_C9 : MOS_BITFIELD_RANGE(16, 31); 315 316 // DWORD 9 317 uint32_t DW9_CSC_Coefficient_C10 : MOS_BITFIELD_RANGE(0, 15); 318 uint32_t DW9_CSC_Coefficient_C11 : MOS_BITFIELD_RANGE(16, 31); 319 320 // DWORD 10 321 uint32_t DW10_BTI_InputSurface; 322 323 // DWORD 11 324 uint32_t DW11_BTI_Enc8BitSurface; 325 326 // DWORD 12 327 uint32_t DW12_BTI_4xDsSurface; 328 329 // DWORD 13 330 uint32_t DW13_BTI_MbStatsSurface; 331 332 // DWORD 14 333 uint32_t DW14_BTI_2xDsSurface; 334 335 // DWORD 15 336 uint32_t DW15_BTI_HistoryBuffer; 337 338 // DWORD 16 339 uint32_t DW16_BTI_HistorySumBuffer; 340 341 // DWORD 17 342 uint32_t DW17_BTI_MultiTaskBuffer; 343 }; 344 C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CscKernelCurbeData)) == 18); 345 346 //! 347 //! \brief 4xDS kernel binding table 348 //! 349 enum Ds4xKernelBTI 350 { 351 ds4xSrcYPlane = 0, 352 ds4xDstYPlane = 1, 353 ds4xSrcYPlaneTopField = 0, 354 ds4xDstYPlaneTopField = 1, 355 ds4xSrcYPlaneBtmField = 2, 356 ds4xDstYPlaneBtmField = 3, 357 ds4xDstMbVProc = 4, 358 ds4xDstMbVProcTopField = 4, 359 ds4xDstMbVProcBtmField = 5, 360 ds4xNumSurfaces = 6 361 }; 362 363 virtual MOS_STATUS CheckRawColorFormat(MOS_FORMAT format, MOS_TILE_TYPE tileType) override; 364 virtual MOS_STATUS InitKernelStateCsc() override; 365 virtual MOS_STATUS SetKernelParamsCsc(KernelParams* params) override; 366 virtual MOS_STATUS SetCurbeCsc() override; 367 virtual MOS_STATUS SendSurfaceCsc(PMOS_COMMAND_BUFFER cmdBuffer) override; 368 virtual MOS_STATUS InitSfcState() override; 369 virtual MOS_STATUS CheckRawSurfaceAlignment(MOS_SURFACE surface) override; 370 }; 371 372 #endif // __CodechalEncodeCscDsG11__ 373