1 /* 2 * Copyright © 2014 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 addrinterface.h 30 * @brief Contains the addrlib interfaces declaration and parameter defines 31 **************************************************************************************************** 32 */ 33 #ifndef __ADDR_INTERFACE_H__ 34 #define __ADDR_INTERFACE_H__ 35 36 #include "addrtypes.h" 37 38 #if defined(__cplusplus) 39 extern "C" 40 { 41 #endif 42 43 #define ADDRLIB_VERSION_MAJOR 6 44 #define ADDRLIB_VERSION_MINOR 2 45 #define ADDRLIB_VERSION ((ADDRLIB_VERSION_MAJOR << 16) | ADDRLIB_VERSION_MINOR) 46 47 /// Virtually all interface functions need ADDR_HANDLE as first parameter 48 typedef VOID* ADDR_HANDLE; 49 50 /// Client handle used in callbacks 51 typedef VOID* ADDR_CLIENT_HANDLE; 52 53 /** 54 * ///////////////////////////////////////////////////////////////////////////////////////////////// 55 * // Callback functions 56 * ///////////////////////////////////////////////////////////////////////////////////////////////// 57 * typedef VOID* (ADDR_API* ADDR_ALLOCSYSMEM)( 58 * const ADDR_ALLOCSYSMEM_INPUT* pInput); 59 * typedef ADDR_E_RETURNCODE (ADDR_API* ADDR_FREESYSMEM)( 60 * VOID* pVirtAddr); 61 * typedef ADDR_E_RETURNCODE (ADDR_API* ADDR_DEBUGPRINT)( 62 * const ADDR_DEBUGPRINT_INPUT* pInput); 63 * 64 * ///////////////////////////////////////////////////////////////////////////////////////////////// 65 * // Create/Destroy/Config functions 66 * ///////////////////////////////////////////////////////////////////////////////////////////////// 67 * AddrCreate() 68 * AddrDestroy() 69 * 70 * ///////////////////////////////////////////////////////////////////////////////////////////////// 71 * // Surface functions 72 * ///////////////////////////////////////////////////////////////////////////////////////////////// 73 * AddrComputeSurfaceInfo() 74 * AddrComputeSurfaceAddrFromCoord() 75 * AddrComputeSurfaceCoordFromAddr() 76 * 77 * ///////////////////////////////////////////////////////////////////////////////////////////////// 78 * // HTile functions 79 * ///////////////////////////////////////////////////////////////////////////////////////////////// 80 * AddrComputeHtileInfo() 81 * AddrComputeHtileAddrFromCoord() 82 * AddrComputeHtileCoordFromAddr() 83 * 84 * ///////////////////////////////////////////////////////////////////////////////////////////////// 85 * // C-mask functions 86 * ///////////////////////////////////////////////////////////////////////////////////////////////// 87 * AddrComputeCmaskInfo() 88 * AddrComputeCmaskAddrFromCoord() 89 * AddrComputeCmaskCoordFromAddr() 90 * 91 * ///////////////////////////////////////////////////////////////////////////////////////////////// 92 * // F-mask functions 93 * ///////////////////////////////////////////////////////////////////////////////////////////////// 94 * AddrComputeFmaskInfo() 95 * AddrComputeFmaskAddrFromCoord() 96 * AddrComputeFmaskCoordFromAddr() 97 * 98 * ///////////////////////////////////////////////////////////////////////////////////////////////// 99 * // Element/Utility functions 100 * ///////////////////////////////////////////////////////////////////////////////////////////////// 101 * ElemFlt32ToDepthPixel() 102 * ElemFlt32ToColorPixel() 103 * AddrExtractBankPipeSwizzle() 104 * AddrCombineBankPipeSwizzle() 105 * AddrComputeSliceSwizzle() 106 * AddrConvertTileInfoToHW() 107 * AddrConvertTileIndex() 108 * AddrConvertTileIndex1() 109 * AddrGetTileIndex() 110 * AddrComputeBaseSwizzle() 111 * AddrUseTileIndex() 112 * AddrUseCombinedSwizzle() 113 * 114 **/ 115 116 //////////////////////////////////////////////////////////////////////////////////////////////////// 117 // Callback functions 118 //////////////////////////////////////////////////////////////////////////////////////////////////// 119 120 /** 121 **************************************************************************************************** 122 * @brief channel setting structure 123 **************************************************************************************************** 124 */ 125 typedef union _ADDR_CHANNEL_SETTING 126 { 127 struct 128 { 129 UINT_8 valid : 1; ///< Indicate whehter this channel setting is valid 130 UINT_8 channel : 2; ///< 0 for x channel, 1 for y channel, 2 for z channel 131 UINT_8 index : 5; ///< Channel index 132 }; 133 UINT_8 value; ///< Value 134 } ADDR_CHANNEL_SETTING; 135 136 /** 137 **************************************************************************************************** 138 * @brief address equation key structure 139 **************************************************************************************************** 140 */ 141 typedef union _ADDR_EQUATION_KEY 142 { 143 struct 144 { 145 UINT_32 log2ElementBytes : 3; ///< Log2 of Bytes per pixel 146 UINT_32 tileMode : 5; ///< Tile mode 147 UINT_32 microTileType : 3; ///< Micro tile type 148 UINT_32 pipeConfig : 5; ///< pipe config 149 UINT_32 numBanksLog2 : 3; ///< Number of banks log2 150 UINT_32 bankWidth : 4; ///< Bank width 151 UINT_32 bankHeight : 4; ///< Bank height 152 UINT_32 macroAspectRatio : 3; ///< Macro tile aspect ratio 153 UINT_32 prt : 1; ///< SI only, indicate whether this equation is for prt 154 UINT_32 reserved : 1; ///< Reserved bit 155 } fields; 156 UINT_32 value; 157 } ADDR_EQUATION_KEY; 158 159 /** 160 **************************************************************************************************** 161 * @brief address equation structure 162 **************************************************************************************************** 163 */ 164 #define ADDR_MAX_EQUATION_BIT 20u 165 166 // Invalid equation index 167 #define ADDR_INVALID_EQUATION_INDEX 0xFFFFFFFF 168 169 typedef struct _ADDR_EQUATION 170 { 171 ADDR_CHANNEL_SETTING addr[ADDR_MAX_EQUATION_BIT]; ///< addr setting 172 ///< each bit is result of addr ^ xor ^ xor2 173 ADDR_CHANNEL_SETTING xor1[ADDR_MAX_EQUATION_BIT]; ///< xor setting 174 ADDR_CHANNEL_SETTING xor2[ADDR_MAX_EQUATION_BIT]; ///< xor2 setting 175 UINT_32 numBits; ///< The number of bits in equation 176 BOOL_32 stackedDepthSlices; ///< TRUE if depth slices are treated as being 177 ///< stacked vertically prior to swizzling 178 } ADDR_EQUATION; 179 180 181 /** 182 **************************************************************************************************** 183 * @brief Alloc system memory flags. 184 * @note These flags are reserved for future use and if flags are added will minimize the impact 185 * of the client. 186 **************************************************************************************************** 187 */ 188 typedef union _ADDR_ALLOCSYSMEM_FLAGS 189 { 190 struct 191 { 192 UINT_32 reserved : 32; ///< Reserved for future use. 193 } fields; 194 UINT_32 value; 195 196 } ADDR_ALLOCSYSMEM_FLAGS; 197 198 /** 199 **************************************************************************************************** 200 * @brief Alloc system memory input structure 201 **************************************************************************************************** 202 */ 203 typedef struct _ADDR_ALLOCSYSMEM_INPUT 204 { 205 UINT_32 size; ///< Size of this structure in bytes 206 207 ADDR_ALLOCSYSMEM_FLAGS flags; ///< System memory flags. 208 UINT_32 sizeInBytes; ///< System memory allocation size in bytes. 209 ADDR_CLIENT_HANDLE hClient; ///< Client handle 210 } ADDR_ALLOCSYSMEM_INPUT; 211 212 /** 213 **************************************************************************************************** 214 * ADDR_ALLOCSYSMEM 215 * @brief 216 * Allocate system memory callback function. Returns valid pointer on success. 217 **************************************************************************************************** 218 */ 219 typedef VOID* (ADDR_API* ADDR_ALLOCSYSMEM)( 220 const ADDR_ALLOCSYSMEM_INPUT* pInput); 221 222 /** 223 **************************************************************************************************** 224 * @brief Free system memory input structure 225 **************************************************************************************************** 226 */ 227 typedef struct _ADDR_FREESYSMEM_INPUT 228 { 229 UINT_32 size; ///< Size of this structure in bytes 230 231 VOID* pVirtAddr; ///< Virtual address 232 ADDR_CLIENT_HANDLE hClient; ///< Client handle 233 } ADDR_FREESYSMEM_INPUT; 234 235 /** 236 **************************************************************************************************** 237 * ADDR_FREESYSMEM 238 * @brief 239 * Free system memory callback function. 240 * Returns ADDR_OK on success. 241 **************************************************************************************************** 242 */ 243 typedef ADDR_E_RETURNCODE (ADDR_API* ADDR_FREESYSMEM)( 244 const ADDR_FREESYSMEM_INPUT* pInput); 245 246 /** 247 **************************************************************************************************** 248 * @brief Print debug message input structure 249 **************************************************************************************************** 250 */ 251 typedef struct _ADDR_DEBUGPRINT_INPUT 252 { 253 UINT_32 size; ///< Size of this structure in bytes 254 255 CHAR* pDebugString; ///< Debug print string 256 va_list ap; ///< Variable argument list 257 ADDR_CLIENT_HANDLE hClient; ///< Client handle 258 } ADDR_DEBUGPRINT_INPUT; 259 260 /** 261 **************************************************************************************************** 262 * ADDR_DEBUGPRINT 263 * @brief 264 * Print debug message callback function. 265 * Returns ADDR_OK on success. 266 **************************************************************************************************** 267 */ 268 typedef ADDR_E_RETURNCODE (ADDR_API* ADDR_DEBUGPRINT)( 269 const ADDR_DEBUGPRINT_INPUT* pInput); 270 271 /** 272 **************************************************************************************************** 273 * ADDR_CALLBACKS 274 * 275 * @brief 276 * Address Library needs client to provide system memory alloc/free routines. 277 **************************************************************************************************** 278 */ 279 typedef struct _ADDR_CALLBACKS 280 { 281 ADDR_ALLOCSYSMEM allocSysMem; ///< Routine to allocate system memory 282 ADDR_FREESYSMEM freeSysMem; ///< Routine to free system memory 283 ADDR_DEBUGPRINT debugPrint; ///< Routine to print debug message 284 } ADDR_CALLBACKS; 285 286 //////////////////////////////////////////////////////////////////////////////////////////////////// 287 // Create/Destroy functions 288 //////////////////////////////////////////////////////////////////////////////////////////////////// 289 290 /** 291 **************************************************************************************************** 292 * ADDR_CREATE_FLAGS 293 * 294 * @brief 295 * This structure is used to pass some setup in creation of AddrLib 296 * @note 297 **************************************************************************************************** 298 */ 299 typedef union _ADDR_CREATE_FLAGS 300 { 301 struct 302 { 303 UINT_32 noCubeMipSlicesPad : 1; ///< Turn cubemap faces padding off 304 UINT_32 fillSizeFields : 1; ///< If clients fill size fields in all input and 305 /// output structure 306 UINT_32 useTileIndex : 1; ///< Make tileIndex field in input valid 307 UINT_32 useCombinedSwizzle : 1; ///< Use combined tile swizzle 308 UINT_32 checkLast2DLevel : 1; ///< Check the last 2D mip sub level 309 UINT_32 useHtileSliceAlign : 1; ///< Do htile single slice alignment 310 UINT_32 allowLargeThickTile : 1; ///< Allow 64*thickness*bytesPerPixel > rowSize 311 UINT_32 reserved : 25; ///< Reserved bits for future use 312 }; 313 314 UINT_32 value; 315 } ADDR_CREATE_FLAGS; 316 317 /** 318 **************************************************************************************************** 319 * ADDR_REGISTER_VALUE 320 * 321 * @brief 322 * Data from registers to setup AddrLib global data, used in AddrCreate 323 **************************************************************************************************** 324 */ 325 typedef struct _ADDR_REGISTER_VALUE 326 { 327 UINT_32 gbAddrConfig; ///< For R8xx, use GB_ADDR_CONFIG register value. 328 /// For R6xx/R7xx, use GB_TILING_CONFIG. 329 /// But they can be treated as the same. 330 /// if this value is 0, use chip to set default value 331 UINT_32 backendDisables; ///< 1 bit per backend, starting with LSB. 1=disabled,0=enabled. 332 /// Register value of CC_RB_BACKEND_DISABLE.BACKEND_DISABLE 333 334 /// R800 registers----------------------------------------------- 335 UINT_32 noOfBanks; ///< Number of h/w ram banks - For r800: MC_ARB_RAMCFG.NOOFBANK 336 /// No enums for this value in h/w header files 337 /// 0: 4 338 /// 1: 8 339 /// 2: 16 340 UINT_32 noOfRanks; /// MC_ARB_RAMCFG.NOOFRANK 341 /// 0: 1 342 /// 1: 2 343 /// SI (R1000) registers----------------------------------------- 344 const UINT_32* pTileConfig; ///< Global tile setting tables 345 UINT_32 noOfEntries; ///< Number of entries in pTileConfig 346 347 ///< CI registers------------------------------------------------- 348 const UINT_32* pMacroTileConfig; ///< Global macro tile mode table 349 UINT_32 noOfMacroEntries; ///< Number of entries in pMacroTileConfig 350 351 ///< GFX9 HW parameters 352 UINT_32 blockVarSizeLog2; ///< SW_VAR_* block size 353 } ADDR_REGISTER_VALUE; 354 355 /** 356 **************************************************************************************************** 357 * ADDR_CREATE_INPUT 358 * 359 * @brief 360 * Parameters use to create an AddrLib Object. Caller must provide all fields. 361 * 362 **************************************************************************************************** 363 */ 364 typedef struct _ADDR_CREATE_INPUT 365 { 366 UINT_32 size; ///< Size of this structure in bytes 367 368 UINT_32 chipEngine; ///< Chip Engine 369 UINT_32 chipFamily; ///< Chip Family 370 UINT_32 chipRevision; ///< Chip Revision 371 ADDR_CALLBACKS callbacks; ///< Callbacks for sysmem alloc/free/print 372 ADDR_CREATE_FLAGS createFlags; ///< Flags to setup AddrLib 373 ADDR_REGISTER_VALUE regValue; ///< Data from registers to setup AddrLib global data 374 ADDR_CLIENT_HANDLE hClient; ///< Client handle 375 UINT_32 minPitchAlignPixels; ///< Minimum pitch alignment in pixels 376 } ADDR_CREATE_INPUT; 377 378 /** 379 **************************************************************************************************** 380 * ADDR_CREATEINFO_OUTPUT 381 * 382 * @brief 383 * Return AddrLib handle to client driver 384 * 385 **************************************************************************************************** 386 */ 387 typedef struct _ADDR_CREATE_OUTPUT 388 { 389 UINT_32 size; ///< Size of this structure in bytes 390 391 ADDR_HANDLE hLib; ///< Address lib handle 392 393 UINT_32 numEquations; ///< Number of equations in the table 394 const ADDR_EQUATION* pEquationTable; ///< Pointer to the equation table 395 } ADDR_CREATE_OUTPUT; 396 397 /** 398 **************************************************************************************************** 399 * AddrCreate 400 * 401 * @brief 402 * Create AddrLib object, must be called before any interface calls 403 * 404 * @return 405 * ADDR_OK if successful 406 **************************************************************************************************** 407 */ 408 ADDR_E_RETURNCODE ADDR_API AddrCreate( 409 const ADDR_CREATE_INPUT* pAddrCreateIn, 410 ADDR_CREATE_OUTPUT* pAddrCreateOut); 411 412 413 414 /** 415 **************************************************************************************************** 416 * AddrDestroy 417 * 418 * @brief 419 * Destroy AddrLib object, must be called to free internally allocated resources. 420 * 421 * @return 422 * ADDR_OK if successful 423 **************************************************************************************************** 424 */ 425 ADDR_E_RETURNCODE ADDR_API AddrDestroy( 426 ADDR_HANDLE hLib); 427 428 429 430 //////////////////////////////////////////////////////////////////////////////////////////////////// 431 // Surface functions 432 //////////////////////////////////////////////////////////////////////////////////////////////////// 433 434 /** 435 **************************************************************************************************** 436 * @brief 437 * Bank/tiling parameters. On function input, these can be set as desired or 438 * left 0 for AddrLib to calculate/default. On function output, these are the actual 439 * parameters used. 440 * @note 441 * Valid bankWidth/bankHeight value: 442 * 1,2,4,8. They are factors instead of pixels or bytes. 443 * 444 * The bank number remains constant across each row of the 445 * macro tile as each pipe is selected, so the number of 446 * tiles in the x direction with the same bank number will 447 * be bank_width * num_pipes. 448 **************************************************************************************************** 449 */ 450 typedef struct _ADDR_TILEINFO 451 { 452 /// Any of these parameters can be set to 0 to use the HW default. 453 UINT_32 banks; ///< Number of banks, numerical value 454 UINT_32 bankWidth; ///< Number of tiles in the X direction in the same bank 455 UINT_32 bankHeight; ///< Number of tiles in the Y direction in the same bank 456 UINT_32 macroAspectRatio; ///< Macro tile aspect ratio. 1-1:1, 2-4:1, 4-16:1, 8-64:1 457 UINT_32 tileSplitBytes; ///< Tile split size, in bytes 458 AddrPipeCfg pipeConfig; ///< Pipe Config = HW enum + 1 459 } ADDR_TILEINFO; 460 461 // Create a define to avoid client change. The removal of R800 is because we plan to implement SI 462 // within 800 HWL - An AddrPipeCfg is added in above data structure 463 typedef ADDR_TILEINFO ADDR_R800_TILEINFO; 464 465 /** 466 **************************************************************************************************** 467 * @brief 468 * Information needed by quad buffer stereo support 469 **************************************************************************************************** 470 */ 471 typedef struct _ADDR_QBSTEREOINFO 472 { 473 UINT_32 eyeHeight; ///< Height (in pixel rows) to right eye 474 UINT_32 rightOffset; ///< Offset (in bytes) to right eye 475 UINT_32 rightSwizzle; ///< TileSwizzle for right eyes 476 } ADDR_QBSTEREOINFO; 477 478 /** 479 **************************************************************************************************** 480 * ADDR_SURFACE_FLAGS 481 * 482 * @brief 483 * Surface flags 484 **************************************************************************************************** 485 */ 486 typedef union _ADDR_SURFACE_FLAGS 487 { 488 struct 489 { 490 UINT_32 color : 1; ///< Flag indicates this is a color buffer 491 UINT_32 depth : 1; ///< Flag indicates this is a depth/stencil buffer 492 UINT_32 stencil : 1; ///< Flag indicates this is a stencil buffer 493 UINT_32 texture : 1; ///< Flag indicates this is a texture 494 UINT_32 cube : 1; ///< Flag indicates this is a cubemap 495 UINT_32 volume : 1; ///< Flag indicates this is a volume texture 496 UINT_32 fmask : 1; ///< Flag indicates this is an fmask 497 UINT_32 cubeAsArray : 1; ///< Flag indicates if treat cubemap as arrays 498 UINT_32 compressZ : 1; ///< Flag indicates z buffer is compressed 499 UINT_32 overlay : 1; ///< Flag indicates this is an overlay surface 500 UINT_32 noStencil : 1; ///< Flag indicates this depth has no separate stencil 501 UINT_32 display : 1; ///< Flag indicates this should match display controller req. 502 UINT_32 opt4Space : 1; ///< Flag indicates this surface should be optimized for space 503 /// i.e. save some memory but may lose performance 504 UINT_32 prt : 1; ///< Flag for partially resident texture 505 UINT_32 qbStereo : 1; ///< Quad buffer stereo surface 506 UINT_32 pow2Pad : 1; ///< SI: Pad to pow2, must set for mipmap (include level0) 507 UINT_32 interleaved : 1; ///< Special flag for interleaved YUV surface padding 508 UINT_32 tcCompatible : 1; ///< Flag indicates surface needs to be shader readable 509 UINT_32 dispTileType : 1; ///< NI: force display Tiling for 128 bit shared resoruce 510 UINT_32 dccCompatible : 1; ///< VI: whether to make MSAA surface support dcc fast clear 511 UINT_32 dccPipeWorkaround : 1; ///< VI: whether to workaround the HW limit that 512 /// dcc can't be enabled if pipe config of tile mode 513 /// is different from that of ASIC, this flag 514 /// is address lib internal flag, client should ignore it 515 UINT_32 czDispCompatible : 1; ///< SI+: CZ family has a HW bug needs special alignment. 516 /// This flag indicates we need to follow the 517 /// alignment with CZ families or other ASICs under 518 /// PX configuration + CZ. 519 UINT_32 nonSplit : 1; ///< CI: depth texture should not be split 520 UINT_32 disableLinearOpt : 1; ///< Disable tile mode optimization to linear 521 UINT_32 needEquation : 1; ///< Make the surface tile setting equation compatible. 522 /// This flag indicates we need to override tile 523 /// mode to PRT_* tile mode to disable slice rotation, 524 /// which is needed by swizzle pattern equation. 525 UINT_32 skipIndicesOutput : 1; ///< Skipping indices in output. 526 UINT_32 rotateDisplay : 1; ///< Rotate micro tile type 527 UINT_32 minimizeAlignment : 1; ///< Minimize alignment 528 UINT_32 preferEquation : 1; ///< Return equation index without adjusting tile mode 529 UINT_32 matchStencilTileCfg : 1; ///< Select tile index of stencil as well as depth surface 530 /// to make sure they share same tile config parameters 531 UINT_32 reserved : 2; ///< Reserved bits 532 }; 533 534 UINT_32 value; 535 } ADDR_SURFACE_FLAGS; 536 537 /** 538 **************************************************************************************************** 539 * ADDR_COMPUTE_SURFACE_INFO_INPUT 540 * 541 * @brief 542 * Input structure for AddrComputeSurfaceInfo 543 **************************************************************************************************** 544 */ 545 typedef struct _ADDR_COMPUTE_SURFACE_INFO_INPUT 546 { 547 UINT_32 size; ///< Size of this structure in bytes 548 549 AddrTileMode tileMode; ///< Tile mode 550 AddrFormat format; ///< If format is set to valid one, bpp/width/height 551 /// might be overwritten 552 UINT_32 bpp; ///< Bits per pixel 553 UINT_32 numSamples; ///< Number of samples 554 UINT_32 width; ///< Width, in pixels 555 UINT_32 height; ///< Height, in pixels 556 UINT_32 numSlices; ///< Number of surface slices or depth 557 UINT_32 slice; ///< Slice index 558 UINT_32 mipLevel; ///< Current mipmap level 559 UINT_32 numMipLevels; ///< Number of mips in mip chain 560 ADDR_SURFACE_FLAGS flags; ///< Surface type flags 561 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as 562 /// number of samples for normal AA; Set it to the 563 /// number of fragments for EQAA 564 /// r800 and later HWL parameters 565 // Needed by 2D tiling, for linear and 1D tiling, just keep them 0's 566 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Set to 0 to default/calculate 567 AddrTileType tileType; ///< Micro tiling type, not needed when tileIndex != -1 568 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it 569 /// while the global useTileIndex is set to 1 570 UINT_32 basePitch; ///< Base level pitch in pixels, 0 means ignored, is a 571 /// must for mip levels from SI+. 572 /// Don't use pitch in blocks for compressed formats! 573 UINT_32 maxBaseAlign; ///< Max base alignment request from client 574 UINT_32 pitchAlign; ///< Pitch alignment request from client 575 UINT_32 heightAlign; ///< Height alignment request from client 576 } ADDR_COMPUTE_SURFACE_INFO_INPUT; 577 578 /** 579 **************************************************************************************************** 580 * ADDR_COMPUTE_SURFACE_INFO_OUTPUT 581 * 582 * @brief 583 * Output structure for AddrComputeSurfInfo 584 * @note 585 Element: AddrLib unit for computing. e.g. BCn: 4x4 blocks; R32B32B32: 32bit with 3x pitch 586 Pixel: Original pixel 587 **************************************************************************************************** 588 */ 589 typedef struct _ADDR_COMPUTE_SURFACE_INFO_OUTPUT 590 { 591 UINT_32 size; ///< Size of this structure in bytes 592 593 UINT_32 pitch; ///< Pitch in elements (in blocks for compressed formats) 594 UINT_32 height; ///< Height in elements (in blocks for compressed formats) 595 UINT_32 depth; ///< Number of slice/depth 596 UINT_64 surfSize; ///< Surface size in bytes 597 AddrTileMode tileMode; ///< Actual tile mode. May differ from that in input 598 UINT_32 baseAlign; ///< Base address alignment 599 UINT_32 pitchAlign; ///< Pitch alignment, in elements 600 UINT_32 heightAlign; ///< Height alignment, in elements 601 UINT_32 depthAlign; ///< Depth alignment, aligned to thickness, for 3d texture 602 UINT_32 bpp; ///< Bits per elements (e.g. blocks for BCn, 1/3 for 96bit) 603 UINT_32 pixelPitch; ///< Pitch in original pixels 604 UINT_32 pixelHeight; ///< Height in original pixels 605 UINT_32 pixelBits; ///< Original bits per pixel, passed from input 606 UINT_64 sliceSize; ///< Size of slice specified by input's slice 607 /// The result is controlled by surface flags & createFlags 608 /// By default this value equals to surfSize for volume 609 UINT_32 pitchTileMax; ///< PITCH_TILE_MAX value for h/w register 610 UINT_32 heightTileMax; ///< HEIGHT_TILE_MAX value for h/w register 611 UINT_32 sliceTileMax; ///< SLICE_TILE_MAX value for h/w register 612 613 UINT_32 numSamples; ///< Pass the effective numSamples processed in this call 614 615 /// r800 and later HWL parameters 616 ADDR_TILEINFO* pTileInfo; ///< Tile parameters used. Filled in if 0 on input 617 AddrTileType tileType; ///< Micro tiling type, only valid when tileIndex != -1 618 INT_32 tileIndex; ///< Tile index, MAY be "downgraded" 619 620 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI) 621 /// Output flags 622 struct 623 { 624 /// Special information to work around SI mipmap swizzle bug UBTS #317508 625 UINT_32 last2DLevel : 1; ///< TRUE if this is the last 2D(3D) tiled 626 ///< Only meaningful when create flag checkLast2DLevel is set 627 UINT_32 tcCompatible : 1; ///< If the surface can be shader compatible 628 UINT_32 dccUnsupport : 1; ///< If the surface can support DCC compressed rendering 629 UINT_32 prtTileIndex : 1; ///< SI only, indicate the returned tile index is for PRT 630 ///< If address lib return true for mip 0, client should set prt flag 631 ///< for child mips in subsequent compute surface info calls 632 UINT_32 reserved :28; ///< Reserved bits 633 }; 634 635 UINT_32 equationIndex; ///< Equation index in the equation table; 636 637 UINT_32 blockWidth; ///< Width in element inside one block(1D->Micro, 2D->Macro) 638 UINT_32 blockHeight; ///< Height in element inside one block(1D->Micro, 2D->Macro) 639 UINT_32 blockSlices; ///< Slice number inside one block(1D->Micro, 2D->Macro) 640 641 /// Stereo info 642 ADDR_QBSTEREOINFO* pStereoInfo;///< Stereo information, needed when .qbStereo flag is TRUE 643 644 INT_32 stencilTileIdx; ///< stencil tile index output when matchStencilTileCfg was set 645 } ADDR_COMPUTE_SURFACE_INFO_OUTPUT; 646 647 /** 648 **************************************************************************************************** 649 * AddrComputeSurfaceInfo 650 * 651 * @brief 652 * Compute surface width/height/depth/alignments and suitable tiling mode 653 **************************************************************************************************** 654 */ 655 ADDR_E_RETURNCODE ADDR_API AddrComputeSurfaceInfo( 656 ADDR_HANDLE hLib, 657 const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn, 658 ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut); 659 660 661 662 /** 663 **************************************************************************************************** 664 * ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT 665 * 666 * @brief 667 * Input structure for AddrComputeSurfaceAddrFromCoord 668 **************************************************************************************************** 669 */ 670 typedef struct _ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT 671 { 672 UINT_32 size; ///< Size of this structure in bytes 673 674 UINT_32 x; ///< X coordinate 675 UINT_32 y; ///< Y coordinate 676 UINT_32 slice; ///< Slice index 677 UINT_32 sample; ///< Sample index, use fragment index for EQAA 678 679 UINT_32 bpp; ///< Bits per pixel 680 UINT_32 pitch; ///< Surface pitch, in pixels 681 UINT_32 height; ///< Surface height, in pixels 682 UINT_32 numSlices; ///< Surface depth 683 UINT_32 numSamples; ///< Number of samples 684 685 AddrTileMode tileMode; ///< Tile mode 686 BOOL_32 isDepth; ///< TRUE if the surface uses depth sample ordering within 687 /// micro tile. Textures can also choose depth sample order 688 UINT_32 tileBase; ///< Base offset (in bits) inside micro tile which handles 689 /// the case that components are stored separately 690 UINT_32 compBits; ///< The component bits actually needed(for planar surface) 691 692 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as 693 /// number of samples for normal AA; Set it to the 694 /// number of fragments for EQAA 695 /// r800 and later HWL parameters 696 // Used for 1D tiling above 697 AddrTileType tileType; ///< See defintion of AddrTileType 698 struct 699 { 700 UINT_32 ignoreSE : 1; ///< TRUE if shader engines are ignored. This is texture 701 /// only flag. Only non-RT texture can set this to TRUE 702 UINT_32 reserved :31; ///< Reserved for future use. 703 }; 704 // 2D tiling needs following structure 705 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Client must provide all data 706 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it 707 /// while the global useTileIndex is set to 1 708 union 709 { 710 struct 711 { 712 UINT_32 bankSwizzle; ///< Bank swizzle 713 UINT_32 pipeSwizzle; ///< Pipe swizzle 714 }; 715 UINT_32 tileSwizzle; ///< Combined swizzle, if useCombinedSwizzle is TRUE 716 }; 717 } ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT; 718 719 /** 720 **************************************************************************************************** 721 * ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT 722 * 723 * @brief 724 * Output structure for AddrComputeSurfaceAddrFromCoord 725 **************************************************************************************************** 726 */ 727 typedef struct _ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT 728 { 729 UINT_32 size; ///< Size of this structure in bytes 730 731 UINT_64 addr; ///< Byte address 732 UINT_32 bitPosition; ///< Bit position within surfaceAddr, 0-7. 733 /// For surface bpp < 8, e.g. FMT_1. 734 UINT_32 prtBlockIndex; ///< Index of a PRT tile (64K block) 735 } ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT; 736 737 /** 738 **************************************************************************************************** 739 * AddrComputeSurfaceAddrFromCoord 740 * 741 * @brief 742 * Compute surface address from a given coordinate. 743 **************************************************************************************************** 744 */ 745 ADDR_E_RETURNCODE ADDR_API AddrComputeSurfaceAddrFromCoord( 746 ADDR_HANDLE hLib, 747 const ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT* pIn, 748 ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT* pOut); 749 750 751 752 /** 753 **************************************************************************************************** 754 * ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT 755 * 756 * @brief 757 * Input structure for AddrComputeSurfaceCoordFromAddr 758 **************************************************************************************************** 759 */ 760 typedef struct _ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT 761 { 762 UINT_32 size; ///< Size of this structure in bytes 763 764 UINT_64 addr; ///< Address in bytes 765 UINT_32 bitPosition; ///< Bit position in addr. 0-7. for surface bpp < 8, 766 /// e.g. FMT_1; 767 UINT_32 bpp; ///< Bits per pixel 768 UINT_32 pitch; ///< Pitch, in pixels 769 UINT_32 height; ///< Height in pixels 770 UINT_32 numSlices; ///< Surface depth 771 UINT_32 numSamples; ///< Number of samples 772 773 AddrTileMode tileMode; ///< Tile mode 774 BOOL_32 isDepth; ///< Surface uses depth sample ordering within micro tile. 775 /// Note: Textures can choose depth sample order as well. 776 UINT_32 tileBase; ///< Base offset (in bits) inside micro tile which handles 777 /// the case that components are stored separately 778 UINT_32 compBits; ///< The component bits actually needed(for planar surface) 779 780 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as 781 /// number of samples for normal AA; Set it to the 782 /// number of fragments for EQAA 783 /// r800 and later HWL parameters 784 // Used for 1D tiling above 785 AddrTileType tileType; ///< See defintion of AddrTileType 786 struct 787 { 788 UINT_32 ignoreSE : 1; ///< TRUE if shader engines are ignored. This is texture 789 /// only flag. Only non-RT texture can set this to TRUE 790 UINT_32 reserved :31; ///< Reserved for future use. 791 }; 792 // 2D tiling needs following structure 793 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Client must provide all data 794 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it 795 /// while the global useTileIndex is set to 1 796 union 797 { 798 struct 799 { 800 UINT_32 bankSwizzle; ///< Bank swizzle 801 UINT_32 pipeSwizzle; ///< Pipe swizzle 802 }; 803 UINT_32 tileSwizzle; ///< Combined swizzle, if useCombinedSwizzle is TRUE 804 }; 805 } ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT; 806 807 /** 808 **************************************************************************************************** 809 * ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT 810 * 811 * @brief 812 * Output structure for AddrComputeSurfaceCoordFromAddr 813 **************************************************************************************************** 814 */ 815 typedef struct _ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT 816 { 817 UINT_32 size; ///< Size of this structure in bytes 818 819 UINT_32 x; ///< X coordinate 820 UINT_32 y; ///< Y coordinate 821 UINT_32 slice; ///< Index of slices 822 UINT_32 sample; ///< Index of samples, means fragment index for EQAA 823 } ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT; 824 825 /** 826 **************************************************************************************************** 827 * AddrComputeSurfaceCoordFromAddr 828 * 829 * @brief 830 * Compute coordinate from a given surface address 831 **************************************************************************************************** 832 */ 833 ADDR_E_RETURNCODE ADDR_API AddrComputeSurfaceCoordFromAddr( 834 ADDR_HANDLE hLib, 835 const ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT* pIn, 836 ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT* pOut); 837 838 //////////////////////////////////////////////////////////////////////////////////////////////////// 839 // HTile functions 840 //////////////////////////////////////////////////////////////////////////////////////////////////// 841 842 /** 843 **************************************************************************************************** 844 * ADDR_HTILE_FLAGS 845 * 846 * @brief 847 * HTILE flags 848 **************************************************************************************************** 849 */ 850 typedef union _ADDR_HTILE_FLAGS 851 { 852 struct 853 { 854 UINT_32 tcCompatible : 1; ///< Flag indicates surface needs to be shader readable 855 UINT_32 skipTcCompatSizeAlign : 1; ///< Flag indicates that addrLib will not align htile 856 /// size to 256xBankxPipe when computing tc-compatible 857 /// htile info. 858 UINT_32 reserved : 30; ///< Reserved bits 859 }; 860 861 UINT_32 value; 862 } ADDR_HTILE_FLAGS; 863 864 /** 865 **************************************************************************************************** 866 * ADDR_COMPUTE_HTILE_INFO_INPUT 867 * 868 * @brief 869 * Input structure of AddrComputeHtileInfo 870 **************************************************************************************************** 871 */ 872 typedef struct _ADDR_COMPUTE_HTILE_INFO_INPUT 873 { 874 UINT_32 size; ///< Size of this structure in bytes 875 876 ADDR_HTILE_FLAGS flags; ///< HTILE flags 877 UINT_32 pitch; ///< Surface pitch, in pixels 878 UINT_32 height; ///< Surface height, in pixels 879 UINT_32 numSlices; ///< Number of slices 880 BOOL_32 isLinear; ///< Linear or tiled HTILE layout 881 AddrHtileBlockSize blockWidth; ///< 4 or 8. EG above only support 8 882 AddrHtileBlockSize blockHeight; ///< 4 or 8. EG above only support 8 883 ADDR_TILEINFO* pTileInfo; ///< Tile info 884 885 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it 886 /// while the global useTileIndex is set to 1 887 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI) 888 ///< README: When tileIndex is not -1, this must be valid 889 } ADDR_COMPUTE_HTILE_INFO_INPUT; 890 891 /** 892 **************************************************************************************************** 893 * ADDR_COMPUTE_HTILE_INFO_OUTPUT 894 * 895 * @brief 896 * Output structure of AddrComputeHtileInfo 897 **************************************************************************************************** 898 */ 899 typedef struct _ADDR_COMPUTE_HTILE_INFO_OUTPUT 900 { 901 UINT_32 size; ///< Size of this structure in bytes 902 903 UINT_32 pitch; ///< Pitch in pixels of depth buffer represented in this 904 /// HTile buffer. This might be larger than original depth 905 /// buffer pitch when called with an unaligned pitch. 906 UINT_32 height; ///< Height in pixels, as above 907 UINT_64 htileBytes; ///< Size of HTILE buffer, in bytes 908 UINT_32 baseAlign; ///< Base alignment 909 UINT_32 bpp; ///< Bits per pixel for HTILE is how many bits for an 8x8 block! 910 UINT_32 macroWidth; ///< Macro width in pixels, actually squared cache shape 911 UINT_32 macroHeight; ///< Macro height in pixels 912 UINT_64 sliceSize; ///< Slice size, in bytes. 913 BOOL_32 sliceInterleaved; ///< Flag to indicate if different slice's htile is interleaved 914 /// Compute engine clear can't be used if htile is interleaved 915 BOOL_32 nextMipLevelCompressible; ///< Flag to indicate whether HTILE can be enabled in 916 /// next mip level, it also indicates if memory set based 917 /// fast clear can be used for current mip level. 918 } ADDR_COMPUTE_HTILE_INFO_OUTPUT; 919 920 /** 921 **************************************************************************************************** 922 * AddrComputeHtileInfo 923 * 924 * @brief 925 * Compute Htile pitch, height, base alignment and size in bytes 926 **************************************************************************************************** 927 */ 928 ADDR_E_RETURNCODE ADDR_API AddrComputeHtileInfo( 929 ADDR_HANDLE hLib, 930 const ADDR_COMPUTE_HTILE_INFO_INPUT* pIn, 931 ADDR_COMPUTE_HTILE_INFO_OUTPUT* pOut); 932 933 934 935 /** 936 **************************************************************************************************** 937 * ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT 938 * 939 * @brief 940 * Input structure for AddrComputeHtileAddrFromCoord 941 **************************************************************************************************** 942 */ 943 typedef struct _ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT 944 { 945 UINT_32 size; ///< Size of this structure in bytes 946 947 UINT_32 pitch; ///< Pitch, in pixels 948 UINT_32 height; ///< Height in pixels 949 UINT_32 x; ///< X coordinate 950 UINT_32 y; ///< Y coordinate 951 UINT_32 slice; ///< Index of slice 952 UINT_32 numSlices; ///< Number of slices 953 BOOL_32 isLinear; ///< Linear or tiled HTILE layout 954 ADDR_HTILE_FLAGS flags; ///< htile flags 955 AddrHtileBlockSize blockWidth; ///< 4 or 8. 1 means 8, 0 means 4. EG above only support 8 956 AddrHtileBlockSize blockHeight; ///< 4 or 8. 1 means 8, 0 means 4. EG above only support 8 957 ADDR_TILEINFO* pTileInfo; ///< Tile info 958 959 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it 960 /// while the global useTileIndex is set to 1 961 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI) 962 ///< README: When tileIndex is not -1, this must be valid 963 UINT_32 bpp; ///< depth/stencil buffer bit per pixel size 964 UINT_32 zStencilAddr; ///< tcCompatible Z/Stencil surface address 965 } ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT; 966 967 /** 968 **************************************************************************************************** 969 * ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT 970 * 971 * @brief 972 * Output structure for AddrComputeHtileAddrFromCoord 973 **************************************************************************************************** 974 */ 975 typedef struct _ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT 976 { 977 UINT_32 size; ///< Size of this structure in bytes 978 979 UINT_64 addr; ///< Address in bytes 980 UINT_32 bitPosition; ///< Bit position, 0 or 4. CMASK and HTILE shares some lib method. 981 /// So we keep bitPosition for HTILE as well 982 } ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT; 983 984 /** 985 **************************************************************************************************** 986 * AddrComputeHtileAddrFromCoord 987 * 988 * @brief 989 * Compute Htile address according to coordinates (of depth buffer) 990 **************************************************************************************************** 991 */ 992 ADDR_E_RETURNCODE ADDR_API AddrComputeHtileAddrFromCoord( 993 ADDR_HANDLE hLib, 994 const ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT* pIn, 995 ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT* pOut); 996 997 998 999 /** 1000 **************************************************************************************************** 1001 * ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT 1002 * 1003 * @brief 1004 * Input structure for AddrComputeHtileCoordFromAddr 1005 **************************************************************************************************** 1006 */ 1007 typedef struct _ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT 1008 { 1009 UINT_32 size; ///< Size of this structure in bytes 1010 1011 UINT_64 addr; ///< Address 1012 UINT_32 bitPosition; ///< Bit position 0 or 4. CMASK and HTILE share some methods 1013 /// so we keep bitPosition for HTILE as well 1014 UINT_32 pitch; ///< Pitch, in pixels 1015 UINT_32 height; ///< Height, in pixels 1016 UINT_32 numSlices; ///< Number of slices 1017 BOOL_32 isLinear; ///< Linear or tiled HTILE layout 1018 AddrHtileBlockSize blockWidth; ///< 4 or 8. 1 means 8, 0 means 4. R8xx/R9xx only support 8 1019 AddrHtileBlockSize blockHeight; ///< 4 or 8. 1 means 8, 0 means 4. R8xx/R9xx only support 8 1020 ADDR_TILEINFO* pTileInfo; ///< Tile info 1021 1022 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it 1023 /// while the global useTileIndex is set to 1 1024 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI) 1025 ///< README: When tileIndex is not -1, this must be valid 1026 } ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT; 1027 1028 /** 1029 **************************************************************************************************** 1030 * ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT 1031 * 1032 * @brief 1033 * Output structure for AddrComputeHtileCoordFromAddr 1034 **************************************************************************************************** 1035 */ 1036 typedef struct _ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT 1037 { 1038 UINT_32 size; ///< Size of this structure in bytes 1039 1040 UINT_32 x; ///< X coordinate 1041 UINT_32 y; ///< Y coordinate 1042 UINT_32 slice; ///< Slice index 1043 } ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT; 1044 1045 /** 1046 **************************************************************************************************** 1047 * AddrComputeHtileCoordFromAddr 1048 * 1049 * @brief 1050 * Compute coordinates within depth buffer (1st pixel of a micro tile) according to 1051 * Htile address 1052 **************************************************************************************************** 1053 */ 1054 ADDR_E_RETURNCODE ADDR_API AddrComputeHtileCoordFromAddr( 1055 ADDR_HANDLE hLib, 1056 const ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT* pIn, 1057 ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT* pOut); 1058 1059 1060 1061 //////////////////////////////////////////////////////////////////////////////////////////////////// 1062 // C-mask functions 1063 //////////////////////////////////////////////////////////////////////////////////////////////////// 1064 1065 /** 1066 **************************************************************************************************** 1067 * ADDR_CMASK_FLAGS 1068 * 1069 * @brief 1070 * CMASK flags 1071 **************************************************************************************************** 1072 */ 1073 typedef union _ADDR_CMASK_FLAGS 1074 { 1075 struct 1076 { 1077 UINT_32 tcCompatible : 1; ///< Flag indicates surface needs to be shader readable 1078 UINT_32 reserved :31; ///< Reserved bits 1079 }; 1080 1081 UINT_32 value; 1082 } ADDR_CMASK_FLAGS; 1083 1084 /** 1085 **************************************************************************************************** 1086 * ADDR_COMPUTE_CMASK_INFO_INPUT 1087 * 1088 * @brief 1089 * Input structure of AddrComputeCmaskInfo 1090 **************************************************************************************************** 1091 */ 1092 typedef struct _ADDR_COMPUTE_CMASKINFO_INPUT 1093 { 1094 UINT_32 size; ///< Size of this structure in bytes 1095 1096 ADDR_CMASK_FLAGS flags; ///< CMASK flags 1097 UINT_32 pitch; ///< Pitch, in pixels, of color buffer 1098 UINT_32 height; ///< Height, in pixels, of color buffer 1099 UINT_32 numSlices; ///< Number of slices, of color buffer 1100 BOOL_32 isLinear; ///< Linear or tiled layout, Only SI can be linear 1101 ADDR_TILEINFO* pTileInfo; ///< Tile info 1102 1103 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it 1104 /// while the global useTileIndex is set to 1 1105 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI) 1106 ///< README: When tileIndex is not -1, this must be valid 1107 } ADDR_COMPUTE_CMASK_INFO_INPUT; 1108 1109 /** 1110 **************************************************************************************************** 1111 * ADDR_COMPUTE_CMASK_INFO_OUTPUT 1112 * 1113 * @brief 1114 * Output structure of AddrComputeCmaskInfo 1115 **************************************************************************************************** 1116 */ 1117 typedef struct _ADDR_COMPUTE_CMASK_INFO_OUTPUT 1118 { 1119 UINT_32 size; ///< Size of this structure in bytes 1120 1121 UINT_32 pitch; ///< Pitch in pixels of color buffer which 1122 /// this Cmask matches. The size might be larger than 1123 /// original color buffer pitch when called with 1124 /// an unaligned pitch. 1125 UINT_32 height; ///< Height in pixels, as above 1126 UINT_64 cmaskBytes; ///< Size in bytes of CMask buffer 1127 UINT_32 baseAlign; ///< Base alignment 1128 UINT_32 blockMax; ///< Cmask block size. Need this to set CB_COLORn_MASK register 1129 UINT_32 macroWidth; ///< Macro width in pixels, actually squared cache shape 1130 UINT_32 macroHeight; ///< Macro height in pixels 1131 UINT_64 sliceSize; ///< Slice size, in bytes. 1132 } ADDR_COMPUTE_CMASK_INFO_OUTPUT; 1133 1134 /** 1135 **************************************************************************************************** 1136 * AddrComputeCmaskInfo 1137 * 1138 * @brief 1139 * Compute Cmask pitch, height, base alignment and size in bytes from color buffer 1140 * info 1141 **************************************************************************************************** 1142 */ 1143 ADDR_E_RETURNCODE ADDR_API AddrComputeCmaskInfo( 1144 ADDR_HANDLE hLib, 1145 const ADDR_COMPUTE_CMASK_INFO_INPUT* pIn, 1146 ADDR_COMPUTE_CMASK_INFO_OUTPUT* pOut); 1147 1148 1149 1150 /** 1151 **************************************************************************************************** 1152 * ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT 1153 * 1154 * @brief 1155 * Input structure for AddrComputeCmaskAddrFromCoord 1156 * 1157 **************************************************************************************************** 1158 */ 1159 typedef struct _ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT 1160 { 1161 UINT_32 size; ///< Size of this structure in bytes 1162 UINT_32 x; ///< X coordinate 1163 UINT_32 y; ///< Y coordinate 1164 UINT_64 fmaskAddr; ///< Fmask addr for tc compatible Cmask 1165 UINT_32 slice; ///< Slice index 1166 UINT_32 pitch; ///< Pitch in pixels, of color buffer 1167 UINT_32 height; ///< Height in pixels, of color buffer 1168 UINT_32 numSlices; ///< Number of slices 1169 UINT_32 bpp; 1170 BOOL_32 isLinear; ///< Linear or tiled layout, Only SI can be linear 1171 ADDR_CMASK_FLAGS flags; ///< CMASK flags 1172 ADDR_TILEINFO* pTileInfo; ///< Tile info 1173 1174 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it 1175 ///< while the global useTileIndex is set to 1 1176 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI) 1177 ///< README: When tileIndex is not -1, this must be valid 1178 } ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT; 1179 1180 /** 1181 **************************************************************************************************** 1182 * ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT 1183 * 1184 * @brief 1185 * Output structure for AddrComputeCmaskAddrFromCoord 1186 **************************************************************************************************** 1187 */ 1188 typedef struct _ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT 1189 { 1190 UINT_32 size; ///< Size of this structure in bytes 1191 1192 UINT_64 addr; ///< CMASK address in bytes 1193 UINT_32 bitPosition; ///< Bit position within addr, 0-7. CMASK is 4 bpp, 1194 /// so the address may be located in bit 0 (0) or 4 (4) 1195 } ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT; 1196 1197 /** 1198 **************************************************************************************************** 1199 * AddrComputeCmaskAddrFromCoord 1200 * 1201 * @brief 1202 * Compute Cmask address according to coordinates (of MSAA color buffer) 1203 **************************************************************************************************** 1204 */ 1205 ADDR_E_RETURNCODE ADDR_API AddrComputeCmaskAddrFromCoord( 1206 ADDR_HANDLE hLib, 1207 const ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT* pIn, 1208 ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT* pOut); 1209 1210 1211 1212 /** 1213 **************************************************************************************************** 1214 * ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT 1215 * 1216 * @brief 1217 * Input structure for AddrComputeCmaskCoordFromAddr 1218 **************************************************************************************************** 1219 */ 1220 typedef struct _ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT 1221 { 1222 UINT_32 size; ///< Size of this structure in bytes 1223 1224 UINT_64 addr; ///< CMASK address in bytes 1225 UINT_32 bitPosition; ///< Bit position within addr, 0-7. CMASK is 4 bpp, 1226 /// so the address may be located in bit 0 (0) or 4 (4) 1227 UINT_32 pitch; ///< Pitch, in pixels 1228 UINT_32 height; ///< Height in pixels 1229 UINT_32 numSlices; ///< Number of slices 1230 BOOL_32 isLinear; ///< Linear or tiled layout, Only SI can be linear 1231 ADDR_TILEINFO* pTileInfo; ///< Tile info 1232 1233 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it 1234 /// while the global useTileIndex is set to 1 1235 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI) 1236 ///< README: When tileIndex is not -1, this must be valid 1237 } ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT; 1238 1239 /** 1240 **************************************************************************************************** 1241 * ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT 1242 * 1243 * @brief 1244 * Output structure for AddrComputeCmaskCoordFromAddr 1245 **************************************************************************************************** 1246 */ 1247 typedef struct _ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT 1248 { 1249 UINT_32 size; ///< Size of this structure in bytes 1250 1251 UINT_32 x; ///< X coordinate 1252 UINT_32 y; ///< Y coordinate 1253 UINT_32 slice; ///< Slice index 1254 } ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT; 1255 1256 /** 1257 **************************************************************************************************** 1258 * AddrComputeCmaskCoordFromAddr 1259 * 1260 * @brief 1261 * Compute coordinates within color buffer (1st pixel of a micro tile) according to 1262 * Cmask address 1263 **************************************************************************************************** 1264 */ 1265 ADDR_E_RETURNCODE ADDR_API AddrComputeCmaskCoordFromAddr( 1266 ADDR_HANDLE hLib, 1267 const ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT* pIn, 1268 ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT* pOut); 1269 1270 1271 1272 //////////////////////////////////////////////////////////////////////////////////////////////////// 1273 // F-mask functions 1274 //////////////////////////////////////////////////////////////////////////////////////////////////// 1275 1276 /** 1277 **************************************************************************************************** 1278 * ADDR_COMPUTE_FMASK_INFO_INPUT 1279 * 1280 * @brief 1281 * Input structure for AddrComputeFmaskInfo 1282 **************************************************************************************************** 1283 */ 1284 typedef struct _ADDR_COMPUTE_FMASK_INFO_INPUT 1285 { 1286 UINT_32 size; ///< Size of this structure in bytes 1287 1288 AddrTileMode tileMode; ///< Tile mode 1289 UINT_32 pitch; ///< Surface pitch, in pixels 1290 UINT_32 height; ///< Surface height, in pixels 1291 UINT_32 numSlices; ///< Number of slice/depth 1292 UINT_32 numSamples; ///< Number of samples 1293 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as 1294 /// number of samples for normal AA; Set it to the 1295 /// number of fragments for EQAA 1296 /// r800 and later HWL parameters 1297 struct 1298 { 1299 UINT_32 resolved: 1; ///< TRUE if the surface is for resolved fmask, only used 1300 /// by H/W clients. S/W should always set it to FALSE. 1301 UINT_32 reserved: 31; ///< Reserved for future use. 1302 }; 1303 ADDR_TILEINFO* pTileInfo; ///< 2D tiling parameters. Clients must give valid data 1304 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it 1305 /// while the global useTileIndex is set to 1 1306 } ADDR_COMPUTE_FMASK_INFO_INPUT; 1307 1308 /** 1309 **************************************************************************************************** 1310 * ADDR_COMPUTE_FMASK_INFO_OUTPUT 1311 * 1312 * @brief 1313 * Output structure for AddrComputeFmaskInfo 1314 **************************************************************************************************** 1315 */ 1316 typedef struct _ADDR_COMPUTE_FMASK_INFO_OUTPUT 1317 { 1318 UINT_32 size; ///< Size of this structure in bytes 1319 1320 UINT_32 pitch; ///< Pitch of fmask in pixels 1321 UINT_32 height; ///< Height of fmask in pixels 1322 UINT_32 numSlices; ///< Slices of fmask 1323 UINT_64 fmaskBytes; ///< Size of fmask in bytes 1324 UINT_32 baseAlign; ///< Base address alignment 1325 UINT_32 pitchAlign; ///< Pitch alignment 1326 UINT_32 heightAlign; ///< Height alignment 1327 UINT_32 bpp; ///< Bits per pixel of FMASK is: number of bit planes 1328 UINT_32 numSamples; ///< Number of samples, used for dump, export this since input 1329 /// may be changed in 9xx and above 1330 /// r800 and later HWL parameters 1331 ADDR_TILEINFO* pTileInfo; ///< Tile parameters used. Fmask can have different 1332 /// bank_height from color buffer 1333 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it 1334 /// while the global useTileIndex is set to 1 1335 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI) 1336 UINT_64 sliceSize; ///< Size of slice in bytes 1337 } ADDR_COMPUTE_FMASK_INFO_OUTPUT; 1338 1339 /** 1340 **************************************************************************************************** 1341 * AddrComputeFmaskInfo 1342 * 1343 * @brief 1344 * Compute Fmask pitch/height/depth/alignments and size in bytes 1345 **************************************************************************************************** 1346 */ 1347 ADDR_E_RETURNCODE ADDR_API AddrComputeFmaskInfo( 1348 ADDR_HANDLE hLib, 1349 const ADDR_COMPUTE_FMASK_INFO_INPUT* pIn, 1350 ADDR_COMPUTE_FMASK_INFO_OUTPUT* pOut); 1351 1352 1353 1354 /** 1355 **************************************************************************************************** 1356 * ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT 1357 * 1358 * @brief 1359 * Input structure for AddrComputeFmaskAddrFromCoord 1360 **************************************************************************************************** 1361 */ 1362 typedef struct _ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT 1363 { 1364 UINT_32 size; ///< Size of this structure in bytes 1365 1366 UINT_32 x; ///< X coordinate 1367 UINT_32 y; ///< Y coordinate 1368 UINT_32 slice; ///< Slice index 1369 UINT_32 plane; ///< Plane number 1370 UINT_32 sample; ///< Sample index (fragment index for EQAA) 1371 1372 UINT_32 pitch; ///< Surface pitch, in pixels 1373 UINT_32 height; ///< Surface height, in pixels 1374 UINT_32 numSamples; ///< Number of samples 1375 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as 1376 /// number of samples for normal AA; Set it to the 1377 /// number of fragments for EQAA 1378 1379 AddrTileMode tileMode; ///< Tile mode 1380 union 1381 { 1382 struct 1383 { 1384 UINT_32 bankSwizzle; ///< Bank swizzle 1385 UINT_32 pipeSwizzle; ///< Pipe swizzle 1386 }; 1387 UINT_32 tileSwizzle; ///< Combined swizzle, if useCombinedSwizzle is TRUE 1388 }; 1389 1390 /// r800 and later HWL parameters 1391 struct 1392 { 1393 UINT_32 resolved: 1; ///< TRUE if this is a resolved fmask, used by H/W clients 1394 UINT_32 ignoreSE: 1; ///< TRUE if shader engines are ignored. 1395 UINT_32 reserved: 30; ///< Reserved for future use. 1396 }; 1397 ADDR_TILEINFO* pTileInfo; ///< 2D tiling parameters. Client must provide all data 1398 1399 } ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT; 1400 1401 /** 1402 **************************************************************************************************** 1403 * ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT 1404 * 1405 * @brief 1406 * Output structure for AddrComputeFmaskAddrFromCoord 1407 **************************************************************************************************** 1408 */ 1409 typedef struct _ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT 1410 { 1411 UINT_32 size; ///< Size of this structure in bytes 1412 1413 UINT_64 addr; ///< Fmask address 1414 UINT_32 bitPosition; ///< Bit position within fmaskAddr, 0-7. 1415 } ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT; 1416 1417 /** 1418 **************************************************************************************************** 1419 * AddrComputeFmaskAddrFromCoord 1420 * 1421 * @brief 1422 * Compute Fmask address according to coordinates (x,y,slice,sample,plane) 1423 **************************************************************************************************** 1424 */ 1425 ADDR_E_RETURNCODE ADDR_API AddrComputeFmaskAddrFromCoord( 1426 ADDR_HANDLE hLib, 1427 const ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT* pIn, 1428 ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT* pOut); 1429 1430 1431 1432 /** 1433 **************************************************************************************************** 1434 * ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT 1435 * 1436 * @brief 1437 * Input structure for AddrComputeFmaskCoordFromAddr 1438 **************************************************************************************************** 1439 */ 1440 typedef struct _ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT 1441 { 1442 UINT_32 size; ///< Size of this structure in bytes 1443 1444 UINT_64 addr; ///< Address 1445 UINT_32 bitPosition; ///< Bit position within addr, 0-7. 1446 1447 UINT_32 pitch; ///< Pitch, in pixels 1448 UINT_32 height; ///< Height in pixels 1449 UINT_32 numSamples; ///< Number of samples 1450 UINT_32 numFrags; ///< Number of fragments 1451 AddrTileMode tileMode; ///< Tile mode 1452 union 1453 { 1454 struct 1455 { 1456 UINT_32 bankSwizzle; ///< Bank swizzle 1457 UINT_32 pipeSwizzle; ///< Pipe swizzle 1458 }; 1459 UINT_32 tileSwizzle; ///< Combined swizzle, if useCombinedSwizzle is TRUE 1460 }; 1461 1462 /// r800 and later HWL parameters 1463 struct 1464 { 1465 UINT_32 resolved: 1; ///< TRUE if this is a resolved fmask, used by HW components 1466 UINT_32 ignoreSE: 1; ///< TRUE if shader engines are ignored. 1467 UINT_32 reserved: 30; ///< Reserved for future use. 1468 }; 1469 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Client must provide all data 1470 1471 } ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT; 1472 1473 /** 1474 **************************************************************************************************** 1475 * ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT 1476 * 1477 * @brief 1478 * Output structure for AddrComputeFmaskCoordFromAddr 1479 **************************************************************************************************** 1480 */ 1481 typedef struct _ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT 1482 { 1483 UINT_32 size; ///< Size of this structure in bytes 1484 1485 UINT_32 x; ///< X coordinate 1486 UINT_32 y; ///< Y coordinate 1487 UINT_32 slice; ///< Slice index 1488 UINT_32 plane; ///< Plane number 1489 UINT_32 sample; ///< Sample index (fragment index for EQAA) 1490 } ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT; 1491 1492 /** 1493 **************************************************************************************************** 1494 * AddrComputeFmaskCoordFromAddr 1495 * 1496 * @brief 1497 * Compute FMASK coordinate from an given address 1498 **************************************************************************************************** 1499 */ 1500 ADDR_E_RETURNCODE ADDR_API AddrComputeFmaskCoordFromAddr( 1501 ADDR_HANDLE hLib, 1502 const ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT* pIn, 1503 ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT* pOut); 1504 1505 1506 1507 //////////////////////////////////////////////////////////////////////////////////////////////////// 1508 // Element/utility functions 1509 //////////////////////////////////////////////////////////////////////////////////////////////////// 1510 1511 /** 1512 **************************************************************************************************** 1513 * AddrGetVersion 1514 * 1515 * @brief 1516 * Get AddrLib version number 1517 **************************************************************************************************** 1518 */ 1519 UINT_32 ADDR_API AddrGetVersion(ADDR_HANDLE hLib); 1520 1521 /** 1522 **************************************************************************************************** 1523 * AddrUseTileIndex 1524 * 1525 * @brief 1526 * Return TRUE if tileIndex is enabled in this address library 1527 **************************************************************************************************** 1528 */ 1529 BOOL_32 ADDR_API AddrUseTileIndex(ADDR_HANDLE hLib); 1530 1531 /** 1532 **************************************************************************************************** 1533 * AddrUseCombinedSwizzle 1534 * 1535 * @brief 1536 * Return TRUE if combined swizzle is enabled in this address library 1537 **************************************************************************************************** 1538 */ 1539 BOOL_32 ADDR_API AddrUseCombinedSwizzle(ADDR_HANDLE hLib); 1540 1541 /** 1542 **************************************************************************************************** 1543 * ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT 1544 * 1545 * @brief 1546 * Input structure of AddrExtractBankPipeSwizzle 1547 **************************************************************************************************** 1548 */ 1549 typedef struct _ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT 1550 { 1551 UINT_32 size; ///< Size of this structure in bytes 1552 1553 UINT_32 base256b; ///< Base256b value 1554 1555 /// r800 and later HWL parameters 1556 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Client must provide all data 1557 1558 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it 1559 /// while the global useTileIndex is set to 1 1560 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI) 1561 ///< README: When tileIndex is not -1, this must be valid 1562 } ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT; 1563 1564 /** 1565 **************************************************************************************************** 1566 * ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT 1567 * 1568 * @brief 1569 * Output structure of AddrExtractBankPipeSwizzle 1570 **************************************************************************************************** 1571 */ 1572 typedef struct _ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT 1573 { 1574 UINT_32 size; ///< Size of this structure in bytes 1575 1576 UINT_32 bankSwizzle; ///< Bank swizzle 1577 UINT_32 pipeSwizzle; ///< Pipe swizzle 1578 } ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT; 1579 1580 /** 1581 **************************************************************************************************** 1582 * AddrExtractBankPipeSwizzle 1583 * 1584 * @brief 1585 * Extract Bank and Pipe swizzle from base256b 1586 * @return 1587 * ADDR_OK if no error 1588 **************************************************************************************************** 1589 */ 1590 ADDR_E_RETURNCODE ADDR_API AddrExtractBankPipeSwizzle( 1591 ADDR_HANDLE hLib, 1592 const ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT* pIn, 1593 ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT* pOut); 1594 1595 1596 /** 1597 **************************************************************************************************** 1598 * ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT 1599 * 1600 * @brief 1601 * Input structure of AddrCombineBankPipeSwizzle 1602 **************************************************************************************************** 1603 */ 1604 typedef struct _ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT 1605 { 1606 UINT_32 size; ///< Size of this structure in bytes 1607 1608 UINT_32 bankSwizzle; ///< Bank swizzle 1609 UINT_32 pipeSwizzle; ///< Pipe swizzle 1610 UINT_64 baseAddr; ///< Base address (leave it zero for driver clients) 1611 1612 /// r800 and later HWL parameters 1613 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Client must provide all data 1614 1615 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it 1616 /// while the global useTileIndex is set to 1 1617 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI) 1618 ///< README: When tileIndex is not -1, this must be valid 1619 } ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT; 1620 1621 /** 1622 **************************************************************************************************** 1623 * ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT 1624 * 1625 * @brief 1626 * Output structure of AddrCombineBankPipeSwizzle 1627 **************************************************************************************************** 1628 */ 1629 typedef struct _ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT 1630 { 1631 UINT_32 size; ///< Size of this structure in bytes 1632 1633 UINT_32 tileSwizzle; ///< Combined swizzle 1634 } ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT; 1635 1636 /** 1637 **************************************************************************************************** 1638 * AddrCombineBankPipeSwizzle 1639 * 1640 * @brief 1641 * Combine Bank and Pipe swizzle 1642 * @return 1643 * ADDR_OK if no error 1644 * @note 1645 * baseAddr here is full MCAddress instead of base256b 1646 **************************************************************************************************** 1647 */ 1648 ADDR_E_RETURNCODE ADDR_API AddrCombineBankPipeSwizzle( 1649 ADDR_HANDLE hLib, 1650 const ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT* pIn, 1651 ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT* pOut); 1652 1653 1654 1655 /** 1656 **************************************************************************************************** 1657 * ADDR_COMPUTE_SLICESWIZZLE_INPUT 1658 * 1659 * @brief 1660 * Input structure of AddrComputeSliceSwizzle 1661 **************************************************************************************************** 1662 */ 1663 typedef struct _ADDR_COMPUTE_SLICESWIZZLE_INPUT 1664 { 1665 UINT_32 size; ///< Size of this structure in bytes 1666 1667 AddrTileMode tileMode; ///< Tile Mode 1668 UINT_32 baseSwizzle; ///< Base tile swizzle 1669 UINT_32 slice; ///< Slice index 1670 UINT_64 baseAddr; ///< Base address, driver should leave it 0 in most cases 1671 1672 /// r800 and later HWL parameters 1673 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Actually banks needed here! 1674 1675 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it 1676 /// while the global useTileIndex is set to 1 1677 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI) 1678 ///< README: When tileIndex is not -1, this must be valid 1679 } ADDR_COMPUTE_SLICESWIZZLE_INPUT; 1680 1681 1682 1683 /** 1684 **************************************************************************************************** 1685 * ADDR_COMPUTE_SLICESWIZZLE_OUTPUT 1686 * 1687 * @brief 1688 * Output structure of AddrComputeSliceSwizzle 1689 **************************************************************************************************** 1690 */ 1691 typedef struct _ADDR_COMPUTE_SLICESWIZZLE_OUTPUT 1692 { 1693 UINT_32 size; ///< Size of this structure in bytes 1694 1695 UINT_32 tileSwizzle; ///< Recalculated tileSwizzle value 1696 } ADDR_COMPUTE_SLICESWIZZLE_OUTPUT; 1697 1698 /** 1699 **************************************************************************************************** 1700 * AddrComputeSliceSwizzle 1701 * 1702 * @brief 1703 * Extract Bank and Pipe swizzle from base256b 1704 * @return 1705 * ADDR_OK if no error 1706 **************************************************************************************************** 1707 */ 1708 ADDR_E_RETURNCODE ADDR_API AddrComputeSliceSwizzle( 1709 ADDR_HANDLE hLib, 1710 const ADDR_COMPUTE_SLICESWIZZLE_INPUT* pIn, 1711 ADDR_COMPUTE_SLICESWIZZLE_OUTPUT* pOut); 1712 1713 1714 /** 1715 **************************************************************************************************** 1716 * AddrSwizzleGenOption 1717 * 1718 * @brief 1719 * Which swizzle generating options: legacy or linear 1720 **************************************************************************************************** 1721 */ 1722 typedef enum _AddrSwizzleGenOption 1723 { 1724 ADDR_SWIZZLE_GEN_DEFAULT = 0, ///< As is in client driver implemention for swizzle 1725 ADDR_SWIZZLE_GEN_LINEAR = 1, ///< Using a linear increment of swizzle 1726 } AddrSwizzleGenOption; 1727 1728 /** 1729 **************************************************************************************************** 1730 * AddrSwizzleOption 1731 * 1732 * @brief 1733 * Controls how swizzle is generated 1734 **************************************************************************************************** 1735 */ 1736 typedef union _ADDR_SWIZZLE_OPTION 1737 { 1738 struct 1739 { 1740 UINT_32 genOption : 1; ///< The way swizzle is generated, see AddrSwizzleGenOption 1741 UINT_32 reduceBankBit : 1; ///< TRUE if we need reduce swizzle bits 1742 UINT_32 reserved :30; ///< Reserved bits 1743 }; 1744 1745 UINT_32 value; 1746 1747 } ADDR_SWIZZLE_OPTION; 1748 1749 /** 1750 **************************************************************************************************** 1751 * ADDR_COMPUTE_BASE_SWIZZLE_INPUT 1752 * 1753 * @brief 1754 * Input structure of AddrComputeBaseSwizzle 1755 **************************************************************************************************** 1756 */ 1757 typedef struct _ADDR_COMPUTE_BASE_SWIZZLE_INPUT 1758 { 1759 UINT_32 size; ///< Size of this structure in bytes 1760 1761 ADDR_SWIZZLE_OPTION option; ///< Swizzle option 1762 UINT_32 surfIndex; ///< Index of this surface type 1763 AddrTileMode tileMode; ///< Tile Mode 1764 1765 /// r800 and later HWL parameters 1766 ADDR_TILEINFO* pTileInfo; ///< 2D tile parameters. Actually banks needed here! 1767 1768 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it 1769 /// while the global useTileIndex is set to 1 1770 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI) 1771 ///< README: When tileIndex is not -1, this must be valid 1772 } ADDR_COMPUTE_BASE_SWIZZLE_INPUT; 1773 1774 /** 1775 **************************************************************************************************** 1776 * ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT 1777 * 1778 * @brief 1779 * Output structure of AddrComputeBaseSwizzle 1780 **************************************************************************************************** 1781 */ 1782 typedef struct _ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT 1783 { 1784 UINT_32 size; ///< Size of this structure in bytes 1785 1786 UINT_32 tileSwizzle; ///< Combined swizzle 1787 } ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT; 1788 1789 /** 1790 **************************************************************************************************** 1791 * AddrComputeBaseSwizzle 1792 * 1793 * @brief 1794 * Return a Combined Bank and Pipe swizzle base on surface based on surface type/index 1795 * @return 1796 * ADDR_OK if no error 1797 **************************************************************************************************** 1798 */ 1799 ADDR_E_RETURNCODE ADDR_API AddrComputeBaseSwizzle( 1800 ADDR_HANDLE hLib, 1801 const ADDR_COMPUTE_BASE_SWIZZLE_INPUT* pIn, 1802 ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT* pOut); 1803 1804 1805 1806 /** 1807 **************************************************************************************************** 1808 * ELEM_GETEXPORTNORM_INPUT 1809 * 1810 * @brief 1811 * Input structure for ElemGetExportNorm 1812 * 1813 **************************************************************************************************** 1814 */ 1815 typedef struct _ELEM_GETEXPORTNORM_INPUT 1816 { 1817 UINT_32 size; ///< Size of this structure in bytes 1818 1819 AddrColorFormat format; ///< Color buffer format; Client should use ColorFormat 1820 AddrSurfaceNumber num; ///< Surface number type; Client should use NumberType 1821 AddrSurfaceSwap swap; ///< Surface swap byte swap; Client should use SurfaceSwap 1822 UINT_32 numSamples; ///< Number of samples 1823 } ELEM_GETEXPORTNORM_INPUT; 1824 1825 /** 1826 **************************************************************************************************** 1827 * ElemGetExportNorm 1828 * 1829 * @brief 1830 * Helper function to check one format can be EXPORT_NUM, which is a register 1831 * CB_COLOR_INFO.SURFACE_FORMAT. FP16 can be reported as EXPORT_NORM for rv770 in r600 1832 * family 1833 * @note 1834 * The implementation is only for r600. 1835 * 00 - EXPORT_FULL: PS exports are 4 pixels with 4 components with 32-bits-per-component. (two 1836 * clocks per export) 1837 * 01 - EXPORT_NORM: PS exports are 4 pixels with 4 components with 16-bits-per-component. (one 1838 * clock per export) 1839 * 1840 **************************************************************************************************** 1841 */ 1842 BOOL_32 ADDR_API ElemGetExportNorm( 1843 ADDR_HANDLE hLib, 1844 const ELEM_GETEXPORTNORM_INPUT* pIn); 1845 1846 1847 1848 /** 1849 **************************************************************************************************** 1850 * ELEM_FLT32TODEPTHPIXEL_INPUT 1851 * 1852 * @brief 1853 * Input structure for addrFlt32ToDepthPixel 1854 * 1855 **************************************************************************************************** 1856 */ 1857 typedef struct _ELEM_FLT32TODEPTHPIXEL_INPUT 1858 { 1859 UINT_32 size; ///< Size of this structure in bytes 1860 1861 AddrDepthFormat format; ///< Depth buffer format 1862 ADDR_FLT_32 comps[2]; ///< Component values (Z/stencil) 1863 } ELEM_FLT32TODEPTHPIXEL_INPUT; 1864 1865 /** 1866 **************************************************************************************************** 1867 * ELEM_FLT32TODEPTHPIXEL_INPUT 1868 * 1869 * @brief 1870 * Output structure for ElemFlt32ToDepthPixel 1871 * 1872 **************************************************************************************************** 1873 */ 1874 typedef struct _ELEM_FLT32TODEPTHPIXEL_OUTPUT 1875 { 1876 UINT_32 size; ///< Size of this structure in bytes 1877 1878 UINT_8* pPixel; ///< Real depth value. Same data type as depth buffer. 1879 /// Client must provide enough storage for this type. 1880 UINT_32 depthBase; ///< Tile base in bits for depth bits 1881 UINT_32 stencilBase; ///< Tile base in bits for stencil bits 1882 UINT_32 depthBits; ///< Bits for depth 1883 UINT_32 stencilBits; ///< Bits for stencil 1884 } ELEM_FLT32TODEPTHPIXEL_OUTPUT; 1885 1886 /** 1887 **************************************************************************************************** 1888 * ElemFlt32ToDepthPixel 1889 * 1890 * @brief 1891 * Convert a FLT_32 value to a depth/stencil pixel value 1892 * 1893 * @return 1894 * Return code 1895 * 1896 **************************************************************************************************** 1897 */ 1898 ADDR_E_RETURNCODE ADDR_API ElemFlt32ToDepthPixel( 1899 ADDR_HANDLE hLib, 1900 const ELEM_FLT32TODEPTHPIXEL_INPUT* pIn, 1901 ELEM_FLT32TODEPTHPIXEL_OUTPUT* pOut); 1902 1903 1904 1905 /** 1906 **************************************************************************************************** 1907 * ELEM_FLT32TOCOLORPIXEL_INPUT 1908 * 1909 * @brief 1910 * Input structure for addrFlt32ToColorPixel 1911 * 1912 **************************************************************************************************** 1913 */ 1914 typedef struct _ELEM_FLT32TOCOLORPIXEL_INPUT 1915 { 1916 UINT_32 size; ///< Size of this structure in bytes 1917 1918 AddrColorFormat format; ///< Color buffer format 1919 AddrSurfaceNumber surfNum; ///< Surface number 1920 AddrSurfaceSwap surfSwap; ///< Surface swap 1921 ADDR_FLT_32 comps[4]; ///< Component values (r/g/b/a) 1922 } ELEM_FLT32TOCOLORPIXEL_INPUT; 1923 1924 /** 1925 **************************************************************************************************** 1926 * ELEM_FLT32TOCOLORPIXEL_INPUT 1927 * 1928 * @brief 1929 * Output structure for ElemFlt32ToColorPixel 1930 * 1931 **************************************************************************************************** 1932 */ 1933 typedef struct _ELEM_FLT32TOCOLORPIXEL_OUTPUT 1934 { 1935 UINT_32 size; ///< Size of this structure in bytes 1936 1937 UINT_8* pPixel; ///< Real color value. Same data type as color buffer. 1938 /// Client must provide enough storage for this type. 1939 } ELEM_FLT32TOCOLORPIXEL_OUTPUT; 1940 1941 /** 1942 **************************************************************************************************** 1943 * ElemFlt32ToColorPixel 1944 * 1945 * @brief 1946 * Convert a FLT_32 value to a red/green/blue/alpha pixel value 1947 * 1948 * @return 1949 * Return code 1950 * 1951 **************************************************************************************************** 1952 */ 1953 ADDR_E_RETURNCODE ADDR_API ElemFlt32ToColorPixel( 1954 ADDR_HANDLE hLib, 1955 const ELEM_FLT32TOCOLORPIXEL_INPUT* pIn, 1956 ELEM_FLT32TOCOLORPIXEL_OUTPUT* pOut); 1957 1958 1959 /** 1960 **************************************************************************************************** 1961 * ADDR_CONVERT_TILEINFOTOHW_INPUT 1962 * 1963 * @brief 1964 * Input structure for AddrConvertTileInfoToHW 1965 * @note 1966 * When reverse is TRUE, indices are igonred 1967 **************************************************************************************************** 1968 */ 1969 typedef struct _ADDR_CONVERT_TILEINFOTOHW_INPUT 1970 { 1971 UINT_32 size; ///< Size of this structure in bytes 1972 BOOL_32 reverse; ///< Convert control flag. 1973 /// FALSE: convert from real value to HW value; 1974 /// TRUE: convert from HW value to real value. 1975 1976 /// r800 and later HWL parameters 1977 ADDR_TILEINFO* pTileInfo; ///< Tile parameters with real value 1978 1979 INT_32 tileIndex; ///< Tile index, MUST be -1 if you don't want to use it 1980 /// while the global useTileIndex is set to 1 1981 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI) 1982 ///< README: When tileIndex is not -1, this must be valid 1983 UINT_32 bpp; ///< Bits per pixel 1984 } ADDR_CONVERT_TILEINFOTOHW_INPUT; 1985 1986 /** 1987 **************************************************************************************************** 1988 * ADDR_CONVERT_TILEINFOTOHW_OUTPUT 1989 * 1990 * @brief 1991 * Output structure for AddrConvertTileInfoToHW 1992 **************************************************************************************************** 1993 */ 1994 typedef struct _ADDR_CONVERT_TILEINFOTOHW_OUTPUT 1995 { 1996 UINT_32 size; ///< Size of this structure in bytes 1997 1998 /// r800 and later HWL parameters 1999 ADDR_TILEINFO* pTileInfo; ///< Tile parameters with hardware register value 2000 2001 } ADDR_CONVERT_TILEINFOTOHW_OUTPUT; 2002 2003 /** 2004 **************************************************************************************************** 2005 * AddrConvertTileInfoToHW 2006 * 2007 * @brief 2008 * Convert tile info from real value to hardware register value 2009 **************************************************************************************************** 2010 */ 2011 ADDR_E_RETURNCODE ADDR_API AddrConvertTileInfoToHW( 2012 ADDR_HANDLE hLib, 2013 const ADDR_CONVERT_TILEINFOTOHW_INPUT* pIn, 2014 ADDR_CONVERT_TILEINFOTOHW_OUTPUT* pOut); 2015 2016 2017 2018 /** 2019 **************************************************************************************************** 2020 * ADDR_CONVERT_TILEINDEX_INPUT 2021 * 2022 * @brief 2023 * Input structure for AddrConvertTileIndex 2024 **************************************************************************************************** 2025 */ 2026 typedef struct _ADDR_CONVERT_TILEINDEX_INPUT 2027 { 2028 UINT_32 size; ///< Size of this structure in bytes 2029 2030 INT_32 tileIndex; ///< Tile index 2031 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI) 2032 UINT_32 bpp; ///< Bits per pixel 2033 BOOL_32 tileInfoHw; ///< Set to TRUE if client wants HW enum, otherwise actual 2034 } ADDR_CONVERT_TILEINDEX_INPUT; 2035 2036 /** 2037 **************************************************************************************************** 2038 * ADDR_CONVERT_TILEINDEX_OUTPUT 2039 * 2040 * @brief 2041 * Output structure for AddrConvertTileIndex 2042 **************************************************************************************************** 2043 */ 2044 typedef struct _ADDR_CONVERT_TILEINDEX_OUTPUT 2045 { 2046 UINT_32 size; ///< Size of this structure in bytes 2047 2048 AddrTileMode tileMode; ///< Tile mode 2049 AddrTileType tileType; ///< Tile type 2050 ADDR_TILEINFO* pTileInfo; ///< Tile info 2051 2052 } ADDR_CONVERT_TILEINDEX_OUTPUT; 2053 2054 /** 2055 **************************************************************************************************** 2056 * AddrConvertTileIndex 2057 * 2058 * @brief 2059 * Convert tile index to tile mode/type/info 2060 **************************************************************************************************** 2061 */ 2062 ADDR_E_RETURNCODE ADDR_API AddrConvertTileIndex( 2063 ADDR_HANDLE hLib, 2064 const ADDR_CONVERT_TILEINDEX_INPUT* pIn, 2065 ADDR_CONVERT_TILEINDEX_OUTPUT* pOut); 2066 2067 /** 2068 **************************************************************************************************** 2069 * ADDR_GET_MACROMODEINDEX_INPUT 2070 * 2071 * @brief 2072 * Input structure for AddrGetMacroModeIndex 2073 **************************************************************************************************** 2074 */ 2075 typedef struct _ADDR_GET_MACROMODEINDEX_INPUT 2076 { 2077 UINT_32 size; ///< Size of this structure in bytes 2078 ADDR_SURFACE_FLAGS flags; ///< Surface flag 2079 INT_32 tileIndex; ///< Tile index 2080 UINT_32 bpp; ///< Bits per pixel 2081 UINT_32 numFrags; ///< Number of color fragments 2082 } ADDR_GET_MACROMODEINDEX_INPUT; 2083 2084 /** 2085 **************************************************************************************************** 2086 * ADDR_GET_MACROMODEINDEX_OUTPUT 2087 * 2088 * @brief 2089 * Output structure for AddrGetMacroModeIndex 2090 **************************************************************************************************** 2091 */ 2092 typedef struct _ADDR_GET_MACROMODEINDEX_OUTPUT 2093 { 2094 UINT_32 size; ///< Size of this structure in bytes 2095 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI) 2096 } ADDR_GET_MACROMODEINDEX_OUTPUT; 2097 2098 /** 2099 **************************************************************************************************** 2100 * AddrGetMacroModeIndex 2101 * 2102 * @brief 2103 * Get macro mode index based on input parameters 2104 **************************************************************************************************** 2105 */ 2106 ADDR_E_RETURNCODE ADDR_API AddrGetMacroModeIndex( 2107 ADDR_HANDLE hLib, 2108 const ADDR_GET_MACROMODEINDEX_INPUT* pIn, 2109 ADDR_GET_MACROMODEINDEX_OUTPUT* pOut); 2110 2111 /** 2112 **************************************************************************************************** 2113 * ADDR_CONVERT_TILEINDEX1_INPUT 2114 * 2115 * @brief 2116 * Input structure for AddrConvertTileIndex1 (without macro mode index) 2117 **************************************************************************************************** 2118 */ 2119 typedef struct _ADDR_CONVERT_TILEINDEX1_INPUT 2120 { 2121 UINT_32 size; ///< Size of this structure in bytes 2122 2123 INT_32 tileIndex; ///< Tile index 2124 UINT_32 bpp; ///< Bits per pixel 2125 UINT_32 numSamples; ///< Number of samples 2126 BOOL_32 tileInfoHw; ///< Set to TRUE if client wants HW enum, otherwise actual 2127 } ADDR_CONVERT_TILEINDEX1_INPUT; 2128 2129 /** 2130 **************************************************************************************************** 2131 * AddrConvertTileIndex1 2132 * 2133 * @brief 2134 * Convert tile index to tile mode/type/info 2135 **************************************************************************************************** 2136 */ 2137 ADDR_E_RETURNCODE ADDR_API AddrConvertTileIndex1( 2138 ADDR_HANDLE hLib, 2139 const ADDR_CONVERT_TILEINDEX1_INPUT* pIn, 2140 ADDR_CONVERT_TILEINDEX_OUTPUT* pOut); 2141 2142 2143 2144 /** 2145 **************************************************************************************************** 2146 * ADDR_GET_TILEINDEX_INPUT 2147 * 2148 * @brief 2149 * Input structure for AddrGetTileIndex 2150 **************************************************************************************************** 2151 */ 2152 typedef struct _ADDR_GET_TILEINDEX_INPUT 2153 { 2154 UINT_32 size; ///< Size of this structure in bytes 2155 2156 AddrTileMode tileMode; ///< Tile mode 2157 AddrTileType tileType; ///< Tile-type: disp/non-disp/... 2158 ADDR_TILEINFO* pTileInfo; ///< Pointer to tile-info structure, can be NULL for linear/1D 2159 } ADDR_GET_TILEINDEX_INPUT; 2160 2161 /** 2162 **************************************************************************************************** 2163 * ADDR_GET_TILEINDEX_OUTPUT 2164 * 2165 * @brief 2166 * Output structure for AddrGetTileIndex 2167 **************************************************************************************************** 2168 */ 2169 typedef struct _ADDR_GET_TILEINDEX_OUTPUT 2170 { 2171 UINT_32 size; ///< Size of this structure in bytes 2172 2173 INT_32 index; ///< index in table 2174 } ADDR_GET_TILEINDEX_OUTPUT; 2175 2176 /** 2177 **************************************************************************************************** 2178 * AddrGetTileIndex 2179 * 2180 * @brief 2181 * Get the tiling mode index in table 2182 **************************************************************************************************** 2183 */ 2184 ADDR_E_RETURNCODE ADDR_API AddrGetTileIndex( 2185 ADDR_HANDLE hLib, 2186 const ADDR_GET_TILEINDEX_INPUT* pIn, 2187 ADDR_GET_TILEINDEX_OUTPUT* pOut); 2188 2189 2190 2191 /** 2192 **************************************************************************************************** 2193 * ADDR_PRT_INFO_INPUT 2194 * 2195 * @brief 2196 * Input structure for AddrComputePrtInfo 2197 **************************************************************************************************** 2198 */ 2199 typedef struct _ADDR_PRT_INFO_INPUT 2200 { 2201 AddrFormat format; ///< Surface format 2202 UINT_32 baseMipWidth; ///< Base mipmap width 2203 UINT_32 baseMipHeight; ///< Base mipmap height 2204 UINT_32 baseMipDepth; ///< Base mipmap depth 2205 UINT_32 numFrags; ///< Number of fragments, 2206 } ADDR_PRT_INFO_INPUT; 2207 2208 /** 2209 **************************************************************************************************** 2210 * ADDR_PRT_INFO_OUTPUT 2211 * 2212 * @brief 2213 * Input structure for AddrComputePrtInfo 2214 **************************************************************************************************** 2215 */ 2216 typedef struct _ADDR_PRT_INFO_OUTPUT 2217 { 2218 UINT_32 prtTileWidth; 2219 UINT_32 prtTileHeight; 2220 } ADDR_PRT_INFO_OUTPUT; 2221 2222 /** 2223 **************************************************************************************************** 2224 * AddrComputePrtInfo 2225 * 2226 * @brief 2227 * Compute prt surface related information 2228 **************************************************************************************************** 2229 */ 2230 ADDR_E_RETURNCODE ADDR_API AddrComputePrtInfo( 2231 ADDR_HANDLE hLib, 2232 const ADDR_PRT_INFO_INPUT* pIn, 2233 ADDR_PRT_INFO_OUTPUT* pOut); 2234 2235 2236 2237 //////////////////////////////////////////////////////////////////////////////////////////////////// 2238 // DCC key functions 2239 //////////////////////////////////////////////////////////////////////////////////////////////////// 2240 2241 /** 2242 **************************************************************************************************** 2243 * _ADDR_COMPUTE_DCCINFO_INPUT 2244 * 2245 * @brief 2246 * Input structure of AddrComputeDccInfo 2247 **************************************************************************************************** 2248 */ 2249 typedef struct _ADDR_COMPUTE_DCCINFO_INPUT 2250 { 2251 UINT_32 size; ///< Size of this structure in bytes 2252 UINT_32 bpp; ///< BitPP of color surface 2253 UINT_32 numSamples; ///< Sample number of color surface 2254 UINT_64 colorSurfSize; ///< Size of color surface to which dcc key is bound 2255 AddrTileMode tileMode; ///< Tile mode of color surface 2256 ADDR_TILEINFO tileInfo; ///< Tile info of color surface 2257 UINT_32 tileSwizzle; ///< Tile swizzle 2258 INT_32 tileIndex; ///< Tile index of color surface, 2259 ///< MUST be -1 if you don't want to use it 2260 ///< while the global useTileIndex is set to 1 2261 INT_32 macroModeIndex; ///< Index in macro tile mode table if there is one (CI) 2262 ///< README: When tileIndex is not -1, this must be valid 2263 } ADDR_COMPUTE_DCCINFO_INPUT; 2264 2265 /** 2266 **************************************************************************************************** 2267 * ADDR_COMPUTE_DCCINFO_OUTPUT 2268 * 2269 * @brief 2270 * Output structure of AddrComputeDccInfo 2271 **************************************************************************************************** 2272 */ 2273 typedef struct _ADDR_COMPUTE_DCCINFO_OUTPUT 2274 { 2275 UINT_32 size; ///< Size of this structure in bytes 2276 UINT_64 dccRamBaseAlign; ///< Base alignment of dcc key 2277 UINT_64 dccRamSize; ///< Size of dcc key 2278 UINT_64 dccFastClearSize; ///< Size of dcc key portion that can be fast cleared 2279 BOOL_32 subLvlCompressible; ///< Whether sub resource is compressiable 2280 BOOL_32 dccRamSizeAligned; ///< Whether the dcc key size is aligned 2281 } ADDR_COMPUTE_DCCINFO_OUTPUT; 2282 2283 /** 2284 **************************************************************************************************** 2285 * AddrComputeDccInfo 2286 * 2287 * @brief 2288 * Compute DCC key size, base alignment 2289 * info 2290 **************************************************************************************************** 2291 */ 2292 ADDR_E_RETURNCODE ADDR_API AddrComputeDccInfo( 2293 ADDR_HANDLE hLib, 2294 const ADDR_COMPUTE_DCCINFO_INPUT* pIn, 2295 ADDR_COMPUTE_DCCINFO_OUTPUT* pOut); 2296 2297 2298 2299 /** 2300 **************************************************************************************************** 2301 * ADDR_GET_MAX_ALIGNMENTS_OUTPUT 2302 * 2303 * @brief 2304 * Output structure of AddrGetMaxAlignments 2305 **************************************************************************************************** 2306 */ 2307 typedef struct _ADDR_GET_MAX_ALIGNMENTS_OUTPUT 2308 { 2309 UINT_32 size; ///< Size of this structure in bytes 2310 UINT_64 baseAlign; ///< Maximum base alignment in bytes 2311 } ADDR_GET_MAX_ALIGNMENTS_OUTPUT; 2312 2313 /** 2314 **************************************************************************************************** 2315 * AddrGetMaxAlignments 2316 * 2317 * @brief 2318 * Gets maximnum alignments 2319 **************************************************************************************************** 2320 */ 2321 ADDR_E_RETURNCODE ADDR_API AddrGetMaxAlignments( 2322 ADDR_HANDLE hLib, 2323 ADDR_GET_MAX_ALIGNMENTS_OUTPUT* pOut); 2324 2325 2326 2327 /** 2328 **************************************************************************************************** 2329 * Address library interface version 2 2330 * available from Gfx9 hardware 2331 **************************************************************************************************** 2332 * Addr2ComputeSurfaceInfo() 2333 * Addr2ComputeSurfaceAddrFromCoord() 2334 * Addr2ComputeSurfaceCoordFromAddr() 2335 2336 * Addr2ComputeHtileInfo() 2337 * Addr2ComputeHtileAddrFromCoord() 2338 * Addr2ComputeHtileCoordFromAddr() 2339 * 2340 * Addr2ComputeCmaskInfo() 2341 * Addr2ComputeCmaskAddrFromCoord() 2342 * Addr2ComputeCmaskCoordFromAddr() 2343 * 2344 * Addr2ComputeFmaskInfo() 2345 * Addr2ComputeFmaskAddrFromCoord() 2346 * Addr2ComputeFmaskCoordFromAddr() 2347 * 2348 * Addr2ComputeDccInfo() 2349 * 2350 **/ 2351 2352 2353 //////////////////////////////////////////////////////////////////////////////////////////////////// 2354 // Surface functions for Gfx9 2355 //////////////////////////////////////////////////////////////////////////////////////////////////// 2356 2357 /** 2358 **************************************************************************************************** 2359 * ADDR2_SURFACE_FLAGS 2360 * 2361 * @brief 2362 * Surface flags 2363 **************************************************************************************************** 2364 */ 2365 typedef union _ADDR2_SURFACE_FLAGS 2366 { 2367 struct 2368 { 2369 UINT_32 color : 1; ///< This resource is a color buffer, can be used with RTV 2370 UINT_32 depth : 1; ///< Thie resource is a depth buffer, can be used with DSV 2371 UINT_32 stencil : 1; ///< Thie resource is a stencil buffer, can be used with DSV 2372 UINT_32 fmask : 1; ///< This is an fmask surface 2373 UINT_32 overlay : 1; ///< This is an overlay surface 2374 UINT_32 display : 1; ///< This resource is displable, can be used with DRV 2375 UINT_32 prt : 1; ///< This is a partially resident texture 2376 UINT_32 qbStereo : 1; ///< This is a quad buffer stereo surface 2377 UINT_32 interleaved : 1; ///< Special flag for interleaved YUV surface padding 2378 UINT_32 texture : 1; ///< This resource can be used with SRV 2379 UINT_32 unordered : 1; ///< This resource can be used with UAV 2380 UINT_32 rotated : 1; ///< This resource is rotated and displable 2381 UINT_32 needEquation : 1; ///< This resource needs equation to be generated if possible 2382 UINT_32 opt4space : 1; ///< This resource should be optimized for space 2383 UINT_32 minimizeAlign : 1; ///< This resource should use minimum alignment 2384 UINT_32 reserved : 17; ///< Reserved bits 2385 }; 2386 2387 UINT_32 value; 2388 } ADDR2_SURFACE_FLAGS; 2389 2390 /** 2391 **************************************************************************************************** 2392 * ADDR2_COMPUTE_SURFACE_INFO_INPUT 2393 * 2394 * @brief 2395 * Input structure for Addr2ComputeSurfaceInfo 2396 **************************************************************************************************** 2397 */ 2398 typedef struct _ADDR2_COMPUTE_SURFACE_INFO_INPUT 2399 { 2400 UINT_32 size; ///< Size of this structure in bytes 2401 2402 ADDR2_SURFACE_FLAGS flags; ///< Surface flags 2403 AddrSwizzleMode swizzleMode; ///< Swizzle Mode for Gfx9 2404 AddrResourceType resourceType; ///< Surface type 2405 AddrFormat format; ///< Surface format 2406 UINT_32 bpp; ///< bits per pixel 2407 UINT_32 width; ///< Width (of mip0), in pixels 2408 UINT_32 height; ///< Height (of mip0), in pixels 2409 UINT_32 numSlices; ///< Number surface slice/depth (of mip0), 2410 UINT_32 numMipLevels; ///< Total mipmap levels. 2411 UINT_32 numSamples; ///< Number of samples 2412 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as 2413 /// number of samples for normal AA; Set it to the 2414 /// number of fragments for EQAA 2415 UINT_32 pitchInElement; ///< Pitch in elements (blocks for compressed formats) 2416 UINT_32 sliceAlign; ///< Required slice size in bytes 2417 } ADDR2_COMPUTE_SURFACE_INFO_INPUT; 2418 2419 /** 2420 **************************************************************************************************** 2421 * ADDR2_MIP_INFO 2422 * 2423 * @brief 2424 * Structure that contains information for mip level 2425 * 2426 **************************************************************************************************** 2427 */ 2428 typedef struct _ADDR2_MIP_INFO 2429 { 2430 UINT_32 pitch; ///< Pitch in elements 2431 UINT_32 height; ///< Padded height in elements 2432 UINT_32 depth; ///< Padded depth 2433 UINT_32 pixelPitch; ///< Pitch in pixels 2434 UINT_32 pixelHeight; ///< Padded height in pixels 2435 UINT_32 equationIndex; ///< Equation index in the equation table 2436 UINT_64 offset; ///< Offset in bytes from mip base, should only be used 2437 ///< to setup vam surface descriptor, can't be used 2438 ///< to setup swizzle pattern 2439 UINT_64 macroBlockOffset; ///< macro block offset in bytes from mip base 2440 UINT_32 mipTailOffset; ///< mip tail offset in bytes 2441 UINT_32 mipTailCoordX; ///< mip tail coord x 2442 UINT_32 mipTailCoordY; ///< mip tail coord y 2443 UINT_32 mipTailCoordZ; ///< mip tail coord z 2444 } ADDR2_MIP_INFO; 2445 2446 /** 2447 **************************************************************************************************** 2448 * ADDR2_COMPUTE_SURFACE_INFO_OUTPUT 2449 * 2450 * @brief 2451 * Output structure for Addr2ComputeSurfInfo 2452 * @note 2453 Element: AddrLib unit for computing. e.g. BCn: 4x4 blocks; R32B32B32: 32bit with 3x pitch 2454 Pixel: Original pixel 2455 **************************************************************************************************** 2456 */ 2457 typedef struct _ADDR2_COMPUTE_SURFACE_INFO_OUTPUT 2458 { 2459 UINT_32 size; ///< Size of this structure in bytes 2460 2461 UINT_32 pitch; ///< Pitch in elements (blocks for compressed formats) 2462 UINT_32 height; ///< Padded height (of mip0) in elements 2463 UINT_32 numSlices; ///< Padded depth for 3d resource 2464 ///< or padded number of slices for 2d array resource 2465 UINT_32 mipChainPitch; ///< Pitch (of total mip chain) in elements 2466 UINT_32 mipChainHeight; ///< Padded height (of total mip chain) in elements 2467 UINT_32 mipChainSlice; ///< Padded depth (of total mip chain) 2468 UINT_64 sliceSize; ///< Slice (total mip chain) size in bytes 2469 UINT_64 surfSize; ///< Surface (total mip chain) size in bytes 2470 UINT_32 baseAlign; ///< Base address alignment 2471 UINT_32 bpp; ///< Bits per elements 2472 /// (e.g. blocks for BCn, 1/3 for 96bit) 2473 UINT_32 pixelMipChainPitch; ///< Mip chain pitch in original pixels 2474 UINT_32 pixelMipChainHeight; ///< Mip chain height in original pixels 2475 UINT_32 pixelPitch; ///< Pitch in original pixels 2476 UINT_32 pixelHeight; ///< Height in original pixels 2477 UINT_32 pixelBits; ///< Original bits per pixel, passed from input 2478 2479 UINT_32 blockWidth; ///< Width in element inside one block 2480 UINT_32 blockHeight; ///< Height in element inside one block 2481 UINT_32 blockSlices; ///< Slice number inside one block 2482 ///< Prt tile is one block, its width/height/slice 2483 ///< equals to blcok width/height/slice 2484 2485 BOOL_32 epitchIsHeight; ///< Whether to use height to program epitch register 2486 /// Stereo info 2487 ADDR_QBSTEREOINFO* pStereoInfo; ///< Stereo info, needed if qbStereo flag is TRUE 2488 /// Mip info 2489 ADDR2_MIP_INFO* pMipInfo; ///< Pointer to mip information array 2490 /// if it is not NULL, the array is assumed to 2491 /// contain numMipLevels entries 2492 2493 UINT_32 equationIndex; ///< Equation index in the equation table of mip0 2494 BOOL_32 mipChainInTail; ///< If whole mipchain falls into mip tail block 2495 UINT_32 firstMipIdInTail; ///< The id of first mip in tail, if there is no mip 2496 /// in tail, it will be set to number of mip levels 2497 } ADDR2_COMPUTE_SURFACE_INFO_OUTPUT; 2498 2499 /** 2500 **************************************************************************************************** 2501 * Addr2ComputeSurfaceInfo 2502 * 2503 * @brief 2504 * Compute surface width/height/slices/alignments and suitable tiling mode 2505 **************************************************************************************************** 2506 */ 2507 ADDR_E_RETURNCODE ADDR_API Addr2ComputeSurfaceInfo( 2508 ADDR_HANDLE hLib, 2509 const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn, 2510 ADDR2_COMPUTE_SURFACE_INFO_OUTPUT* pOut); 2511 2512 2513 2514 /** 2515 **************************************************************************************************** 2516 * ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT 2517 * 2518 * @brief 2519 * Input structure for Addr2ComputeSurfaceAddrFromCoord 2520 **************************************************************************************************** 2521 */ 2522 typedef struct _ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT 2523 { 2524 UINT_32 size; ///< Size of this structure in bytes 2525 2526 UINT_32 x; ///< X coordinate 2527 UINT_32 y; ///< Y coordinate 2528 UINT_32 slice; ///< Slice index 2529 UINT_32 sample; ///< Sample index, use fragment index for EQAA 2530 UINT_32 mipId; ///< the mip ID in mip chain 2531 2532 AddrSwizzleMode swizzleMode; ///< Swizzle mode for Gfx9 2533 ADDR2_SURFACE_FLAGS flags; ///< Surface flags 2534 AddrResourceType resourceType; ///< Surface type 2535 UINT_32 bpp; ///< Bits per pixel 2536 UINT_32 unalignedWidth; ///< Surface original width (of mip0) 2537 UINT_32 unalignedHeight; ///< Surface original height (of mip0) 2538 UINT_32 numSlices; ///< Surface original slices (of mip0) 2539 UINT_32 numMipLevels; ///< Total mipmap levels 2540 UINT_32 numSamples; ///< Number of samples 2541 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as 2542 /// number of samples for normal AA; Set it to the 2543 /// number of fragments for EQAA 2544 2545 UINT_32 pipeBankXor; ///< Combined swizzle used to do bank/pipe rotation 2546 UINT_32 pitchInElement; ///< Pitch in elements (blocks for compressed formats) 2547 } ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT; 2548 2549 /** 2550 **************************************************************************************************** 2551 * ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT 2552 * 2553 * @brief 2554 * Output structure for Addr2ComputeSurfaceAddrFromCoord 2555 **************************************************************************************************** 2556 */ 2557 typedef struct _ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT 2558 { 2559 UINT_32 size; ///< Size of this structure in bytes 2560 2561 UINT_64 addr; ///< Byte address 2562 UINT_32 bitPosition; ///< Bit position within surfaceAddr, 0-7. 2563 /// For surface bpp < 8, e.g. FMT_1. 2564 UINT_32 prtBlockIndex; ///< Index of a PRT tile (64K block) 2565 } ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT; 2566 2567 /** 2568 **************************************************************************************************** 2569 * Addr2ComputeSurfaceAddrFromCoord 2570 * 2571 * @brief 2572 * Compute surface address from a given coordinate. 2573 **************************************************************************************************** 2574 */ 2575 ADDR_E_RETURNCODE ADDR_API Addr2ComputeSurfaceAddrFromCoord( 2576 ADDR_HANDLE hLib, 2577 const ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT* pIn, 2578 ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT* pOut); 2579 2580 2581 2582 /** 2583 **************************************************************************************************** 2584 * ADDR2_COMPUTE_SURFACE_COORDFROMADDR_INPUT 2585 * 2586 * @brief 2587 * Input structure for Addr2ComputeSurfaceCoordFromAddr 2588 **************************************************************************************************** 2589 */ 2590 typedef struct _ADDR2_COMPUTE_SURFACE_COORDFROMADDR_INPUT 2591 { 2592 UINT_32 size; ///< Size of this structure in bytes 2593 2594 UINT_64 addr; ///< Address in bytes 2595 UINT_32 bitPosition; ///< Bit position in addr. 0-7. for surface bpp < 8, 2596 /// e.g. FMT_1; 2597 2598 AddrSwizzleMode swizzleMode; ///< Swizzle mode for Gfx9 2599 ADDR2_SURFACE_FLAGS flags; ///< Surface flags 2600 AddrResourceType resourceType; ///< Surface type 2601 UINT_32 bpp; ///< Bits per pixel 2602 UINT_32 unalignedWidth; ///< Surface original width (of mip0) 2603 UINT_32 unalignedHeight; ///< Surface original height (of mip0) 2604 UINT_32 numSlices; ///< Surface original slices (of mip0) 2605 UINT_32 numMipLevels; ///< Total mipmap levels. 2606 UINT_32 numSamples; ///< Number of samples 2607 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as 2608 /// number of samples for normal AA; Set it to the 2609 /// number of fragments for EQAA 2610 2611 UINT_32 pipeBankXor; ///< Combined swizzle used to do bank/pipe rotation 2612 UINT_32 pitchInElement; ///< Pitch in elements (blocks for compressed formats) 2613 } ADDR2_COMPUTE_SURFACE_COORDFROMADDR_INPUT; 2614 2615 /** 2616 **************************************************************************************************** 2617 * ADDR2_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT 2618 * 2619 * @brief 2620 * Output structure for Addr2ComputeSurfaceCoordFromAddr 2621 **************************************************************************************************** 2622 */ 2623 typedef struct _ADDR2_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT 2624 { 2625 UINT_32 size; ///< Size of this structure in bytes 2626 2627 UINT_32 x; ///< X coordinate 2628 UINT_32 y; ///< Y coordinate 2629 UINT_32 slice; ///< Index of slices 2630 UINT_32 sample; ///< Index of samples, means fragment index for EQAA 2631 UINT_32 mipId; ///< mipmap level id 2632 } ADDR2_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT; 2633 2634 /** 2635 **************************************************************************************************** 2636 * Addr2ComputeSurfaceCoordFromAddr 2637 * 2638 * @brief 2639 * Compute coordinate from a given surface address 2640 **************************************************************************************************** 2641 */ 2642 ADDR_E_RETURNCODE ADDR_API Addr2ComputeSurfaceCoordFromAddr( 2643 ADDR_HANDLE hLib, 2644 const ADDR2_COMPUTE_SURFACE_COORDFROMADDR_INPUT* pIn, 2645 ADDR2_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT* pOut); 2646 2647 2648 2649 //////////////////////////////////////////////////////////////////////////////////////////////////// 2650 // HTile functions for Gfx9 2651 //////////////////////////////////////////////////////////////////////////////////////////////////// 2652 2653 /** 2654 **************************************************************************************************** 2655 * ADDR2_META_FLAGS 2656 * 2657 * @brief 2658 * Metadata flags 2659 **************************************************************************************************** 2660 */ 2661 typedef union _ADDR2_META_FLAGS 2662 { 2663 struct 2664 { 2665 UINT_32 pipeAligned : 1; ///< if Metadata being pipe aligned 2666 UINT_32 rbAligned : 1; ///< if Metadata being RB aligned 2667 UINT_32 linear : 1; ///< if Metadata linear, GFX9 does not suppord this! 2668 UINT_32 reserved : 29; ///< Reserved bits 2669 }; 2670 2671 UINT_32 value; 2672 } ADDR2_META_FLAGS; 2673 2674 /** 2675 **************************************************************************************************** 2676 * ADDR2_META_MIP_INFO 2677 * 2678 * @brief 2679 * Structure to store per mip metadata information 2680 **************************************************************************************************** 2681 */ 2682 typedef struct _ADDR2_META_MIP_INFO 2683 { 2684 BOOL_32 inMiptail; 2685 union 2686 { 2687 struct 2688 { 2689 UINT_32 startX; 2690 UINT_32 startY; 2691 UINT_32 startZ; 2692 UINT_32 width; 2693 UINT_32 height; 2694 UINT_32 depth; 2695 }; 2696 2697 struct 2698 { 2699 UINT_32 offset; 2700 UINT_32 sliceSize; 2701 }; 2702 }; 2703 } ADDR2_META_MIP_INFO; 2704 2705 /** 2706 **************************************************************************************************** 2707 * ADDR2_COMPUTE_HTILE_INFO_INPUT 2708 * 2709 * @brief 2710 * Input structure of Addr2ComputeHtileInfo 2711 **************************************************************************************************** 2712 */ 2713 typedef struct _ADDR2_COMPUTE_HTILE_INFO_INPUT 2714 { 2715 UINT_32 size; ///< Size of this structure in bytes 2716 2717 ADDR2_META_FLAGS hTileFlags; ///< HTILE flags 2718 ADDR2_SURFACE_FLAGS depthFlags; ///< Depth surface flags 2719 AddrSwizzleMode swizzleMode; ///< Depth surface swizzle mode 2720 UINT_32 unalignedWidth; ///< Depth surface original width (of mip0) 2721 UINT_32 unalignedHeight; ///< Depth surface original height (of mip0) 2722 UINT_32 numSlices; ///< Number of slices of depth surface (of mip0) 2723 UINT_32 numMipLevels; ///< Total mipmap levels of color surface 2724 UINT_32 firstMipIdInTail; 2725 } ADDR2_COMPUTE_HTILE_INFO_INPUT; 2726 2727 /** 2728 **************************************************************************************************** 2729 * ADDR2_COMPUTE_HTILE_INFO_OUTPUT 2730 * 2731 * @brief 2732 * Output structure of Addr2ComputeHtileInfo 2733 **************************************************************************************************** 2734 */ 2735 typedef struct _ADDR2_COMPUTE_HTILE_INFO_OUTPUT 2736 { 2737 UINT_32 size; ///< Size of this structure in bytes 2738 2739 UINT_32 pitch; ///< Pitch in pixels of depth buffer represented in this 2740 /// HTile buffer. This might be larger than original depth 2741 /// buffer pitch when called with an unaligned pitch. 2742 UINT_32 height; ///< Height in pixels, as above 2743 UINT_32 baseAlign; ///< Base alignment 2744 UINT_32 sliceSize; ///< Slice size, in bytes. 2745 UINT_32 htileBytes; ///< Size of HTILE buffer, in bytes 2746 UINT_32 metaBlkWidth; ///< Meta block width 2747 UINT_32 metaBlkHeight; ///< Meta block height 2748 UINT_32 metaBlkNumPerSlice; ///< Number of metablock within one slice 2749 2750 ADDR2_META_MIP_INFO* pMipInfo; ///< HTILE mip information 2751 } ADDR2_COMPUTE_HTILE_INFO_OUTPUT; 2752 2753 /** 2754 **************************************************************************************************** 2755 * Addr2ComputeHtileInfo 2756 * 2757 * @brief 2758 * Compute Htile pitch, height, base alignment and size in bytes 2759 **************************************************************************************************** 2760 */ 2761 ADDR_E_RETURNCODE ADDR_API Addr2ComputeHtileInfo( 2762 ADDR_HANDLE hLib, 2763 const ADDR2_COMPUTE_HTILE_INFO_INPUT* pIn, 2764 ADDR2_COMPUTE_HTILE_INFO_OUTPUT* pOut); 2765 2766 2767 2768 /** 2769 **************************************************************************************************** 2770 * ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT 2771 * 2772 * @brief 2773 * Input structure for Addr2ComputeHtileAddrFromCoord 2774 **************************************************************************************************** 2775 */ 2776 typedef struct _ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT 2777 { 2778 UINT_32 size; ///< Size of this structure in bytes 2779 2780 UINT_32 x; ///< X coordinate 2781 UINT_32 y; ///< Y coordinate 2782 UINT_32 slice; ///< Index of slices 2783 UINT_32 mipId; ///< mipmap level id 2784 2785 ADDR2_META_FLAGS hTileFlags; ///< HTILE flags 2786 ADDR2_SURFACE_FLAGS depthflags; ///< Depth surface flags 2787 AddrSwizzleMode swizzleMode; ///< Depth surface swizzle mode 2788 UINT_32 bpp; ///< Depth surface bits per pixel 2789 UINT_32 unalignedWidth; ///< Depth surface original width (of mip0) 2790 UINT_32 unalignedHeight; ///< Depth surface original height (of mip0) 2791 UINT_32 numSlices; ///< Depth surface original depth (of mip0) 2792 UINT_32 numMipLevels; ///< Depth surface total mipmap levels 2793 UINT_32 numSamples; ///< Depth surface number of samples 2794 UINT_32 pipeXor; ///< Pipe xor setting 2795 } ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT; 2796 2797 /** 2798 **************************************************************************************************** 2799 * ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT 2800 * 2801 * @brief 2802 * Output structure for Addr2ComputeHtileAddrFromCoord 2803 **************************************************************************************************** 2804 */ 2805 typedef struct _ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT 2806 { 2807 UINT_32 size; ///< Size of this structure in bytes 2808 2809 UINT_64 addr; ///< Address in bytes 2810 } ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT; 2811 2812 /** 2813 **************************************************************************************************** 2814 * Addr2ComputeHtileAddrFromCoord 2815 * 2816 * @brief 2817 * Compute Htile address according to coordinates (of depth buffer) 2818 **************************************************************************************************** 2819 */ 2820 ADDR_E_RETURNCODE ADDR_API Addr2ComputeHtileAddrFromCoord( 2821 ADDR_HANDLE hLib, 2822 const ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT* pIn, 2823 ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT* pOut); 2824 2825 2826 2827 /** 2828 **************************************************************************************************** 2829 * ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT 2830 * 2831 * @brief 2832 * Input structure for Addr2ComputeHtileCoordFromAddr 2833 **************************************************************************************************** 2834 */ 2835 typedef struct _ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT 2836 { 2837 UINT_32 size; ///< Size of this structure in bytes 2838 2839 UINT_64 addr; ///< Address 2840 2841 ADDR2_META_FLAGS hTileFlags; ///< HTILE flags 2842 ADDR2_SURFACE_FLAGS depthFlags; ///< Depth surface flags 2843 AddrSwizzleMode swizzleMode; ///< Depth surface swizzle mode 2844 UINT_32 bpp; ///< Depth surface bits per pixel 2845 UINT_32 unalignedWidth; ///< Depth surface original width (of mip0) 2846 UINT_32 unalignedHeight; ///< Depth surface original height (of mip0) 2847 UINT_32 numSlices; ///< Depth surface original depth (of mip0) 2848 UINT_32 numMipLevels; ///< Depth surface total mipmap levels 2849 UINT_32 numSamples; ///< Depth surface number of samples 2850 UINT_32 pipeXor; ///< Pipe xor setting 2851 } ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT; 2852 2853 /** 2854 **************************************************************************************************** 2855 * ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT 2856 * 2857 * @brief 2858 * Output structure for Addr2ComputeHtileCoordFromAddr 2859 **************************************************************************************************** 2860 */ 2861 typedef struct _ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT 2862 { 2863 UINT_32 size; ///< Size of this structure in bytes 2864 2865 UINT_32 x; ///< X coordinate 2866 UINT_32 y; ///< Y coordinate 2867 UINT_32 slice; ///< Index of slices 2868 UINT_32 mipId; ///< mipmap level id 2869 } ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT; 2870 2871 /** 2872 **************************************************************************************************** 2873 * Addr2ComputeHtileCoordFromAddr 2874 * 2875 * @brief 2876 * Compute coordinates within depth buffer (1st pixel of a micro tile) according to 2877 * Htile address 2878 **************************************************************************************************** 2879 */ 2880 ADDR_E_RETURNCODE ADDR_API Addr2ComputeHtileCoordFromAddr( 2881 ADDR_HANDLE hLib, 2882 const ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT* pIn, 2883 ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT* pOut); 2884 2885 2886 2887 //////////////////////////////////////////////////////////////////////////////////////////////////// 2888 // C-mask functions for Gfx9 2889 //////////////////////////////////////////////////////////////////////////////////////////////////// 2890 2891 /** 2892 **************************************************************************************************** 2893 * ADDR2_COMPUTE_CMASK_INFO_INPUT 2894 * 2895 * @brief 2896 * Input structure of Addr2ComputeCmaskInfo 2897 **************************************************************************************************** 2898 */ 2899 typedef struct _ADDR2_COMPUTE_CMASKINFO_INPUT 2900 { 2901 UINT_32 size; ///< Size of this structure in bytes 2902 2903 ADDR2_META_FLAGS cMaskFlags; ///< CMASK flags 2904 ADDR2_SURFACE_FLAGS colorFlags; ///< Color surface flags 2905 AddrResourceType resourceType; ///< Color surface type 2906 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode 2907 UINT_32 unalignedWidth; ///< Color surface original width 2908 UINT_32 unalignedHeight; ///< Color surface original height 2909 UINT_32 numSlices; ///< Number of slices of color buffer 2910 } ADDR2_COMPUTE_CMASK_INFO_INPUT; 2911 2912 /** 2913 **************************************************************************************************** 2914 * ADDR2_COMPUTE_CMASK_INFO_OUTPUT 2915 * 2916 * @brief 2917 * Output structure of Addr2ComputeCmaskInfo 2918 **************************************************************************************************** 2919 */ 2920 typedef struct _ADDR2_COMPUTE_CMASK_INFO_OUTPUT 2921 { 2922 UINT_32 size; ///< Size of this structure in bytes 2923 2924 UINT_32 pitch; ///< Pitch in pixels of color buffer which 2925 /// this Cmask matches. The size might be larger than 2926 /// original color buffer pitch when called with 2927 /// an unaligned pitch. 2928 UINT_32 height; ///< Height in pixels, as above 2929 UINT_32 baseAlign; ///< Base alignment 2930 UINT_32 sliceSize; ///< Slice size, in bytes. 2931 UINT_32 cmaskBytes; ///< Size in bytes of CMask buffer 2932 UINT_32 metaBlkWidth; ///< Meta block width 2933 UINT_32 metaBlkHeight; ///< Meta block height 2934 2935 UINT_32 metaBlkNumPerSlice; ///< Number of metablock within one slice 2936 } ADDR2_COMPUTE_CMASK_INFO_OUTPUT; 2937 2938 /** 2939 **************************************************************************************************** 2940 * Addr2ComputeCmaskInfo 2941 * 2942 * @brief 2943 * Compute Cmask pitch, height, base alignment and size in bytes from color buffer 2944 * info 2945 **************************************************************************************************** 2946 */ 2947 ADDR_E_RETURNCODE ADDR_API Addr2ComputeCmaskInfo( 2948 ADDR_HANDLE hLib, 2949 const ADDR2_COMPUTE_CMASK_INFO_INPUT* pIn, 2950 ADDR2_COMPUTE_CMASK_INFO_OUTPUT* pOut); 2951 2952 2953 2954 /** 2955 **************************************************************************************************** 2956 * ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT 2957 * 2958 * @brief 2959 * Input structure for Addr2ComputeCmaskAddrFromCoord 2960 * 2961 **************************************************************************************************** 2962 */ 2963 typedef struct _ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT 2964 { 2965 UINT_32 size; ///< Size of this structure in bytes 2966 2967 UINT_32 x; ///< X coordinate 2968 UINT_32 y; ///< Y coordinate 2969 UINT_32 slice; ///< Index of slices 2970 2971 ADDR2_META_FLAGS cMaskFlags; ///< CMASK flags 2972 ADDR2_SURFACE_FLAGS colorFlags; ///< Color surface flags 2973 AddrResourceType resourceType; ///< Color surface type 2974 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode 2975 2976 UINT_32 unalignedWidth; ///< Color surface original width (of mip0) 2977 UINT_32 unalignedHeight; ///< Color surface original height (of mip0) 2978 UINT_32 numSlices; ///< Color surface original slices (of mip0) 2979 2980 UINT_32 numSamples; ///< Color surfae sample number 2981 UINT_32 numFrags; ///< Color surface fragment number 2982 2983 UINT_32 pipeXor; ///< pipe Xor setting 2984 } ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT; 2985 2986 /** 2987 **************************************************************************************************** 2988 * ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT 2989 * 2990 * @brief 2991 * Output structure for Addr2ComputeCmaskAddrFromCoord 2992 **************************************************************************************************** 2993 */ 2994 typedef struct _ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT 2995 { 2996 UINT_32 size; ///< Size of this structure in bytes 2997 2998 UINT_64 addr; ///< CMASK address in bytes 2999 UINT_32 bitPosition; ///< Bit position within addr, 0 or 4 3000 } ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT; 3001 3002 /** 3003 **************************************************************************************************** 3004 * Addr2ComputeCmaskAddrFromCoord 3005 * 3006 * @brief 3007 * Compute Cmask address according to coordinates (of MSAA color buffer) 3008 **************************************************************************************************** 3009 */ 3010 ADDR_E_RETURNCODE ADDR_API Addr2ComputeCmaskAddrFromCoord( 3011 ADDR_HANDLE hLib, 3012 const ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT* pIn, 3013 ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT* pOut); 3014 3015 3016 3017 /** 3018 **************************************************************************************************** 3019 * ADDR2_COMPUTE_CMASK_COORDFROMADDR_INPUT 3020 * 3021 * @brief 3022 * Input structure for Addr2ComputeCmaskCoordFromAddr 3023 **************************************************************************************************** 3024 */ 3025 typedef struct _ADDR2_COMPUTE_CMASK_COORDFROMADDR_INPUT 3026 { 3027 UINT_32 size; ///< Size of this structure in bytes 3028 3029 UINT_64 addr; ///< CMASK address in bytes 3030 UINT_32 bitPosition; ///< Bit position within addr, 0 or 4 3031 3032 ADDR2_META_FLAGS cMaskFlags; ///< CMASK flags 3033 ADDR2_SURFACE_FLAGS colorFlags; ///< Color surface flags 3034 AddrResourceType resourceType; ///< Color surface type 3035 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode 3036 3037 UINT_32 unalignedWidth; ///< Color surface original width (of mip0) 3038 UINT_32 unalignedHeight; ///< Color surface original height (of mip0) 3039 UINT_32 numSlices; ///< Color surface original slices (of mip0) 3040 UINT_32 numMipLevels; ///< Color surface total mipmap levels. 3041 } ADDR2_COMPUTE_CMASK_COORDFROMADDR_INPUT; 3042 3043 /** 3044 **************************************************************************************************** 3045 * ADDR2_COMPUTE_CMASK_COORDFROMADDR_OUTPUT 3046 * 3047 * @brief 3048 * Output structure for Addr2ComputeCmaskCoordFromAddr 3049 **************************************************************************************************** 3050 */ 3051 typedef struct _ADDR2_COMPUTE_CMASK_COORDFROMADDR_OUTPUT 3052 { 3053 UINT_32 size; ///< Size of this structure in bytes 3054 3055 UINT_32 x; ///< X coordinate 3056 UINT_32 y; ///< Y coordinate 3057 UINT_32 slice; ///< Index of slices 3058 UINT_32 mipId; ///< mipmap level id 3059 } ADDR2_COMPUTE_CMASK_COORDFROMADDR_OUTPUT; 3060 3061 /** 3062 **************************************************************************************************** 3063 * Addr2ComputeCmaskCoordFromAddr 3064 * 3065 * @brief 3066 * Compute coordinates within color buffer (1st pixel of a micro tile) according to 3067 * Cmask address 3068 **************************************************************************************************** 3069 */ 3070 ADDR_E_RETURNCODE ADDR_API Addr2ComputeCmaskCoordFromAddr( 3071 ADDR_HANDLE hLib, 3072 const ADDR2_COMPUTE_CMASK_COORDFROMADDR_INPUT* pIn, 3073 ADDR2_COMPUTE_CMASK_COORDFROMADDR_OUTPUT* pOut); 3074 3075 3076 3077 //////////////////////////////////////////////////////////////////////////////////////////////////// 3078 // F-mask functions for Gfx9 3079 //////////////////////////////////////////////////////////////////////////////////////////////////// 3080 3081 /** 3082 **************************************************************************************************** 3083 * ADDR2_FMASK_FLAGS 3084 * 3085 * @brief 3086 * FMASK flags 3087 **************************************************************************************************** 3088 */ 3089 typedef union _ADDR2_FMASK_FLAGS 3090 { 3091 struct 3092 { 3093 UINT_32 resolved : 1; ///< TRUE if this is a resolved fmask, used by H/W clients 3094 /// by H/W clients. S/W should always set it to FALSE. 3095 UINT_32 reserved : 31; ///< Reserved for future use. 3096 }; 3097 3098 UINT_32 value; 3099 } ADDR2_FMASK_FLAGS; 3100 3101 /** 3102 **************************************************************************************************** 3103 * ADDR2_COMPUTE_FMASK_INFO_INPUT 3104 * 3105 * @brief 3106 * Input structure for Addr2ComputeFmaskInfo 3107 **************************************************************************************************** 3108 */ 3109 typedef struct _ADDR2_COMPUTE_FMASK_INFO_INPUT 3110 { 3111 UINT_32 size; ///< Size of this structure in bytes 3112 3113 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode 3114 UINT_32 unalignedWidth; ///< Color surface original width 3115 UINT_32 unalignedHeight; ///< Color surface original height 3116 UINT_32 numSlices; ///< Number of slices/depth 3117 UINT_32 numSamples; ///< Number of samples 3118 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as 3119 /// number of samples for normal AA; Set it to the 3120 /// number of fragments for EQAA 3121 ADDR2_FMASK_FLAGS fMaskFlags; ///< FMASK flags 3122 } ADDR2_COMPUTE_FMASK_INFO_INPUT; 3123 3124 /** 3125 **************************************************************************************************** 3126 * ADDR2_COMPUTE_FMASK_INFO_OUTPUT 3127 * 3128 * @brief 3129 * Output structure for Addr2ComputeFmaskInfo 3130 **************************************************************************************************** 3131 */ 3132 typedef struct _ADDR2_COMPUTE_FMASK_INFO_OUTPUT 3133 { 3134 UINT_32 size; ///< Size of this structure in bytes 3135 3136 UINT_32 pitch; ///< Pitch of fmask in pixels 3137 UINT_32 height; ///< Height of fmask in pixels 3138 UINT_32 baseAlign; ///< Base alignment 3139 UINT_32 numSlices; ///< Slices of fmask 3140 UINT_32 fmaskBytes; ///< Size of fmask in bytes 3141 UINT_32 bpp; ///< Bits per pixel of FMASK is: number of bit planes 3142 UINT_32 numSamples; ///< Number of samples 3143 UINT_32 sliceSize; ///< Size of slice in bytes 3144 } ADDR2_COMPUTE_FMASK_INFO_OUTPUT; 3145 3146 /** 3147 **************************************************************************************************** 3148 * Addr2ComputeFmaskInfo 3149 * 3150 * @brief 3151 * Compute Fmask pitch/height/slices/alignments and size in bytes 3152 **************************************************************************************************** 3153 */ 3154 ADDR_E_RETURNCODE ADDR_API Addr2ComputeFmaskInfo( 3155 ADDR_HANDLE hLib, 3156 const ADDR2_COMPUTE_FMASK_INFO_INPUT* pIn, 3157 ADDR2_COMPUTE_FMASK_INFO_OUTPUT* pOut); 3158 3159 3160 3161 /** 3162 **************************************************************************************************** 3163 * ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_INPUT 3164 * 3165 * @brief 3166 * Input structure for Addr2ComputeFmaskAddrFromCoord 3167 **************************************************************************************************** 3168 */ 3169 typedef struct _ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_INPUT 3170 { 3171 UINT_32 size; ///< Size of this structure in bytes 3172 3173 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode 3174 UINT_32 x; ///< X coordinate 3175 UINT_32 y; ///< Y coordinate 3176 UINT_32 slice; ///< Slice index 3177 UINT_32 sample; ///< Sample index (fragment index for EQAA) 3178 UINT_32 plane; ///< Plane number 3179 3180 UINT_32 unalignedWidth; ///< Color surface original width 3181 UINT_32 unalignedHeight; ///< Color surface original height 3182 UINT_32 numSamples; ///< Number of samples 3183 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as 3184 /// number of samples for normal AA; Set it to the 3185 /// number of fragments for EQAA 3186 UINT_32 tileSwizzle; ///< Combined swizzle used to do bank/pipe rotation 3187 3188 ADDR2_FMASK_FLAGS fMaskFlags; ///< FMASK flags 3189 } ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_INPUT; 3190 3191 /** 3192 **************************************************************************************************** 3193 * ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT 3194 * 3195 * @brief 3196 * Output structure for Addr2ComputeFmaskAddrFromCoord 3197 **************************************************************************************************** 3198 */ 3199 typedef struct _ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT 3200 { 3201 UINT_32 size; ///< Size of this structure in bytes 3202 3203 UINT_64 addr; ///< Fmask address 3204 UINT_32 bitPosition; ///< Bit position within fmaskAddr, 0-7. 3205 } ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT; 3206 3207 /** 3208 **************************************************************************************************** 3209 * Addr2ComputeFmaskAddrFromCoord 3210 * 3211 * @brief 3212 * Compute Fmask address according to coordinates (x,y,slice,sample,plane) 3213 **************************************************************************************************** 3214 */ 3215 ADDR_E_RETURNCODE ADDR_API Addr2ComputeFmaskAddrFromCoord( 3216 ADDR_HANDLE hLib, 3217 const ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_INPUT* pIn, 3218 ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT* pOut); 3219 3220 3221 3222 /** 3223 **************************************************************************************************** 3224 * ADDR2_COMPUTE_FMASK_COORDFROMADDR_INPUT 3225 * 3226 * @brief 3227 * Input structure for Addr2ComputeFmaskCoordFromAddr 3228 **************************************************************************************************** 3229 */ 3230 typedef struct _ADDR2_COMPUTE_FMASK_COORDFROMADDR_INPUT 3231 { 3232 UINT_32 size; ///< Size of this structure in bytes 3233 3234 UINT_64 addr; ///< Address 3235 UINT_32 bitPosition; ///< Bit position within addr, 0-7. 3236 AddrSwizzleMode swizzleMode; ///< FMask surface swizzle mode 3237 3238 UINT_32 unalignedWidth; ///< Color surface original width 3239 UINT_32 unalignedHeight; ///< Color surface original height 3240 UINT_32 numSamples; ///< Number of samples 3241 UINT_32 numFrags; ///< Number of fragments 3242 3243 UINT_32 tileSwizzle; ///< Combined swizzle used to do bank/pipe rotation 3244 3245 ADDR2_FMASK_FLAGS fMaskFlags; ///< FMASK flags 3246 } ADDR2_COMPUTE_FMASK_COORDFROMADDR_INPUT; 3247 3248 /** 3249 **************************************************************************************************** 3250 * ADDR2_COMPUTE_FMASK_COORDFROMADDR_OUTPUT 3251 * 3252 * @brief 3253 * Output structure for Addr2ComputeFmaskCoordFromAddr 3254 **************************************************************************************************** 3255 */ 3256 typedef struct _ADDR2_COMPUTE_FMASK_COORDFROMADDR_OUTPUT 3257 { 3258 UINT_32 size; ///< Size of this structure in bytes 3259 3260 UINT_32 x; ///< X coordinate 3261 UINT_32 y; ///< Y coordinate 3262 UINT_32 slice; ///< Slice index 3263 UINT_32 sample; ///< Sample index (fragment index for EQAA) 3264 UINT_32 plane; ///< Plane number 3265 } ADDR2_COMPUTE_FMASK_COORDFROMADDR_OUTPUT; 3266 3267 /** 3268 **************************************************************************************************** 3269 * Addr2ComputeFmaskCoordFromAddr 3270 * 3271 * @brief 3272 * Compute FMASK coordinate from an given address 3273 **************************************************************************************************** 3274 */ 3275 ADDR_E_RETURNCODE ADDR_API Addr2ComputeFmaskCoordFromAddr( 3276 ADDR_HANDLE hLib, 3277 const ADDR2_COMPUTE_FMASK_COORDFROMADDR_INPUT* pIn, 3278 ADDR2_COMPUTE_FMASK_COORDFROMADDR_OUTPUT* pOut); 3279 3280 3281 3282 //////////////////////////////////////////////////////////////////////////////////////////////////// 3283 // DCC key functions for Gfx9 3284 //////////////////////////////////////////////////////////////////////////////////////////////////// 3285 3286 /** 3287 **************************************************************************************************** 3288 * _ADDR2_COMPUTE_DCCINFO_INPUT 3289 * 3290 * @brief 3291 * Input structure of Addr2ComputeDccInfo 3292 **************************************************************************************************** 3293 */ 3294 typedef struct _ADDR2_COMPUTE_DCCINFO_INPUT 3295 { 3296 UINT_32 size; ///< Size of this structure in bytes 3297 3298 ADDR2_META_FLAGS dccKeyFlags; ///< DCC key flags 3299 ADDR2_SURFACE_FLAGS colorFlags; ///< Color surface flags 3300 AddrResourceType resourceType; ///< Color surface type 3301 AddrSwizzleMode swizzleMode; ///< Color surface swizzle mode 3302 UINT_32 bpp; ///< bits per pixel 3303 UINT_32 unalignedWidth; ///< Color surface original width (of mip0) 3304 UINT_32 unalignedHeight; ///< Color surface original height (of mip0) 3305 UINT_32 numSlices; ///< Number of slices, of color surface (of mip0) 3306 UINT_32 numFrags; ///< Fragment number of color surface 3307 UINT_32 numMipLevels; ///< Total mipmap levels of color surface 3308 UINT_32 dataSurfaceSize; ///< The padded size of all slices and mip levels 3309 ///< useful in meta linear case 3310 UINT_32 firstMipIdInTail; 3311 } ADDR2_COMPUTE_DCCINFO_INPUT; 3312 3313 /** 3314 **************************************************************************************************** 3315 * ADDR2_COMPUTE_DCCINFO_OUTPUT 3316 * 3317 * @brief 3318 * Output structure of Addr2ComputeDccInfo 3319 **************************************************************************************************** 3320 */ 3321 typedef struct _ADDR2_COMPUTE_DCCINFO_OUTPUT 3322 { 3323 UINT_32 size; ///< Size of this structure in bytes 3324 3325 UINT_32 dccRamBaseAlign; ///< Base alignment of dcc key 3326 UINT_32 dccRamSize; ///< Size of dcc key 3327 3328 UINT_32 pitch; ///< DCC surface mip chain pitch 3329 UINT_32 height; ///< DCC surface mip chain height 3330 UINT_32 depth; ///< DCC surface mip chain depth 3331 3332 UINT_32 compressBlkWidth; ///< DCC compress block width 3333 UINT_32 compressBlkHeight; ///< DCC compress block height 3334 UINT_32 compressBlkDepth; ///< DCC compress block depth 3335 3336 UINT_32 metaBlkWidth; ///< DCC meta block width 3337 UINT_32 metaBlkHeight; ///< DCC meta block height 3338 UINT_32 metaBlkDepth; ///< DCC meta block depth 3339 3340 UINT_32 metaBlkNumPerSlice; ///< Number of metablock within one slice 3341 3342 union 3343 { 3344 UINT_32 fastClearSizePerSlice; ///< Size of DCC within a slice should be fast cleared 3345 UINT_32 dccRamSliceSize; 3346 }; 3347 3348 ADDR2_META_MIP_INFO* pMipInfo; ///< DCC mip information 3349 } ADDR2_COMPUTE_DCCINFO_OUTPUT; 3350 3351 /** 3352 **************************************************************************************************** 3353 * Addr2ComputeDccInfo 3354 * 3355 * @brief 3356 * Compute DCC key size, base alignment 3357 * info 3358 **************************************************************************************************** 3359 */ 3360 ADDR_E_RETURNCODE ADDR_API Addr2ComputeDccInfo( 3361 ADDR_HANDLE hLib, 3362 const ADDR2_COMPUTE_DCCINFO_INPUT* pIn, 3363 ADDR2_COMPUTE_DCCINFO_OUTPUT* pOut); 3364 3365 3366 /** 3367 **************************************************************************************************** 3368 * ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT 3369 * 3370 * @brief 3371 * Input structure for Addr2ComputeDccAddrFromCoord 3372 * 3373 **************************************************************************************************** 3374 */ 3375 typedef struct _ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT 3376 { 3377 UINT_32 size; ///< Size of this structure in bytes 3378 3379 UINT_32 x; ///< X coordinate 3380 UINT_32 y; ///< Y coordinate 3381 UINT_32 slice; ///< Index of slices 3382 UINT_32 sample; ///< Index of samples, means fragment index for EQAA 3383 UINT_32 mipId; ///< mipmap level id 3384 3385 ADDR2_META_FLAGS dccKeyFlags; ///< DCC flags 3386 ADDR2_SURFACE_FLAGS colorFlags; ///< Color surface flags 3387 AddrResourceType resourceType; ///< Color surface type 3388 AddrSwizzleMode swizzleMode; ///< Color surface swizzle mode 3389 UINT_32 bpp; ///< Color surface bits per pixel 3390 UINT_32 unalignedWidth; ///< Color surface original width (of mip0) 3391 UINT_32 unalignedHeight; ///< Color surface original height (of mip0) 3392 UINT_32 numSlices; ///< Color surface original slices (of mip0) 3393 UINT_32 numMipLevels; ///< Color surface mipmap levels 3394 UINT_32 numFrags; ///< Color surface fragment number 3395 3396 UINT_32 pipeXor; ///< pipe Xor setting 3397 } ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT; 3398 3399 /** 3400 **************************************************************************************************** 3401 * ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT 3402 * 3403 * @brief 3404 * Output structure for Addr2ComputeDccAddrFromCoord 3405 **************************************************************************************************** 3406 */ 3407 typedef struct _ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT 3408 { 3409 UINT_32 size; ///< Size of this structure in bytes 3410 3411 UINT_64 addr; ///< DCC address in bytes 3412 } ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT; 3413 3414 /** 3415 **************************************************************************************************** 3416 * Addr2ComputeDccAddrFromCoord 3417 * 3418 * @brief 3419 * Compute DCC address according to coordinates (of MSAA color buffer) 3420 **************************************************************************************************** 3421 */ 3422 ADDR_E_RETURNCODE ADDR_API Addr2ComputeDccAddrFromCoord( 3423 ADDR_HANDLE hLib, 3424 const ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT* pIn, 3425 ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT* pOut); 3426 3427 //////////////////////////////////////////////////////////////////////////////////////////////////// 3428 // Misc functions for Gfx9 3429 //////////////////////////////////////////////////////////////////////////////////////////////////// 3430 3431 /** 3432 **************************************************************************************************** 3433 * ADDR2_COMPUTE_PIPEBANKXOR_INPUT 3434 * 3435 * @brief 3436 * Input structure of Addr2ComputePipebankXor 3437 **************************************************************************************************** 3438 */ 3439 typedef struct _ADDR2_COMPUTE_PIPEBANKXOR_INPUT 3440 { 3441 UINT_32 size; ///< Size of this structure in bytes 3442 UINT_32 surfIndex; ///< Input surface index 3443 ADDR2_SURFACE_FLAGS flags; ///< Surface flag 3444 AddrSwizzleMode swizzleMode; ///< Surface swizzle mode 3445 AddrResourceType resourceType; ///< Surface resource type 3446 AddrFormat format; ///< Surface format 3447 UINT_32 numSamples; ///< Number of samples 3448 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as 3449 /// number of samples for normal AA; Set it to the 3450 /// number of fragments for EQAA 3451 } ADDR2_COMPUTE_PIPEBANKXOR_INPUT; 3452 3453 /** 3454 **************************************************************************************************** 3455 * ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT 3456 * 3457 * @brief 3458 * Output structure of Addr2ComputePipebankXor 3459 **************************************************************************************************** 3460 */ 3461 typedef struct _ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT 3462 { 3463 UINT_32 size; ///< Size of this structure in bytes 3464 UINT_32 pipeBankXor; ///< Pipe bank xor 3465 } ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT; 3466 3467 /** 3468 **************************************************************************************************** 3469 * Addr2ComputePipeBankXor 3470 * 3471 * @brief 3472 * Calculate a valid bank pipe xor value for client to use. 3473 **************************************************************************************************** 3474 */ 3475 ADDR_E_RETURNCODE ADDR_API Addr2ComputePipeBankXor( 3476 ADDR_HANDLE hLib, 3477 const ADDR2_COMPUTE_PIPEBANKXOR_INPUT* pIn, 3478 ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT* pOut); 3479 3480 /** 3481 **************************************************************************************************** 3482 * ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT 3483 * 3484 * @brief 3485 * Input structure of Addr2ComputeSlicePipeBankXor 3486 **************************************************************************************************** 3487 */ 3488 typedef struct _ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT 3489 { 3490 UINT_32 size; ///< Size of this structure in bytes 3491 AddrSwizzleMode swizzleMode; ///< Surface swizzle mode 3492 AddrResourceType resourceType; ///< Surface resource type 3493 UINT_32 basePipeBankXor; ///< Base pipe bank xor 3494 UINT_32 slice; ///< Slice id 3495 UINT_32 numSamples; ///< Number of samples 3496 } ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT; 3497 3498 /** 3499 **************************************************************************************************** 3500 * ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT 3501 * 3502 * @brief 3503 * Output structure of Addr2ComputeSlicePipeBankXor 3504 **************************************************************************************************** 3505 */ 3506 typedef struct _ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT 3507 { 3508 UINT_32 size; ///< Size of this structure in bytes 3509 UINT_32 pipeBankXor; ///< Pipe bank xor 3510 } ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT; 3511 3512 /** 3513 **************************************************************************************************** 3514 * Addr2ComputeSlicePipeBankXor 3515 * 3516 * @brief 3517 * Calculate slice pipe bank xor value based on base pipe bank xor and slice id. 3518 **************************************************************************************************** 3519 */ 3520 ADDR_E_RETURNCODE ADDR_API Addr2ComputeSlicePipeBankXor( 3521 ADDR_HANDLE hLib, 3522 const ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT* pIn, 3523 ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT* pOut); 3524 3525 /** 3526 **************************************************************************************************** 3527 * ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT 3528 * 3529 * @brief 3530 * Input structure of Addr2ComputeSubResourceOffsetForSwizzlePattern 3531 **************************************************************************************************** 3532 */ 3533 typedef struct _ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT 3534 { 3535 UINT_32 size; ///< Size of this structure in bytes 3536 AddrSwizzleMode swizzleMode; ///< Surface swizzle mode 3537 AddrResourceType resourceType; ///< Surface resource type 3538 UINT_32 pipeBankXor; ///< Per resource xor 3539 UINT_32 slice; ///< Slice id 3540 UINT_64 sliceSize; ///< Slice size of a mip chain 3541 UINT_64 macroBlockOffset; ///< Macro block offset, returned in ADDR2_MIP_INFO 3542 UINT_32 mipTailOffset; ///< Mip tail offset, returned in ADDR2_MIP_INFO 3543 } ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT; 3544 3545 /** 3546 **************************************************************************************************** 3547 * ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT 3548 * 3549 * @brief 3550 * Output structure of Addr2ComputeSubResourceOffsetForSwizzlePattern 3551 **************************************************************************************************** 3552 */ 3553 typedef struct _ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT 3554 { 3555 UINT_32 size; ///< Size of this structure in bytes 3556 UINT_64 offset; ///< offset 3557 } ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT; 3558 3559 /** 3560 **************************************************************************************************** 3561 * Addr2ComputeSubResourceOffsetForSwizzlePattern 3562 * 3563 * @brief 3564 * Calculate sub resource offset to support swizzle pattern. 3565 **************************************************************************************************** 3566 */ 3567 ADDR_E_RETURNCODE ADDR_API Addr2ComputeSubResourceOffsetForSwizzlePattern( 3568 ADDR_HANDLE hLib, 3569 const ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT* pIn, 3570 ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT* pOut); 3571 3572 /** 3573 **************************************************************************************************** 3574 * ADDR2_BLOCK_SET 3575 * 3576 * @brief 3577 * Bit field that defines block type 3578 **************************************************************************************************** 3579 */ 3580 typedef union _ADDR2_BLOCK_SET 3581 { 3582 struct 3583 { 3584 UINT_32 micro : 1; // 256B block for 2D resource 3585 UINT_32 macro4KB : 1; // 4KB for 2D/3D resource 3586 UINT_32 macro64KB : 1; // 64KB for 2D/3D resource 3587 UINT_32 var : 1; // VAR block 3588 UINT_32 linear : 1; // Linear block 3589 UINT_32 reserved : 27; 3590 }; 3591 3592 UINT_32 value; 3593 } ADDR2_BLOCK_SET; 3594 3595 /** 3596 **************************************************************************************************** 3597 * ADDR2_SWTYPE_SET 3598 * 3599 * @brief 3600 * Bit field that defines swizzle type 3601 **************************************************************************************************** 3602 */ 3603 typedef union _ADDR2_SWTYPE_SET 3604 { 3605 struct 3606 { 3607 UINT_32 sw_Z : 1; // SW_*_Z_* 3608 UINT_32 sw_S : 1; // SW_*_S_* 3609 UINT_32 sw_D : 1; // SW_*_D_* 3610 UINT_32 sw_R : 1; // SW_*_R_* 3611 UINT_32 reserved : 28; 3612 }; 3613 3614 UINT_32 value; 3615 } ADDR2_SWTYPE_SET; 3616 3617 /** 3618 **************************************************************************************************** 3619 * ADDR2_GET_PREFERRED_SURF_SETTING_INPUT 3620 * 3621 * @brief 3622 * Input structure of Addr2GetPreferredSurfaceSetting 3623 **************************************************************************************************** 3624 */ 3625 typedef struct _ADDR2_GET_PREFERRED_SURF_SETTING_INPUT 3626 { 3627 UINT_32 size; ///< Size of this structure in bytes 3628 3629 ADDR2_SURFACE_FLAGS flags; ///< Surface flags 3630 AddrResourceType resourceType; ///< Surface type 3631 AddrFormat format; ///< Surface format 3632 AddrResrouceLocation resourceLoction; ///< Surface heap choice 3633 ADDR2_BLOCK_SET forbiddenBlock; ///< Client can use it to disable some block setting 3634 ///< such as linear for DXTn, tiled for YUV 3635 ADDR2_SWTYPE_SET preferredSwSet; ///< Client can use it to specify sw type(s) wanted 3636 BOOL_32 noXor; ///< Do not use xor mode for this resource 3637 UINT_32 bpp; ///< bits per pixel 3638 UINT_32 width; ///< Width (of mip0), in pixels 3639 UINT_32 height; ///< Height (of mip0), in pixels 3640 UINT_32 numSlices; ///< Number surface slice/depth (of mip0), 3641 UINT_32 numMipLevels; ///< Total mipmap levels. 3642 UINT_32 numSamples; ///< Number of samples 3643 UINT_32 numFrags; ///< Number of fragments, leave it zero or the same as 3644 /// number of samples for normal AA; Set it to the 3645 /// number of fragments for EQAA 3646 UINT_32 maxAlign; ///< maximum base/size alignment requested by client 3647 UINT_32 minSizeAlign; ///< memory allocated for surface in client driver will 3648 /// be padded to multiple of this value (in bytes) 3649 } ADDR2_GET_PREFERRED_SURF_SETTING_INPUT; 3650 3651 /** 3652 **************************************************************************************************** 3653 * ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT 3654 * 3655 * @brief 3656 * Output structure of Addr2GetPreferredSurfaceSetting 3657 **************************************************************************************************** 3658 */ 3659 typedef struct _ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT 3660 { 3661 UINT_32 size; ///< Size of this structure in bytes 3662 3663 AddrSwizzleMode swizzleMode; ///< Suggested swizzle mode to be used 3664 AddrResourceType resourceType; ///< Suggested resource type to program HW 3665 ADDR2_BLOCK_SET validBlockSet; ///< Valid block type bit conbination 3666 BOOL_32 canXor; ///< If client can use xor on a valid macro block 3667 /// type 3668 ADDR2_SWTYPE_SET validSwTypeSet; ///< Valid swizzle type bit combination 3669 ADDR2_SWTYPE_SET clientPreferredSwSet; ///< Client-preferred swizzle type bit combination 3670 } ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT; 3671 3672 /** 3673 **************************************************************************************************** 3674 * Addr2GetPreferredSurfaceSetting 3675 * 3676 * @brief 3677 * Suggest a preferred setting for client driver to program HW register 3678 **************************************************************************************************** 3679 */ 3680 ADDR_E_RETURNCODE ADDR_API Addr2GetPreferredSurfaceSetting( 3681 ADDR_HANDLE hLib, 3682 const ADDR2_GET_PREFERRED_SURF_SETTING_INPUT* pIn, 3683 ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT* pOut); 3684 3685 /** 3686 **************************************************************************************************** 3687 * Addr2IsValidDisplaySwizzleMode 3688 * 3689 * @brief 3690 * Return whether the swizzle mode is supported by DCE / DCN. 3691 **************************************************************************************************** 3692 */ 3693 ADDR_E_RETURNCODE ADDR_API Addr2IsValidDisplaySwizzleMode( 3694 ADDR_HANDLE hLib, 3695 AddrSwizzleMode swizzleMode, 3696 UINT_32 bpp, 3697 bool *result); 3698 3699 #if defined(__cplusplus) 3700 } 3701 #endif 3702 3703 #endif // __ADDR_INTERFACE_H__ 3704