Edit

IABSD.fr/xenocara/lib/mesa/src/amd/addrlib/inc/addrinterface.h

Branch :

  • Show log

    Commit

  • Author : jsg
    Date : 2025-06-05 11:23:11
    Hash : 67d6f117
    Message : Import Mesa 25.0.7

  • lib/mesa/src/amd/addrlib/inc/addrinterface.h
  • /*
    ************************************************************************************************************************
    *
    *  Copyright (C) 2007-2024 Advanced Micro Devices, Inc. All rights reserved.
    *  SPDX-License-Identifier: MIT
    *
    ***********************************************************************************************************************/
    
    /**
    ****************************************************************************************************
    * @file  addrinterface.h
    * @brief Contains the addrlib interfaces declaration and parameter defines
    ****************************************************************************************************
    */
    #ifndef __ADDR_INTERFACE_H__
    #define __ADDR_INTERFACE_H__
    
    // Includes should be before extern "C"
    #include "addrtypes.h"
    
    #if defined(__cplusplus)
    extern "C"
    {
    #endif
    
    #define ADDRLIB_VERSION_MAJOR 10
    #define ADDRLIB_VERSION_MINOR 1
    #define ADDRLIB_MAKE_VERSION(major, minor) ((major << 16) | minor)
    #define ADDRLIB_VERSION                    ADDRLIB_MAKE_VERSION(ADDRLIB_VERSION_MAJOR, ADDRLIB_VERSION_MINOR)
    
    /// Virtually all interface functions need ADDR_HANDLE as first parameter
    typedef VOID*   ADDR_HANDLE;
    
    /// Client handle used in callbacks
    typedef VOID*   ADDR_CLIENT_HANDLE;
    
    typedef struct _ADDR_COORD2D
    {
        UINT_32  x;
        UINT_32  y;
    } ADDR_COORD2D;
    
    typedef struct _ADDR_COORD3D
    {
        UINT_32  x;
        UINT_32  y;
        UINT_32  z; // also slices for 2D images
    } ADDR_COORD3D;
    
    typedef struct _ADDR_EXTENT2D
    {
        UINT_32  width;
        UINT_32  height;
    } ADDR_EXTENT2D;
    
    typedef struct _ADDR_EXTENT3D
    {
        UINT_32  width;
        UINT_32  height;
        UINT_32  depth;  // also slices for 2D images
    } ADDR_EXTENT3D;
    
    /**
    * /////////////////////////////////////////////////////////////////////////////////////////////////
    * //                                  Callback functions
    * /////////////////////////////////////////////////////////////////////////////////////////////////
    *    typedef VOID* (ADDR_API* ADDR_ALLOCSYSMEM)(
    *         const ADDR_ALLOCSYSMEM_INPUT* pInput);
    *    typedef ADDR_E_RETURNCODE (ADDR_API* ADDR_FREESYSMEM)(
    *         VOID* pVirtAddr);
    *    typedef ADDR_E_RETURNCODE (ADDR_API* ADDR_DEBUGPRINT)(
    *         const ADDR_DEBUGPRINT_INPUT* pInput);
    *
    **/
    /**
    * /////////////////////////////////////////////////////////////////////////////////////////////////
    * //                               Create/Destroy/Config functions
    * /////////////////////////////////////////////////////////////////////////////////////////////////
    *     AddrCreate()
    *     AddrDestroy()
    *
    * /////////////////////////////////////////////////////////////////////////////////////////////////
    * //                                  Surface functions
    * /////////////////////////////////////////////////////////////////////////////////////////////////
    *     AddrComputeSurfaceInfo()
    *     AddrComputeSurfaceAddrFromCoord()
    *     AddrComputeSurfaceCoordFromAddr()
    *
    * /////////////////////////////////////////////////////////////////////////////////////////////////
    * //                                   HTile functions
    * /////////////////////////////////////////////////////////////////////////////////////////////////
    *     AddrComputeHtileInfo()
    *     AddrComputeHtileAddrFromCoord()
    *     AddrComputeHtileCoordFromAddr()
    *
    * /////////////////////////////////////////////////////////////////////////////////////////////////
    * //                                   C-mask functions
    * /////////////////////////////////////////////////////////////////////////////////////////////////
    *     AddrComputeCmaskInfo()
    *     AddrComputeCmaskAddrFromCoord()
    *     AddrComputeCmaskCoordFromAddr()
    *
    * /////////////////////////////////////////////////////////////////////////////////////////////////
    * //                                   F-mask functions
    * /////////////////////////////////////////////////////////////////////////////////////////////////
    *     AddrComputeFmaskInfo()
    *     AddrComputeFmaskAddrFromCoord()
    *     AddrComputeFmaskCoordFromAddr()
    *
    **/
    /**
    * /////////////////////////////////////////////////////////////////////////////////////////////////
    * //                               Element/Utility functions
    * /////////////////////////////////////////////////////////////////////////////////////////////////
    *     ElemFlt32ToDepthPixel()
    *     ElemFlt32ToColorPixel()
    **/
    /**
    *     AddrExtractBankPipeSwizzle()
    *     AddrCombineBankPipeSwizzle()
    *     AddrComputeSliceSwizzle()
    *     AddrConvertTileInfoToHW()
    *     AddrConvertTileIndex()
    *     AddrConvertTileIndex1()
    *     AddrGetTileIndex()
    *     AddrComputeBaseSwizzle()
    *     AddrUseTileIndex()
    *     AddrUseCombinedSwizzle()
    *
    **/
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //                                      Callback functions
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /**
    ****************************************************************************************************
    * @brief channel setting structure
    ****************************************************************************************************
    */
    typedef union _ADDR_CHANNEL_SETTING
    {
        struct
        {
            UINT_8 valid   : 1;    ///< Indicate whehter this channel setting is valid
            UINT_8 channel : 2;    ///< 0 for x channel, 1 for y channel, 2 for z channel, 3 for MSAA sample index
            UINT_8 index   : 5;    ///< Channel index
        };
        UINT_8 value;              ///< Value
    } ADDR_CHANNEL_SETTING;
    
    /**
    ****************************************************************************************************
    * @brief address equation key structure
    ****************************************************************************************************
    */
    typedef union _ADDR_EQUATION_KEY
    {
        struct
        {
            UINT_32 log2ElementBytes : 3; ///< Log2 of Bytes per pixel
            UINT_32 tileMode         : 5; ///< Tile mode
            UINT_32 microTileType    : 3; ///< Micro tile type
            UINT_32 pipeConfig       : 5; ///< pipe config
            UINT_32 numBanksLog2     : 3; ///< Number of banks log2
            UINT_32 bankWidth        : 4; ///< Bank width
            UINT_32 bankHeight       : 4; ///< Bank height
            UINT_32 macroAspectRatio : 3; ///< Macro tile aspect ratio
            UINT_32 prt              : 1; ///< SI only, indicate whether this equation is for prt
            UINT_32 reserved         : 1; ///< Reserved bit
        } fields;
        UINT_32 value;
    } ADDR_EQUATION_KEY;
    
    /**
    ****************************************************************************************************
    * @brief address equation structure
    ****************************************************************************************************
    */
    #define ADDR_MAX_LEGACY_EQUATION_COMP 3u
    #define ADDR_MAX_EQUATION_COMP        5u
    #define ADDR_MAX_EQUATION_BIT         20u
    
    // Invalid equation index
    #define ADDR_INVALID_EQUATION_INDEX 0xFFFFFFFF
    
    typedef struct _ADDR_EQUATION
    {
        union
        {
            struct {
                ADDR_CHANNEL_SETTING addr[ADDR_MAX_EQUATION_BIT];  ///< addr setting
                ADDR_CHANNEL_SETTING xor1[ADDR_MAX_EQUATION_BIT];  ///< xor setting
                ADDR_CHANNEL_SETTING xor2[ADDR_MAX_EQUATION_BIT];  ///< xor2 setting
                ADDR_CHANNEL_SETTING xor3[ADDR_MAX_EQUATION_BIT];  ///< xor3 setting
                ADDR_CHANNEL_SETTING xor4[ADDR_MAX_EQUATION_BIT];  ///< xor4 setting
            };
            ///< Components showing the sources of each bit; each bit is result of addr ^ xor ^ xor2...
            ADDR_CHANNEL_SETTING comps[ADDR_MAX_EQUATION_COMP][ADDR_MAX_EQUATION_BIT];
        };
        UINT_32              numBits;                      ///< The number of bits in equation
        UINT_32              numBitComponents;             ///< The max number of channels contributing to a bit
        BOOL_32              stackedDepthSlices;           ///< TRUE if depth slices are treated as being
                                                           ///< stacked vertically prior to swizzling
    } ADDR_EQUATION;
    
    
    /**
    ****************************************************************************************************
    * @brief Alloc system memory flags.
    * @note These flags are reserved for future use and if flags are added will minimize the impact
    *       of the client.
    ****************************************************************************************************
    */
    typedef union _ADDR_ALLOCSYSMEM_FLAGS
    {
        struct
        {
            UINT_32 reserved    : 32;  ///< Reserved for future use.
        } fields;
        UINT_32 value;
    
    } ADDR_ALLOCSYSMEM_FLAGS;
    
    /**
    ****************************************************************************************************
    * @brief Alloc system memory input structure
    ****************************************************************************************************
    */
    typedef struct _ADDR_ALLOCSYSMEM_INPUT
    {
        UINT_32                 size;           ///< Size of this structure in bytes
    
        ADDR_ALLOCSYSMEM_FLAGS  flags;          ///< System memory flags.
        UINT_32                 sizeInBytes;    ///< System memory allocation size in bytes.
        ADDR_CLIENT_HANDLE      hClient;        ///< Client handle
    } ADDR_ALLOCSYSMEM_INPUT;
    
    /**
    ****************************************************************************************************
    * ADDR_ALLOCSYSMEM
    *   @brief
    *       Allocate system memory callback function. Returns valid pointer on success.
    ****************************************************************************************************
    */
    typedef VOID* (ADDR_API* ADDR_ALLOCSYSMEM)(
        const ADDR_ALLOCSYSMEM_INPUT* pInput);
    
    /**
    ****************************************************************************************************
    * @brief Free system memory input structure
    ****************************************************************************************************
    */
    typedef struct _ADDR_FREESYSMEM_INPUT
    {
        UINT_32                 size;           ///< Size of this structure in bytes
    
        VOID*                   pVirtAddr;      ///< Virtual address
        ADDR_CLIENT_HANDLE      hClient;        ///< Client handle
    } ADDR_FREESYSMEM_INPUT;
    
    /**
    ****************************************************************************************************
    * ADDR_FREESYSMEM
    *   @brief
    *       Free system memory callback function.
    *       Returns ADDR_OK on success.
    ****************************************************************************************************
    */
    typedef ADDR_E_RETURNCODE (ADDR_API* ADDR_FREESYSMEM)(
        const ADDR_FREESYSMEM_INPUT* pInput);
    
    /**
    ****************************************************************************************************
    * @brief Print debug message input structure
    ****************************************************************************************************
    */
    typedef struct _ADDR_DEBUGPRINT_INPUT
    {
        UINT_32             size;           ///< Size of this structure in bytes
    
        CHAR*               pDebugString;   ///< Debug print string
        va_list             ap;             ///< Variable argument list
        ADDR_CLIENT_HANDLE  hClient;        ///< Client handle
    } ADDR_DEBUGPRINT_INPUT;
    
    /**
    ****************************************************************************************************
    * ADDR_DEBUGPRINT
    *   @brief
    *       Print debug message callback function.
    *       Returns ADDR_OK on success.
    ****************************************************************************************************
    */
    typedef ADDR_E_RETURNCODE (ADDR_API* ADDR_DEBUGPRINT)(
        const ADDR_DEBUGPRINT_INPUT* pInput);
    
    /**
    ****************************************************************************************************
    * ADDR_CALLBACKS
    *
    *   @brief
    *       Address Library needs client to provide system memory alloc/free routines.
    ****************************************************************************************************
    */
    typedef struct _ADDR_CALLBACKS
    {
        ADDR_ALLOCSYSMEM allocSysMem;   ///< Routine to allocate system memory
        ADDR_FREESYSMEM  freeSysMem;    ///< Routine to free system memory
        ADDR_DEBUGPRINT  debugPrint;    ///< Routine to print debug message
    } ADDR_CALLBACKS;
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //                               Create/Destroy functions
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /**
    ****************************************************************************************************
    * ADDR_CREATE_FLAGS
    *
    *   @brief
    *       This structure is used to pass some setup in creation of AddrLib
    *   @note
    ****************************************************************************************************
    */
    typedef union _ADDR_CREATE_FLAGS
    {
        struct
        {
            UINT_32 noCubeMipSlicesPad     : 1;    ///< Turn cubemap faces padding off
            UINT_32 fillSizeFields         : 1;    ///< If clients fill size fields in all input and
                                                   ///  output structure
            UINT_32 useTileIndex           : 1;    ///< Make tileIndex field in input valid
            UINT_32 useCombinedSwizzle     : 1;    ///< Use combined tile swizzle
            UINT_32 checkLast2DLevel       : 1;    ///< Check the last 2D mip sub level
            UINT_32 useHtileSliceAlign     : 1;    ///< Do htile single slice alignment
            UINT_32 allowLargeThickTile    : 1;    ///< Allow 64*thickness*bytesPerPixel > rowSize
            UINT_32 forceDccAndTcCompat    : 1;    ///< Force enable DCC and TC compatibility
            UINT_32 nonPower2MemConfig     : 1;    ///< Video memory bit width is not power of 2
            UINT_32 enableAltTiling        : 1;    ///< Enable alt tile mode
            UINT_32 reserved               : 22;   ///< Reserved bits for future use
        };
    
        UINT_32 value;
    } ADDR_CREATE_FLAGS;
    
    /**
    ****************************************************************************************************
    *   ADDR_REGISTER_VALUE
    *
    *   @brief
    *       Data from registers to setup AddrLib global data, used in AddrCreate
    ****************************************************************************************************
    */
    typedef struct _ADDR_REGISTER_VALUE
    {
        UINT_32  gbAddrConfig;       ///< For R8xx, use GB_ADDR_CONFIG register value.
                                     ///  For R6xx/R7xx, use GB_TILING_CONFIG.
                                     ///  But they can be treated as the same.
                                     ///  if this value is 0, use chip to set default value
        UINT_32  backendDisables;    ///< 1 bit per backend, starting with LSB. 1=disabled,0=enabled.
                                     ///  Register value of CC_RB_BACKEND_DISABLE.BACKEND_DISABLE
    
                                     ///  R800 registers-----------------------------------------------
        UINT_32  noOfBanks;          ///< Number of h/w ram banks - For r800: MC_ARB_RAMCFG.NOOFBANK
                                     ///  No enums for this value in h/w header files
                                     ///  0: 4
                                     ///  1: 8
                                     ///  2: 16
        UINT_32  noOfRanks;          ///  MC_ARB_RAMCFG.NOOFRANK
                                     ///  0: 1
                                     ///  1: 2
                                     ///  SI (R1000) registers-----------------------------------------
        const UINT_32* pTileConfig;  ///< Global tile setting tables
        UINT_32  noOfEntries;        ///< Number of entries in pTileConfig
    
                                     ///< CI registers-------------------------------------------------
        const UINT_32* pMacroTileConfig;    ///< Global macro tile mode table
        UINT_32  noOfMacroEntries;   ///< Number of entries in pMacroTileConfig
    } ADDR_REGISTER_VALUE;
    
    /**
    ****************************************************************************************************
    * ADDR_CREATE_INPUT
    *
    *   @brief
    *       Parameters use to create an AddrLib Object. Caller must provide all fields.
    *
    ****************************************************************************************************
    */
    typedef struct _ADDR_CREATE_INPUT
    {
        UINT_32             size;                ///< Size of this structure in bytes
    
        UINT_32             chipEngine;          ///< Chip Engine
        UINT_32             chipFamily;          ///< Chip Family
        UINT_32             chipRevision;        ///< Chip Revision
        ADDR_CALLBACKS      callbacks;           ///< Callbacks for sysmem alloc/free/print
        ADDR_CREATE_FLAGS   createFlags;         ///< Flags to setup AddrLib
        ADDR_REGISTER_VALUE regValue;            ///< Data from registers to setup AddrLib global data
        ADDR_CLIENT_HANDLE  hClient;             ///< Client handle
        UINT_32             minPitchAlignPixels; ///< Minimum pitch alignment in pixels
    } ADDR_CREATE_INPUT;
    
    /**
    ****************************************************************************************************
    * ADDR_CREATEINFO_OUTPUT
    *
    *   @brief
    *       Return AddrLib handle to client driver
    *
    ****************************************************************************************************
    */
    typedef struct _ADDR_CREATE_OUTPUT
    {
        UINT_32              size;            ///< Size of this structure in bytes
    
        ADDR_HANDLE          hLib;            ///< Address lib handle
    
        UINT_32              numEquations;    ///< Number of equations in the table
        const ADDR_EQUATION* pEquationTable;  ///< Pointer to the equation table
    } ADDR_CREATE_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrCreate
    *
    *   @brief
    *       Create AddrLib object, must be called before any interface calls
    *
    *   @return
    *       ADDR_OK if successful
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrCreate(
        const ADDR_CREATE_INPUT*    pAddrCreateIn,
        ADDR_CREATE_OUTPUT*         pAddrCreateOut);
    
    
    
    /**
    ****************************************************************************************************
    *   AddrDestroy
    *
    *   @brief
    *       Destroy AddrLib object, must be called to free internally allocated resources.
    *
    *   @return
    *      ADDR_OK if successful
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrDestroy(
        ADDR_HANDLE hLib);
    
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //                                    Surface functions
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /**
    ****************************************************************************************************
    * @brief
    *       Bank/tiling parameters. On function input, these can be set as desired or
    *       left 0 for AddrLib to calculate/default. On function output, these are the actual
    *       parameters used.
    * @note
    *       Valid bankWidth/bankHeight value:
    *       1,2,4,8. They are factors instead of pixels or bytes.
    *
    *       The bank number remains constant across each row of the
    *       macro tile as each pipe is selected, so the number of
    *       tiles in the x direction with the same bank number will
    *       be bank_width * num_pipes.
    ****************************************************************************************************
    */
    typedef struct _ADDR_TILEINFO
    {
        ///  Any of these parameters can be set to 0 to use the HW default.
        UINT_32     banks;              ///< Number of banks, numerical value
        UINT_32     bankWidth;          ///< Number of tiles in the X direction in the same bank
        UINT_32     bankHeight;         ///< Number of tiles in the Y direction in the same bank
        UINT_32     macroAspectRatio;   ///< Macro tile aspect ratio. 1-1:1, 2-4:1, 4-16:1, 8-64:1
        UINT_32     tileSplitBytes;     ///< Tile split size, in bytes
        AddrPipeCfg pipeConfig;         ///< Pipe Config = HW enum + 1
    } ADDR_TILEINFO;
    
    // Create a define to avoid client change. The removal of R800 is because we plan to implement SI
    // within 800 HWL - An AddrPipeCfg is added in above data structure
    typedef ADDR_TILEINFO ADDR_R800_TILEINFO;
    
    /**
    ****************************************************************************************************
    * @brief
    *       Information needed by quad buffer stereo support
    ****************************************************************************************************
    */
    typedef struct _ADDR_QBSTEREOINFO
    {
        UINT_32         eyeHeight;          ///< Height (in pixel rows) to right eye
        UINT_32         rightOffset;        ///< Offset (in bytes) to right eye
        UINT_32         rightSwizzle;       ///< TileSwizzle for right eyes
    } ADDR_QBSTEREOINFO;
    
    /**
    ****************************************************************************************************
    *   ADDR_SURFACE_FLAGS
    *
    *   @brief
    *       Surface flags
    ****************************************************************************************************
    */
    typedef union _ADDR_SURFACE_FLAGS
    {
        struct
        {
            UINT_32 color                : 1; ///< Flag indicates this is a color buffer
            UINT_32 depth                : 1; ///< Flag indicates this is a depth/stencil buffer
            UINT_32 stencil              : 1; ///< Flag indicates this is a stencil buffer
            UINT_32 texture              : 1; ///< Flag indicates this is a texture
            UINT_32 cube                 : 1; ///< Flag indicates this is a cubemap
            UINT_32 volume               : 1; ///< Flag indicates this is a volume texture
            UINT_32 fmask                : 1; ///< Flag indicates this is an fmask
            UINT_32 cubeAsArray          : 1; ///< Flag indicates if treat cubemap as arrays
            UINT_32 compressZ            : 1; ///< Flag indicates z buffer is compressed
            UINT_32 overlay              : 1; ///< Flag indicates this is an overlay surface
            UINT_32 noStencil            : 1; ///< Flag indicates this depth has no separate stencil
            UINT_32 display              : 1; ///< Flag indicates this should match display controller req.
            UINT_32 opt4Space            : 1; ///< Flag indicates this surface should be optimized for space
                                              ///  i.e. save some memory but may lose performance
            UINT_32 prt                  : 1; ///< Flag for partially resident texture
            UINT_32 qbStereo             : 1; ///< Quad buffer stereo surface
            UINT_32 pow2Pad              : 1; ///< SI: Pad to pow2, must set for mipmap (include level0)
            UINT_32 interleaved          : 1; ///< Special flag for interleaved YUV surface padding
            UINT_32 tcCompatible         : 1; ///< Flag indicates surface needs to be shader readable
            UINT_32 dispTileType         : 1; ///< NI: force display Tiling for 128 bit shared resoruce
            UINT_32 dccCompatible        : 1; ///< VI: whether to make MSAA surface support dcc fast clear
            UINT_32 dccPipeWorkaround    : 1; ///< VI: whether to workaround the HW limit that
                                              ///  dcc can't be enabled if pipe config of tile mode
                                              ///  is different from that of ASIC, this flag
                                              ///  is address lib internal flag, client should ignore it
            UINT_32 czDispCompatible     : 1; ///< SI+: CZ family has a HW bug needs special alignment.
                                              ///  This flag indicates we need to follow the
                                              ///  alignment with CZ families or other ASICs under
                                              ///  PX configuration + CZ.
            UINT_32 nonSplit             : 1; ///< CI: depth texture should not be split
            UINT_32 disableLinearOpt     : 1; ///< Disable tile mode optimization to linear
            UINT_32 needEquation         : 1; ///< Make the surface tile setting equation compatible.
                                              ///  This flag indicates we need to override tile
                                              ///  mode to PRT_* tile mode to disable slice rotation,
                                              ///  which is needed by swizzle pattern equation.
            UINT_32 skipIndicesOutput    : 1; ///< Skipping indices in output.
            UINT_32 rotateDisplay        : 1; ///< Rotate micro tile type
            UINT_32 minimizeAlignment    : 1; ///< Minimize alignment
            UINT_32 preferEquation       : 1; ///< Return equation index without adjusting tile mode
            UINT_32 matchStencilTileCfg  : 1; ///< Select tile index of stencil as well as depth surface
                                              ///  to make sure they share same tile config parameters
            UINT_32 disallowLargeThickDegrade   : 1;    ///< Disallow large thick tile degrade
            UINT_32 reserved             : 1; ///< Reserved bits
        };
    
        UINT_32 value;
    } ADDR_SURFACE_FLAGS;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_SURFACE_INFO_INPUT
    *
    *   @brief
    *       Input structure for AddrComputeSurfaceInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_SURFACE_INFO_INPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
    
        AddrTileMode        tileMode;           ///< Tile mode
        AddrFormat          format;             ///< If format is set to valid one, bpp/width/height
                                                ///  might be overwritten
        UINT_32             bpp;                ///< Bits per pixel
        UINT_32             numSamples;         ///< Number of samples
        UINT_32             width;              ///< Width, in pixels
        UINT_32             height;             ///< Height, in pixels
        UINT_32             numSlices;          ///< Number of surface slices or depth
        UINT_32             slice;              ///< Slice index
        UINT_32             mipLevel;           ///< Current mipmap level
        UINT_32             numMipLevels;       ///< Number of mips in mip chain
        ADDR_SURFACE_FLAGS  flags;              ///< Surface type flags
        UINT_32             numFrags;           ///< Number of fragments, leave it zero or the same as
                                                ///  number of samples for normal AA; Set it to the
                                                ///  number of fragments for EQAA
        /// r800 and later HWL parameters
        // Needed by 2D tiling, for linear and 1D tiling, just keep them 0's
        ADDR_TILEINFO*      pTileInfo;          ///< 2D tile parameters. Set to 0 to default/calculate
        AddrTileType        tileType;           ///< Micro tiling type, not needed when tileIndex != -1
        INT_32              tileIndex;          ///< Tile index, MUST be -1 if you don't want to use it
                                                ///  while the global useTileIndex is set to 1
        UINT_32             basePitch;          ///< Base level pitch in pixels, 0 means ignored, is a
                                                ///  must for mip levels from SI+.
                                                ///  Don't use pitch in blocks for compressed formats!
        UINT_32             maxBaseAlign;       ///< Max base alignment request from client
        UINT_32             pitchAlign;         ///< Pitch alignment request from client
        UINT_32             heightAlign;        ///< Height alignment request from client
    } ADDR_COMPUTE_SURFACE_INFO_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_SURFACE_INFO_OUTPUT
    *
    *   @brief
    *       Output structure for AddrComputeSurfInfo
    *   @note
            Element: AddrLib unit for computing. e.g. BCn: 4x4 blocks; R32B32B32: 32bit with 3x pitch
            Pixel: Original pixel
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_SURFACE_INFO_OUTPUT
    {
        UINT_32         size;           ///< Size of this structure in bytes
    
        UINT_32         pitch;          ///< Pitch in elements (in blocks for compressed formats)
        UINT_32         height;         ///< Height in elements (in blocks for compressed formats)
        UINT_32         depth;          ///< Number of slice/depth
        UINT_64         surfSize;       ///< Surface size in bytes
        AddrTileMode    tileMode;       ///< Actual tile mode. May differ from that in input
        UINT_32         baseAlign;      ///< Base address alignment
        UINT_32         pitchAlign;     ///< Pitch alignment, in elements
        UINT_32         heightAlign;    ///< Height alignment, in elements
        UINT_32         depthAlign;     ///< Depth alignment, aligned to thickness, for 3d texture
        UINT_32         bpp;            ///< Bits per elements (e.g. blocks for BCn, 1/3 for 96bit)
        UINT_32         pixelPitch;     ///< Pitch in original pixels
        UINT_32         pixelHeight;    ///< Height in original pixels
        UINT_32         pixelBits;      ///< Original bits per pixel, passed from input
        UINT_64         sliceSize;      ///< Size of slice specified by input's slice
                                        ///  The result is controlled by surface flags & createFlags
                                        ///  By default this value equals to surfSize for volume
        UINT_32         pitchTileMax;   ///< PITCH_TILE_MAX value for h/w register
        UINT_32         heightTileMax;  ///< HEIGHT_TILE_MAX value for h/w register
        UINT_32         sliceTileMax;   ///< SLICE_TILE_MAX value for h/w register
    
        UINT_32         numSamples;     ///< Pass the effective numSamples processed in this call
    
        /// r800 and later HWL parameters
        ADDR_TILEINFO*  pTileInfo;      ///< Tile parameters used. Filled in if 0 on input
        AddrTileType    tileType;       ///< Micro tiling type, only valid when tileIndex != -1
        INT_32          tileIndex;      ///< Tile index, MAY be "downgraded"
    
        INT_32          macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
        /// Output flags
        struct
        {
            /// Special information to work around SI mipmap swizzle bug UBTS #317508
            UINT_32     last2DLevel  : 1;  ///< TRUE if this is the last 2D(3D) tiled
                                           ///< Only meaningful when create flag checkLast2DLevel is set
            UINT_32     tcCompatible : 1;  ///< If the surface can be shader compatible
            UINT_32     dccUnsupport : 1;  ///< If the surface can support DCC compressed rendering
            UINT_32     prtTileIndex : 1;  ///< SI only, indicate the returned tile index is for PRT
                                           ///< If address lib return true for mip 0, client should set prt flag
                                           ///< for child mips in subsequent compute surface info calls
            UINT_32     reserved     :28;  ///< Reserved bits
        };
    
        UINT_32         equationIndex;     ///< Equation index in the equation table;
    
        UINT_32         blockWidth;        ///< Width in element inside one block(1D->Micro, 2D->Macro)
        UINT_32         blockHeight;       ///< Height in element inside one block(1D->Micro, 2D->Macro)
        UINT_32         blockSlices;       ///< Slice number inside one block(1D->Micro, 2D->Macro)
    
        /// Stereo info
        ADDR_QBSTEREOINFO*  pStereoInfo;///< Stereo information, needed when .qbStereo flag is TRUE
    
        INT_32          stencilTileIdx; ///< stencil tile index output when matchStencilTileCfg was set
    } ADDR_COMPUTE_SURFACE_INFO_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrComputeSurfaceInfo
    *
    *   @brief
    *       Compute surface width/height/depth/alignments and suitable tiling mode
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrComputeSurfaceInfo(
        ADDR_HANDLE                             hLib,
        const ADDR_COMPUTE_SURFACE_INFO_INPUT*  pIn,
        ADDR_COMPUTE_SURFACE_INFO_OUTPUT*       pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
    *
    *   @brief
    *       Input structure for AddrComputeSurfaceAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
    {
        UINT_32         size;               ///< Size of this structure in bytes
    
        UINT_32         x;                  ///< X coordinate
        UINT_32         y;                  ///< Y coordinate
        UINT_32         slice;              ///< Slice index
        UINT_32         sample;             ///< Sample index, use fragment index for EQAA
    
        UINT_32         bpp;                ///< Bits per pixel
        UINT_32         pitch;              ///< Surface pitch, in pixels
        UINT_32         height;             ///< Surface height, in pixels
        UINT_32         numSlices;          ///< Surface depth
        UINT_32         numSamples;         ///< Number of samples
    
        AddrTileMode    tileMode;           ///< Tile mode
        BOOL_32         isDepth;            ///< TRUE if the surface uses depth sample ordering within
                                            ///  micro tile. Textures can also choose depth sample order
        UINT_32         tileBase;           ///< Base offset (in bits) inside micro tile which handles
                                            ///  the case that components are stored separately
        UINT_32         compBits;           ///< The component bits actually needed(for planar surface)
    
        UINT_32         numFrags;           ///< Number of fragments, leave it zero or the same as
                                            ///  number of samples for normal AA; Set it to the
                                            ///  number of fragments for EQAA
        /// r800 and later HWL parameters
        // Used for 1D tiling above
        AddrTileType    tileType;           ///< See defintion of AddrTileType
        struct
        {
            UINT_32     ignoreSE : 1;       ///< TRUE if shader engines are ignored. This is texture
                                            ///  only flag. Only non-RT texture can set this to TRUE
            UINT_32     reserved :31;       ///< Reserved for future use.
        };
        // 2D tiling needs following structure
        ADDR_TILEINFO*  pTileInfo;          ///< 2D tile parameters. Client must provide all data
        INT_32          tileIndex;          ///< Tile index, MUST be -1 if you don't want to use it
                                            ///  while the global useTileIndex is set to 1
        union
        {
            struct
            {
                UINT_32  bankSwizzle;       ///< Bank swizzle
                UINT_32  pipeSwizzle;       ///< Pipe swizzle
            };
            UINT_32     tileSwizzle;        ///< Combined swizzle, if useCombinedSwizzle is TRUE
        };
    } ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
    *
    *   @brief
    *       Output structure for AddrComputeSurfaceAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
    {
        UINT_32 size;           ///< Size of this structure in bytes
    
        UINT_64 addr;           ///< Byte address
        UINT_32 bitPosition;    ///< Bit position within surfaceAddr, 0-7.
                                ///  For surface bpp < 8, e.g. FMT_1.
        UINT_32 prtBlockIndex;  ///< Index of a PRT tile (64K block)
    } ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrComputeSurfaceAddrFromCoord
    *
    *   @brief
    *       Compute surface address from a given coordinate.
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrComputeSurfaceAddrFromCoord(
        ADDR_HANDLE                                     hLib,
        const ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT* pIn,
        ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT*      pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT
    *
    *   @brief
    *       Input structure for AddrComputeSurfaceCoordFromAddr
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT
    {
        UINT_32         size;               ///< Size of this structure in bytes
    
        UINT_64         addr;               ///< Address in bytes
        UINT_32         bitPosition;        ///< Bit position in addr. 0-7. for surface bpp < 8,
                                            ///  e.g. FMT_1;
        UINT_32         bpp;                ///< Bits per pixel
        UINT_32         pitch;              ///< Pitch, in pixels
        UINT_32         height;             ///< Height in pixels
        UINT_32         numSlices;          ///< Surface depth
        UINT_32         numSamples;         ///< Number of samples
    
        AddrTileMode    tileMode;           ///< Tile mode
        BOOL_32         isDepth;            ///< Surface uses depth sample ordering within micro tile.
                                            ///  Note: Textures can choose depth sample order as well.
        UINT_32         tileBase;           ///< Base offset (in bits) inside micro tile which handles
                                            ///  the case that components are stored separately
        UINT_32         compBits;           ///< The component bits actually needed(for planar surface)
    
        UINT_32         numFrags;           ///< Number of fragments, leave it zero or the same as
                                            ///  number of samples for normal AA; Set it to the
                                            ///  number of fragments for EQAA
        /// r800 and later HWL parameters
        // Used for 1D tiling above
        AddrTileType    tileType;           ///< See defintion of AddrTileType
        struct
        {
            UINT_32     ignoreSE : 1;       ///< TRUE if shader engines are ignored. This is texture
                                            ///  only flag. Only non-RT texture can set this to TRUE
            UINT_32     reserved :31;       ///< Reserved for future use.
        };
        // 2D tiling needs following structure
        ADDR_TILEINFO*  pTileInfo;          ///< 2D tile parameters. Client must provide all data
        INT_32          tileIndex;          ///< Tile index, MUST be -1 if you don't want to use it
                                            ///  while the global useTileIndex is set to 1
        union
        {
            struct
            {
                UINT_32  bankSwizzle;       ///< Bank swizzle
                UINT_32  pipeSwizzle;       ///< Pipe swizzle
            };
            UINT_32     tileSwizzle;        ///< Combined swizzle, if useCombinedSwizzle is TRUE
        };
    } ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
    *
    *   @brief
    *       Output structure for AddrComputeSurfaceCoordFromAddr
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
    {
        UINT_32 size;   ///< Size of this structure in bytes
    
        UINT_32 x;      ///< X coordinate
        UINT_32 y;      ///< Y coordinate
        UINT_32 slice;  ///< Index of slices
        UINT_32 sample; ///< Index of samples, means fragment index for EQAA
    } ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrComputeSurfaceCoordFromAddr
    *
    *   @brief
    *       Compute coordinate from a given surface address
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrComputeSurfaceCoordFromAddr(
        ADDR_HANDLE                                     hLib,
        const ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUT* pIn,
        ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT*      pOut);
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //                                   HTile functions
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /**
    ****************************************************************************************************
    *   ADDR_HTILE_FLAGS
    *
    *   @brief
    *       HTILE flags
    ****************************************************************************************************
    */
    typedef union _ADDR_HTILE_FLAGS
    {
        struct
        {
            UINT_32 tcCompatible          : 1;  ///< Flag indicates surface needs to be shader readable
            UINT_32 skipTcCompatSizeAlign : 1;  ///< Flag indicates that addrLib will not align htile
                                                ///  size to 256xBankxPipe when computing tc-compatible
                                                ///  htile info.
            UINT_32 reserved              : 30; ///< Reserved bits
        };
    
        UINT_32 value;
    } ADDR_HTILE_FLAGS;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_HTILE_INFO_INPUT
    *
    *   @brief
    *       Input structure of AddrComputeHtileInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_HTILE_INFO_INPUT
    {
        UINT_32            size;            ///< Size of this structure in bytes
    
        ADDR_HTILE_FLAGS   flags;           ///< HTILE flags
        UINT_32            pitch;           ///< Surface pitch, in pixels
        UINT_32            height;          ///< Surface height, in pixels
        UINT_32            numSlices;       ///< Number of slices
        BOOL_32            isLinear;        ///< Linear or tiled HTILE layout
        AddrHtileBlockSize blockWidth;      ///< 4 or 8. EG above only support 8
        AddrHtileBlockSize blockHeight;     ///< 4 or 8. EG above only support 8
        ADDR_TILEINFO*     pTileInfo;       ///< Tile info
    
        INT_32             tileIndex;       ///< Tile index, MUST be -1 if you don't want to use it
                                            ///  while the global useTileIndex is set to 1
        INT_32             macroModeIndex;  ///< Index in macro tile mode table if there is one (CI)
                                            ///< README: When tileIndex is not -1, this must be valid
    } ADDR_COMPUTE_HTILE_INFO_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_HTILE_INFO_OUTPUT
    *
    *   @brief
    *       Output structure of AddrComputeHtileInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_HTILE_INFO_OUTPUT
    {
        UINT_32 size;               ///< Size of this structure in bytes
    
        UINT_32 pitch;              ///< Pitch in pixels of depth buffer represented in this
                                    ///  HTile buffer. This might be larger than original depth
                                    ///  buffer pitch when called with an unaligned pitch.
        UINT_32 height;             ///< Height in pixels, as above
        UINT_64 htileBytes;         ///< Size of HTILE buffer, in bytes
        UINT_32 baseAlign;          ///< Base alignment
        UINT_32 bpp;                ///< Bits per pixel for HTILE is how many bits for an 8x8 block!
        UINT_32 macroWidth;         ///< Macro width in pixels, actually squared cache shape
        UINT_32 macroHeight;        ///< Macro height in pixels
        UINT_64 sliceSize;          ///< Slice size, in bytes.
        BOOL_32 sliceInterleaved;   ///< Flag to indicate if different slice's htile is interleaved
                                    ///  Compute engine clear can't be used if htile is interleaved
        BOOL_32 nextMipLevelCompressible;   ///< Flag to indicate whether HTILE can be enabled in
                                            ///  next mip level, it also indicates if memory set based
                                            ///  fast clear can be used for current mip level.
    } ADDR_COMPUTE_HTILE_INFO_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrComputeHtileInfo
    *
    *   @brief
    *       Compute Htile pitch, height, base alignment and size in bytes
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrComputeHtileInfo(
        ADDR_HANDLE                             hLib,
        const ADDR_COMPUTE_HTILE_INFO_INPUT*    pIn,
        ADDR_COMPUTE_HTILE_INFO_OUTPUT*         pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT
    *
    *   @brief
    *       Input structure for AddrComputeHtileAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT
    {
        UINT_32            size;            ///< Size of this structure in bytes
    
        UINT_32            pitch;           ///< Pitch, in pixels
        UINT_32            height;          ///< Height in pixels
        UINT_32            x;               ///< X coordinate
        UINT_32            y;               ///< Y coordinate
        UINT_32            slice;           ///< Index of slice
        UINT_32            numSlices;       ///< Number of slices
        BOOL_32            isLinear;        ///< Linear or tiled HTILE layout
        ADDR_HTILE_FLAGS   flags;           ///< htile flags
        AddrHtileBlockSize blockWidth;      ///< 4 or 8. 1 means 8, 0 means 4. EG above only support 8
        AddrHtileBlockSize blockHeight;     ///< 4 or 8. 1 means 8, 0 means 4. EG above only support 8
        ADDR_TILEINFO*     pTileInfo;       ///< Tile info
    
        INT_32             tileIndex;       ///< Tile index, MUST be -1 if you don't want to use it
                                            ///  while the global useTileIndex is set to 1
        INT_32             macroModeIndex;  ///< Index in macro tile mode table if there is one (CI)
                                            ///< README: When tileIndex is not -1, this must be valid
        UINT_32            bpp;             ///< depth/stencil buffer bit per pixel size
        UINT_32            zStencilAddr;    ///< tcCompatible Z/Stencil surface address
    } ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT
    *
    *   @brief
    *       Output structure for AddrComputeHtileAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT
    {
        UINT_32 size;           ///< Size of this structure in bytes
    
        UINT_64 addr;           ///< Address in bytes
        UINT_32 bitPosition;    ///< Bit position, 0 or 4. CMASK and HTILE shares some lib method.
                                ///  So we keep bitPosition for HTILE as well
    } ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrComputeHtileAddrFromCoord
    *
    *   @brief
    *       Compute Htile address according to coordinates (of depth buffer)
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrComputeHtileAddrFromCoord(
        ADDR_HANDLE                                     hLib,
        const ADDR_COMPUTE_HTILE_ADDRFROMCOORD_INPUT*   pIn,
        ADDR_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT*        pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT
    *
    *   @brief
    *       Input structure for AddrComputeHtileCoordFromAddr
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT
    {
        UINT_32            size;            ///< Size of this structure in bytes
    
        UINT_64            addr;            ///< Address
        UINT_32            bitPosition;     ///< Bit position 0 or 4. CMASK and HTILE share some methods
                                            ///  so we keep bitPosition for HTILE as well
        UINT_32            pitch;           ///< Pitch, in pixels
        UINT_32            height;          ///< Height, in pixels
        UINT_32            numSlices;       ///< Number of slices
        BOOL_32            isLinear;        ///< Linear or tiled HTILE layout
        AddrHtileBlockSize blockWidth;      ///< 4 or 8. 1 means 8, 0 means 4. R8xx/R9xx only support 8
        AddrHtileBlockSize blockHeight;     ///< 4 or 8. 1 means 8, 0 means 4. R8xx/R9xx only support 8
        ADDR_TILEINFO*     pTileInfo;       ///< Tile info
    
        INT_32             tileIndex;       ///< Tile index, MUST be -1 if you don't want to use it
                                            ///  while the global useTileIndex is set to 1
        INT_32             macroModeIndex;  ///< Index in macro tile mode table if there is one (CI)
                                            ///< README: When tileIndex is not -1, this must be valid
    } ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT
    *
    *   @brief
    *       Output structure for AddrComputeHtileCoordFromAddr
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT
    {
        UINT_32 size;   ///< Size of this structure in bytes
    
        UINT_32 x;      ///< X coordinate
        UINT_32 y;      ///< Y coordinate
        UINT_32 slice;  ///< Slice index
    } ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrComputeHtileCoordFromAddr
    *
    *   @brief
    *       Compute coordinates within depth buffer (1st pixel of a micro tile) according to
    *       Htile address
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrComputeHtileCoordFromAddr(
        ADDR_HANDLE                                     hLib,
        const ADDR_COMPUTE_HTILE_COORDFROMADDR_INPUT*   pIn,
        ADDR_COMPUTE_HTILE_COORDFROMADDR_OUTPUT*        pOut);
    
    
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //                                     C-mask functions
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /**
    ****************************************************************************************************
    *   ADDR_CMASK_FLAGS
    *
    *   @brief
    *       CMASK flags
    ****************************************************************************************************
    */
    typedef union _ADDR_CMASK_FLAGS
    {
        struct
        {
            UINT_32 tcCompatible  : 1; ///< Flag indicates surface needs to be shader readable
            UINT_32 reserved      :31; ///< Reserved bits
        };
    
        UINT_32 value;
    } ADDR_CMASK_FLAGS;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_CMASK_INFO_INPUT
    *
    *   @brief
    *       Input structure of AddrComputeCmaskInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_CMASKINFO_INPUT
    {
        UINT_32             size;            ///< Size of this structure in bytes
    
        ADDR_CMASK_FLAGS    flags;           ///< CMASK flags
        UINT_32             pitch;           ///< Pitch, in pixels, of color buffer
        UINT_32             height;          ///< Height, in pixels, of color buffer
        UINT_32             numSlices;       ///< Number of slices, of color buffer
        BOOL_32             isLinear;        ///< Linear or tiled layout, Only SI can be linear
        ADDR_TILEINFO*      pTileInfo;       ///< Tile info
    
        INT_32              tileIndex;       ///< Tile index, MUST be -1 if you don't want to use it
                                             ///  while the global useTileIndex is set to 1
        INT_32              macroModeIndex;  ///< Index in macro tile mode table if there is one (CI)
                                             ///< README: When tileIndex is not -1, this must be valid
    } ADDR_COMPUTE_CMASK_INFO_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_CMASK_INFO_OUTPUT
    *
    *   @brief
    *       Output structure of AddrComputeCmaskInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_CMASK_INFO_OUTPUT
    {
        UINT_32 size;           ///< Size of this structure in bytes
    
        UINT_32 pitch;          ///< Pitch in pixels of color buffer which
                                ///  this Cmask matches. The size might be larger than
                                ///  original color buffer pitch when called with
                                ///  an unaligned pitch.
        UINT_32 height;         ///< Height in pixels, as above
        UINT_64 cmaskBytes;     ///< Size in bytes of CMask buffer
        UINT_32 baseAlign;      ///< Base alignment
        UINT_32 blockMax;       ///< Cmask block size. Need this to set CB_COLORn_MASK register
        UINT_32 macroWidth;     ///< Macro width in pixels, actually squared cache shape
        UINT_32 macroHeight;    ///< Macro height in pixels
        UINT_64 sliceSize;      ///< Slice size, in bytes.
    } ADDR_COMPUTE_CMASK_INFO_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrComputeCmaskInfo
    *
    *   @brief
    *       Compute Cmask pitch, height, base alignment and size in bytes from color buffer
    *       info
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrComputeCmaskInfo(
        ADDR_HANDLE                             hLib,
        const ADDR_COMPUTE_CMASK_INFO_INPUT*    pIn,
        ADDR_COMPUTE_CMASK_INFO_OUTPUT*         pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT
    *
    *   @brief
    *       Input structure for AddrComputeCmaskAddrFromCoord
    *
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT
    {
        UINT_32          size;           ///< Size of this structure in bytes
        UINT_32          x;              ///< X coordinate
        UINT_32          y;              ///< Y coordinate
        UINT_64          fmaskAddr;      ///< Fmask addr for tc compatible Cmask
        UINT_32          slice;          ///< Slice index
        UINT_32          pitch;          ///< Pitch in pixels, of color buffer
        UINT_32          height;         ///< Height in pixels, of color buffer
        UINT_32          numSlices;      ///< Number of slices
        UINT_32          bpp;
        BOOL_32          isLinear;       ///< Linear or tiled layout, Only SI can be linear
        ADDR_CMASK_FLAGS flags;          ///< CMASK flags
        ADDR_TILEINFO*   pTileInfo;      ///< Tile info
    
        INT_32           tileIndex;      ///< Tile index, MUST be -1 if you don't want to use it
                                         ///< while the global useTileIndex is set to 1
        INT_32           macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
                                         ///< README: When tileIndex is not -1, this must be valid
    } ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT
    *
    *   @brief
    *       Output structure for AddrComputeCmaskAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT
    {
        UINT_32 size;           ///< Size of this structure in bytes
    
        UINT_64 addr;           ///< CMASK address in bytes
        UINT_32 bitPosition;    ///< Bit position within addr, 0-7. CMASK is 4 bpp,
                                ///  so the address may be located in bit 0 (0) or 4 (4)
    } ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrComputeCmaskAddrFromCoord
    *
    *   @brief
    *       Compute Cmask address according to coordinates (of MSAA color buffer)
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrComputeCmaskAddrFromCoord(
        ADDR_HANDLE                                     hLib,
        const ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT*   pIn,
        ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT*        pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT
    *
    *   @brief
    *       Input structure for AddrComputeCmaskCoordFromAddr
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT
    {
        UINT_32        size;            ///< Size of this structure in bytes
    
        UINT_64        addr;            ///< CMASK address in bytes
        UINT_32        bitPosition;     ///< Bit position within addr, 0-7. CMASK is 4 bpp,
                                        ///  so the address may be located in bit 0 (0) or 4 (4)
        UINT_32        pitch;           ///< Pitch, in pixels
        UINT_32        height;          ///< Height in pixels
        UINT_32        numSlices;       ///< Number of slices
        BOOL_32        isLinear;        ///< Linear or tiled layout, Only SI can be linear
        ADDR_TILEINFO* pTileInfo;       ///< Tile info
    
        INT_32         tileIndex;       ///< Tile index, MUST be -1 if you don't want to use it
                                        ///  while the global useTileIndex is set to 1
        INT_32         macroModeIndex;  ///< Index in macro tile mode table if there is one (CI)
                                        ///< README: When tileIndex is not -1, this must be valid
    } ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT
    *
    *   @brief
    *       Output structure for AddrComputeCmaskCoordFromAddr
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT
    {
        UINT_32 size;   ///< Size of this structure in bytes
    
        UINT_32 x;      ///< X coordinate
        UINT_32 y;      ///< Y coordinate
        UINT_32 slice;  ///< Slice index
    } ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrComputeCmaskCoordFromAddr
    *
    *   @brief
    *       Compute coordinates within color buffer (1st pixel of a micro tile) according to
    *       Cmask address
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrComputeCmaskCoordFromAddr(
        ADDR_HANDLE                                     hLib,
        const ADDR_COMPUTE_CMASK_COORDFROMADDR_INPUT*   pIn,
        ADDR_COMPUTE_CMASK_COORDFROMADDR_OUTPUT*        pOut);
    
    
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //                                     F-mask functions
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_FMASK_INFO_INPUT
    *
    *   @brief
    *       Input structure for AddrComputeFmaskInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_FMASK_INFO_INPUT
    {
        UINT_32         size;               ///< Size of this structure in bytes
    
        AddrTileMode    tileMode;           ///< Tile mode
        UINT_32         pitch;              ///< Surface pitch, in pixels
        UINT_32         height;             ///< Surface height, in pixels
        UINT_32         numSlices;          ///< Number of slice/depth
        UINT_32         numSamples;         ///< Number of samples
        UINT_32         numFrags;           ///< Number of fragments, leave it zero or the same as
                                            ///  number of samples for normal AA; Set it to the
                                            ///  number of fragments for EQAA
        /// r800 and later HWL parameters
        struct
        {
            UINT_32 resolved:   1;          ///< TRUE if the surface is for resolved fmask, only used
                                            ///  by H/W clients. S/W should always set it to FALSE.
            UINT_32 reserved:  31;          ///< Reserved for future use.
        };
        ADDR_TILEINFO*  pTileInfo;          ///< 2D tiling parameters. Clients must give valid data
        INT_32          tileIndex;          ///< Tile index, MUST be -1 if you don't want to use it
                                            ///  while the global useTileIndex is set to 1
    } ADDR_COMPUTE_FMASK_INFO_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_FMASK_INFO_OUTPUT
    *
    *   @brief
    *       Output structure for AddrComputeFmaskInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_FMASK_INFO_OUTPUT
    {
        UINT_32         size;           ///< Size of this structure in bytes
    
        UINT_32         pitch;          ///< Pitch of fmask in pixels
        UINT_32         height;         ///< Height of fmask in pixels
        UINT_32         numSlices;      ///< Slices of fmask
        UINT_64         fmaskBytes;     ///< Size of fmask in bytes
        UINT_32         baseAlign;      ///< Base address alignment
        UINT_32         pitchAlign;     ///< Pitch alignment
        UINT_32         heightAlign;    ///< Height alignment
        UINT_32         bpp;            ///< Bits per pixel of FMASK is: number of bit planes
        UINT_32         numSamples;     ///< Number of samples, used for dump, export this since input
                                        ///  may be changed in 9xx and above
        /// r800 and later HWL parameters
        ADDR_TILEINFO*  pTileInfo;      ///< Tile parameters used. Fmask can have different
                                        ///  bank_height from color buffer
        INT_32          tileIndex;      ///< Tile index, MUST be -1 if you don't want to use it
                                        ///  while the global useTileIndex is set to 1
        INT_32          macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
        UINT_64         sliceSize;      ///< Size of slice in bytes
    } ADDR_COMPUTE_FMASK_INFO_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrComputeFmaskInfo
    *
    *   @brief
    *       Compute Fmask pitch/height/depth/alignments and size in bytes
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrComputeFmaskInfo(
        ADDR_HANDLE                             hLib,
        const ADDR_COMPUTE_FMASK_INFO_INPUT*    pIn,
        ADDR_COMPUTE_FMASK_INFO_OUTPUT*         pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT
    *
    *   @brief
    *       Input structure for AddrComputeFmaskAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT
    {
        UINT_32         size;               ///< Size of this structure in bytes
    
        UINT_32         x;                  ///< X coordinate
        UINT_32         y;                  ///< Y coordinate
        UINT_32         slice;              ///< Slice index
        UINT_32         plane;              ///< Plane number
        UINT_32         sample;             ///< Sample index (fragment index for EQAA)
    
        UINT_32         pitch;              ///< Surface pitch, in pixels
        UINT_32         height;             ///< Surface height, in pixels
        UINT_32         numSamples;         ///< Number of samples
        UINT_32         numFrags;           ///< Number of fragments, leave it zero or the same as
                                            ///  number of samples for normal AA; Set it to the
                                            ///  number of fragments for EQAA
    
        AddrTileMode    tileMode;           ///< Tile mode
        union
        {
            struct
            {
                UINT_32  bankSwizzle;       ///< Bank swizzle
                UINT_32  pipeSwizzle;       ///< Pipe swizzle
            };
            UINT_32     tileSwizzle;        ///< Combined swizzle, if useCombinedSwizzle is TRUE
        };
    
        /// r800 and later HWL parameters
        struct
        {
            UINT_32 resolved:   1;          ///< TRUE if this is a resolved fmask, used by H/W clients
            UINT_32 ignoreSE:   1;          ///< TRUE if shader engines are ignored.
            UINT_32 reserved:  30;          ///< Reserved for future use.
        };
        ADDR_TILEINFO*  pTileInfo;          ///< 2D tiling parameters. Client must provide all data
    
    } ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT
    *
    *   @brief
    *       Output structure for AddrComputeFmaskAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT
    {
        UINT_32 size;           ///< Size of this structure in bytes
    
        UINT_64 addr;           ///< Fmask address
        UINT_32 bitPosition;    ///< Bit position within fmaskAddr, 0-7.
    } ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrComputeFmaskAddrFromCoord
    *
    *   @brief
    *       Compute Fmask address according to coordinates (x,y,slice,sample,plane)
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrComputeFmaskAddrFromCoord(
        ADDR_HANDLE                                     hLib,
        const ADDR_COMPUTE_FMASK_ADDRFROMCOORD_INPUT*   pIn,
        ADDR_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT*        pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT
    *
    *   @brief
    *       Input structure for AddrComputeFmaskCoordFromAddr
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT
    {
        UINT_32         size;               ///< Size of this structure in bytes
    
        UINT_64         addr;               ///< Address
        UINT_32         bitPosition;        ///< Bit position within addr, 0-7.
    
        UINT_32         pitch;              ///< Pitch, in pixels
        UINT_32         height;             ///< Height in pixels
        UINT_32         numSamples;         ///< Number of samples
        UINT_32         numFrags;           ///< Number of fragments
        AddrTileMode    tileMode;           ///< Tile mode
        union
        {
            struct
            {
                UINT_32  bankSwizzle;       ///< Bank swizzle
                UINT_32  pipeSwizzle;       ///< Pipe swizzle
            };
            UINT_32     tileSwizzle;        ///< Combined swizzle, if useCombinedSwizzle is TRUE
        };
    
        /// r800 and later HWL parameters
        struct
        {
            UINT_32 resolved:   1;          ///< TRUE if this is a resolved fmask, used by HW components
            UINT_32 ignoreSE:   1;          ///< TRUE if shader engines are ignored.
            UINT_32 reserved:  30;          ///< Reserved for future use.
        };
        ADDR_TILEINFO*  pTileInfo;          ///< 2D tile parameters. Client must provide all data
    
    } ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
    *
    *   @brief
    *       Output structure for AddrComputeFmaskCoordFromAddr
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
    {
        UINT_32 size;       ///< Size of this structure in bytes
    
        UINT_32 x;          ///< X coordinate
        UINT_32 y;          ///< Y coordinate
        UINT_32 slice;      ///< Slice index
        UINT_32 plane;      ///< Plane number
        UINT_32 sample;     ///< Sample index (fragment index for EQAA)
    } ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrComputeFmaskCoordFromAddr
    *
    *   @brief
    *       Compute FMASK coordinate from an given address
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrComputeFmaskCoordFromAddr(
        ADDR_HANDLE                                     hLib,
        const ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUT*   pIn,
        ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT*        pOut);
    
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //                          Element/utility functions
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /**
    ****************************************************************************************************
    *   AddrGetVersion
    *
    *   @brief
    *       Get AddrLib version number
    ****************************************************************************************************
    */
    UINT_32 ADDR_API AddrGetVersion(ADDR_HANDLE hLib);
    
    /**
    ****************************************************************************************************
    *   AddrGetInterfaceVersion
    *
    *   @brief
    *       Get AddrLib interface version number (eg. Addr2 = 2)
    ****************************************************************************************************
    */
    UINT_32 ADDR_API AddrGetInterfaceVersion(ADDR_HANDLE hLib);
    
    /**
    ****************************************************************************************************
    *   AddrUseTileIndex
    *
    *   @brief
    *       Return TRUE if tileIndex is enabled in this address library
    ****************************************************************************************************
    */
    BOOL_32 ADDR_API AddrUseTileIndex(ADDR_HANDLE hLib);
    
    /**
    ****************************************************************************************************
    *   AddrUseCombinedSwizzle
    *
    *   @brief
    *       Return TRUE if combined swizzle is enabled in this address library
    ****************************************************************************************************
    */
    BOOL_32 ADDR_API AddrUseCombinedSwizzle(ADDR_HANDLE hLib);
    
    /**
    ****************************************************************************************************
    *   ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT
    *
    *   @brief
    *       Input structure of AddrExtractBankPipeSwizzle
    ****************************************************************************************************
    */
    typedef struct _ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT
    {
        UINT_32         size;           ///< Size of this structure in bytes
    
        UINT_32         base256b;       ///< Base256b value
    
        /// r800 and later HWL parameters
        ADDR_TILEINFO*  pTileInfo;      ///< 2D tile parameters. Client must provide all data
    
        INT_32          tileIndex;      ///< Tile index, MUST be -1 if you don't want to use it
                                        ///  while the global useTileIndex is set to 1
        INT_32          macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
                                        ///< README: When tileIndex is not -1, this must be valid
    } ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT
    *
    *   @brief
    *       Output structure of AddrExtractBankPipeSwizzle
    ****************************************************************************************************
    */
    typedef struct _ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT
    {
        UINT_32 size;           ///< Size of this structure in bytes
    
        UINT_32 bankSwizzle;    ///< Bank swizzle
        UINT_32 pipeSwizzle;    ///< Pipe swizzle
    } ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrExtractBankPipeSwizzle
    *
    *   @brief
    *       Extract Bank and Pipe swizzle from base256b
    *   @return
    *       ADDR_OK if no error
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrExtractBankPipeSwizzle(
        ADDR_HANDLE                                 hLib,
        const ADDR_EXTRACT_BANKPIPE_SWIZZLE_INPUT*  pIn,
        ADDR_EXTRACT_BANKPIPE_SWIZZLE_OUTPUT*       pOut);
    
    
    /**
    ****************************************************************************************************
    *   ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT
    *
    *   @brief
    *       Input structure of AddrCombineBankPipeSwizzle
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT
    {
        UINT_32         size;           ///< Size of this structure in bytes
    
        UINT_32         bankSwizzle;    ///< Bank swizzle
        UINT_32         pipeSwizzle;    ///< Pipe swizzle
        UINT_64         baseAddr;       ///< Base address (leave it zero for driver clients)
    
        /// r800 and later HWL parameters
        ADDR_TILEINFO*  pTileInfo;      ///< 2D tile parameters. Client must provide all data
    
        INT_32          tileIndex;      ///< Tile index, MUST be -1 if you don't want to use it
                                        ///  while the global useTileIndex is set to 1
        INT_32          macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
                                        ///< README: When tileIndex is not -1, this must be valid
    } ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT
    *
    *   @brief
    *       Output structure of AddrCombineBankPipeSwizzle
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT
    {
        UINT_32 size;           ///< Size of this structure in bytes
    
        UINT_32 tileSwizzle;    ///< Combined swizzle
    } ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrCombineBankPipeSwizzle
    *
    *   @brief
    *       Combine Bank and Pipe swizzle
    *   @return
    *       ADDR_OK if no error
    *   @note
    *       baseAddr here is full MCAddress instead of base256b
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrCombineBankPipeSwizzle(
        ADDR_HANDLE                                 hLib,
        const ADDR_COMBINE_BANKPIPE_SWIZZLE_INPUT*  pIn,
        ADDR_COMBINE_BANKPIPE_SWIZZLE_OUTPUT*       pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_SLICESWIZZLE_INPUT
    *
    *   @brief
    *       Input structure of AddrComputeSliceSwizzle
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_SLICESWIZZLE_INPUT
    {
        UINT_32         size;               ///< Size of this structure in bytes
    
        AddrTileMode    tileMode;           ///< Tile Mode
        UINT_32         baseSwizzle;        ///< Base tile swizzle
        UINT_32         slice;              ///< Slice index
        UINT_64         baseAddr;           ///< Base address, driver should leave it 0 in most cases
    
        /// r800 and later HWL parameters
        ADDR_TILEINFO*  pTileInfo;          ///< 2D tile parameters. Actually banks needed here!
    
        INT_32          tileIndex;          ///< Tile index, MUST be -1 if you don't want to use it
                                            ///  while the global useTileIndex is set to 1
        INT_32          macroModeIndex;     ///< Index in macro tile mode table if there is one (CI)
                                            ///< README: When tileIndex is not -1, this must be valid
    } ADDR_COMPUTE_SLICESWIZZLE_INPUT;
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_SLICESWIZZLE_OUTPUT
    *
    *   @brief
    *       Output structure of AddrComputeSliceSwizzle
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_SLICESWIZZLE_OUTPUT
    {
        UINT_32  size;           ///< Size of this structure in bytes
    
        UINT_32  tileSwizzle;    ///< Recalculated tileSwizzle value
    } ADDR_COMPUTE_SLICESWIZZLE_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrComputeSliceSwizzle
    *
    *   @brief
    *       Extract Bank and Pipe swizzle from base256b
    *   @return
    *       ADDR_OK if no error
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrComputeSliceSwizzle(
        ADDR_HANDLE                             hLib,
        const ADDR_COMPUTE_SLICESWIZZLE_INPUT*  pIn,
        ADDR_COMPUTE_SLICESWIZZLE_OUTPUT*       pOut);
    
    
    /**
    ****************************************************************************************************
    *   AddrSwizzleGenOption
    *
    *   @brief
    *       Which swizzle generating options: legacy or linear
    ****************************************************************************************************
    */
    typedef enum _AddrSwizzleGenOption
    {
        ADDR_SWIZZLE_GEN_DEFAULT    = 0,    ///< As is in client driver implemention for swizzle
        ADDR_SWIZZLE_GEN_LINEAR     = 1,    ///< Using a linear increment of swizzle
    } AddrSwizzleGenOption;
    
    /**
    ****************************************************************************************************
    *   AddrBlockType
    *
    *   @brief
    *       Macro define resource block type
    ****************************************************************************************************
    */
    typedef enum
    {
        AddrBlockLinear = 0, // Resource uses linear swizzle mode
        AddrBlockMicro = 1, // Resource uses 256B block
        AddrBlockThin4KB = 2, // Resource uses thin 4KB block
        AddrBlockThick4KB = 3, // Resource uses thick 4KB block
        AddrBlockThin64KB = 4, // Resource uses thin 64KB block
        AddrBlockThick64KB = 5, // Resource uses thick 64KB block
        AddrBlockThinVar = 6, // Resource uses thin var block
        AddrBlockThickVar = 7, // Resource uses thick var block
        AddrBlockMaxTiledType,
    
        AddrBlockThin256KB = AddrBlockThinVar,
        AddrBlockThick256KB = AddrBlockThickVar,
    } AddrBlockType;
    
    /**
    ****************************************************************************************************
    *   AddrSwizzleOption
    *
    *   @brief
    *       Controls how swizzle is generated
    ****************************************************************************************************
    */
    typedef union _ADDR_SWIZZLE_OPTION
    {
        struct
        {
            UINT_32 genOption       : 1;    ///< The way swizzle is generated, see AddrSwizzleGenOption
            UINT_32 reduceBankBit   : 1;    ///< TRUE if we need reduce swizzle bits
            UINT_32 reserved        :30;    ///< Reserved bits
        };
    
        UINT_32 value;
    
    } ADDR_SWIZZLE_OPTION;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_BASE_SWIZZLE_INPUT
    *
    *   @brief
    *       Input structure of AddrComputeBaseSwizzle
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_BASE_SWIZZLE_INPUT
    {
        UINT_32             size;           ///< Size of this structure in bytes
    
        ADDR_SWIZZLE_OPTION option;         ///< Swizzle option
        UINT_32             surfIndex;      ///< Index of this surface type
        AddrTileMode        tileMode;       ///< Tile Mode
    
        /// r800 and later HWL parameters
        ADDR_TILEINFO*      pTileInfo;      ///< 2D tile parameters. Actually banks needed here!
    
        INT_32              tileIndex;      ///< Tile index, MUST be -1 if you don't want to use it
                                            ///  while the global useTileIndex is set to 1
        INT_32              macroModeIndex; ///< Index in macro tile mode table if there is one (CI)
                                            ///< README: When tileIndex is not -1, this must be valid
    } ADDR_COMPUTE_BASE_SWIZZLE_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT
    *
    *   @brief
    *       Output structure of AddrComputeBaseSwizzle
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT
    {
        UINT_32 size;           ///< Size of this structure in bytes
    
        UINT_32 tileSwizzle;    ///< Combined swizzle
    } ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrComputeBaseSwizzle
    *
    *   @brief
    *       Return a Combined Bank and Pipe swizzle base on surface based on surface type/index
    *   @return
    *       ADDR_OK if no error
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrComputeBaseSwizzle(
        ADDR_HANDLE                             hLib,
        const ADDR_COMPUTE_BASE_SWIZZLE_INPUT*  pIn,
        ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT*       pOut);
    
    
    /**
    ****************************************************************************************************
    *   ELEM_GETEXPORTNORM_INPUT
    *
    *   @brief
    *       Input structure for ElemGetExportNorm
    *
    ****************************************************************************************************
    */
    typedef struct _ELEM_GETEXPORTNORM_INPUT
    {
        UINT_32             size;       ///< Size of this structure in bytes
    
        AddrColorFormat     format;     ///< Color buffer format; Client should use ColorFormat
        AddrSurfaceNumber   num;        ///< Surface number type; Client should use NumberType
        AddrSurfaceSwap     swap;       ///< Surface swap byte swap; Client should use SurfaceSwap
        UINT_32             numSamples; ///< Number of samples
    } ELEM_GETEXPORTNORM_INPUT;
    
    /**
    ****************************************************************************************************
    *  ElemGetExportNorm
    *
    *   @brief
    *       Helper function to check one format can be EXPORT_NUM, which is a register
    *       CB_COLOR_INFO.SURFACE_FORMAT. FP16 can be reported as EXPORT_NORM for rv770 in r600
    *       family
    *   @note
    *       The implementation is only for r600.
    *       00 - EXPORT_FULL: PS exports are 4 pixels with 4 components with 32-bits-per-component. (two
    *       clocks per export)
    *       01 - EXPORT_NORM: PS exports are 4 pixels with 4 components with 16-bits-per-component. (one
    *       clock per export)
    *
    ****************************************************************************************************
    */
    BOOL_32 ADDR_API ElemGetExportNorm(
        ADDR_HANDLE                     hLib,
        const ELEM_GETEXPORTNORM_INPUT* pIn);
    
    
    
    /**
    ****************************************************************************************************
    *   ELEM_FLT32TODEPTHPIXEL_INPUT
    *
    *   @brief
    *       Input structure for addrFlt32ToDepthPixel
    *
    ****************************************************************************************************
    */
    typedef struct _ELEM_FLT32TODEPTHPIXEL_INPUT
    {
        UINT_32         size;           ///< Size of this structure in bytes
    
        AddrDepthFormat format;         ///< Depth buffer format
        ADDR_FLT_32     comps[2];       ///< Component values (Z/stencil)
    } ELEM_FLT32TODEPTHPIXEL_INPUT;
    
    /**
    ****************************************************************************************************
    *   ELEM_FLT32TODEPTHPIXEL_INPUT
    *
    *   @brief
    *       Output structure for ElemFlt32ToDepthPixel
    *
    ****************************************************************************************************
    */
    typedef struct _ELEM_FLT32TODEPTHPIXEL_OUTPUT
    {
        UINT_32 size;           ///< Size of this structure in bytes
    
        UINT_8* pPixel;         ///< Real depth value. Same data type as depth buffer.
                                ///  Client must provide enough storage for this type.
        UINT_32 depthBase;      ///< Tile base in bits for depth bits
        UINT_32 stencilBase;    ///< Tile base in bits for stencil bits
        UINT_32 depthBits;      ///< Bits for depth
        UINT_32 stencilBits;    ///< Bits for stencil
    } ELEM_FLT32TODEPTHPIXEL_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   ElemFlt32ToDepthPixel
    *
    *   @brief
    *       Convert a FLT_32 value to a depth/stencil pixel value
    *
    *   @return
    *       Return code
    *
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API ElemFlt32ToDepthPixel(
        ADDR_HANDLE                         hLib,
        const ELEM_FLT32TODEPTHPIXEL_INPUT* pIn,
        ELEM_FLT32TODEPTHPIXEL_OUTPUT*      pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ELEM_FLT32TOCOLORPIXEL_INPUT
    *
    *   @brief
    *       Input structure for addrFlt32ToColorPixel
    *
    ****************************************************************************************************
    */
    typedef struct _ELEM_FLT32TOCOLORPIXEL_INPUT
    {
        UINT_32            size;           ///< Size of this structure in bytes
    
        AddrColorFormat    format;         ///< Color buffer format
        AddrSurfaceNumber  surfNum;        ///< Surface number
        AddrSurfaceSwap    surfSwap;       ///< Surface swap
        ADDR_FLT_32        comps[4];       ///< Component values (r/g/b/a)
    } ELEM_FLT32TOCOLORPIXEL_INPUT;
    
    /**
    ****************************************************************************************************
    *   ELEM_FLT32TOCOLORPIXEL_INPUT
    *
    *   @brief
    *       Output structure for ElemFlt32ToColorPixel
    *
    ****************************************************************************************************
    */
    typedef struct _ELEM_FLT32TOCOLORPIXEL_OUTPUT
    {
        UINT_32 size;       ///< Size of this structure in bytes
    
        UINT_8* pPixel;     ///< Real color value. Same data type as color buffer.
                            ///  Client must provide enough storage for this type.
    } ELEM_FLT32TOCOLORPIXEL_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   ElemFlt32ToColorPixel
    *
    *   @brief
    *       Convert a FLT_32 value to a red/green/blue/alpha pixel value
    *
    *   @return
    *       Return code
    *
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API ElemFlt32ToColorPixel(
        ADDR_HANDLE                         hLib,
        const ELEM_FLT32TOCOLORPIXEL_INPUT* pIn,
        ELEM_FLT32TOCOLORPIXEL_OUTPUT*      pOut);
    
    /**
    ****************************************************************************************************
    *   ElemSize
    *
    *   @brief
    *       Get bits-per-element for specified format
    *
    *   @return
    *       Bits-per-element of specified format
    *
    ****************************************************************************************************
    */
    UINT_32 ADDR_API ElemSize(
        ADDR_HANDLE hLib,
        AddrFormat  format);
    
    /**
    ****************************************************************************************************
    *   ADDR_CONVERT_TILEINFOTOHW_INPUT
    *
    *   @brief
    *       Input structure for AddrConvertTileInfoToHW
    *   @note
    *       When reverse is TRUE, indices are igonred
    ****************************************************************************************************
    */
    typedef struct _ADDR_CONVERT_TILEINFOTOHW_INPUT
    {
        UINT_32         size;               ///< Size of this structure in bytes
        BOOL_32         reverse;            ///< Convert control flag.
                                            ///  FALSE: convert from real value to HW value;
                                            ///  TRUE: convert from HW value to real value.
    
        /// r800 and later HWL parameters
        ADDR_TILEINFO*  pTileInfo;          ///< Tile parameters with real value
    
        INT_32          tileIndex;          ///< Tile index, MUST be -1 if you don't want to use it
                                            ///  while the global useTileIndex is set to 1
        INT_32          macroModeIndex;     ///< Index in macro tile mode table if there is one (CI)
                                            ///< README: When tileIndex is not -1, this must be valid
        UINT_32         bpp;                ///< Bits per pixel
    } ADDR_CONVERT_TILEINFOTOHW_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_CONVERT_TILEINFOTOHW_OUTPUT
    *
    *   @brief
    *       Output structure for AddrConvertTileInfoToHW
    ****************************************************************************************************
    */
    typedef struct _ADDR_CONVERT_TILEINFOTOHW_OUTPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
    
        /// r800 and later HWL parameters
        ADDR_TILEINFO*      pTileInfo;          ///< Tile parameters with hardware register value
    
    } ADDR_CONVERT_TILEINFOTOHW_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrConvertTileInfoToHW
    *
    *   @brief
    *       Convert tile info from real value to hardware register value
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrConvertTileInfoToHW(
        ADDR_HANDLE                             hLib,
        const ADDR_CONVERT_TILEINFOTOHW_INPUT*  pIn,
        ADDR_CONVERT_TILEINFOTOHW_OUTPUT*       pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR_CONVERT_TILEINDEX_INPUT
    *
    *   @brief
    *       Input structure for AddrConvertTileIndex
    ****************************************************************************************************
    */
    typedef struct _ADDR_CONVERT_TILEINDEX_INPUT
    {
        UINT_32         size;               ///< Size of this structure in bytes
    
        INT_32          tileIndex;          ///< Tile index
        INT_32          macroModeIndex;     ///< Index in macro tile mode table if there is one (CI)
        UINT_32         bpp;                ///< Bits per pixel
        BOOL_32         tileInfoHw;         ///< Set to TRUE if client wants HW enum, otherwise actual
    } ADDR_CONVERT_TILEINDEX_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_CONVERT_TILEINDEX_OUTPUT
    *
    *   @brief
    *       Output structure for AddrConvertTileIndex
    ****************************************************************************************************
    */
    typedef struct _ADDR_CONVERT_TILEINDEX_OUTPUT
    {
        UINT_32             size;           ///< Size of this structure in bytes
    
        AddrTileMode        tileMode;       ///< Tile mode
        AddrTileType        tileType;       ///< Tile type
        ADDR_TILEINFO*      pTileInfo;      ///< Tile info
    
    } ADDR_CONVERT_TILEINDEX_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrConvertTileIndex
    *
    *   @brief
    *       Convert tile index to tile mode/type/info
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrConvertTileIndex(
        ADDR_HANDLE                         hLib,
        const ADDR_CONVERT_TILEINDEX_INPUT* pIn,
        ADDR_CONVERT_TILEINDEX_OUTPUT*      pOut);
    
    /**
    ****************************************************************************************************
    *   ADDR_GET_MACROMODEINDEX_INPUT
    *
    *   @brief
    *       Input structure for AddrGetMacroModeIndex
    ****************************************************************************************************
    */
    typedef struct _ADDR_GET_MACROMODEINDEX_INPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
        ADDR_SURFACE_FLAGS  flags;              ///< Surface flag
        INT_32              tileIndex;          ///< Tile index
        UINT_32             bpp;                ///< Bits per pixel
        UINT_32             numFrags;           ///< Number of color fragments
    } ADDR_GET_MACROMODEINDEX_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_GET_MACROMODEINDEX_OUTPUT
    *
    *   @brief
    *       Output structure for AddrGetMacroModeIndex
    ****************************************************************************************************
    */
    typedef struct _ADDR_GET_MACROMODEINDEX_OUTPUT
    {
        UINT_32             size;            ///< Size of this structure in bytes
        INT_32              macroModeIndex;  ///< Index in macro tile mode table if there is one (CI)
    } ADDR_GET_MACROMODEINDEX_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrGetMacroModeIndex
    *
    *   @brief
    *       Get macro mode index based on input parameters
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrGetMacroModeIndex(
        ADDR_HANDLE                          hLib,
        const ADDR_GET_MACROMODEINDEX_INPUT* pIn,
        ADDR_GET_MACROMODEINDEX_OUTPUT*      pOut);
    
    /**
    ****************************************************************************************************
    *   ADDR_CONVERT_TILEINDEX1_INPUT
    *
    *   @brief
    *       Input structure for AddrConvertTileIndex1 (without macro mode index)
    ****************************************************************************************************
    */
    typedef struct _ADDR_CONVERT_TILEINDEX1_INPUT
    {
        UINT_32         size;               ///< Size of this structure in bytes
    
        INT_32          tileIndex;          ///< Tile index
        UINT_32         bpp;                ///< Bits per pixel
        UINT_32         numSamples;         ///< Number of samples
        BOOL_32         tileInfoHw;         ///< Set to TRUE if client wants HW enum, otherwise actual
    } ADDR_CONVERT_TILEINDEX1_INPUT;
    
    /**
    ****************************************************************************************************
    *   AddrConvertTileIndex1
    *
    *   @brief
    *       Convert tile index to tile mode/type/info
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrConvertTileIndex1(
        ADDR_HANDLE                             hLib,
        const ADDR_CONVERT_TILEINDEX1_INPUT*    pIn,
        ADDR_CONVERT_TILEINDEX_OUTPUT*          pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR_GET_TILEINDEX_INPUT
    *
    *   @brief
    *       Input structure for AddrGetTileIndex
    ****************************************************************************************************
    */
    typedef struct _ADDR_GET_TILEINDEX_INPUT
    {
        UINT_32         size;           ///< Size of this structure in bytes
    
        AddrTileMode    tileMode;       ///< Tile mode
        AddrTileType    tileType;       ///< Tile-type: disp/non-disp/...
        ADDR_TILEINFO*  pTileInfo;      ///< Pointer to tile-info structure, can be NULL for linear/1D
    } ADDR_GET_TILEINDEX_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_GET_TILEINDEX_OUTPUT
    *
    *   @brief
    *       Output structure for AddrGetTileIndex
    ****************************************************************************************************
    */
    typedef struct _ADDR_GET_TILEINDEX_OUTPUT
    {
        UINT_32         size;           ///< Size of this structure in bytes
    
        INT_32          index;          ///< index in table
    } ADDR_GET_TILEINDEX_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrGetTileIndex
    *
    *   @brief
    *       Get the tiling mode index in table
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrGetTileIndex(
        ADDR_HANDLE                     hLib,
        const ADDR_GET_TILEINDEX_INPUT* pIn,
        ADDR_GET_TILEINDEX_OUTPUT*      pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR_PRT_INFO_INPUT
    *
    *   @brief
    *       Input structure for AddrComputePrtInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR_PRT_INFO_INPUT
    {
        AddrFormat          format;        ///< Surface format
        UINT_32             baseMipWidth;  ///< Base mipmap width
        UINT_32             baseMipHeight; ///< Base mipmap height
        UINT_32             baseMipDepth;  ///< Base mipmap depth
        UINT_32             numFrags;      ///< Number of fragments,
    } ADDR_PRT_INFO_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_PRT_INFO_OUTPUT
    *
    *   @brief
    *       Input structure for AddrComputePrtInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR_PRT_INFO_OUTPUT
    {
        UINT_32             prtTileWidth;
        UINT_32             prtTileHeight;
    } ADDR_PRT_INFO_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrComputePrtInfo
    *
    *   @brief
    *       Compute prt surface related information
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrComputePrtInfo(
        ADDR_HANDLE                 hLib,
        const ADDR_PRT_INFO_INPUT*  pIn,
        ADDR_PRT_INFO_OUTPUT*       pOut);
    
    
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //                                     DCC key functions
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /**
    ****************************************************************************************************
    *   _ADDR_COMPUTE_DCCINFO_INPUT
    *
    *   @brief
    *       Input structure of AddrComputeDccInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_DCCINFO_INPUT
    {
        UINT_32             size;            ///< Size of this structure in bytes
        UINT_32             bpp;             ///< BitPP of color surface
        UINT_32             numSamples;      ///< Sample number of color surface
        UINT_64             colorSurfSize;   ///< Size of color surface to which dcc key is bound
        AddrTileMode        tileMode;        ///< Tile mode of color surface
        ADDR_TILEINFO       tileInfo;        ///< Tile info of color surface
        UINT_32             tileSwizzle;     ///< Tile swizzle
        INT_32              tileIndex;       ///< Tile index of color surface,
                                             ///< MUST be -1 if you don't want to use it
                                             ///< while the global useTileIndex is set to 1
        INT_32              macroModeIndex;  ///< Index in macro tile mode table if there is one (CI)
                                             ///< README: When tileIndex is not -1, this must be valid
    } ADDR_COMPUTE_DCCINFO_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR_COMPUTE_DCCINFO_OUTPUT
    *
    *   @brief
    *       Output structure of AddrComputeDccInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR_COMPUTE_DCCINFO_OUTPUT
    {
        UINT_32 size;                 ///< Size of this structure in bytes
        UINT_32 dccRamBaseAlign;      ///< Base alignment of dcc key
        UINT_64 dccRamSize;           ///< Size of dcc key
        UINT_64 dccFastClearSize;     ///< Size of dcc key portion that can be fast cleared
        BOOL_32 subLvlCompressible;   ///< Whether sub resource is compressiable
        BOOL_32 dccRamSizeAligned;    ///< Whether the dcc key size is aligned
    } ADDR_COMPUTE_DCCINFO_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrComputeDccInfo
    *
    *   @brief
    *       Compute DCC key size, base alignment
    *       info
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrComputeDccInfo(
        ADDR_HANDLE                             hLib,
        const ADDR_COMPUTE_DCCINFO_INPUT*       pIn,
        ADDR_COMPUTE_DCCINFO_OUTPUT*            pOut);
    
    
    /**
    ****************************************************************************************************
    *   ADDR_GET_MAX_ALIGNMENTS_OUTPUT
    *
    *   @brief
    *       Output structure of AddrGetMaxAlignments
    ****************************************************************************************************
    */
    typedef struct ADDR_GET_MAX_ALINGMENTS_OUTPUT
    {
        UINT_32 size;                   ///< Size of this structure in bytes
        UINT_32 baseAlign;              ///< Maximum base alignment in bytes
    } ADDR_GET_MAX_ALIGNMENTS_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   AddrGetMaxAlignments
    *
    *   @brief
    *       Gets maximnum alignments
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrGetMaxAlignments(
        ADDR_HANDLE                     hLib,
        ADDR_GET_MAX_ALIGNMENTS_OUTPUT* pOut);
    
    /**
    ****************************************************************************************************
    *   AddrGetMaxMetaAlignments
    *
    *   @brief
    *       Gets maximnum alignments for metadata
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API AddrGetMaxMetaAlignments(
        ADDR_HANDLE                     hLib,
        ADDR_GET_MAX_ALIGNMENTS_OUTPUT* pOut);
    
    /**
    ****************************************************************************************************
    *                                Address library interface version 2
    *                                    available from Gfx9 hardware
    ****************************************************************************************************
    *     Addr2ComputeSurfaceInfo()
    *     Addr2ComputeSurfaceAddrFromCoord()
    *     Addr2ComputeSurfaceCoordFromAddr()
    
    *     Addr2ComputeHtileInfo()
    *     Addr2ComputeHtileAddrFromCoord()
    *     Addr2ComputeHtileCoordFromAddr()
    *
    *     Addr2ComputeCmaskInfo()
    *     Addr2ComputeCmaskAddrFromCoord()
    *     Addr2ComputeCmaskCoordFromAddr()
    *
    *     Addr2ComputeFmaskInfo()
    *     Addr2ComputeFmaskAddrFromCoord()
    *     Addr2ComputeFmaskCoordFromAddr()
    *
    *     Addr2ComputeDccInfo()
    *
    **/
    
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //                                    Surface functions for Addr2
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /**
    ****************************************************************************************************
    *   ADDR2_SURFACE_FLAGS
    *
    *   @brief
    *       Surface flags
    ****************************************************************************************************
    */
    typedef union _ADDR2_SURFACE_FLAGS
    {
        struct
        {
            UINT_32 color             :  1; ///< This resource is a color buffer, can be used with RTV
            UINT_32 depth             :  1; ///< Thie resource is a depth buffer, can be used with DSV
            UINT_32 stencil           :  1; ///< Thie resource is a stencil buffer, can be used with DSV
            UINT_32 fmask             :  1; ///< This is an fmask surface
            UINT_32 overlay           :  1; ///< This is an overlay surface
            UINT_32 display           :  1; ///< This resource is displayable, can be used with DRV
            UINT_32 prt               :  1; ///< This is a partially resident texture
            UINT_32 qbStereo          :  1; ///< This is a quad buffer stereo surface
            UINT_32 interleaved       :  1; ///< Special flag for interleaved YUV surface padding
            UINT_32 texture           :  1; ///< This resource can be used with SRV
            UINT_32 unordered         :  1; ///< This resource can be used with UAV
            UINT_32 rotated           :  1; ///< This resource is rotated and displayable
            UINT_32 needEquation      :  1; ///< This resource needs equation to be generated if possible
            UINT_32 opt4space         :  1; ///< This resource should be optimized for space
            UINT_32 minimizeAlign     :  1; ///< This resource should use minimum alignment
            UINT_32 noMetadata        :  1; ///< This resource has no metadata
            UINT_32 metaRbUnaligned   :  1; ///< This resource has rb unaligned metadata
            UINT_32 metaPipeUnaligned :  1; ///< This resource has pipe unaligned metadata
            UINT_32 view3dAs2dArray   :  1; ///< This resource is a 3D resource viewed as 2D array
            UINT_32 allowExtEquation  :  1; ///< If unset, only legacy DX eqs are allowed (2 XORs)
            UINT_32 requireMetadata   :  1; ///< This resource must support metadata
            UINT_32 reserved          : 11; ///< Reserved bits
        };
    
        UINT_32 value;
    } ADDR2_SURFACE_FLAGS;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_SURFACE_INFO_INPUT
    *
    *   @brief
    *       Input structure for Addr2ComputeSurfaceInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_SURFACE_INFO_INPUT
    {
        UINT_32               size;              ///< Size of this structure in bytes
    
        ADDR2_SURFACE_FLAGS   flags;             ///< Surface flags
        AddrSwizzleMode       swizzleMode;       ///< Swizzle Mode for Addr2
        AddrResourceType      resourceType;      ///< Surface type
        AddrFormat            format;            ///< Surface format
        UINT_32               bpp;               ///< bits per pixel
        UINT_32               width;             ///< Width (of mip0), in pixels
        UINT_32               height;            ///< Height (of mip0), in pixels
        UINT_32               numSlices;         ///< Number surface slice/depth (of mip0),
        UINT_32               numMipLevels;      ///< Total mipmap levels.
        UINT_32               numSamples;        ///< Number of samples
        UINT_32               numFrags;          ///< Number of fragments, leave it zero or the same as
                                                 ///  number of samples for normal AA; Set it to the
                                                 ///  number of fragments for EQAA
        UINT_32               pitchInElement;    ///< Pitch in elements (blocks for compressed formats)
        UINT_32               sliceAlign;        ///< Required slice size in bytes
    } ADDR2_COMPUTE_SURFACE_INFO_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_MIP_INFO
    *
    *   @brief
    *       Structure that contains information for mip level
    *
    ****************************************************************************************************
    */
    typedef struct _ADDR2_MIP_INFO
    {
        UINT_32             pitch;              ///< Pitch in elements
        UINT_32             height;             ///< Padded height in elements
        UINT_32             depth;              ///< Padded depth
        UINT_32             pixelPitch;         ///< Pitch in pixels
        UINT_32             pixelHeight;        ///< Padded height in pixels
        UINT_32             equationIndex;      ///< Equation index in the equation table
        UINT_64             offset;             ///< Offset in bytes from mip base, should only be used
                                                ///< to setup vam surface descriptor, can't be used
                                                ///< to setup swizzle pattern
        UINT_64             macroBlockOffset;   ///< macro block offset in bytes from mip base
        UINT_32             mipTailOffset;      ///< mip tail offset in bytes
        UINT_32             mipTailCoordX;      ///< mip tail coord x
        UINT_32             mipTailCoordY;      ///< mip tail coord y
        UINT_32             mipTailCoordZ;      ///< mip tail coord z
    } ADDR2_MIP_INFO;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_SURFACE_INFO_OUTPUT
    *
    *   @brief
    *       Output structure for Addr2ComputeSurfInfo
    *   @note
            Element: AddrLib unit for computing. e.g. BCn: 4x4 blocks; R32B32B32: 32bit with 3x pitch
            Pixel: Original pixel
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_SURFACE_INFO_OUTPUT
    {
        UINT_32             size;                 ///< Size of this structure in bytes
    
        UINT_32             pitch;                ///< Pitch in elements (blocks for compressed formats)
        UINT_32             height;               ///< Padded height (of mip0) in elements
        UINT_32             numSlices;            ///< Padded depth for 3d resource
                                                  ///< or padded number of slices for 2d array resource
        UINT_32             mipChainPitch;        ///< Pitch (of total mip chain) in elements
        UINT_32             mipChainHeight;       ///< Padded height (of total mip chain) in elements
        UINT_32             mipChainSlice;        ///< Padded depth (of total mip chain)
        UINT_64             sliceSize;            ///< Slice (total mip chain) size in bytes
        UINT_64             surfSize;             ///< Surface (total mip chain) size in bytes
        UINT_32             baseAlign;            ///< Base address alignment
        UINT_32             bpp;                  ///< Bits per elements
                                                  ///  (e.g. blocks for BCn, 1/3 for 96bit)
        UINT_32             pixelMipChainPitch;   ///< Mip chain pitch in original pixels
        UINT_32             pixelMipChainHeight;  ///< Mip chain height in original pixels
        UINT_32             pixelPitch;           ///< Pitch in original pixels
        UINT_32             pixelHeight;          ///< Height in original pixels
        UINT_32             pixelBits;            ///< Original bits per pixel, passed from input
    
        UINT_32             blockWidth;           ///< Width in element inside one block
        UINT_32             blockHeight;          ///< Height in element inside one block
        UINT_32             blockSlices;          ///< Slice number inside one block
                                                  ///< Prt tile is one block, its width/height/slice
                                                  ///< equals to blcok width/height/slice
    
        BOOL_32             epitchIsHeight;       ///< Whether to use height to program epitch register
        /// Stereo info
        ADDR_QBSTEREOINFO*  pStereoInfo;          ///< Stereo info, needed if qbStereo flag is TRUE
        /// Mip info
        ADDR2_MIP_INFO*     pMipInfo;             ///< Pointer to mip information array
                                                  ///  if it is not NULL, the array is assumed to
                                                  ///  contain numMipLevels entries
    
        UINT_32             equationIndex;        ///< Equation index in the equation table of mip0
        BOOL_32             mipChainInTail;       ///< If whole mipchain falls into mip tail block
        UINT_32             firstMipIdInTail;     ///< The id of first mip in tail, if there is no mip
                                                  ///  in tail, it will be set to number of mip levels
    } ADDR2_COMPUTE_SURFACE_INFO_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeSurfaceInfo
    *
    *   @brief
    *       Compute surface width/height/slices/alignments and suitable tiling mode
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeSurfaceInfo(
        ADDR_HANDLE                                hLib,
        const ADDR2_COMPUTE_SURFACE_INFO_INPUT*    pIn,
        ADDR2_COMPUTE_SURFACE_INFO_OUTPUT*         pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
    *
    *   @brief
    *       Input structure for Addr2ComputeSurfaceAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
    {
        UINT_32             size;            ///< Size of this structure in bytes
    
        UINT_32             x;               ///< X coordinate
        UINT_32             y;               ///< Y coordinate
        UINT_32             slice;           ///< Slice index
        UINT_32             sample;          ///< Sample index, use fragment index for EQAA
        UINT_32             mipId;           ///< the mip ID in mip chain
    
        AddrSwizzleMode     swizzleMode;     ///< Swizzle mode for Addr2
        ADDR2_SURFACE_FLAGS flags;           ///< Surface flags
        AddrResourceType    resourceType;    ///< Surface type
        UINT_32             bpp;             ///< Bits per pixel
        UINT_32             unalignedWidth;  ///< Surface original width (of mip0)
        UINT_32             unalignedHeight; ///< Surface original height (of mip0)
        UINT_32             numSlices;       ///< Surface original slices (of mip0)
        UINT_32             numMipLevels;    ///< Total mipmap levels
        UINT_32             numSamples;      ///< Number of samples
        UINT_32             numFrags;        ///< Number of fragments, leave it zero or the same as
                                             ///  number of samples for normal AA; Set it to the
                                             ///  number of fragments for EQAA
    
        UINT_32             pipeBankXor;     ///< Combined swizzle used to do bank/pipe rotation
        UINT_32             pitchInElement;  ///< Pitch in elements (blocks for compressed formats)
    } ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
    *
    *   @brief
    *       Output structure for Addr2ComputeSurfaceAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
    {
        UINT_32    size;             ///< Size of this structure in bytes
    
        UINT_64    addr;             ///< Byte offset from the image starting address
        UINT_32    bitPosition;      ///< Bit position within surfaceAddr, 0-7.
                                     ///  For surface bpp < 8, e.g. FMT_1.
        UINT_32    prtBlockIndex;    ///< Index of a PRT tile (64K block)
    } ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeSurfaceAddrFromCoord
    *
    *   @brief
    *       Compute surface address from a given coordinate.
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeSurfaceAddrFromCoord(
        ADDR_HANDLE                                         hLib,
        const ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT*    pIn,
        ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT*         pOut);
    
    /**
    ****************************************************************************************************
    *   ADDR2_COPY_MEMSURFACE_REGION
    *
    *   @brief
    *       Input structure for Addr2CopyMemToSurface and Addr2CopySurfaceToMem
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COPY_MEMSURFACE_REGION
    {
        UINT_32             size;            ///< Size of this structure in bytes
    
        UINT_32             x;               ///< Starting X coordinate, in elements
        UINT_32             y;               ///< Starting Y coordinate, in elements
        UINT_32             slice;           ///< Starting slice index or Z coordinate, in elements
        UINT_32             mipId;           ///< The mip ID in mip chain
        ADDR_EXTENT3D       copyDims;        ///< Size of the region to copy, in elements
    
        void*               pMem;            ///< Pointer to memory to copy
        UINT_64             memRowPitch;     ///< Pitch between rows in bytes
        UINT_64             memSlicePitch;   ///< Pitch between array/depth slices in bytes
    } ADDR2_COPY_MEMSURFACE_REGION;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COPY_MEMSURFACE_INPUT
    *
    *   @brief
    *       Input structure for Addr2CopyMemToSurface and Addr2CopySurfaceToMem
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COPY_MEMSURFACE_INPUT
    {
        UINT_32             size;            ///< Size of this structure in bytes
    
        AddrSwizzleMode     swizzleMode;     ///< Swizzle mode
        AddrFormat          format;          ///< Format
        ADDR2_SURFACE_FLAGS flags;           ///< Surface flags
        AddrResourceType    resourceType;    ///< Surface type
        UINT_32             bpp;             ///< Bits per pixel
        ADDR_EXTENT3D       unAlignedDims;   ///< Surface original dimensions (of mip0), in pixels
        UINT_32             numMipLevels;    ///< Total mipmap levels
        UINT_32             numSamples;      ///< Number of samples
        UINT_32             pitchInElement;  ///< Pitch in elements (blocks for compressed formats)
        UINT_32             pbXor;           ///< Xor value
    
        void*               pMappedSurface;  ///< Pointer to the image surface, mapped to CPU memory
        BOOL_32             singleSubres;    ///< Pointer is to the base of the subresource, not to the
                                             ///  base of the surface image data. Requires:
                                             ///   - copyDims.depth == 1
                                             ///   - all copy regions target the same mip
                                             ///   - all copy regions target the same slice/depth
    } ADDR2_COPY_MEMSURFACE_INPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2CopyMemToSurface
    *
    *   @brief
    *       Copy an image region from memory to an uncompressed CPU-mapped surface
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2CopyMemToSurface(
        ADDR_HANDLE                         hLib,
        const ADDR2_COPY_MEMSURFACE_INPUT*  pIn,
        const ADDR2_COPY_MEMSURFACE_REGION* pRegions,
        UINT_32                             regionCount
    );
    
    /**
    ****************************************************************************************************
    *   Addr2CopySurfaceToMem
    *
    *   @brief
    *       Copy an image region from an uncompressed CPU-mapped surface to memory
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2CopySurfaceToMem(
        ADDR_HANDLE                         hLib,
        const ADDR2_COPY_MEMSURFACE_INPUT*  pIn,
        const ADDR2_COPY_MEMSURFACE_REGION* pRegions,
        UINT_32                             regionCount
    );
    
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_SURFACE_COORDFROMADDR_INPUT
    *
    *   @brief
    *       Input structure for Addr2ComputeSurfaceCoordFromAddr
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_SURFACE_COORDFROMADDR_INPUT
    {
        UINT_32             size;            ///< Size of this structure in bytes
    
        UINT_64             addr;            ///< Address in bytes
        UINT_32             bitPosition;     ///< Bit position in addr. 0-7. for surface bpp < 8,
                                             ///  e.g. FMT_1;
    
        AddrSwizzleMode     swizzleMode;     ///< Swizzle mode for Addr2
        ADDR2_SURFACE_FLAGS flags;           ///< Surface flags
        AddrResourceType    resourceType;    ///< Surface type
        UINT_32             bpp;             ///< Bits per pixel
        UINT_32             unalignedWidth;  ///< Surface original width (of mip0)
        UINT_32             unalignedHeight; ///< Surface original height (of mip0)
        UINT_32             numSlices;       ///< Surface original slices (of mip0)
        UINT_32             numMipLevels;    ///< Total mipmap levels.
        UINT_32             numSamples;      ///< Number of samples
        UINT_32             numFrags;        ///< Number of fragments, leave it zero or the same as
                                             ///  number of samples for normal AA; Set it to the
                                             ///  number of fragments for EQAA
    
        UINT_32             pipeBankXor;     ///< Combined swizzle used to do bank/pipe rotation
        UINT_32             pitchInElement;  ///< Pitch in elements (blocks for compressed formats)
    } ADDR2_COMPUTE_SURFACE_COORDFROMADDR_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
    *
    *   @brief
    *       Output structure for Addr2ComputeSurfaceCoordFromAddr
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
    {
        UINT_32    size;       ///< Size of this structure in bytes
    
        UINT_32    x;          ///< X coordinate
        UINT_32    y;          ///< Y coordinate
        UINT_32    slice;      ///< Index of slices
        UINT_32    sample;     ///< Index of samples, means fragment index for EQAA
        UINT_32    mipId;      ///< mipmap level id
    } ADDR2_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeSurfaceCoordFromAddr
    *
    *   @brief
    *       Compute coordinate from a given surface address
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeSurfaceCoordFromAddr(
        ADDR_HANDLE                                         hLib,
        const ADDR2_COMPUTE_SURFACE_COORDFROMADDR_INPUT*    pIn,
        ADDR2_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT*         pOut);
    
    
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //                                   HTile functions for Addr2
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /**
    ****************************************************************************************************
    *   ADDR2_META_FLAGS
    *
    *   @brief
    *       Metadata flags
    ****************************************************************************************************
    */
    typedef union _ADDR2_META_FLAGS
    {
        struct
        {
            UINT_32 pipeAligned :  1;    ///< if Metadata being pipe aligned
            UINT_32 rbAligned   :  1;    ///< if Metadata being RB aligned
            UINT_32 linear      :  1;    ///< if Metadata linear, GFX9 does not suppord this!
            UINT_32 reserved    : 29;    ///< Reserved bits
        };
    
        UINT_32 value;
    } ADDR2_META_FLAGS;
    
    /**
    ****************************************************************************************************
    *   ADDR2_META_MIP_INFO
    *
    *   @brief
    *       Structure to store per mip metadata information
    ****************************************************************************************************
    */
    typedef struct _ADDR2_META_MIP_INFO
    {
        BOOL_32    inMiptail;
        union
        {
            struct
            {
                UINT_32    startX;
                UINT_32    startY;
                UINT_32    startZ;
                UINT_32    width;
                UINT_32    height;
                UINT_32    depth;
            };
    
            // GFX10
            struct
            {
                UINT_32    offset;      ///< Metadata offset within one slice,
                                        ///  the thickness of a slice is meta block depth.
                UINT_32    sliceSize;   ///< Metadata size within one slice,
                                        ///  the thickness of a slice is meta block depth.
            };
        };
    } ADDR2_META_MIP_INFO;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_HTILE_INFO_INPUT
    *
    *   @brief
    *       Input structure of Addr2ComputeHtileInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_HTILE_INFO_INPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
    
        ADDR2_META_FLAGS    hTileFlags;         ///< HTILE flags
        ADDR2_SURFACE_FLAGS depthFlags;         ///< Depth surface flags
        AddrSwizzleMode     swizzleMode;        ///< Depth surface swizzle mode
        UINT_32             unalignedWidth;     ///< Depth surface original width (of mip0)
        UINT_32             unalignedHeight;    ///< Depth surface original height (of mip0)
        UINT_32             numSlices;          ///< Number of slices of depth surface (of mip0)
        UINT_32             numMipLevels;       ///< Total mipmap levels of color surface
        UINT_32             firstMipIdInTail;   ///  Id of the first mip in tail,
                                                ///  if no mip is in tail, it should be set to
                                                ///  number of mip levels
                                                ///  Only for GFX10
    } ADDR2_COMPUTE_HTILE_INFO_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_HTILE_INFO_OUTPUT
    *
    *   @brief
    *       Output structure of Addr2ComputeHtileInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_HTILE_INFO_OUTPUT
    {
        UINT_32    size;                ///< Size of this structure in bytes
    
        UINT_32    pitch;               ///< Pitch in pixels of depth buffer represented in this
                                        ///  HTile buffer. This might be larger than original depth
                                        ///  buffer pitch when called with an unaligned pitch.
        UINT_32    height;              ///< Height in pixels, as above
        UINT_32    baseAlign;           ///< Base alignment
        UINT_32    sliceSize;           ///< Slice size, in bytes.
        UINT_32    htileBytes;          ///< Size of HTILE buffer, in bytes
        UINT_32    metaBlkWidth;        ///< Meta block width
        UINT_32    metaBlkHeight;       ///< Meta block height
        UINT_32    metaBlkNumPerSlice;  ///< Number of metablock within one slice
    
        ADDR2_META_MIP_INFO* pMipInfo;  ///< HTILE mip information
    
        struct {
          UINT_16* gfx10_bits; /* 72 2-byte elements */
       } equation;
    } ADDR2_COMPUTE_HTILE_INFO_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeHtileInfo
    *
    *   @brief
    *       Compute Htile pitch, height, base alignment and size in bytes
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeHtileInfo(
        ADDR_HANDLE                              hLib,
        const ADDR2_COMPUTE_HTILE_INFO_INPUT*    pIn,
        ADDR2_COMPUTE_HTILE_INFO_OUTPUT*         pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT
    *
    *   @brief
    *       Input structure for Addr2ComputeHtileAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT
    {
        UINT_32             size;                ///< Size of this structure in bytes
    
        UINT_32             x;                   ///< X coordinate
        UINT_32             y;                   ///< Y coordinate
        UINT_32             slice;               ///< Index of slices
        UINT_32             mipId;               ///< mipmap level id
    
        ADDR2_META_FLAGS    hTileFlags;          ///< HTILE flags
        ADDR2_SURFACE_FLAGS depthflags;          ///< Depth surface flags
        AddrSwizzleMode     swizzleMode;         ///< Depth surface swizzle mode
        UINT_32             bpp;                 ///< Depth surface bits per pixel
        UINT_32             unalignedWidth;      ///< Depth surface original width (of mip0)
        UINT_32             unalignedHeight;     ///< Depth surface original height (of mip0)
        UINT_32             numSlices;           ///< Depth surface original depth (of mip0)
        UINT_32             numMipLevels;        ///< Depth surface total mipmap levels
        UINT_32             numSamples;          ///< Depth surface number of samples
        UINT_32             pipeXor;             ///< Pipe xor setting
    } ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT
    *
    *   @brief
    *       Output structure for Addr2ComputeHtileAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT
    {
        UINT_32    size;    ///< Size of this structure in bytes
    
        UINT_64    addr;    ///< Address in bytes
    } ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeHtileAddrFromCoord
    *
    *   @brief
    *       Compute Htile address according to coordinates (of depth buffer)
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeHtileAddrFromCoord(
        ADDR_HANDLE                                       hLib,
        const ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT*    pIn,
        ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT*         pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT
    *
    *   @brief
    *       Input structure for Addr2ComputeHtileCoordFromAddr
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT
    {
        UINT_32             size;                ///< Size of this structure in bytes
    
        UINT_64             addr;                ///< Address
    
        ADDR2_META_FLAGS    hTileFlags;          ///< HTILE flags
        ADDR2_SURFACE_FLAGS depthFlags;          ///< Depth surface flags
        AddrSwizzleMode     swizzleMode;         ///< Depth surface swizzle mode
        UINT_32             bpp;                 ///< Depth surface bits per pixel
        UINT_32             unalignedWidth;      ///< Depth surface original width (of mip0)
        UINT_32             unalignedHeight;     ///< Depth surface original height (of mip0)
        UINT_32             numSlices;           ///< Depth surface original depth (of mip0)
        UINT_32             numMipLevels;        ///< Depth surface total mipmap levels
        UINT_32             numSamples;          ///< Depth surface number of samples
        UINT_32             pipeXor;             ///< Pipe xor setting
    } ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT
    *
    *   @brief
    *       Output structure for Addr2ComputeHtileCoordFromAddr
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT
    {
        UINT_32    size;        ///< Size of this structure in bytes
    
        UINT_32    x;           ///< X coordinate
        UINT_32    y;           ///< Y coordinate
        UINT_32    slice;       ///< Index of slices
        UINT_32    mipId;       ///< mipmap level id
    } ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeHtileCoordFromAddr
    *
    *   @brief
    *       Compute coordinates within depth buffer (1st pixel of a micro tile) according to
    *       Htile address
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeHtileCoordFromAddr(
        ADDR_HANDLE                                       hLib,
        const ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT*    pIn,
        ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT*         pOut);
    
    
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //                                     C-mask functions for Addr2
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_CMASK_INFO_INPUT
    *
    *   @brief
    *       Input structure of Addr2ComputeCmaskInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_CMASKINFO_INPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
    
        ADDR2_META_FLAGS    cMaskFlags;         ///< CMASK flags
        ADDR2_SURFACE_FLAGS colorFlags;         ///< Color surface flags
        AddrResourceType    resourceType;       ///< Color surface type
        AddrSwizzleMode     swizzleMode;        ///< FMask surface swizzle mode
        UINT_32             unalignedWidth;     ///< Color surface original width
        UINT_32             unalignedHeight;    ///< Color surface original height
        UINT_32             numSlices;          ///< Number of slices of color buffer
        UINT_32             numMipLevels;       ///< Number of mip levels
        UINT_32             firstMipIdInTail;   ///< The id of first mip in tail, if no mip is in tail,
                                                ///  it should be number of mip levels
                                                ///  Only for GFX10
    } ADDR2_COMPUTE_CMASK_INFO_INPUT;
    
    /* DCC addr meta equation for GFX9. */
    struct gfx9_addr_meta_equation {
       UINT_8 num_bits;
    
       struct {
          struct {
             UINT_8 dim; /* 0..4 as index, 5 means invalid */
             UINT_8 ord; /* 0..31 */
          } coord[8]; /* 0..num_coords */
       } bit[32]; /* 0..num_bits */
    
       UINT_8 numPipeBits;
    };
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_CMASK_INFO_OUTPUT
    *
    *   @brief
    *       Output structure of Addr2ComputeCmaskInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_CMASK_INFO_OUTPUT
    {
        UINT_32    size;          ///< Size of this structure in bytes
    
        UINT_32    pitch;         ///< Pitch in pixels of color buffer which
                                  ///  this Cmask matches. The size might be larger than
                                  ///  original color buffer pitch when called with
                                  ///  an unaligned pitch.
        UINT_32    height;        ///< Height in pixels, as above
        UINT_32    baseAlign;     ///< Base alignment
        UINT_32    sliceSize;     ///< Slice size, in bytes.
        UINT_32    cmaskBytes;    ///< Size in bytes of CMask buffer
        UINT_32    metaBlkWidth;  ///< Meta block width
        UINT_32    metaBlkHeight; ///< Meta block height
    
        UINT_32    metaBlkNumPerSlice;  ///< Number of metablock within one slice
    
        ADDR2_META_MIP_INFO* pMipInfo;  ///< CMASK mip information
    
        /* The equation for doing CMASK address computations in shaders. */
        union {
           /* This is chip-specific, and it varies with:
            * - resource type
            * - swizzle_mode
            * - bpp
            * - pipe_aligned
            * - rb_aligned
            */
           struct gfx9_addr_meta_equation gfx9;
    
           /* This is chip-specific, it requires 64KB_Z_X. */
           UINT_16 *gfx10_bits; /* 68 2-byte elements */
        } equation;
    } ADDR2_COMPUTE_CMASK_INFO_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeCmaskInfo
    *
    *   @brief
    *       Compute Cmask pitch, height, base alignment and size in bytes from color buffer
    *       info
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeCmaskInfo(
        ADDR_HANDLE                              hLib,
        const ADDR2_COMPUTE_CMASK_INFO_INPUT*    pIn,
        ADDR2_COMPUTE_CMASK_INFO_OUTPUT*         pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT
    *
    *   @brief
    *       Input structure for Addr2ComputeCmaskAddrFromCoord
    *
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT
    {
        UINT_32             size;                ///< Size of this structure in bytes
    
        UINT_32             x;                   ///< X coordinate
        UINT_32             y;                   ///< Y coordinate
        UINT_32             slice;               ///< Index of slices
    
        ADDR2_META_FLAGS    cMaskFlags;          ///< CMASK flags
        ADDR2_SURFACE_FLAGS colorFlags;          ///< Color surface flags
        AddrResourceType    resourceType;        ///< Color surface type
        AddrSwizzleMode     swizzleMode;         ///< FMask surface swizzle mode
    
        UINT_32             unalignedWidth;      ///< Color surface original width (of mip0)
        UINT_32             unalignedHeight;     ///< Color surface original height (of mip0)
        UINT_32             numSlices;           ///< Color surface original slices (of mip0)
    
        UINT_32             numSamples;          ///< Color surfae sample number
        UINT_32             numFrags;            ///< Color surface fragment number
    
        UINT_32             pipeXor;             ///< pipe Xor setting
    } ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT
    *
    *   @brief
    *       Output structure for Addr2ComputeCmaskAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT
    {
        UINT_32    size;           ///< Size of this structure in bytes
    
        UINT_64    addr;           ///< CMASK address in bytes
        UINT_32    bitPosition;    ///< Bit position within addr, 0 or 4
    } ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeCmaskAddrFromCoord
    *
    *   @brief
    *       Compute Cmask address according to coordinates (of MSAA color buffer)
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeCmaskAddrFromCoord(
        ADDR_HANDLE                                      hLib,
        const ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT*   pIn,
        ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT*        pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_CMASK_COORDFROMADDR_INPUT
    *
    *   @brief
    *       Input structure for Addr2ComputeCmaskCoordFromAddr
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_CMASK_COORDFROMADDR_INPUT
    {
        UINT_32             size;                ///< Size of this structure in bytes
    
        UINT_64             addr;                ///< CMASK address in bytes
        UINT_32             bitPosition;         ///< Bit position within addr, 0 or 4
    
        ADDR2_META_FLAGS    cMaskFlags;          ///< CMASK flags
        ADDR2_SURFACE_FLAGS colorFlags;          ///< Color surface flags
        AddrResourceType    resourceType;        ///< Color surface type
        AddrSwizzleMode     swizzleMode;         ///< FMask surface swizzle mode
    
        UINT_32             unalignedWidth;      ///< Color surface original width (of mip0)
        UINT_32             unalignedHeight;     ///< Color surface original height (of mip0)
        UINT_32             numSlices;           ///< Color surface original slices (of mip0)
        UINT_32             numMipLevels;        ///< Color surface total mipmap levels.
    } ADDR2_COMPUTE_CMASK_COORDFROMADDR_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_CMASK_COORDFROMADDR_OUTPUT
    *
    *   @brief
    *       Output structure for Addr2ComputeCmaskCoordFromAddr
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_CMASK_COORDFROMADDR_OUTPUT
    {
        UINT_32    size;        ///< Size of this structure in bytes
    
        UINT_32    x;           ///< X coordinate
        UINT_32    y;           ///< Y coordinate
        UINT_32    slice;       ///< Index of slices
        UINT_32    mipId;       ///< mipmap level id
    } ADDR2_COMPUTE_CMASK_COORDFROMADDR_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeCmaskCoordFromAddr
    *
    *   @brief
    *       Compute coordinates within color buffer (1st pixel of a micro tile) according to
    *       Cmask address
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeCmaskCoordFromAddr(
        ADDR_HANDLE                                       hLib,
        const ADDR2_COMPUTE_CMASK_COORDFROMADDR_INPUT*    pIn,
        ADDR2_COMPUTE_CMASK_COORDFROMADDR_OUTPUT*         pOut);
    
    
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //                                     F-mask functions for Addr2
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /**
    ****************************************************************************************************
    *   ADDR2_FMASK_FLAGS
    *
    *   @brief
    *       FMASK flags
    ****************************************************************************************************
    */
    typedef union _ADDR2_FMASK_FLAGS
    {
        struct
        {
            UINT_32 resolved :  1;    ///< TRUE if this is a resolved fmask, used by H/W clients
                                      ///  by H/W clients. S/W should always set it to FALSE.
            UINT_32 reserved : 31;    ///< Reserved for future use.
        };
    
        UINT_32 value;
    } ADDR2_FMASK_FLAGS;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_FMASK_INFO_INPUT
    *
    *   @brief
    *       Input structure for Addr2ComputeFmaskInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_FMASK_INFO_INPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
    
        AddrSwizzleMode     swizzleMode;        ///< FMask surface swizzle mode
        UINT_32             unalignedWidth;     ///< Color surface original width
        UINT_32             unalignedHeight;    ///< Color surface original height
        UINT_32             numSlices;          ///< Number of slices/depth
        UINT_32             numSamples;         ///< Number of samples
        UINT_32             numFrags;           ///< Number of fragments, leave it zero or the same as
                                                ///  number of samples for normal AA; Set it to the
                                                ///  number of fragments for EQAA
        ADDR2_FMASK_FLAGS   fMaskFlags;         ///< FMASK flags
    } ADDR2_COMPUTE_FMASK_INFO_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_FMASK_INFO_OUTPUT
    *
    *   @brief
    *       Output structure for Addr2ComputeFmaskInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_FMASK_INFO_OUTPUT
    {
        UINT_32    size;           ///< Size of this structure in bytes
    
        UINT_32    pitch;          ///< Pitch of fmask in pixels
        UINT_32    height;         ///< Height of fmask in pixels
        UINT_32    baseAlign;      ///< Base alignment
        UINT_32    numSlices;      ///< Slices of fmask
        UINT_32    fmaskBytes;     ///< Size of fmask in bytes
        UINT_32    bpp;            ///< Bits per pixel of FMASK is: number of bit planes
        UINT_32    numSamples;     ///< Number of samples
        UINT_32    sliceSize;      ///< Size of slice in bytes
    } ADDR2_COMPUTE_FMASK_INFO_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeFmaskInfo
    *
    *   @brief
    *       Compute Fmask pitch/height/slices/alignments and size in bytes
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeFmaskInfo(
        ADDR_HANDLE                              hLib,
        const ADDR2_COMPUTE_FMASK_INFO_INPUT*    pIn,
        ADDR2_COMPUTE_FMASK_INFO_OUTPUT*         pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_INPUT
    *
    *   @brief
    *       Input structure for Addr2ComputeFmaskAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_INPUT
    {
        UINT_32            size;               ///< Size of this structure in bytes
    
        AddrSwizzleMode    swizzleMode;        ///< FMask surface swizzle mode
        UINT_32            x;                  ///< X coordinate
        UINT_32            y;                  ///< Y coordinate
        UINT_32            slice;              ///< Slice index
        UINT_32            sample;             ///< Sample index (fragment index for EQAA)
        UINT_32            plane;              ///< Plane number
    
        UINT_32            unalignedWidth;     ///< Color surface original width
        UINT_32            unalignedHeight;    ///< Color surface original height
        UINT_32            numSamples;         ///< Number of samples
        UINT_32            numFrags;           ///< Number of fragments, leave it zero or the same as
                                               ///  number of samples for normal AA; Set it to the
                                               ///  number of fragments for EQAA
        UINT_32            tileSwizzle;        ///< Combined swizzle used to do bank/pipe rotation
    
        ADDR2_FMASK_FLAGS  fMaskFlags; ///< FMASK flags
    } ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT
    *
    *   @brief
    *       Output structure for Addr2ComputeFmaskAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT
    {
        UINT_32    size;           ///< Size of this structure in bytes
    
        UINT_64    addr;           ///< Fmask address
        UINT_32    bitPosition;    ///< Bit position within fmaskAddr, 0-7.
    } ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeFmaskAddrFromCoord
    *
    *   @brief
    *       Compute Fmask address according to coordinates (x,y,slice,sample,plane)
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeFmaskAddrFromCoord(
        ADDR_HANDLE                                       hLib,
        const ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_INPUT*    pIn,
        ADDR2_COMPUTE_FMASK_ADDRFROMCOORD_OUTPUT*         pOut);
    
    
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_FMASK_COORDFROMADDR_INPUT
    *
    *   @brief
    *       Input structure for Addr2ComputeFmaskCoordFromAddr
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_FMASK_COORDFROMADDR_INPUT
    {
        UINT_32            size;               ///< Size of this structure in bytes
    
        UINT_64            addr;               ///< Address
        UINT_32            bitPosition;        ///< Bit position within addr, 0-7.
        AddrSwizzleMode    swizzleMode;        ///< FMask surface swizzle mode
    
        UINT_32            unalignedWidth;     ///< Color surface original width
        UINT_32            unalignedHeight;    ///< Color surface original height
        UINT_32            numSamples;         ///< Number of samples
        UINT_32            numFrags;           ///< Number of fragments
    
        UINT_32            tileSwizzle;        ///< Combined swizzle used to do bank/pipe rotation
    
        ADDR2_FMASK_FLAGS  fMaskFlags; ///< FMASK flags
    } ADDR2_COMPUTE_FMASK_COORDFROMADDR_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
    *
    *   @brief
    *       Output structure for Addr2ComputeFmaskCoordFromAddr
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
    {
        UINT_32    size;      ///< Size of this structure in bytes
    
        UINT_32    x;         ///< X coordinate
        UINT_32    y;         ///< Y coordinate
        UINT_32    slice;     ///< Slice index
        UINT_32    sample;    ///< Sample index (fragment index for EQAA)
        UINT_32    plane;     ///< Plane number
    } ADDR2_COMPUTE_FMASK_COORDFROMADDR_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeFmaskCoordFromAddr
    *
    *   @brief
    *       Compute FMASK coordinate from an given address
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeFmaskCoordFromAddr(
        ADDR_HANDLE                                       hLib,
        const ADDR2_COMPUTE_FMASK_COORDFROMADDR_INPUT*    pIn,
        ADDR2_COMPUTE_FMASK_COORDFROMADDR_OUTPUT*         pOut);
    
    
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //                                     DCC key functions for Addr2
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /**
    ****************************************************************************************************
    *   _ADDR2_COMPUTE_DCCINFO_INPUT
    *
    *   @brief
    *       Input structure of Addr2ComputeDccInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_DCCINFO_INPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
    
        ADDR2_META_FLAGS    dccKeyFlags;        ///< DCC key flags
        ADDR2_SURFACE_FLAGS colorFlags;         ///< Color surface flags
        AddrResourceType    resourceType;       ///< Color surface type
        AddrSwizzleMode     swizzleMode;        ///< Color surface swizzle mode
        UINT_32             bpp;                ///< bits per pixel
        UINT_32             unalignedWidth;     ///< Color surface original width (of mip0)
        UINT_32             unalignedHeight;    ///< Color surface original height (of mip0)
        UINT_32             numSlices;          ///< Number of slices, of color surface (of mip0)
        UINT_32             numFrags;           ///< Fragment number of color surface
        UINT_32             numMipLevels;       ///< Total mipmap levels of color surface
        UINT_32             dataSurfaceSize;    ///< The padded size of all slices and mip levels
                                                ///< useful in meta linear case
        UINT_32             firstMipIdInTail;   ///< The id of first mip in tail, if no mip is in tail,
                                                ///  it should be number of mip levels
                                                ///  Only for GFX10
    } ADDR2_COMPUTE_DCCINFO_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_DCCINFO_OUTPUT
    *
    *   @brief
    *       Output structure of Addr2ComputeDccInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_DCCINFO_OUTPUT
    {
        UINT_32    size;               ///< Size of this structure in bytes
    
        UINT_32    dccRamBaseAlign;    ///< Base alignment of dcc key
        UINT_32    dccRamSize;         ///< Size of dcc key
    
        UINT_32    pitch;              ///< DCC surface mip chain pitch
        UINT_32    height;             ///< DCC surface mip chain height
        UINT_32    depth;              ///< DCC surface mip chain depth
    
        UINT_32    compressBlkWidth;   ///< DCC compress block width
        UINT_32    compressBlkHeight;  ///< DCC compress block height
        UINT_32    compressBlkDepth;   ///< DCC compress block depth
    
        UINT_32    metaBlkWidth;       ///< DCC meta block width
        UINT_32    metaBlkHeight;      ///< DCC meta block height
        UINT_32    metaBlkDepth;       ///< DCC meta block depth
        UINT_32    metaBlkSize;        ///< DCC meta block size in bytes
        UINT_32    metaBlkNumPerSlice; ///< Number of metablock within one slice
    
        union
        {
            UINT_32 fastClearSizePerSlice;  ///< Size of DCC within a slice should be fast cleared
            UINT_32 dccRamSliceSize;        ///< DCC ram size per slice. For mipmap, it's
                                            ///  the slize size of a mip chain, the thickness of a
                                            ///  a slice is meta block depth
                                            ///  Only for GFX10
        };
    
        ADDR2_META_MIP_INFO* pMipInfo;      ///< DCC mip information
    
        /* The equation for doing DCC address computations in shaders. */
        union {
           /* This is chip-specific, and it varies with:
            * - resource type
            * - swizzle_mode
            * - bpp
            * - number of fragments
            * - pipe_aligned
            * - rb_aligned
            */
           struct gfx9_addr_meta_equation gfx9;
    
           /* This is chip-specific, it requires 64KB_R_X, and it varies with:
            * - bpp
            * - pipe_aligned
            */
           UINT_16 *gfx10_bits; /* 68 2-byte elements */
        } equation;
    } ADDR2_COMPUTE_DCCINFO_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeDccInfo
    *
    *   @brief
    *       Compute DCC key size, base alignment
    *       info
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeDccInfo(
        ADDR_HANDLE                           hLib,
        const ADDR2_COMPUTE_DCCINFO_INPUT*    pIn,
        ADDR2_COMPUTE_DCCINFO_OUTPUT*         pOut);
    
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT
    *
    *   @brief
    *       Input structure for Addr2ComputeDccAddrFromCoord
    *
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT
    {
        UINT_32             size;                ///< Size of this structure in bytes
    
        UINT_32             x;                   ///< X coordinate
        UINT_32             y;                   ///< Y coordinate
        UINT_32             slice;               ///< Index of slices
        UINT_32             sample;              ///< Index of samples, means fragment index for EQAA
        UINT_32             mipId;               ///< mipmap level id
    
        ADDR2_META_FLAGS    dccKeyFlags;         ///< DCC flags
        ADDR2_SURFACE_FLAGS colorFlags;          ///< Color surface flags
        AddrResourceType    resourceType;        ///< Color surface type
        AddrSwizzleMode     swizzleMode;         ///< Color surface swizzle mode
        UINT_32             bpp;                 ///< Color surface bits per pixel
        UINT_32             unalignedWidth;      ///< Color surface original width (of mip0)
        UINT_32             unalignedHeight;     ///< Color surface original height (of mip0)
        UINT_32             numSlices;           ///< Color surface original slices (of mip0)
        UINT_32             numMipLevels;        ///< Color surface mipmap levels
        UINT_32             numFrags;            ///< Color surface fragment number
    
        UINT_32             pipeXor;             ///< pipe Xor setting
        UINT_32             pitch;               ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::pitch
        UINT_32             height;              ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::height
        UINT_32             compressBlkWidth;    ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::compressBlkWidth
        UINT_32             compressBlkHeight;   ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::compressBlkHeight
        UINT_32             compressBlkDepth;    ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::compressBlkDepth
        UINT_32             metaBlkWidth;        ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::metaBlkWidth
        UINT_32             metaBlkHeight;       ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::metaBlkHeight
        UINT_32             metaBlkDepth;        ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::metaBlkDepth
        UINT_32             dccRamSliceSize;     ///< ADDR2_COMPUTE_DCC_INFO_OUTPUT::dccRamSliceSize
    } ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT
    *
    *   @brief
    *       Output structure for Addr2ComputeDccAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT
    {
        UINT_32    size;           ///< Size of this structure in bytes
    
        UINT_64    addr;           ///< DCC address in bytes
    } ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeDccAddrFromCoord
    *
    *   @brief
    *       Compute DCC address according to coordinates (of MSAA color buffer)
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeDccAddrFromCoord(
        ADDR_HANDLE                                    hLib,
        const ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT*   pIn,
        ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT*        pOut);
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //                                     Misc functions for Addr2
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_PIPEBANKXOR_INPUT
    *
    *   @brief
    *       Input structure of Addr2ComputePipebankXor
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_PIPEBANKXOR_INPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
        UINT_32             surfIndex;          ///< Input surface index
        ADDR2_SURFACE_FLAGS flags;              ///< Surface flag
        AddrSwizzleMode     swizzleMode;        ///< Surface swizzle mode
        AddrResourceType    resourceType;       ///< Surface resource type
        AddrFormat          format;             ///< Surface format
        UINT_32             numSamples;         ///< Number of samples
        UINT_32             numFrags;           ///< Number of fragments, leave it zero or the same as
                                                ///  number of samples for normal AA; Set it to the
                                                ///  number of fragments for EQAA
    } ADDR2_COMPUTE_PIPEBANKXOR_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT
    *
    *   @brief
    *       Output structure of Addr2ComputePipebankXor
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
        UINT_32             pipeBankXor;        ///< Pipe bank xor
    } ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputePipeBankXor
    *
    *   @brief
    *       Calculate a valid bank pipe xor value for client to use.
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputePipeBankXor(
        ADDR_HANDLE                            hLib,
        const ADDR2_COMPUTE_PIPEBANKXOR_INPUT* pIn,
        ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT*      pOut);
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT
    *
    *   @brief
    *       Input structure of Addr2ComputeSlicePipeBankXor
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
        AddrSwizzleMode     swizzleMode;        ///< Surface swizzle mode
        AddrResourceType    resourceType;       ///< Surface resource type
        UINT_32             bpe;                ///< bits per element (e.g. block size for BCn format)
        UINT_32             basePipeBankXor;    ///< Base pipe bank xor
        UINT_32             slice;              ///< Slice id
        UINT_32             numSamples;         ///< Number of samples
    } ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT
    *
    *   @brief
    *       Output structure of Addr2ComputeSlicePipeBankXor
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
        UINT_32             pipeBankXor;        ///< Pipe bank xor
    } ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeSlicePipeBankXor
    *
    *   @brief
    *       Calculate slice pipe bank xor value based on base pipe bank xor and slice id.
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeSlicePipeBankXor(
        ADDR_HANDLE                                  hLib,
        const ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT* pIn,
        ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT*      pOut);
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT
    *
    *   @brief
    *       Input structure of Addr2ComputeSubResourceOffsetForSwizzlePattern
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
        AddrSwizzleMode     swizzleMode;        ///< Surface swizzle mode
        AddrResourceType    resourceType;       ///< Surface resource type
        UINT_32             pipeBankXor;        ///< Per resource xor
        UINT_32             slice;              ///< Slice id
        UINT_64             sliceSize;          ///< Slice size of a mip chain
        UINT_64             macroBlockOffset;   ///< Macro block offset, returned in ADDR2_MIP_INFO
        UINT_32             mipTailOffset;      ///< Mip tail offset, returned in ADDR2_MIP_INFO
    } ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT
    *
    *   @brief
    *       Output structure of Addr2ComputeSubResourceOffsetForSwizzlePattern
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
        UINT_64             offset;             ///< offset
    } ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeSubResourceOffsetForSwizzlePattern
    *
    *   @brief
    *       Calculate sub resource offset to support swizzle pattern.
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeSubResourceOffsetForSwizzlePattern(
        ADDR_HANDLE                                                     hLib,
        const ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT* pIn,
        ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT*      pOut);
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_NONBLOCKCOMPRESSEDVIEW_INPUT
    *
    *   @brief
    *       Input structure of Addr2ComputeNonBlockCompressedView
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_NONBLOCKCOMPRESSEDVIEW_INPUT
    {
        UINT_32               size;              ///< Size of this structure in bytes
        ADDR2_SURFACE_FLAGS   flags;             ///< Surface flags
        AddrSwizzleMode       swizzleMode;       ///< Swizzle Mode for Addr2
        AddrResourceType      resourceType;      ///< Surface type
        AddrFormat            format;            ///< Surface format
        UINT_32               width;             ///< Width of mip0 in texels (not in compressed block)
        UINT_32               height;            ///< Height of mip0 in texels (not in compressed block)
        UINT_32               numSlices;         ///< Number surface slice/depth of mip0
        UINT_32               numMipLevels;      ///< Total mipmap levels.
        UINT_32               pipeBankXor;       ///< Combined swizzle used to do bank/pipe rotation
        UINT_32               slice;             ///< Index of slice to view
        UINT_32               mipId;             ///< Id of mip to view
    } ADDR2_COMPUTE_NONBLOCKCOMPRESSEDVIEW_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_COMPUTE_NONBLOCKCOMPRESSEDVIEW_OUTPUT
    *
    *   @brief
    *       Output structure of Addr2ComputeNonBlockCompressedView
    ****************************************************************************************************
    */
    typedef struct _ADDR2_COMPUTE_NONBLOCKCOMPRESSEDVIEW_OUTPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
        UINT_64             offset;             ///< Offset shifted from resource base for the view
        UINT_32             pipeBankXor;        ///< Pipe bank xor for the view
        UINT_32             unalignedWidth;     ///< Mip0 width (in element) for the view
        UINT_32             unalignedHeight;    ///< Mip0 height (in element) for the view
        UINT_32             numMipLevels;       ///< Total mipmap levels for the view
        UINT_32             mipId;              ///< Mip ID for the view
    } ADDR2_COMPUTE_NONBLOCKCOMPRESSEDVIEW_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2ComputeNonBlockCompressedView
    *
    *   @brief
    *       Compute non-block-compressed view for a given mipmap level/slice
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2ComputeNonBlockCompressedView(
        ADDR_HANDLE                                       hLib,
        const ADDR2_COMPUTE_NONBLOCKCOMPRESSEDVIEW_INPUT* pIn,
        ADDR2_COMPUTE_NONBLOCKCOMPRESSEDVIEW_OUTPUT*      pOut);
    
    /**
    ****************************************************************************************************
    *   ADDR2_BLOCK_SET
    *
    *   @brief
    *       Bit field that defines block type
    ****************************************************************************************************
    */
    typedef union _ADDR2_BLOCK_SET
    {
        struct
        {
            UINT_32 micro          : 1;   // 256B block for 2D resource
            UINT_32 macroThin4KB   : 1;   // Thin 4KB for 2D/3D resource
            UINT_32 macroThick4KB  : 1;   // Thick 4KB for 3D resource
            UINT_32 macroThin64KB  : 1;   // Thin 64KB for 2D/3D resource
            UINT_32 macroThick64KB : 1;   // Thick 64KB for 3D resource
            UINT_32 var            : 1;   // VAR block
            UINT_32                : 1;
            UINT_32 linear         : 1;   // Linear block
            UINT_32 reserved       : 24;
        };
    
        struct
        {
            UINT_32                : 5;
            UINT_32 thin256KB      : 1;   // Thin 256KB block
            UINT_32 thick256KB     : 1;   // Thick 256KB block
            UINT_32                : 25;
        } gfx11;
    
        UINT_32 value;
    } ADDR2_BLOCK_SET;
    
    /**
    ****************************************************************************************************
    *   ADDR2_SWTYPE_SET
    *
    *   @brief
    *       Bit field that defines swizzle type
    ****************************************************************************************************
    */
    typedef union _ADDR2_SWTYPE_SET
    {
        struct
        {
            UINT_32 sw_Z     : 1;   // SW_*_Z_*
            UINT_32 sw_S     : 1;   // SW_*_S_*
            UINT_32 sw_D     : 1;   // SW_*_D_*
            UINT_32 sw_R     : 1;   // SW_*_R_*
            UINT_32 reserved : 28;
        };
    
        UINT_32 value;
    } ADDR2_SWTYPE_SET;
    
    /**
    ****************************************************************************************************
    *   ADDR2_SWMODE_SET
    *
    *   @brief
    *       Bit field that defines swizzle type
    ****************************************************************************************************
    */
    typedef union _ADDR2_SWMODE_SET
    {
        struct
        {
            UINT_32 swLinear    : 1;
            UINT_32 sw256B_S    : 1;
            UINT_32 sw256B_D    : 1;
            UINT_32 sw256B_R    : 1;
            UINT_32 sw4KB_Z     : 1;
            UINT_32 sw4KB_S     : 1;
            UINT_32 sw4KB_D     : 1;
            UINT_32 sw4KB_R     : 1;
            UINT_32 sw64KB_Z    : 1;
            UINT_32 sw64KB_S    : 1;
            UINT_32 sw64KB_D    : 1;
            UINT_32 sw64KB_R    : 1;
            UINT_32 swMiscDef12 : 1;
            UINT_32 swMiscDef13 : 1;
            UINT_32 swMiscDef14 : 1;
            UINT_32 swMiscDef15 : 1;
            UINT_32 sw64KB_Z_T  : 1;
            UINT_32 sw64KB_S_T  : 1;
            UINT_32 sw64KB_D_T  : 1;
            UINT_32 sw64KB_R_T  : 1;
            UINT_32 sw4KB_Z_X   : 1;
            UINT_32 sw4KB_S_X   : 1;
            UINT_32 sw4KB_D_X   : 1;
            UINT_32 sw4KB_R_X   : 1;
            UINT_32 sw64KB_Z_X  : 1;
            UINT_32 sw64KB_S_X  : 1;
            UINT_32 sw64KB_D_X  : 1;
            UINT_32 sw64KB_R_X  : 1;
            UINT_32 swMiscDef28 : 1;
            UINT_32 swMiscDef29 : 1;
            UINT_32 swMiscDef30 : 1;
            UINT_32 swMiscDef31 : 1;
        };
    
        struct
        {
            UINT_32             : 28;
            UINT_32 swVar_Z_X   : 1;
            UINT_32             : 2;
            UINT_32 swVar_R_X   : 1;
        } gfx10;
    
        struct
        {
            UINT_32             : 28;
            UINT_32 sw256KB_Z_X : 1;
            UINT_32 sw256KB_S_X : 1;
            UINT_32 sw256KB_D_X : 1;
            UINT_32 sw256KB_R_X : 1;
        } gfx11;
    
        UINT_32 value;
    } ADDR2_SWMODE_SET;
    
    /**
    ****************************************************************************************************
    *   ADDR2_GET_PREFERRED_SURF_SETTING_INPUT
    *
    *   @brief
    *       Input structure of Addr2GetPreferredSurfaceSetting
    ****************************************************************************************************
    */
    typedef struct _ADDR2_GET_PREFERRED_SURF_SETTING_INPUT
    {
        UINT_32               size;              ///< Size of this structure in bytes
    
        ADDR2_SURFACE_FLAGS   flags;             ///< Surface flags
        AddrResourceType      resourceType;      ///< Surface type
        AddrFormat            format;            ///< Surface format
        AddrResrouceLocation  resourceLoction;   ///< Surface heap choice
        ADDR2_BLOCK_SET       forbiddenBlock;    ///< Client can use it to disable some block setting
                                                 ///< such as linear for DXTn, tiled for YUV
        ADDR2_SWTYPE_SET      preferredSwSet;    ///< Client can use it to specify sw type(s) wanted
        BOOL_32               noXor;             ///< Do not use xor mode for this resource
        UINT_32               bpp;               ///< bits per pixel
        UINT_32               width;             ///< Width (of mip0), in pixels
        UINT_32               height;            ///< Height (of mip0), in pixels
        UINT_32               numSlices;         ///< Number surface slice/depth (of mip0),
        UINT_32               numMipLevels;      ///< Total mipmap levels.
        UINT_32               numSamples;        ///< Number of samples
        UINT_32               numFrags;          ///< Number of fragments, leave it zero or the same as
                                                 ///  number of samples for normal AA; Set it to the
                                                 ///  number of fragments for EQAA
        UINT_32               maxAlign;          ///< maximum base/size alignment requested by client
        UINT_32               minSizeAlign;      ///< memory allocated for surface in client driver will
                                                 ///  be padded to multiple of this value (in bytes)
        DOUBLE                memoryBudget;      ///< Memory consumption ratio based on minimum possible
                                                 ///  size.
    } ADDR2_GET_PREFERRED_SURF_SETTING_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT
    *
    *   @brief
    *       Output structure of Addr2GetPreferredSurfaceSetting
    ****************************************************************************************************
    */
    typedef struct _ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT
    {
        UINT_32               size;                 ///< Size of this structure in bytes
    
        AddrSwizzleMode       swizzleMode;          ///< Suggested swizzle mode to be used
        AddrResourceType      resourceType;         ///< Suggested resource type to program HW
        ADDR2_BLOCK_SET       validBlockSet;        ///< Valid block type bit conbination
        BOOL_32               canXor;               ///< If client can use xor on a valid macro block
                                                    ///  type
        ADDR2_SWTYPE_SET      validSwTypeSet;       ///< Valid swizzle type bit combination
        ADDR2_SWTYPE_SET      clientPreferredSwSet; ///< Client-preferred swizzle type bit combination
        ADDR2_SWMODE_SET      validSwModeSet;       ///< Valid swizzle mode bit combination
    } ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr2GetPreferredSurfaceSetting
    *
    *   @brief
    *       Suggest a preferred setting for client driver to program HW register
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2GetPreferredSurfaceSetting(
        ADDR_HANDLE                                   hLib,
        const ADDR2_GET_PREFERRED_SURF_SETTING_INPUT* pIn,
        ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT*      pOut);
    
    /**
    ****************************************************************************************************
    *   Addr2GetPossibleSwizzleModes
    *
    *   @brief
    *       Returns a list of swizzle modes that are valid from the hardware's perspective for the
    *       client to choose from
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2GetPossibleSwizzleModes(
        ADDR_HANDLE                                   hLib,
        const ADDR2_GET_PREFERRED_SURF_SETTING_INPUT* pIn,
        ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT*      pOut);
    
    /**
    ****************************************************************************************************
    *   Addr2IsValidDisplaySwizzleMode
    *
    *   @brief
    *       Return whether the swizzle mode is supported by display engine
            pResult: whether it is displayAble or not for the given displaySwizzleMode
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2IsValidDisplaySwizzleMode(
        ADDR_HANDLE     hLib,
        AddrSwizzleMode swizzleMode,
        UINT_32         bpp,
        BOOL_32         *pResult);
    
    /**
    ****************************************************************************************************
    *   Addr2GetAllowedBlockSet
    *
    *   @brief
    *       Returns the set of allowed block sizes given the allowed swizzle modes and resource type
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2GetAllowedBlockSet(
        ADDR_HANDLE      hLib,
        ADDR2_SWMODE_SET allowedSwModeSet,
        AddrResourceType rsrcType,
        ADDR2_BLOCK_SET* pAllowedBlockSet);
    
    /**
    ****************************************************************************************************
    *   Addr2GetAllowedSwSet
    *
    *   @brief
    *       Returns the set of allowed swizzle types given the allowed swizzle modes
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr2GetAllowedSwSet(
        ADDR_HANDLE       hLib,
        ADDR2_SWMODE_SET  allowedSwModeSet,
        ADDR2_SWTYPE_SET* pAllowedSwSet);
    
    /**
    ****************************************************************************************************
    *   Addr2IsBlockTypeAvailable
    *
    *   @brief
    *       Determine whether a block type is allowed in a given blockSet
    ****************************************************************************************************
    */
    BOOL_32 Addr2IsBlockTypeAvailable(ADDR2_BLOCK_SET blockSet, AddrBlockType blockType);
    
    /**
    ****************************************************************************************************
    *   Addr2BlockTypeWithinMemoryBudget
    *
    *   @brief
    *       Determine whether a new block type is acceptable based on memory waste ratio. Will favor
    *       larger block types.
    ****************************************************************************************************
    */
    BOOL_32 Addr2BlockTypeWithinMemoryBudget(
        UINT_64 minSize,
        UINT_64 newBlockTypeSize,
        UINT_32 ratioLow,
        UINT_32 ratioHi,
    #if defined(__cplusplus)
        DOUBLE  memoryBudget = 0.0f,
        BOOL_32 newBlockTypeBigger = TRUE);
    #else
        DOUBLE  memoryBudget,
        BOOL_32 newBlockTypeBigger);
    #endif
    
    /**
    ****************************************************************************************************
    *   ADDR3_SURFACE_FLAGS
    *
    *   @brief
    *       Surface flags
    ****************************************************************************************************
    */
    typedef union _ADDR3_SURFACE_FLAGS
    {
        struct
        {
            UINT_32 depth              : 1; ///< This resource is a depth buffer, can be used with DSV
            UINT_32 stencil            : 1; ///< This resource is a stencil buffer, can be used with DSV
            UINT_32 hiZHiS             : 1;
            UINT_32 blockCompressed    : 1;
            UINT_32 nv12               : 1;
            UINT_32 p010               : 1;
            UINT_32 view3dAs2dArray    : 1;
            UINT_32 isVrsImage         : 1; ///< This resource is a VRS source image
            UINT_32 standardPrt        : 1; ///< This resource is a PRT resource with the specific block
                                            ///  dimensions that some APIs want
            UINT_32 reserved1          : 2;
            UINT_32 denseSliceExact    : 1;  ///< Pad dimensions such that
                                             ///  Pow2Align(pitch*height, surfAlign)==pitch*height
            UINT_32 qbStereo           : 1;  ///< Quad buffer stereo surface
            UINT_32 display            : 1;  ///< This resource is displayable, can be used with DRV
            UINT_32 reserved           : 18; ///< Reserved bits
        };
    
        UINT_32 value;
    } ADDR3_SURFACE_FLAGS;
    
    /**
    ****************************************************************************************************
    *   ADDR3_COMPUTE_SURFACE_INFO_INPUT
    *
    *   @brief
    *       Input structure for Addr3ComputeSurfaceInfo
    ****************************************************************************************************
    */
    typedef struct _ADDR3_COMPUTE_SURFACE_INFO_INPUT
    {
        UINT_32               size;              ///< Size of this structure in bytes
    
        ADDR3_SURFACE_FLAGS   flags;             ///< Surface flags
        Addr3SwizzleMode      swizzleMode;       ///< Swizzle Mode for Gfx12
        AddrResourceType      resourceType;      ///< Surface type
        AddrFormat            format;            ///< Surface format
        UINT_32               bpp;               ///< bits per pixel
        UINT_32               width;             ///< Width (of mip0), in pixels
        UINT_32               height;            ///< Height (of mip0), in pixels
        UINT_32               numSlices;         ///< Number surface slice/depth (of mip0),
        UINT_32               numMipLevels;      ///< Total mipmap levels.
        UINT_32               numSamples;        ///< Number of samples
        UINT_32               pitchInElement;    ///< Pitch in elements (blocks for compressed formats)
        UINT_32               sliceAlign;        ///< Required slice size in bytes
    } ADDR3_COMPUTE_SURFACE_INFO_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR3_MIP_INFO
    *
    *   @brief
    *       Structure that contains information for mip level
    *
    ****************************************************************************************************
    */
    typedef struct _ADDR3_MIP_INFO
    {
        UINT_32             pitch;              ///< Pitch in elements of image data
        UINT_32             pitchForSlice;      ///< Pitch in elements used to compute slice size
        UINT_32             height;             ///< Padded height in elements
        UINT_32             depth;              ///< Padded depth
        UINT_32             pixelPitch;         ///< Pitch in pixels for image data
        UINT_32             pixelHeight;        ///< Padded height in pixels
        UINT_32             equationIndex;      ///< Equation index in the equation table
        UINT_64             offset;             ///< Offset in bytes from mip base, should only be used
                                                ///< to setup vam surface descriptor, can't be used
                                                ///< to setup swizzle pattern
        UINT_64             macroBlockOffset;   ///< macro block offset in bytes from mip base
        UINT_32             mipTailOffset;      ///< mip tail offset in bytes
        UINT_32             mipTailCoordX;      ///< mip tail coord x
        UINT_32             mipTailCoordY;      ///< mip tail coord y
        UINT_32             mipTailCoordZ;      ///< mip tail coord z
    } ADDR3_MIP_INFO;
    
    /**
    ****************************************************************************************************
    *   ADDR3_COMPUTE_SURFACE_INFO_OUTPUT
    *
    *   @brief
    *       Output structure for Addr3ComputeSurfaceInfo
    *   @note
            Element: AddrLib unit for computing. e.g. BCn: 4x4 blocks; R32B32B32: 32bit with 3x pitch
            Pixel: Original pixel
    ****************************************************************************************************
    */
    typedef struct _ADDR3_COMPUTE_SURFACE_INFO_OUTPUT
    {
        UINT_32             size;                 ///< Size of this structure in bytes
        UINT_32             pitch;                ///< Pitch in elements for image data
        UINT_32             pitchForSlice;        ///< Pitch in elements used to compute slice size
        UINT_32             pixelPitch;           ///< Pitch in original pixels
        UINT_32             pixelHeight;          ///< Height in original pixels
        UINT_32             pixelBits;            ///< Original bits per pixel, passed from input
        UINT_32             bpp;                  ///< Bits per elements
                                                  ///  (e.g. blocks for BCn, 1/3 for 96bit)
        UINT_32             numSlices;            ///< Padded depth for 3d resource
                                                  ///  or padded number of slices for 2d array resource
        UINT_32             height;               ///< Padded height (of mip0) in elements
        UINT_64             sliceSize;            ///< Slice (total mip chain) size in bytes
        UINT_64             sliceSizeDensePacked; ///< Slice (total mip chain) size of image data in bytes
        UINT_64             surfSize;             ///< Surface (total mip chain) size in bytes
        UINT_32             baseAlign;            ///< Base address alignment
        ADDR_EXTENT3D       blockExtent;          ///< Dimensions in element inside one block
        UINT_32             pixelMipChainPitch;   ///< Mip chain pitch in original pixels
        UINT_32             pixelMipChainHeight;  ///< Mip chain height in original pixels
        ADDR3_MIP_INFO*     pMipInfo;             ///< Info regarding the start, sizes of the mip levels
        BOOL_32             mipChainInTail;       ///< If whole mipchain falls into mip tail block
        UINT_32             firstMipIdInTail;     ///< The id of first mip in tail, if there is no mip
                                                  ///  in tail, it will be set to number of mip levels
        /// Stereo info
        ADDR_QBSTEREOINFO*  pStereoInfo;          ///< Stereo info, needed if qbStereo flag is TRUE
    } ADDR3_COMPUTE_SURFACE_INFO_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR3_SWMODE_SET
    *
    *   @brief
    *       Bit field that defines swizzle type
    ****************************************************************************************************
    */
    // The bit order MUST be the same as Addr3SwizzleMode enumerations, otherwise using bitset to enable
    // or disable swizzle modes will be problematic.
    typedef union _ADDR3_SWMODE_SET
    {
        struct
        {
            UINT_32 swLinear    :  1;
            UINT_32 sw2d256B    :  1;
            UINT_32 sw2d4kB     :  1;
            UINT_32 sw2d64kB    :  1;
            UINT_32 sw2d256kB   :  1;
            UINT_32 sw3d4kB     :  1;
            UINT_32 sw3d64kB    :  1;
            UINT_32 sw3d256kB   :  1;
            UINT_32 reserved1   :  2;
            UINT_32 reserved    : 22;
        };
    
        UINT_32 value;
    } ADDR3_SWMODE_SET;
    
    /**
    ****************************************************************************************************
    *   ADDR3_GET_POSSIBLE_SWIZZLE_MODE_INPUT
    *
    *   @brief
    *       Input structure of Addr3GetPossibleSwizzleModes
    ****************************************************************************************************
    */
    typedef struct _ADDR3_GET_POSSIBLE_SWIZZLE_MODE_INPUT
    {
        UINT_32               size;              ///< Size of this structure in bytes
    
        ADDR3_SURFACE_FLAGS   flags;             ///< Surface flags
        AddrResourceType      resourceType;      ///< Surface type
        UINT_32               bpp;               ///< bits per pixel
        UINT_32               width;             ///< Width (of mip0), in pixels
        UINT_32               height;            ///< Height (of mip0), in pixels
        UINT_32               numSlices;         ///< Number surface slice/depth (of mip0),
        UINT_32               numMipLevels;      ///< Total mipmap levels.
        UINT_32               numSamples;        ///< Number of samples
        UINT_32               maxAlign;          ///< maximum base/size alignment requested by client
    } ADDR3_GET_POSSIBLE_SWIZZLE_MODE_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR3_GET_POSSIBLE_SWIZZLE_MODE_OUTPUT
    *
    *   @brief
    *       Output structure of Addr3GetPossibleSwizzleModes
    ****************************************************************************************************
    */
    typedef struct _ADDR3_GET_POSSIBLE_SWIZZLE_MODE_OUTPUT
    {
        UINT_32           size;             ///< Size of this structure in bytes
        ADDR3_SWMODE_SET  validModes;       ///< List of valid swizzle modes for this function.
    } ADDR3_GET_POSSIBLE_SWIZZLE_MODE_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr3ComputeSurfaceInfo
    *
    *   @brief
    *       Compute surface width/height/slices/alignments and suitable tiling mode
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr3ComputeSurfaceInfo(
        ADDR_HANDLE                              hLib,
        const ADDR3_COMPUTE_SURFACE_INFO_INPUT*  pIn,
        ADDR3_COMPUTE_SURFACE_INFO_OUTPUT*       pOut);
    
    /**
    ****************************************************************************************************
    *   Addr3GetPossibleSwizzleModes
    *
    *   @brief
    *       Returns a list of swizzle modes that are valid from the hardware's perspective for the
    *       client to choose from
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr3GetPossibleSwizzleModes(
        ADDR_HANDLE                                  hLib,
        const ADDR3_GET_POSSIBLE_SWIZZLE_MODE_INPUT* pIn,
        ADDR3_GET_POSSIBLE_SWIZZLE_MODE_OUTPUT*      pOut);
    
    /**
    ****************************************************************************************************
    *   ADDR3_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
    *
    *   @brief
    *       Input structure for Addr3ComputeSurfaceAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR3_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT
    {
        UINT_32             size;            ///< Size of this structure in bytes
    
        UINT_32             x;               ///< X coordinate
        UINT_32             y;               ///< Y coordinate
        UINT_32             slice;           ///< Slice index
        UINT_32             sample;          ///< Sample index, use fragment index for EQAA
        UINT_32             mipId;           ///< the mip ID in mip chain
    
        Addr3SwizzleMode    swizzleMode;     ///< Swizzle mode for Gfx12
        ADDR3_SURFACE_FLAGS flags;           ///< Surface flags
        AddrResourceType    resourceType;    ///< Surface type
        UINT_32             bpp;             ///< Bits per pixel
        ADDR_EXTENT3D       unAlignedDims;   ///< Surface original dimensions (of mip0)
        UINT_32             numMipLevels;    ///< Total mipmap levels
        UINT_32             numSamples;      ///< Number of samples
        UINT_32             pitchInElement;  ///< Pitch in elements (blocks for compressed formats)
    } ADDR3_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR3_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
    *
    *   @brief
    *       Output structure for Addr3ComputeSurfaceAddrFromCoord
    ****************************************************************************************************
    */
    typedef struct _ADDR3_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
    {
        UINT_32    size;             ///< Size of this structure in bytes
    
        UINT_64    addr;             ///< Byte offset from the image starting address
        UINT_32    bitPosition;      ///< Bit position within surfaceAddr, 0-7.
                                     ///  For surface bpp < 8, e.g. FMT_1.
        UINT_32    prtBlockIndex;    ///< Index of a PRT tile (64K block)
    } ADDR3_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr3ComputeSurfaceAddrFromCoord
    *
    *   @brief
    *       Compute surface address from a given coordinate.
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr3ComputeSurfaceAddrFromCoord(
        ADDR_HANDLE                                         hLib,
        const ADDR3_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT*    pIn,
        ADDR3_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT*         pOut);
    
    
    /**
    ****************************************************************************************************
    *   ADDR3_COPY_MEMSURFACE_REGION
    *
    *   @brief
    *       Input structure for Addr3CopyMemToSurface and Addr3CopySurfaceToMem
    ****************************************************************************************************
    */
    typedef struct _ADDR3_COPY_MEMSURFACE_REGION
    {
        UINT_32             size;            ///< Size of this structure in bytes
    
        UINT_32             x;               ///< Starting X coordinate, in elements
        UINT_32             y;               ///< Starting Y coordinate, in elements
        UINT_32             slice;           ///< Starting slice index or Z coordinate, in elements
        UINT_32             mipId;           ///< The mip ID in mip chain
        ADDR_EXTENT3D       copyDims;        ///< Size of the region to copy, in elements
    
        void*               pMem;            ///< Pointer to memory to copy
        UINT_64             memRowPitch;     ///< Pitch between rows in bytes
        UINT_64             memSlicePitch;   ///< Pitch between array/depth slices in bytes
    } ADDR3_COPY_MEMSURFACE_REGION;
    
    /**
    ****************************************************************************************************
    *   ADDR3_COPY_MEMSURFACE_INPUT
    *
    *   @brief
    *       Input structure for Addr3CopyMemToSurface and Addr3CopySurfaceToMem
    ****************************************************************************************************
    */
    typedef struct _ADDR3_COPY_MEMSURFACE_INPUT
    {
        UINT_32             size;            ///< Size of this structure in bytes
    
        Addr3SwizzleMode    swizzleMode;     ///< Swizzle mode for Gfx12
        ADDR3_SURFACE_FLAGS flags;           ///< Surface flags
        AddrFormat          format;          ///< Format
        AddrResourceType    resourceType;    ///< Surface type
        UINT_32             bpp;             ///< Bits per pixel
        ADDR_EXTENT3D       unAlignedDims;   ///< Surface original dimensions (of mip0), in pixels
        UINT_32             numMipLevels;    ///< Total mipmap levels
        UINT_32             numSamples;      ///< Number of samples
        UINT_32             pitchInElement;  ///< Pitch in elements (blocks for compressed formats)
        UINT_32             pbXor;           ///< Xor value
    
        void*               pMappedSurface;  ///< Pointer to the image surface, mapped to CPU memory
        BOOL_32             singleSubres;    ///< Pointer is to the base of the subresource, not to the
                                             ///  base of the surface image data. Requires:
                                             ///   - copyDims.depth == 1
                                             ///   - all copy regions target the same mip
                                             ///   - all copy regions target the same slice/depth
    } ADDR3_COPY_MEMSURFACE_INPUT;
    
    /**
    ****************************************************************************************************
    *   Addr3CopyMemToSurface
    *
    *   @brief
    *       Copy an image region from memory to an uncompressed CPU-mapped surface
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr3CopyMemToSurface(
        ADDR_HANDLE                         hLib,
        const ADDR3_COPY_MEMSURFACE_INPUT*  pIn,
        const ADDR3_COPY_MEMSURFACE_REGION* pRegions,
        UINT_32                             regionCount
    );
    
    /**
    ****************************************************************************************************
    *   Addr3CopySurfaceToMem
    *
    *   @brief
    *       Copy an image region from an uncompressed CPU-mapped surface to memory
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr3CopySurfaceToMem(
        ADDR_HANDLE                         hLib,
        const ADDR3_COPY_MEMSURFACE_INPUT*  pIn,
        const ADDR3_COPY_MEMSURFACE_REGION* pRegions,
        UINT_32                             regionCount
    );
    
    /**
    ****************************************************************************************************
    *   ADDR3_COMPUTE_PIPEBANKXOR_INPUT
    *
    *   @brief
    *       Input structure of Addr3ComputePipebankXor
    ****************************************************************************************************
    */
    typedef struct _ADDR3_COMPUTE_PIPEBANKXOR_INPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
        UINT_32             surfIndex;          ///< Input surface index
        Addr3SwizzleMode    swizzleMode;        ///< Surface swizzle mode
    } ADDR3_COMPUTE_PIPEBANKXOR_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR3_COMPUTE_PIPEBANKXOR_OUTPUT
    *
    *   @brief
    *       Output structure of Addr3ComputePipebankXor
    ****************************************************************************************************
    */
    typedef struct _ADDR3_COMPUTE_PIPEBANKXOR_OUTPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
        UINT_32             pipeBankXor;        ///< Pipe bank xor
    } ADDR3_COMPUTE_PIPEBANKXOR_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr3ComputePipeBankXor
    *
    *   @brief
    *       Calculate a valid bank pipe xor value for client to use.
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr3ComputePipeBankXor(
        ADDR_HANDLE                            hLib,
        const ADDR3_COMPUTE_PIPEBANKXOR_INPUT* pIn,
        ADDR3_COMPUTE_PIPEBANKXOR_OUTPUT*      pOut);
    
    /**
    ****************************************************************************************************
    *   ADDR3_COMPUTE_NONBLOCKCOMPRESSEDVIEW_INPUT
    *
    *   @brief
    *       Input structure of Addr3ComputeNonBlockCompressedView
    ****************************************************************************************************
    */
    typedef struct _ADDR3_COMPUTE_NONBLOCKCOMPRESSEDVIEW_INPUT
    {
        UINT_32               size;              ///< Size of this structure in bytes
        ADDR3_SURFACE_FLAGS   flags;             ///< Surface flags
        Addr3SwizzleMode      swizzleMode;       ///< Swizzle Mode for Gfx12
        AddrResourceType      resourceType;      ///< Surface type
        AddrFormat            format;            ///< Surface format
        ADDR_EXTENT3D         unAlignedDims;     ///< Surface original dimensions (of mip0)
        UINT_32               numMipLevels;      ///< Total mipmap levels.
        UINT_32               pipeBankXor;       ///< Combined swizzle used to do bank/pipe rotation
        UINT_32               slice;             ///< Index of slice to view
        UINT_32               mipId;             ///< Id of mip to view
    } ADDR3_COMPUTE_NONBLOCKCOMPRESSEDVIEW_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR3_COMPUTE_NONBLOCKCOMPRESSEDVIEW_OUTPUT
    *
    *   @brief
    *       Output structure of Addr3ComputeNonBlockCompressedView
    ****************************************************************************************************
    */
    typedef struct _ADDR3_COMPUTE_NONBLOCKCOMPRESSEDVIEW_OUTPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
        UINT_64             offset;             ///< Offset from resource base for the view
        UINT_32             pipeBankXor;        ///< Pipe bank xor for the view
        ADDR_EXTENT3D       unAlignedDims;      ///< Mip0 dimens (in element) for the view
        UINT_32             numMipLevels;       ///< Total mipmap levels for the view
        UINT_32             mipId;              ///< Mip ID for the view
    } ADDR3_COMPUTE_NONBLOCKCOMPRESSEDVIEW_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr3ComputeNonBlockCompressedView
    *
    *   @brief
    *       Compute non-block-compressed view for a given mipmap level/slice
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr3ComputeNonBlockCompressedView(
        ADDR_HANDLE                                       hLib,
        const ADDR3_COMPUTE_NONBLOCKCOMPRESSEDVIEW_INPUT* pIn,
        ADDR3_COMPUTE_NONBLOCKCOMPRESSEDVIEW_OUTPUT*      pOut);
    
    /**
    ****************************************************************************************************
    *   ADDR3_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT
    *
    *   @brief
    *       Input structure of Addr3ComputeSubResourceOffsetForSwizzlePattern
    ****************************************************************************************************
    */
    typedef struct _ADDR3_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
        Addr3SwizzleMode    swizzleMode;        ///< Surface swizzle mode
        AddrResourceType    resourceType;       ///< Surface resource type
        UINT_32             pipeBankXor;        ///< Per resource xor
        UINT_32             slice;              ///< Slice id
        UINT_64             sliceSize;          ///< Slice size of a mip chain
        UINT_64             macroBlockOffset;   ///< Macro block offset, returned in ADDR3_MIP_INFO
        UINT_32             mipTailOffset;      ///< Mip tail offset, returned in ADDR3_MIP_INFO
    } ADDR3_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR3_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT
    *
    *   @brief
    *       Output structure of Addr3ComputeSubResourceOffsetForSwizzlePattern
    ****************************************************************************************************
    */
    typedef struct _ADDR3_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
        UINT_64             offset;             ///< offset
    } ADDR3_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr3ComputeSubResourceOffsetForSwizzlePattern
    *
    *   @brief
    *       Calculate sub resource offset to support swizzle pattern.
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr3ComputeSubResourceOffsetForSwizzlePattern(
        ADDR_HANDLE                                                     hLib,
        const ADDR3_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT* pIn,
        ADDR3_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT*      pOut);
    
    /**
    ****************************************************************************************************
    *   ADDR3_COMPUTE_SLICE_PIPEBANKXOR_INPUT
    *
    *   @brief
    *       Input structure of Addr2ComputeSlicePipeBankXor
    ****************************************************************************************************
    */
    typedef struct _ADDR3_COMPUTE_SLICE_PIPEBANKXOR_INPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
        Addr3SwizzleMode    swizzleMode;        ///< Surface swizzle mode
        AddrResourceType    resourceType;       ///< Surface resource type
        UINT_32             bpe;                ///< bits per element (e.g. block size for BCn format)
        UINT_32             basePipeBankXor;    ///< Base pipe bank xor
        UINT_32             slice;              ///< Slice id
        UINT_32             numSamples;         ///< Number of samples
    } ADDR3_COMPUTE_SLICE_PIPEBANKXOR_INPUT;
    
    /**
    ****************************************************************************************************
    *   ADDR3_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT
    *
    *   @brief
    *       Output structure of Addr3ComputeSlicePipeBankXor
    ****************************************************************************************************
    */
    typedef struct _ADDR3_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT
    {
        UINT_32             size;               ///< Size of this structure in bytes
        UINT_32             pipeBankXor;        ///< Pipe bank xor
    } ADDR3_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT;
    
    /**
    ****************************************************************************************************
    *   Addr3ComputeSlicePipeBankXor
    *
    *   @brief
    *       Calculate slice pipe bank xor value based on base pipe bank xor and slice id.
    ****************************************************************************************************
    */
    ADDR_E_RETURNCODE ADDR_API Addr3ComputeSlicePipeBankXor(
        ADDR_HANDLE                                  hLib,
        const ADDR3_COMPUTE_SLICE_PIPEBANKXOR_INPUT* pIn,
        ADDR3_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT*      pOut);
    
    #if defined(__cplusplus)
    }
    #endif
    
    #endif // __ADDR_INTERFACE_H__