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_kernel_intra_dist.h 24 //! \brief Defines the intra distortion kernel base 25 //! \details Intra distortion base includes all common functions and definitions for intra distortion 26 //! 27 #ifndef __CODECHAL_KERNEL_INTRA_DIST_H__ 28 #define __CODECHAL_KERNEL_INTRA_DIST_H__ 29 #include "codechal_kernel_base.h" 30 31 //! 32 //! \class CodechalKernelIntraDist 33 //! \brief Codechal kernel intra dist 34 //! 35 class CodechalKernelIntraDist : public CodechalKernelBase 36 { 37 public: 38 //! 39 //! \enum KernelIndex 40 //! \brief Kernel index 41 //! 42 enum KernelIndex 43 { 44 intraDistortion = 0 45 }; 46 47 //! 48 //! \enum BindingTableOffset 49 //! \brief Binding table offset 50 //! 51 enum BindingTableOffset 52 { 53 intraDistCurrent4xY = 0, 54 intraDistOutputSurf = 1, 55 intraDistVmeIntraPred = 2, 56 intraDistSurfaceNum = 3 57 }; 58 59 //! 60 //! \class CurbeParam 61 //! \brief Curbe parameter 62 //! 63 struct CurbeParam 64 { 65 uint32_t downScaledWidthInMb4x = 0; 66 uint32_t downScaledHeightInMb4x = 0; 67 }; 68 69 //! 70 //! \class SurfaceParams 71 //! \brief Surface parameters 72 //! 73 struct SurfaceParams 74 { 75 uint32_t intraDistBottomFieldOffset = 0; 76 PMOS_SURFACE input4xDsSurface = nullptr; 77 PMOS_SURFACE intraDistSurface = nullptr; 78 PMOS_SURFACE input4xDsVmeSurface = nullptr; 79 }; 80 81 // clang-format off 82 //! 83 //! \class Curbe 84 //! \brief Curbe 85 //! 86 class Curbe 87 { 88 public: Curbe()89 Curbe() 90 { 91 memset(&m_data, 0, sizeof(CurbeData)); 92 m_data.DW1.interSAD = 2; 93 m_data.DW1.intraSAD = 2; 94 m_data.DW8.value = 0xFFFFFFFF; 95 m_data.DW9.value = 0xFFFFFFFF; 96 m_data.DW10.value = 0xFFFFFFFF; 97 } 98 //! 99 //! \struct CurbeData 100 //! \brief Curbe data 101 //! 102 struct CurbeData 103 { 104 //DW0 105 union 106 { 107 struct 108 { 109 uint32_t picWidthInLumaSamples : MOS_BITFIELD_RANGE(0, 15); 110 uint32_t picHeightInLumaSamples : MOS_BITFIELD_RANGE(16, 31); 111 }; 112 uint32_t value; 113 } DW0; 114 115 //DW1 116 union 117 { 118 struct 119 { 120 uint32_t srcSize : MOS_BITFIELD_RANGE(0, 1); 121 uint32_t reserved2 : MOS_BITFIELD_RANGE(2, 13); 122 uint32_t skipType : MOS_BITFIELD_BIT(14); 123 uint32_t reserved15 : MOS_BITFIELD_BIT(15); 124 uint32_t intraChromaMode : MOS_BITFIELD_BIT(16); 125 uint32_t ftSkipCheckEnable : MOS_BITFIELD_BIT(17); 126 uint32_t reserved18 : MOS_BITFIELD_BIT(18); 127 uint32_t blockBasedSkipEnable : MOS_BITFIELD_BIT(19); 128 uint32_t interSAD : MOS_BITFIELD_RANGE(20, 21); 129 uint32_t intraSAD : MOS_BITFIELD_RANGE(22, 23); 130 uint32_t reserved24 : MOS_BITFIELD_RANGE(24, 31); 131 }; 132 uint32_t value; 133 } DW1; 134 135 //DW2 136 union 137 { 138 struct 139 { 140 uint32_t intraPartMask : MOS_BITFIELD_RANGE(0, 4); 141 uint32_t nonSkipZmvAdded : MOS_BITFIELD_BIT(5); 142 uint32_t nonSkipModeAdded : MOS_BITFIELD_BIT(6); 143 uint32_t intraCornerSwap : MOS_BITFIELD_BIT(7); 144 uint32_t reserved8 : MOS_BITFIELD_RANGE(8, 15); 145 uint32_t mvCostScaleFactor : MOS_BITFIELD_RANGE(16, 17); 146 uint32_t bilinearEnable : MOS_BITFIELD_BIT(18); 147 uint32_t reserved19 : MOS_BITFIELD_BIT(19); 148 uint32_t weightedSADHaar : MOS_BITFIELD_BIT(20); 149 uint32_t acOnlyHaar : MOS_BITFIELD_BIT(21); 150 uint32_t refIDCostMode : MOS_BITFIELD_BIT(22); 151 uint32_t reserved23 : MOS_BITFIELD_BIT(23); 152 uint32_t skipCenterMask : MOS_BITFIELD_RANGE(24, 31); 153 }; 154 uint32_t value; 155 } DW2; 156 157 //DW3 158 union 159 { 160 struct 161 { 162 uint32_t reserved; 163 }; 164 uint32_t value; 165 } DW3; 166 167 //DW4 168 union 169 { 170 struct 171 { 172 uint32_t reserved; 173 }; 174 uint32_t value; 175 } DW4; 176 177 //DW5 178 union 179 { 180 struct 181 { 182 uint32_t reserved; 183 }; 184 uint32_t value; 185 } DW5; 186 187 //DW6 188 union 189 { 190 struct 191 { 192 uint32_t reserved; 193 }; 194 uint32_t value; 195 } DW6; 196 197 //DW7 198 union 199 { 200 struct 201 { 202 uint32_t reserved; 203 }; 204 uint32_t value; 205 } DW7; 206 207 //DW8 208 union 209 { 210 struct 211 { 212 uint32_t currPic4xBTI; 213 }; 214 uint32_t value; 215 } DW8; 216 217 //DW9 218 union 219 { 220 struct 221 { 222 uint32_t intraDistSurfaceBTI; 223 }; 224 uint32_t value; 225 } DW9; 226 227 //DW10 228 union 229 { 230 struct 231 { 232 uint32_t vmeIntraPredSurfaceBTI; 233 }; 234 uint32_t value; 235 } DW10; 236 } m_data; 237 static const uint32_t m_curbeSize = sizeof(CurbeData); 238 }; 239 // clang-format on 240 241 CodechalKernelIntraDist(CodechalEncoderState *encoder); 242 243 virtual ~CodechalKernelIntraDist(); 244 245 //! 246 //! \brief Execute Intra Distortion kernel 247 //! 248 //! \param [in] curbeParam 249 //! Reference to CodechalKernelIntraDist::CurbeParam 250 //! \param [in] surfaceParam 251 //! Reference to CodechalKernelIntraDist::SurfaceParams 252 //! 253 //! \return MOS_STATUS 254 //! MOS_STATUS_SUCCESS if success 255 //! 256 MOS_STATUS Execute(CurbeParam &curbeParam, SurfaceParams &surfaceParam); 257 GetBTCount()258 uint32_t GetBTCount() { return BindingTableOffset::intraDistSurfaceNum; } 259 260 protected: 261 MOS_STATUS AllocateResources(); 262 MOS_STATUS ReleaseResources(); 263 GetCurbeSize()264 virtual uint32_t GetCurbeSize() { return Curbe::m_curbeSize; } 265 virtual MOS_STATUS SetCurbe(MHW_KERNEL_STATE *kernelState); 266 virtual MOS_STATUS SendSurfaces(PMOS_COMMAND_BUFFER cmd, MHW_KERNEL_STATE *kernelState); 267 virtual MOS_STATUS AddPerfTag(); 268 virtual MHW_KERNEL_STATE *GetActiveKernelState(); 269 virtual MOS_STATUS InitWalkerCodecParams(CODECHAL_WALKER_CODEC_PARAMS &walkerParam); 270 virtual CODECHAL_MEDIA_STATE_TYPE GetMediaStateType(); 271 272 CurbeParam m_curbeParam; //!< curbe paramters 273 SurfaceParams m_surfaceParam; //! surface parameters 274 }; 275 276 #endif /* __CODECHAL_KERNEL_INTRA_DIST_H__ */ 277