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 #pragma once 23 #ifdef __cplusplus 24 #include "External/Common/GmmMemAllocator.hpp" 25 #include "Internal/Common/GmmLibInc.h" 26 ///////////////////////////////////////////////////////////////////////////////////// 27 /// @file GmmTextureCalc.h 28 /// @brief This file contains the common functions and members for texture calculations 29 /// on all GENs/Platforms 30 ///////////////////////////////////////////////////////////////////////////////////// 31 namespace GmmLib 32 { 33 34 ///////////////////////////////////////////////////////////////////////// 35 /// Contains texture calc functions and members that are common across all 36 /// platform implementation. This is an abstract class and provides a 37 /// uniform interface to all the texture clients and provides gen specific 38 /// texture allocation through derived concrete GmmGenXTextureCalc class. 39 ///////////////////////////////////////////////////////////////////////// 40 class Context; 41 class NON_PAGED_SECTION GmmTextureCalc : 42 public GmmMemAllocator 43 { 44 private: 45 46 GMM_STATUS FillTexBlockMem( 47 GMM_TEXTURE_INFO *pTexInfo, 48 __GMM_BUFFER_TYPE *pRestrictions); 49 void ResetRestrictions(__GMM_BUFFER_TYPE *pRestriction); 50 51 void GetTexRestrictions( 52 GMM_TEXTURE_INFO* pTexInfo, 53 __GMM_BUFFER_TYPE* pBuff); 54 55 bool ValidateTexInfo( 56 GMM_TEXTURE_INFO *pTexInfo, 57 __GMM_BUFFER_TYPE *pRestrictions); 58 59 protected: 60 Context *pGmmLibContext; 61 62 /* Function prototypes */ 63 64 65 virtual GMM_STATUS GMM_STDCALL FillTexPlanar( 66 GMM_TEXTURE_INFO *pTexInfo, 67 __GMM_BUFFER_TYPE *pRestrictions); 68 69 GMM_STATUS FillTexPitchAndSize(GMM_TEXTURE_INFO *pTexInfo, 70 GMM_GFX_SIZE_T WidthBytesPhysical, 71 uint32_t Height, 72 __GMM_BUFFER_TYPE *pBufferType); 73 74 void FillPlanarOffsetAddress( 75 GMM_TEXTURE_INFO *pTexInfo); 76 77 void FindMipTailStartLod(GMM_TEXTURE_INFO *pTexInfo); 78 GMM_VIRTUAL void GetGenericRestrictions(GMM_TEXTURE_INFO* pTexInfo, 79 __GMM_BUFFER_TYPE *pBuff); 80 GMM_VIRTUAL __GMM_BUFFER_TYPE* GetBestRestrictions(__GMM_BUFFER_TYPE *pFirstBuffer, 81 const __GMM_BUFFER_TYPE *pSecondBuffer); 82 /* Inline functions */ 83 ///////////////////////////////////////////////////////////////////////////////////// 84 /// Checks where the restrictions are invalid or not 85 /// @param[in] pRestriction Restrictions to check 86 /// @return true if restriction is invalid. false otherwise. 87 ///////////////////////////////////////////////////////////////////////////////////// IsRestrictionInvalid(__GMM_BUFFER_TYPE * pRestriction)88 GMM_INLINE_VIRTUAL GMM_INLINE bool IsRestrictionInvalid(__GMM_BUFFER_TYPE *pRestriction) 89 { 90 return ((pRestriction->MinDepth == 0xffffffff) ? true : false); 91 } 92 ///////////////////////////////////////////////////////////////////////////////////// 93 /// Returns restrictions for a linear buffer. 94 /// @param[out] pBuff Restrictions are returned in this buffer 95 ///////////////////////////////////////////////////////////////////////////////////// GetLinearRestrictions(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pBuff)96 GMM_INLINE_VIRTUAL GMM_INLINE void GetLinearRestrictions(GMM_TEXTURE_INFO* pTexInfo, __GMM_BUFFER_TYPE* pBuff) 97 { 98 *pBuff = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo,pGmmLibContext)->Linear; 99 } 100 ///////////////////////////////////////////////////////////////////////////////////// 101 /// Returns restrictions for the primary buffer. 102 /// @param[out] pBuff Restrictions are returned in this buffer 103 ///////////////////////////////////////////////////////////////////////////////////// GetPrimaryRestrictions(GMM_TEXTURE_INFO * pTexInfo,__GMM_BUFFER_TYPE * pBuff)104 GMM_INLINE_VIRTUAL GMM_INLINE void GetPrimaryRestrictions(GMM_TEXTURE_INFO* pTexInfo, __GMM_BUFFER_TYPE* pBuff) 105 { 106 *pBuff = GMM_OVERRIDE_PLATFORM_INFO(pTexInfo,pGmmLibContext)->ASyncFlipSurface; 107 } 108 109 virtual uint32_t Get2DMipMapHeight(GMM_TEXTURE_INFO *pTexInfo) = 0; 110 111 virtual void Fill2DTexOffsetAddress(GMM_TEXTURE_INFO *pTexInfo) = 0; 112 113 virtual GMM_GFX_SIZE_T Get2DTexOffsetAddressPerMip( 114 GMM_TEXTURE_INFO *pTexInfo, 115 uint32_t MipLevel) = 0; 116 GetMipTailByteOffset(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel)117 virtual uint32_t GetMipTailByteOffset( 118 GMM_TEXTURE_INFO *pTexInfo, 119 uint32_t MipLevel) 120 { 121 GMM_UNREFERENCED_PARAMETER(pTexInfo); 122 GMM_UNREFERENCED_PARAMETER(MipLevel); 123 // Left empty 124 return 0; 125 } 126 GetMipTailGeometryOffset(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel,uint32_t * OffsetX,uint32_t * OffsetY,uint32_t * OffsetZ)127 virtual void GetMipTailGeometryOffset( 128 GMM_TEXTURE_INFO *pTexInfo, 129 uint32_t MipLevel, 130 uint32_t* OffsetX, 131 uint32_t* OffsetY, 132 uint32_t* OffsetZ) 133 { 134 GMM_UNREFERENCED_PARAMETER(pTexInfo); 135 GMM_UNREFERENCED_PARAMETER(MipLevel); 136 GMM_UNREFERENCED_PARAMETER(OffsetX); 137 GMM_UNREFERENCED_PARAMETER(OffsetY); 138 GMM_UNREFERENCED_PARAMETER(OffsetZ); 139 140 // Left empty 141 } 142 143 GMM_GFX_SIZE_T Get3DMipByteAddress( 144 GMM_TEXTURE_INFO* pTexInfo, 145 GMM_REQ_OFFSET_INFO *pReqInfo); 146 GetAligned3DBlockHeight(GMM_TEXTURE_INFO * pTexInfo,uint32_t BlockHeight,uint32_t ExpandedArraySize)147 virtual uint32_t GetAligned3DBlockHeight( 148 GMM_TEXTURE_INFO* pTexInfo, 149 uint32_t BlockHeight, 150 uint32_t ExpandedArraySize) 151 { 152 GMM_UNREFERENCED_PARAMETER(pTexInfo); 153 GMM_UNREFERENCED_PARAMETER(BlockHeight); 154 GMM_UNREFERENCED_PARAMETER(ExpandedArraySize); 155 156 // Left empty 157 return 0; 158 } 159 160 public: 161 /* Constructors */ 162 // "Creates GmmTextureCalc object based on platform ID" 163 void SetTileMode(GMM_TEXTURE_INFO* pTexInfo); 164 GmmTextureCalc(Context * pGmmLibContext)165 GmmTextureCalc(Context *pGmmLibContext) 166 { 167 this->pGmmLibContext = pGmmLibContext; 168 } 169 ~GmmTextureCalc()170 virtual ~GmmTextureCalc() 171 { 172 173 } 174 175 /* Function prototypes */ 176 GMM_STATUS AllocateTexture(GMM_TEXTURE_INFO *pTexInfo); 177 virtual GMM_STATUS FillTexCCS(GMM_TEXTURE_INFO *pBaseSurf, GMM_TEXTURE_INFO *pTexInfo); 178 uint8_t SurfaceRequires64KBTileOptimization( 179 GMM_TEXTURE_INFO *pTexInfo); 180 181 GMM_STATUS PreProcessTexSpecialCases( 182 GMM_TEXTURE_INFO* pTexInfo); 183 184 uint32_t ExpandHeight( 185 uint32_t Height, 186 uint32_t UnitAlignment, 187 uint32_t NumSamples); 188 189 uint32_t ExpandWidth( 190 uint32_t Width, 191 uint32_t UnitAlignment, 192 uint32_t NumSamples); 193 194 void GetCompressionBlockDimensions( 195 GMM_RESOURCE_FORMAT Format, 196 uint32_t *pWidth, 197 uint32_t *pHeight, 198 uint32_t *pDepth); 199 200 GMM_STATUS GetTexRenderOffset( 201 GMM_TEXTURE_INFO* pTexInfo, 202 GMM_REQ_OFFSET_INFO* pReqInfo); 203 204 virtual GMM_STATUS GetTexLockOffset( 205 GMM_TEXTURE_INFO* pTexInfo, 206 GMM_REQ_OFFSET_INFO *pReqInfo); 207 208 GMM_STATUS GetTexStdLayoutOffset( 209 GMM_TEXTURE_INFO* pTexInfo, 210 GMM_REQ_OFFSET_INFO *pReqInfo); 211 212 virtual GMM_GFX_SIZE_T GetMipMapByteAddress( 213 GMM_TEXTURE_INFO* pTexInfo, 214 GMM_REQ_OFFSET_INFO *pReqInfo); 215 216 void AlignTexHeightWidth( 217 GMM_TEXTURE_INFO* pTexInfo, 218 uint32_t* pHeight, 219 uint32_t* pWidth); 220 221 bool GmmGetD3DToHwTileConversion( 222 GMM_TEXTURE_INFO *pTexInfo, 223 uint32_t *pColFactor, 224 uint32_t *pRowFactor); 225 void GetResRestrictions( 226 GMM_TEXTURE_INFO* pTexInfo, 227 __GMM_BUFFER_TYPE& pBuff); 228 229 bool RedescribeTexturePlanes(GMM_TEXTURE_INFO *pTexInfo, uint32_t *pWidthBytesPhysical); 230 231 bool GetRedescribedPlaneParams(GMM_TEXTURE_INFO *pTexInfo, GMM_YUV_PLANE PlaneType, GMM_TEXTURE_INFO *pRedescribedTexInfo); 232 233 // Virtual functions 234 virtual GMM_STATUS GMM_STDCALL FillTex1D( 235 GMM_TEXTURE_INFO *pTexInfo, 236 __GMM_BUFFER_TYPE *pRestrictions) = 0; 237 virtual GMM_STATUS GMM_STDCALL FillTex2D( 238 GMM_TEXTURE_INFO *pTexInfo, 239 __GMM_BUFFER_TYPE *pRestrictions) = 0; 240 virtual GMM_STATUS GMM_STDCALL FillTex3D( 241 GMM_TEXTURE_INFO *pTexInfo, 242 __GMM_BUFFER_TYPE *pRestrictions) = 0; 243 virtual GMM_STATUS GMM_STDCALL FillTexCube( 244 GMM_TEXTURE_INFO *pTexInfo, 245 __GMM_BUFFER_TYPE *pRestrictions) = 0; 246 GetCCSExMode(GMM_TEXTURE_INFO * AuxSurf)247 virtual GMM_STATUS GMM_STDCALL GetCCSExMode(GMM_TEXTURE_INFO * AuxSurf) 248 { 249 GMM_UNREFERENCED_PARAMETER(AuxSurf); 250 251 return GMM_SUCCESS; 252 } 253 ScaleTextureWidth(GMM_TEXTURE_INFO * pTexInfo,uint32_t Width)254 virtual uint32_t GMM_STDCALL ScaleTextureWidth(GMM_TEXTURE_INFO* pTexInfo, 255 uint32_t Width) 256 { 257 __GMM_ASSERT(pTexInfo != NULL); 258 259 switch (pTexInfo->BitsPerPixel) 260 { 261 case 32: Width /= 8; break; 262 case 64: Width /= 4; break; 263 case 128: Width /= 2; break; 264 default: __GMM_ASSERT(0); 265 } 266 267 return Width; 268 } 269 ScaleTextureHeight(GMM_TEXTURE_INFO * pTexInfo,uint32_t Height)270 virtual uint32_t GMM_STDCALL ScaleTextureHeight(GMM_TEXTURE_INFO* pTexInfo, 271 uint32_t Height) 272 { 273 GMM_UNREFERENCED_PARAMETER(pTexInfo); 274 return Height /= 16; 275 } 276 GmmTexGetMipWidth(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel)277 virtual GMM_GFX_SIZE_T GmmTexGetMipWidth(GMM_TEXTURE_INFO *pTexInfo, uint32_t MipLevel) 278 { 279 __GMM_ASSERTPTR(pTexInfo, 0); 280 return(GFX_MAX(1, pTexInfo->BaseWidth >> MipLevel)); 281 } GmmTexGetMipHeight(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel)282 virtual uint32_t GmmTexGetMipHeight(GMM_TEXTURE_INFO *pTexInfo, uint32_t MipLevel) 283 { 284 __GMM_ASSERTPTR(pTexInfo, 0); 285 return(GFX_MAX(1, pTexInfo->BaseHeight >> MipLevel)); 286 } 287 GmmTexGetMipDepth(GMM_TEXTURE_INFO * pTexInfo,uint32_t MipLevel)288 virtual uint32_t GmmTexGetMipDepth(GMM_TEXTURE_INFO *pTexInfo, uint32_t MipLevel) 289 { 290 __GMM_ASSERTPTR(pTexInfo, 0); 291 return(GFX_MAX(1, pTexInfo->Depth >> MipLevel)); 292 } 293 ScaleFCRectHeight(GMM_TEXTURE_INFO * pTexInfo,uint32_t Height)294 virtual uint32_t GMM_STDCALL ScaleFCRectHeight(GMM_TEXTURE_INFO * pTexInfo, uint32_t Height) 295 { 296 __GMM_ASSERTPTR(pTexInfo, 0); 297 uint32_t ScaledHeight = Height; 298 299 if (pTexInfo->TileMode == LEGACY_TILE_X) 300 { 301 const uint16_t FastClearRccTileXAlignHeight = 64; // lines - RCC ( Render Color Cache ) Alignment Sizes 302 const uint16_t TileXClearHeightScale = 32; // lines - Clear & Resolve Rect Scaling Sizes 303 304 ScaledHeight = GFX_ALIGN(ScaledHeight, FastClearRccTileXAlignHeight); 305 ScaledHeight /= TileXClearHeightScale; 306 } 307 else if (pTexInfo->TileMode == LEGACY_TILE_Y) 308 { 309 const uint16_t FastClearRccTileYAlignHeight = 128; // bits 310 const uint16_t TileYClearHeightScale = 64; // bits 311 312 ScaledHeight = GFX_ALIGN(ScaledHeight, FastClearRccTileYAlignHeight); 313 ScaledHeight /= TileYClearHeightScale; 314 } 315 return ScaledHeight; 316 317 } 318 ScaleFCRectWidth(GMM_TEXTURE_INFO * pTexInfo,uint64_t Width)319 virtual uint64_t GMM_STDCALL ScaleFCRectWidth(GMM_TEXTURE_INFO * pTexInfo, uint64_t Width) 320 { 321 __GMM_ASSERTPTR(pTexInfo, 0); 322 uint64_t ScaledWidth = Width; 323 324 if (pTexInfo->TileMode == LEGACY_TILE_X) 325 { 326 const uint32_t FastClearRccTileXAlignWidth = 8192; // bits - RCC ( Render Color Cache ) Alignment Sizes 327 const uint32_t TileXClearWidthScale = 4096; // bits - Clear & Resolve Rect Scaling Sizes 328 329 ScaledWidth = GFX_ALIGN(ScaledWidth, FastClearRccTileXAlignWidth / pTexInfo->BitsPerPixel); 330 ScaledWidth /= TileXClearWidthScale; 331 } 332 else if (pTexInfo->TileMode == LEGACY_TILE_Y) 333 { 334 const uint32_t FastClearRccTileYAlignWidth = 4096; // bits 335 const uint32_t TileYClearWidthScale = 2048; // bits 336 337 ScaledWidth = GFX_ALIGN(ScaledWidth, FastClearRccTileYAlignWidth / pTexInfo->BitsPerPixel); 338 ScaledWidth /= TileYClearWidthScale; 339 } 340 return ScaledWidth; 341 } 342 343 virtual GMM_STATUS GMM_STDCALL MSAACCSUsage(GMM_TEXTURE_INFO *pTexInfo); 344 virtual void GMM_STDCALL AllocateOneTileThanRequied(GMM_TEXTURE_INFO *pTexInfo, 345 GMM_GFX_SIZE_T &WidthBytesRender, 346 GMM_GFX_SIZE_T &WidthBytesPhysical, 347 GMM_GFX_SIZE_T &WidthBytesLock); 348 GMM_STATUS MSAACompression(GMM_TEXTURE_INFO *pTexInfo); Get2DFCSurfaceWidthFor3DSurface(GMM_TEXTURE_INFO * pTexInfo,uint64_t Width)349 virtual uint64_t GMM_STDCALL Get2DFCSurfaceWidthFor3DSurface(GMM_TEXTURE_INFO *pTexInfo, 350 uint64_t Width) 351 { 352 GMM_UNREFERENCED_PARAMETER(pTexInfo); 353 return Width; 354 } Get2DFCSurfaceHeightFor3DSurface(GMM_TEXTURE_INFO * pTexInfo,uint32_t Height,uint32_t Depth)355 virtual uint64_t GMM_STDCALL Get2DFCSurfaceHeightFor3DSurface(GMM_TEXTURE_INFO *pTexInfo, 356 uint32_t Height, 357 uint32_t Depth) 358 { 359 GMM_UNREFERENCED_PARAMETER(pTexInfo); 360 GMM_UNREFERENCED_PARAMETER(Depth); 361 return Height; 362 } 363 364 uint32_t GMM_STDCALL GetDisplayFrameOffset(GMM_TEXTURE_INFO *pTexInfo, 365 GMM_REQ_OFFSET_INFO *pReqInfo); 366 virtual uint32_t GMM_STDCALL IsTileAlignedPlanes(GMM_TEXTURE_INFO *pTexInfo); 367 virtual uint32_t GMM_STDCALL GetNumberOfPlanes(GMM_TEXTURE_INFO *pTexInfo); 368 virtual void GMM_STDCALL SetPlanarOffsetInfo(GMM_TEXTURE_INFO *pTexInfo, 369 GMM_RESCREATE_CUSTOM_PARAMS &CreateParams); 370 #ifndef __GMM_KMD__ 371 virtual void GMM_STDCALL SetPlanarOffsetInfo_2(GMM_TEXTURE_INFO *pTexInfo, 372 GMM_RESCREATE_CUSTOM_PARAMS_2 &CreateParams); 373 #endif 374 virtual void GMM_STDCALL SetPlaneUnAlignedTexOffsetInfo(GMM_TEXTURE_INFO *pTexInfo, 375 uint32_t YHeight, 376 uint32_t VHeight); 377 virtual void GMM_STDCALL GetPlaneIdForCpuBlt(GMM_TEXTURE_INFO *pTexInfo, 378 GMM_RES_COPY_BLT *pBlt, 379 uint32_t *PlaneId); 380 virtual void GMM_STDCALL GetBltInfoPerPlane(GMM_TEXTURE_INFO *pTexInfo, 381 GMM_RES_COPY_BLT *pBlt, 382 uint32_t PlaneId); 383 /* inline functions */ 384 }; 385 386 } 387 #endif // #ifdef __cplusplus 388