1 /* 2 * Copyright © 2007-2019 Advanced Micro Devices, Inc. 3 * All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining 6 * a copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sub license, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 14 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 15 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 16 * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS 17 * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 20 * USE OR OTHER DEALINGS IN THE SOFTWARE. 21 * 22 * The above copyright notice and this permission notice (including the 23 * next paragraph) shall be included in all copies or substantial portions 24 * of the Software. 25 */ 26 27 /** 28 ************************************************************************************************************************ 29 * @file gfx9addrlib.h 30 * @brief Contgfx9ns the Gfx9Lib class definition. 31 ************************************************************************************************************************ 32 */ 33 34 #ifndef __GFX9_ADDR_LIB_H__ 35 #define __GFX9_ADDR_LIB_H__ 36 37 #include "addrlib2.h" 38 #include "coord.h" 39 40 namespace Addr 41 { 42 namespace V2 43 { 44 45 /** 46 ************************************************************************************************************************ 47 * @brief GFX9 specific settings structure. 48 ************************************************************************************************************************ 49 */ 50 struct Gfx9ChipSettings 51 { 52 struct 53 { 54 // Asic/Generation name 55 UINT_32 isArcticIsland : 1; 56 UINT_32 isVega10 : 1; 57 UINT_32 isRaven : 1; 58 UINT_32 isVega12 : 1; 59 UINT_32 isVega20 : 1; 60 UINT_32 reserved0 : 27; 61 62 // Display engine IP version name 63 UINT_32 isDce12 : 1; 64 UINT_32 isDcn1 : 1; 65 UINT_32 isDcn2 : 1; 66 UINT_32 reserved1 : 29; 67 68 // Misc configuration bits 69 UINT_32 metaBaseAlignFix : 1; 70 UINT_32 depthPipeXorDisable : 1; 71 UINT_32 htileAlignFix : 1; 72 UINT_32 applyAliasFix : 1; 73 UINT_32 htileCacheRbConflict: 1; 74 UINT_32 reserved2 : 27; 75 }; 76 }; 77 78 /** 79 ************************************************************************************************************************ 80 * @brief GFX9 data surface type. 81 ************************************************************************************************************************ 82 */ 83 enum Gfx9DataType 84 { 85 Gfx9DataColor, 86 Gfx9DataDepthStencil, 87 Gfx9DataFmask 88 }; 89 90 const UINT_32 Gfx9LinearSwModeMask = (1u << ADDR_SW_LINEAR); 91 92 const UINT_32 Gfx9Blk256BSwModeMask = (1u << ADDR_SW_256B_S) | 93 (1u << ADDR_SW_256B_D) | 94 (1u << ADDR_SW_256B_R); 95 96 const UINT_32 Gfx9Blk4KBSwModeMask = (1u << ADDR_SW_4KB_Z) | 97 (1u << ADDR_SW_4KB_S) | 98 (1u << ADDR_SW_4KB_D) | 99 (1u << ADDR_SW_4KB_R) | 100 (1u << ADDR_SW_4KB_Z_X) | 101 (1u << ADDR_SW_4KB_S_X) | 102 (1u << ADDR_SW_4KB_D_X) | 103 (1u << ADDR_SW_4KB_R_X); 104 105 const UINT_32 Gfx9Blk64KBSwModeMask = (1u << ADDR_SW_64KB_Z) | 106 (1u << ADDR_SW_64KB_S) | 107 (1u << ADDR_SW_64KB_D) | 108 (1u << ADDR_SW_64KB_R) | 109 (1u << ADDR_SW_64KB_Z_T) | 110 (1u << ADDR_SW_64KB_S_T) | 111 (1u << ADDR_SW_64KB_D_T) | 112 (1u << ADDR_SW_64KB_R_T) | 113 (1u << ADDR_SW_64KB_Z_X) | 114 (1u << ADDR_SW_64KB_S_X) | 115 (1u << ADDR_SW_64KB_D_X) | 116 (1u << ADDR_SW_64KB_R_X); 117 118 const UINT_32 Gfx9ZSwModeMask = (1u << ADDR_SW_4KB_Z) | 119 (1u << ADDR_SW_64KB_Z) | 120 (1u << ADDR_SW_64KB_Z_T) | 121 (1u << ADDR_SW_4KB_Z_X) | 122 (1u << ADDR_SW_64KB_Z_X); 123 124 const UINT_32 Gfx9StandardSwModeMask = (1u << ADDR_SW_256B_S) | 125 (1u << ADDR_SW_4KB_S) | 126 (1u << ADDR_SW_64KB_S) | 127 (1u << ADDR_SW_64KB_S_T) | 128 (1u << ADDR_SW_4KB_S_X) | 129 (1u << ADDR_SW_64KB_S_X); 130 131 const UINT_32 Gfx9DisplaySwModeMask = (1u << ADDR_SW_256B_D) | 132 (1u << ADDR_SW_4KB_D) | 133 (1u << ADDR_SW_64KB_D) | 134 (1u << ADDR_SW_64KB_D_T) | 135 (1u << ADDR_SW_4KB_D_X) | 136 (1u << ADDR_SW_64KB_D_X); 137 138 const UINT_32 Gfx9RotateSwModeMask = (1u << ADDR_SW_256B_R) | 139 (1u << ADDR_SW_4KB_R) | 140 (1u << ADDR_SW_64KB_R) | 141 (1u << ADDR_SW_64KB_R_T) | 142 (1u << ADDR_SW_4KB_R_X) | 143 (1u << ADDR_SW_64KB_R_X); 144 145 const UINT_32 Gfx9XSwModeMask = (1u << ADDR_SW_4KB_Z_X) | 146 (1u << ADDR_SW_4KB_S_X) | 147 (1u << ADDR_SW_4KB_D_X) | 148 (1u << ADDR_SW_4KB_R_X) | 149 (1u << ADDR_SW_64KB_Z_X) | 150 (1u << ADDR_SW_64KB_S_X) | 151 (1u << ADDR_SW_64KB_D_X) | 152 (1u << ADDR_SW_64KB_R_X); 153 154 const UINT_32 Gfx9TSwModeMask = (1u << ADDR_SW_64KB_Z_T) | 155 (1u << ADDR_SW_64KB_S_T) | 156 (1u << ADDR_SW_64KB_D_T) | 157 (1u << ADDR_SW_64KB_R_T); 158 159 const UINT_32 Gfx9XorSwModeMask = Gfx9XSwModeMask | 160 Gfx9TSwModeMask; 161 162 const UINT_32 Gfx9AllSwModeMask = Gfx9LinearSwModeMask | 163 Gfx9ZSwModeMask | 164 Gfx9StandardSwModeMask | 165 Gfx9DisplaySwModeMask | 166 Gfx9RotateSwModeMask; 167 168 const UINT_32 Gfx9Rsrc1dSwModeMask = Gfx9LinearSwModeMask; 169 170 const UINT_32 Gfx9Rsrc2dSwModeMask = Gfx9AllSwModeMask; 171 172 const UINT_32 Gfx9Rsrc3dSwModeMask = Gfx9AllSwModeMask & ~Gfx9Blk256BSwModeMask & ~Gfx9RotateSwModeMask; 173 174 const UINT_32 Gfx9Rsrc2dPrtSwModeMask = (Gfx9Blk4KBSwModeMask | Gfx9Blk64KBSwModeMask) & ~Gfx9XSwModeMask; 175 176 const UINT_32 Gfx9Rsrc3dPrtSwModeMask = Gfx9Rsrc2dPrtSwModeMask & ~Gfx9RotateSwModeMask & ~Gfx9DisplaySwModeMask; 177 178 const UINT_32 Gfx9Rsrc3dThinSwModeMask = Gfx9DisplaySwModeMask & ~Gfx9Blk256BSwModeMask; 179 180 const UINT_32 Gfx9Rsrc3dThin4KBSwModeMask = Gfx9Rsrc3dThinSwModeMask & Gfx9Blk4KBSwModeMask; 181 182 const UINT_32 Gfx9Rsrc3dThin64KBSwModeMask = Gfx9Rsrc3dThinSwModeMask & Gfx9Blk64KBSwModeMask; 183 184 const UINT_32 Gfx9Rsrc3dThickSwModeMask = Gfx9Rsrc3dSwModeMask & ~(Gfx9Rsrc3dThinSwModeMask | Gfx9LinearSwModeMask); 185 186 const UINT_32 Gfx9Rsrc3dThick4KBSwModeMask = Gfx9Rsrc3dThickSwModeMask & Gfx9Blk4KBSwModeMask; 187 188 const UINT_32 Gfx9Rsrc3dThick64KBSwModeMask = Gfx9Rsrc3dThickSwModeMask & Gfx9Blk64KBSwModeMask; 189 190 const UINT_32 Gfx9MsaaSwModeMask = Gfx9AllSwModeMask & ~Gfx9Blk256BSwModeMask & ~Gfx9LinearSwModeMask; 191 192 const UINT_32 Dce12NonBpp32SwModeMask = (1u << ADDR_SW_LINEAR) | 193 (1u << ADDR_SW_4KB_D) | 194 (1u << ADDR_SW_4KB_R) | 195 (1u << ADDR_SW_64KB_D) | 196 (1u << ADDR_SW_64KB_R) | 197 (1u << ADDR_SW_4KB_D_X) | 198 (1u << ADDR_SW_4KB_R_X) | 199 (1u << ADDR_SW_64KB_D_X) | 200 (1u << ADDR_SW_64KB_R_X); 201 202 const UINT_32 Dce12Bpp32SwModeMask = (1u << ADDR_SW_256B_D) | 203 (1u << ADDR_SW_256B_R) | 204 Dce12NonBpp32SwModeMask; 205 206 const UINT_32 Dcn1NonBpp64SwModeMask = (1u << ADDR_SW_LINEAR) | 207 (1u << ADDR_SW_4KB_S) | 208 (1u << ADDR_SW_64KB_S) | 209 (1u << ADDR_SW_64KB_S_T) | 210 (1u << ADDR_SW_4KB_S_X) | 211 (1u << ADDR_SW_64KB_S_X); 212 const UINT_32 Dcn1Bpp64SwModeMask = (1u << ADDR_SW_4KB_D) | 213 (1u << ADDR_SW_64KB_D) | 214 (1u << ADDR_SW_64KB_D_T) | 215 (1u << ADDR_SW_4KB_D_X) | 216 (1u << ADDR_SW_64KB_D_X) | 217 Dcn1NonBpp64SwModeMask; 218 219 const UINT_32 Dcn2NonBpp64SwModeMask = (1u << ADDR_SW_LINEAR) | 220 (1u << ADDR_SW_64KB_S) | 221 (1u << ADDR_SW_64KB_S_T) | 222 (1u << ADDR_SW_64KB_S_X); 223 224 const UINT_32 Dcn2Bpp64SwModeMask = (1u << ADDR_SW_64KB_D) | 225 (1u << ADDR_SW_64KB_D_T) | 226 (1u << ADDR_SW_64KB_D_X) | 227 Dcn2NonBpp64SwModeMask; 228 229 /** 230 ************************************************************************************************************************ 231 * @brief GFX9 meta equation parameters 232 ************************************************************************************************************************ 233 */ 234 struct MetaEqParams 235 { 236 UINT_32 maxMip; 237 UINT_32 elementBytesLog2; 238 UINT_32 numSamplesLog2; 239 ADDR2_META_FLAGS metaFlag; 240 Gfx9DataType dataSurfaceType; 241 AddrSwizzleMode swizzleMode; 242 AddrResourceType resourceType; 243 UINT_32 metaBlkWidthLog2; 244 UINT_32 metaBlkHeightLog2; 245 UINT_32 metaBlkDepthLog2; 246 UINT_32 compBlkWidthLog2; 247 UINT_32 compBlkHeightLog2; 248 UINT_32 compBlkDepthLog2; 249 }; 250 251 /** 252 ************************************************************************************************************************ 253 * @brief This class is the GFX9 specific address library 254 * function set. 255 ************************************************************************************************************************ 256 */ 257 class Gfx9Lib : public Lib 258 { 259 public: 260 /// Creates Gfx9Lib object CreateObj(const Client * pClient)261 static Addr::Lib* CreateObj(const Client* pClient) 262 { 263 VOID* pMem = Object::ClientAlloc(sizeof(Gfx9Lib), pClient); 264 return (pMem != NULL) ? new (pMem) Gfx9Lib(pClient) : NULL; 265 } 266 267 protected: 268 Gfx9Lib(const Client* pClient); 269 virtual ~Gfx9Lib(); 270 HwlIsStandardSwizzle(AddrResourceType resourceType,AddrSwizzleMode swizzleMode)271 virtual BOOL_32 HwlIsStandardSwizzle( 272 AddrResourceType resourceType, 273 AddrSwizzleMode swizzleMode) const 274 { 275 return m_swizzleModeTable[swizzleMode].isStd || 276 (IsTex3d(resourceType) && m_swizzleModeTable[swizzleMode].isDisp); 277 } 278 HwlIsDisplaySwizzle(AddrResourceType resourceType,AddrSwizzleMode swizzleMode)279 virtual BOOL_32 HwlIsDisplaySwizzle( 280 AddrResourceType resourceType, 281 AddrSwizzleMode swizzleMode) const 282 { 283 return IsTex2d(resourceType) && m_swizzleModeTable[swizzleMode].isDisp; 284 } 285 HwlIsThin(AddrResourceType resourceType,AddrSwizzleMode swizzleMode)286 virtual BOOL_32 HwlIsThin( 287 AddrResourceType resourceType, 288 AddrSwizzleMode swizzleMode) const 289 { 290 return ((IsTex2d(resourceType) == TRUE) || 291 ((IsTex3d(resourceType) == TRUE) && 292 (m_swizzleModeTable[swizzleMode].isZ == FALSE) && 293 (m_swizzleModeTable[swizzleMode].isStd == FALSE))); 294 } 295 HwlIsThick(AddrResourceType resourceType,AddrSwizzleMode swizzleMode)296 virtual BOOL_32 HwlIsThick( 297 AddrResourceType resourceType, 298 AddrSwizzleMode swizzleMode) const 299 { 300 return (IsTex3d(resourceType) && 301 (m_swizzleModeTable[swizzleMode].isZ || m_swizzleModeTable[swizzleMode].isStd)); 302 } 303 304 virtual ADDR_E_RETURNCODE HwlComputeHtileInfo( 305 const ADDR2_COMPUTE_HTILE_INFO_INPUT* pIn, 306 ADDR2_COMPUTE_HTILE_INFO_OUTPUT* pOut) const; 307 308 virtual ADDR_E_RETURNCODE HwlComputeCmaskInfo( 309 const ADDR2_COMPUTE_CMASK_INFO_INPUT* pIn, 310 ADDR2_COMPUTE_CMASK_INFO_OUTPUT* pOut) const; 311 312 virtual ADDR_E_RETURNCODE HwlComputeDccInfo( 313 const ADDR2_COMPUTE_DCCINFO_INPUT* pIn, 314 ADDR2_COMPUTE_DCCINFO_OUTPUT* pOut) const; 315 316 virtual ADDR_E_RETURNCODE HwlComputeCmaskAddrFromCoord( 317 const ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT* pIn, 318 ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT* pOut); 319 320 virtual ADDR_E_RETURNCODE HwlComputeHtileAddrFromCoord( 321 const ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT* pIn, 322 ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT* pOut); 323 324 virtual ADDR_E_RETURNCODE HwlComputeHtileCoordFromAddr( 325 const ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT* pIn, 326 ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT* pOut); 327 328 virtual ADDR_E_RETURNCODE HwlSupportComputeDccAddrFromCoord( 329 const ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT* pIn); 330 331 virtual VOID HwlComputeDccAddrFromCoord( 332 const ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT* pIn, 333 ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT* pOut); 334 335 virtual UINT_32 HwlGetEquationIndex( 336 const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn, 337 ADDR2_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const; 338 339 virtual ADDR_E_RETURNCODE HwlComputeBlock256Equation( 340 AddrResourceType rsrcType, 341 AddrSwizzleMode swMode, 342 UINT_32 elementBytesLog2, 343 ADDR_EQUATION* pEquation) const; 344 345 virtual ADDR_E_RETURNCODE HwlComputeThinEquation( 346 AddrResourceType rsrcType, 347 AddrSwizzleMode swMode, 348 UINT_32 elementBytesLog2, 349 ADDR_EQUATION* pEquation) const; 350 351 virtual ADDR_E_RETURNCODE HwlComputeThickEquation( 352 AddrResourceType rsrcType, 353 AddrSwizzleMode swMode, 354 UINT_32 elementBytesLog2, 355 ADDR_EQUATION* pEquation) const; 356 357 // Get equation table pointer and number of equations HwlGetEquationTableInfo(const ADDR_EQUATION ** ppEquationTable)358 virtual UINT_32 HwlGetEquationTableInfo(const ADDR_EQUATION** ppEquationTable) const 359 { 360 *ppEquationTable = m_equationTable; 361 362 return m_numEquations; 363 } 364 365 virtual BOOL_32 IsEquationSupported( 366 AddrResourceType rsrcType, 367 AddrSwizzleMode swMode, 368 UINT_32 elementBytesLog2) const; 369 370 virtual ADDR_E_RETURNCODE HwlComputePipeBankXor( 371 const ADDR2_COMPUTE_PIPEBANKXOR_INPUT* pIn, 372 ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT* pOut) const; 373 374 virtual ADDR_E_RETURNCODE HwlComputeSlicePipeBankXor( 375 const ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT* pIn, 376 ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT* pOut) const; 377 378 virtual ADDR_E_RETURNCODE HwlComputeSubResourceOffsetForSwizzlePattern( 379 const ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT* pIn, 380 ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT* pOut) const; 381 382 virtual ADDR_E_RETURNCODE HwlGetPreferredSurfaceSetting( 383 const ADDR2_GET_PREFERRED_SURF_SETTING_INPUT* pIn, 384 ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT* pOut) const; 385 386 virtual ADDR_E_RETURNCODE HwlComputeSurfaceInfoSanityCheck( 387 const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn) const; 388 389 virtual ADDR_E_RETURNCODE HwlComputeSurfaceInfoTiled( 390 const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn, 391 ADDR2_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const; 392 393 virtual ADDR_E_RETURNCODE HwlComputeSurfaceInfoLinear( 394 const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn, 395 ADDR2_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const; 396 397 virtual ADDR_E_RETURNCODE HwlComputeSurfaceAddrFromCoordTiled( 398 const ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT* pIn, 399 ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT* pOut) const; 400 401 virtual UINT_32 HwlComputeMaxBaseAlignments() const; 402 403 virtual UINT_32 HwlComputeMaxMetaBaseAlignments() const; 404 405 virtual BOOL_32 HwlInitGlobalParams(const ADDR_CREATE_INPUT* pCreateIn); 406 407 virtual ChipFamily HwlConvertChipFamily(UINT_32 uChipFamily, UINT_32 uChipRevision); 408 409 virtual VOID ComputeThinBlockDimension( 410 UINT_32* pWidth, 411 UINT_32* pHeight, 412 UINT_32* pDepth, 413 UINT_32 bpp, 414 UINT_32 numSamples, 415 AddrResourceType resourceType, 416 AddrSwizzleMode swizzleMode) const; 417 418 private: 419 VOID GetRbEquation(CoordEq* pRbEq, UINT_32 rbPerSeLog2, UINT_32 seLog2) const; 420 421 VOID GetDataEquation(CoordEq* pDataEq, Gfx9DataType dataSurfaceType, 422 AddrSwizzleMode swizzleMode, AddrResourceType resourceType, 423 UINT_32 elementBytesLog2, UINT_32 numSamplesLog2) const; 424 425 VOID GetPipeEquation(CoordEq* pPipeEq, CoordEq* pDataEq, 426 UINT_32 pipeInterleaveLog2, UINT_32 numPipesLog2, 427 UINT_32 numSamplesLog2, Gfx9DataType dataSurfaceType, 428 AddrSwizzleMode swizzleMode, AddrResourceType resourceType) const; 429 430 VOID GenMetaEquation(CoordEq* pMetaEq, UINT_32 maxMip, 431 UINT_32 elementBytesLog2, UINT_32 numSamplesLog2, 432 ADDR2_META_FLAGS metaFlag, Gfx9DataType dataSurfaceType, 433 AddrSwizzleMode swizzleMode, AddrResourceType resourceType, 434 UINT_32 metaBlkWidthLog2, UINT_32 metaBlkHeightLog2, 435 UINT_32 metaBlkDepthLog2, UINT_32 compBlkWidthLog2, 436 UINT_32 compBlkHeightLog2, UINT_32 compBlkDepthLog2) const; 437 438 const CoordEq* GetMetaEquation(const MetaEqParams& metaEqParams); 439 440 VOID GetMetaMipInfo(UINT_32 numMipLevels, Dim3d* pMetaBlkDim, 441 BOOL_32 dataThick, ADDR2_META_MIP_INFO* pInfo, 442 UINT_32 mip0Width, UINT_32 mip0Height, UINT_32 mip0Depth, 443 UINT_32* pNumMetaBlkX, UINT_32* pNumMetaBlkY, UINT_32* pNumMetaBlkZ) const; 444 445 BOOL_32 IsValidDisplaySwizzleMode(const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn) const; 446 447 ADDR_E_RETURNCODE ComputeSurfaceLinearPadding( 448 const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn, 449 UINT_32* pMipmap0PaddedWidth, 450 UINT_32* pSlice0PaddedHeight, 451 ADDR2_MIP_INFO* pMipInfo = NULL) const; 452 GetAllowedBlockSet(ADDR2_SWMODE_SET allowedSwModeSet,AddrResourceType rsrcType)453 static ADDR2_BLOCK_SET GetAllowedBlockSet(ADDR2_SWMODE_SET allowedSwModeSet, AddrResourceType rsrcType) 454 { 455 ADDR2_BLOCK_SET allowedBlockSet = {}; 456 457 allowedBlockSet.micro = (allowedSwModeSet.value & Gfx9Blk256BSwModeMask) ? TRUE : FALSE; 458 allowedBlockSet.linear = (allowedSwModeSet.value & Gfx9LinearSwModeMask) ? TRUE : FALSE; 459 460 if (rsrcType == ADDR_RSRC_TEX_3D) 461 { 462 allowedBlockSet.macroThin4KB = (allowedSwModeSet.value & Gfx9Rsrc3dThin4KBSwModeMask) ? TRUE : FALSE; 463 allowedBlockSet.macroThick4KB = (allowedSwModeSet.value & Gfx9Rsrc3dThick4KBSwModeMask) ? TRUE : FALSE; 464 allowedBlockSet.macroThin64KB = (allowedSwModeSet.value & Gfx9Rsrc3dThin64KBSwModeMask) ? TRUE : FALSE; 465 allowedBlockSet.macroThick64KB = (allowedSwModeSet.value & Gfx9Rsrc3dThick64KBSwModeMask) ? TRUE : FALSE; 466 } 467 else 468 { 469 allowedBlockSet.macroThin4KB = (allowedSwModeSet.value & Gfx9Blk4KBSwModeMask) ? TRUE : FALSE; 470 allowedBlockSet.macroThin64KB = (allowedSwModeSet.value & Gfx9Blk64KBSwModeMask) ? TRUE : FALSE; 471 } 472 473 return allowedBlockSet; 474 } 475 GetAllowedSwSet(ADDR2_SWMODE_SET allowedSwModeSet)476 static ADDR2_SWTYPE_SET GetAllowedSwSet(ADDR2_SWMODE_SET allowedSwModeSet) 477 { 478 ADDR2_SWTYPE_SET allowedSwSet = {}; 479 480 allowedSwSet.sw_Z = (allowedSwModeSet.value & Gfx9ZSwModeMask) ? TRUE : FALSE; 481 allowedSwSet.sw_S = (allowedSwModeSet.value & Gfx9StandardSwModeMask) ? TRUE : FALSE; 482 allowedSwSet.sw_D = (allowedSwModeSet.value & Gfx9DisplaySwModeMask) ? TRUE : FALSE; 483 allowedSwSet.sw_R = (allowedSwModeSet.value & Gfx9RotateSwModeMask) ? TRUE : FALSE; 484 485 return allowedSwSet; 486 } 487 IsInMipTail(AddrResourceType resourceType,AddrSwizzleMode swizzleMode,Dim3d mipTailDim,UINT_32 width,UINT_32 height,UINT_32 depth)488 BOOL_32 IsInMipTail( 489 AddrResourceType resourceType, 490 AddrSwizzleMode swizzleMode, 491 Dim3d mipTailDim, 492 UINT_32 width, 493 UINT_32 height, 494 UINT_32 depth) const 495 { 496 BOOL_32 inTail = ((width <= mipTailDim.w) && 497 (height <= mipTailDim.h) && 498 (IsThin(resourceType, swizzleMode) || (depth <= mipTailDim.d))); 499 500 return inTail; 501 } 502 503 BOOL_32 ValidateNonSwModeParams(const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn) const; 504 BOOL_32 ValidateSwModeParams(const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn) const; 505 GetBankXorBits(UINT_32 macroBlockBits)506 UINT_32 GetBankXorBits(UINT_32 macroBlockBits) const 507 { 508 UINT_32 pipeBits = GetPipeXorBits(macroBlockBits); 509 510 // Bank xor bits 511 UINT_32 bankBits = Min(macroBlockBits - pipeBits - m_pipeInterleaveLog2, m_banksLog2); 512 513 return bankBits; 514 } 515 ComputeSurfaceBaseAlignTiled(AddrSwizzleMode swizzleMode)516 UINT_32 ComputeSurfaceBaseAlignTiled(AddrSwizzleMode swizzleMode) const 517 { 518 UINT_32 baseAlign; 519 520 if (IsXor(swizzleMode)) 521 { 522 baseAlign = GetBlockSize(swizzleMode); 523 } 524 else 525 { 526 baseAlign = 256; 527 } 528 529 return baseAlign; 530 } 531 532 // Initialize equation table 533 VOID InitEquationTable(); 534 535 ADDR_E_RETURNCODE ComputeStereoInfo( 536 const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn, 537 ADDR2_COMPUTE_SURFACE_INFO_OUTPUT* pOut, 538 UINT_32* pHeightAlign) const; 539 540 UINT_32 GetMipChainInfo( 541 AddrResourceType resourceType, 542 AddrSwizzleMode swizzleMode, 543 UINT_32 bpp, 544 UINT_32 mip0Width, 545 UINT_32 mip0Height, 546 UINT_32 mip0Depth, 547 UINT_32 blockWidth, 548 UINT_32 blockHeight, 549 UINT_32 blockDepth, 550 UINT_32 numMipLevel, 551 ADDR2_MIP_INFO* pMipInfo) const; 552 553 VOID GetMetaMiptailInfo( 554 ADDR2_META_MIP_INFO* pInfo, 555 Dim3d mipCoord, 556 UINT_32 numMipInTail, 557 Dim3d* pMetaBlkDim) const; 558 559 Dim3d GetMipStartPos( 560 AddrResourceType resourceType, 561 AddrSwizzleMode swizzleMode, 562 UINT_32 width, 563 UINT_32 height, 564 UINT_32 depth, 565 UINT_32 blockWidth, 566 UINT_32 blockHeight, 567 UINT_32 blockDepth, 568 UINT_32 mipId, 569 UINT_32 log2ElementBytes, 570 UINT_32* pMipTailBytesOffset) const; 571 GetMajorMode(AddrResourceType resourceType,AddrSwizzleMode swizzleMode,UINT_32 mip0WidthInBlk,UINT_32 mip0HeightInBlk,UINT_32 mip0DepthInBlk)572 AddrMajorMode GetMajorMode( 573 AddrResourceType resourceType, 574 AddrSwizzleMode swizzleMode, 575 UINT_32 mip0WidthInBlk, 576 UINT_32 mip0HeightInBlk, 577 UINT_32 mip0DepthInBlk) const 578 { 579 BOOL_32 yMajor = (mip0WidthInBlk < mip0HeightInBlk); 580 BOOL_32 xMajor = (yMajor == FALSE); 581 582 if (IsThick(resourceType, swizzleMode)) 583 { 584 yMajor = yMajor && (mip0HeightInBlk >= mip0DepthInBlk); 585 xMajor = xMajor && (mip0WidthInBlk >= mip0DepthInBlk); 586 } 587 588 AddrMajorMode majorMode; 589 if (xMajor) 590 { 591 majorMode = ADDR_MAJOR_X; 592 } 593 else if (yMajor) 594 { 595 majorMode = ADDR_MAJOR_Y; 596 } 597 else 598 { 599 majorMode = ADDR_MAJOR_Z; 600 } 601 602 return majorMode; 603 } 604 GetDccCompressBlk(AddrResourceType resourceType,AddrSwizzleMode swizzleMode,UINT_32 bpp)605 Dim3d GetDccCompressBlk( 606 AddrResourceType resourceType, 607 AddrSwizzleMode swizzleMode, 608 UINT_32 bpp) const 609 { 610 UINT_32 index = Log2(bpp >> 3); 611 Dim3d compressBlkDim; 612 613 if (IsThin(resourceType, swizzleMode)) 614 { 615 compressBlkDim.w = Block256_2d[index].w; 616 compressBlkDim.h = Block256_2d[index].h; 617 compressBlkDim.d = 1; 618 } 619 else if (IsStandardSwizzle(resourceType, swizzleMode)) 620 { 621 compressBlkDim = Block256_3dS[index]; 622 } 623 else 624 { 625 compressBlkDim = Block256_3dZ[index]; 626 } 627 628 return compressBlkDim; 629 } 630 631 static const UINT_32 MaxSeLog2 = 3; 632 static const UINT_32 MaxRbPerSeLog2 = 2; 633 634 static const Dim3d Block256_3dS[MaxNumOfBpp]; 635 static const Dim3d Block256_3dZ[MaxNumOfBpp]; 636 637 static const UINT_32 MipTailOffset256B[]; 638 639 static const SwizzleModeFlags SwizzleModeTable[ADDR_SW_MAX_TYPE]; 640 641 static const UINT_32 MaxCachedMetaEq = 2; 642 643 Gfx9ChipSettings m_settings; 644 645 CoordEq m_cachedMetaEq[MaxCachedMetaEq]; 646 MetaEqParams m_cachedMetaEqKey[MaxCachedMetaEq]; 647 UINT_32 m_metaEqOverrideIndex; 648 }; 649 650 } // V2 651 } // Addr 652 653 #endif 654 655