/* * Copyright © 2017 Advanced Micro Devices, Inc. * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sub license, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * USE OR OTHER DEALINGS IN THE SOFTWARE. * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial portions * of the Software. */ /** ************************************************************************************************************************ * @file gfx9addrlib.h * @brief Contgfx9ns the Gfx9Lib class definition. ************************************************************************************************************************ */ #ifndef __GFX9_ADDR_LIB_H__ #define __GFX9_ADDR_LIB_H__ #include "addrlib2.h" #include "coord.h" namespace Addr { namespace V2 { /** ************************************************************************************************************************ * @brief GFX9 specific settings structure. ************************************************************************************************************************ */ struct Gfx9ChipSettings { struct { // Asic/Generation name UINT_32 isArcticIsland : 1; UINT_32 isVega10 : 1; UINT_32 isRaven : 1; UINT_32 reserved0 : 29; // Display engine IP version name UINT_32 isDce12 : 1; UINT_32 isDcn1 : 1; UINT_32 reserved1 : 29; // Misc configuration bits UINT_32 metaBaseAlignFix : 1; UINT_32 depthPipeXorDisable : 1; UINT_32 htileAlignFix : 1; UINT_32 applyAliasFix : 1; UINT_32 reserved2 : 28; }; }; /** ************************************************************************************************************************ * @brief GFX9 data surface type. ************************************************************************************************************************ */ enum Gfx9DataType { Gfx9DataColor, Gfx9DataDepthStencil, Gfx9DataFmask }; /** ************************************************************************************************************************ * @brief GFX9 meta equation parameters ************************************************************************************************************************ */ struct MetaEqParams { UINT_32 maxMip; UINT_32 elementBytesLog2; UINT_32 numSamplesLog2; ADDR2_META_FLAGS metaFlag; Gfx9DataType dataSurfaceType; AddrSwizzleMode swizzleMode; AddrResourceType resourceType; UINT_32 metaBlkWidthLog2; UINT_32 metaBlkHeightLog2; UINT_32 metaBlkDepthLog2; UINT_32 compBlkWidthLog2; UINT_32 compBlkHeightLog2; UINT_32 compBlkDepthLog2; }; /** ************************************************************************************************************************ * @brief This class is the GFX9 specific address library * function set. ************************************************************************************************************************ */ class Gfx9Lib : public Lib { public: /// Creates Gfx9Lib object static Addr::Lib* CreateObj(const Client* pClient) { VOID* pMem = Object::ClientAlloc(sizeof(Gfx9Lib), pClient); return (pMem != NULL) ? new (pMem) Gfx9Lib(pClient) : NULL; } virtual BOOL_32 IsValidDisplaySwizzleMode( const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn) const; protected: Gfx9Lib(const Client* pClient); virtual ~Gfx9Lib(); virtual BOOL_32 HwlIsStandardSwizzle( AddrResourceType resourceType, AddrSwizzleMode swizzleMode) const { return m_swizzleModeTable[swizzleMode].isStd || (IsTex3d(resourceType) && m_swizzleModeTable[swizzleMode].isDisp); } virtual BOOL_32 HwlIsDisplaySwizzle( AddrResourceType resourceType, AddrSwizzleMode swizzleMode) const { return IsTex2d(resourceType) && m_swizzleModeTable[swizzleMode].isDisp; } virtual BOOL_32 HwlIsThin( AddrResourceType resourceType, AddrSwizzleMode swizzleMode) const { return ((IsTex2d(resourceType) == TRUE) || ((IsTex3d(resourceType) == TRUE) && (m_swizzleModeTable[swizzleMode].isZ == FALSE) && (m_swizzleModeTable[swizzleMode].isStd == FALSE))); } virtual BOOL_32 HwlIsThick( AddrResourceType resourceType, AddrSwizzleMode swizzleMode) const { return (IsTex3d(resourceType) && (m_swizzleModeTable[swizzleMode].isZ || m_swizzleModeTable[swizzleMode].isStd)); } virtual ADDR_E_RETURNCODE HwlComputeHtileInfo( const ADDR2_COMPUTE_HTILE_INFO_INPUT* pIn, ADDR2_COMPUTE_HTILE_INFO_OUTPUT* pOut) const; virtual ADDR_E_RETURNCODE HwlComputeCmaskInfo( const ADDR2_COMPUTE_CMASK_INFO_INPUT* pIn, ADDR2_COMPUTE_CMASK_INFO_OUTPUT* pOut) const; virtual ADDR_E_RETURNCODE HwlComputeDccInfo( const ADDR2_COMPUTE_DCCINFO_INPUT* pIn, ADDR2_COMPUTE_DCCINFO_OUTPUT* pOut) const; virtual ADDR_E_RETURNCODE HwlComputeCmaskAddrFromCoord( const ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_INPUT* pIn, ADDR2_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT* pOut); virtual ADDR_E_RETURNCODE HwlComputeHtileAddrFromCoord( const ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT* pIn, ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT* pOut); virtual ADDR_E_RETURNCODE HwlComputeHtileCoordFromAddr( const ADDR2_COMPUTE_HTILE_COORDFROMADDR_INPUT* pIn, ADDR2_COMPUTE_HTILE_COORDFROMADDR_OUTPUT* pOut); virtual ADDR_E_RETURNCODE HwlComputeDccAddrFromCoord( const ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT* pIn, ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT* pOut); virtual UINT_32 HwlGetEquationIndex( const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn, ADDR2_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const; virtual ADDR_E_RETURNCODE HwlComputeBlock256Equation( AddrResourceType rsrcType, AddrSwizzleMode swMode, UINT_32 elementBytesLog2, ADDR_EQUATION* pEquation) const; virtual ADDR_E_RETURNCODE HwlComputeThinEquation( AddrResourceType rsrcType, AddrSwizzleMode swMode, UINT_32 elementBytesLog2, ADDR_EQUATION* pEquation) const; virtual ADDR_E_RETURNCODE HwlComputeThickEquation( AddrResourceType rsrcType, AddrSwizzleMode swMode, UINT_32 elementBytesLog2, ADDR_EQUATION* pEquation) const; // Get equation table pointer and number of equations virtual UINT_32 HwlGetEquationTableInfo(const ADDR_EQUATION** ppEquationTable) const { *ppEquationTable = m_equationTable; return m_numEquations; } virtual BOOL_32 IsEquationSupported( AddrResourceType rsrcType, AddrSwizzleMode swMode, UINT_32 elementBytesLog2) const; virtual UINT_32 HwlComputeSurfaceBaseAlign(AddrSwizzleMode swizzleMode) const { UINT_32 baseAlign; if (IsXor(swizzleMode)) { baseAlign = GetBlockSize(swizzleMode); } else { baseAlign = 256; } return baseAlign; } virtual ADDR_E_RETURNCODE HwlComputePipeBankXor( const ADDR2_COMPUTE_PIPEBANKXOR_INPUT* pIn, ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT* pOut) const; virtual ADDR_E_RETURNCODE HwlComputeSlicePipeBankXor( const ADDR2_COMPUTE_SLICE_PIPEBANKXOR_INPUT* pIn, ADDR2_COMPUTE_SLICE_PIPEBANKXOR_OUTPUT* pOut) const; virtual ADDR_E_RETURNCODE HwlComputeSubResourceOffsetForSwizzlePattern( const ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_INPUT* pIn, ADDR2_COMPUTE_SUBRESOURCE_OFFSET_FORSWIZZLEPATTERN_OUTPUT* pOut) const; virtual ADDR_E_RETURNCODE HwlGetPreferredSurfaceSetting( const ADDR2_GET_PREFERRED_SURF_SETTING_INPUT* pIn, ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT* pOut) const; virtual ADDR_E_RETURNCODE HwlComputeSurfaceInfoSanityCheck( const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn) const; virtual ADDR_E_RETURNCODE HwlComputeSurfaceInfoTiled( const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn, ADDR2_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const; virtual ADDR_E_RETURNCODE HwlComputeSurfaceInfoLinear( const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn, ADDR2_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const; virtual ADDR_E_RETURNCODE HwlComputeSurfaceAddrFromCoordTiled( const ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT* pIn, ADDR2_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT* pOut) const; // Initialize equation table VOID InitEquationTable(); ADDR_E_RETURNCODE ComputeStereoInfo( const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn, ADDR2_COMPUTE_SURFACE_INFO_OUTPUT* pOut, UINT_32* pHeightAlign) const; UINT_32 GetMipChainInfo( AddrResourceType resourceType, AddrSwizzleMode swizzleMode, UINT_32 bpp, UINT_32 mip0Width, UINT_32 mip0Height, UINT_32 mip0Depth, UINT_32 blockWidth, UINT_32 blockHeight, UINT_32 blockDepth, UINT_32 numMipLevel, ADDR2_MIP_INFO* pMipInfo) const; VOID GetMetaMiptailInfo( ADDR2_META_MIP_INFO* pInfo, Dim3d mipCoord, UINT_32 numMipInTail, Dim3d* pMetaBlkDim) const; Dim3d GetMipStartPos( AddrResourceType resourceType, AddrSwizzleMode swizzleMode, UINT_32 width, UINT_32 height, UINT_32 depth, UINT_32 blockWidth, UINT_32 blockHeight, UINT_32 blockDepth, UINT_32 mipId, UINT_32 log2ElementBytes, UINT_32* pMipTailBytesOffset) const; AddrMajorMode GetMajorMode( AddrResourceType resourceType, AddrSwizzleMode swizzleMode, UINT_32 mip0WidthInBlk, UINT_32 mip0HeightInBlk, UINT_32 mip0DepthInBlk) const { BOOL_32 yMajor = (mip0WidthInBlk < mip0HeightInBlk); BOOL_32 xMajor = (yMajor == FALSE); if (IsThick(resourceType, swizzleMode)) { yMajor = yMajor && (mip0HeightInBlk >= mip0DepthInBlk); xMajor = xMajor && (mip0WidthInBlk >= mip0DepthInBlk); } AddrMajorMode majorMode; if (xMajor) { majorMode = ADDR_MAJOR_X; } else if (yMajor) { majorMode = ADDR_MAJOR_Y; } else { majorMode = ADDR_MAJOR_Z; } return majorMode; } Dim3d GetDccCompressBlk( AddrResourceType resourceType, AddrSwizzleMode swizzleMode, UINT_32 bpp) const { UINT_32 index = Log2(bpp >> 3); Dim3d compressBlkDim; if (IsThin(resourceType, swizzleMode)) { compressBlkDim.w = Block256_2d[index].w; compressBlkDim.h = Block256_2d[index].h; compressBlkDim.d = 1; } else if (IsStandardSwizzle(resourceType, swizzleMode)) { compressBlkDim = Block256_3dS[index]; } else { compressBlkDim = Block256_3dZ[index]; } return compressBlkDim; } static const UINT_32 MaxSeLog2 = 3; static const UINT_32 MaxRbPerSeLog2 = 2; static const Dim3d Block256_3dS[MaxNumOfBpp]; static const Dim3d Block256_3dZ[MaxNumOfBpp]; static const UINT_32 MipTailOffset256B[]; static const SwizzleModeFlags SwizzleModeTable[ADDR_SW_MAX_TYPE]; // Max number of swizzle mode supported for equation static const UINT_32 MaxSwMode = 32; // Max number of resource type (2D/3D) supported for equation static const UINT_32 MaxRsrcType = 2; // Max number of bpp (8bpp/16bpp/32bpp/64bpp/128bpp) static const UINT_32 MaxElementBytesLog2 = 5; // Almost all swizzle mode + resource type support equation static const UINT_32 EquationTableSize = MaxElementBytesLog2 * MaxSwMode * MaxRsrcType; // Equation table ADDR_EQUATION m_equationTable[EquationTableSize]; // Number of equation entries in the table UINT_32 m_numEquations; // Equation lookup table according to bpp and tile index UINT_32 m_equationLookupTable[MaxRsrcType][MaxSwMode][MaxElementBytesLog2]; static const UINT_32 MaxCachedMetaEq = 2; private: virtual ADDR_E_RETURNCODE HwlGetMaxAlignments( ADDR_GET_MAX_ALIGNMENTS_OUTPUT* pOut) const; virtual BOOL_32 HwlInitGlobalParams( const ADDR_CREATE_INPUT* pCreateIn); VOID GetRbEquation(CoordEq* pRbEq, UINT_32 rbPerSeLog2, UINT_32 seLog2) const; VOID GetDataEquation(CoordEq* pDataEq, Gfx9DataType dataSurfaceType, AddrSwizzleMode swizzleMode, AddrResourceType resourceType, UINT_32 elementBytesLog2, UINT_32 numSamplesLog2) const; VOID GetPipeEquation(CoordEq* pPipeEq, CoordEq* pDataEq, UINT_32 pipeInterleaveLog2, UINT_32 numPipesLog2, UINT_32 numSamplesLog2, Gfx9DataType dataSurfaceType, AddrSwizzleMode swizzleMode, AddrResourceType resourceType) const; VOID GenMetaEquation(CoordEq* pMetaEq, UINT_32 maxMip, UINT_32 elementBytesLog2, UINT_32 numSamplesLog2, ADDR2_META_FLAGS metaFlag, Gfx9DataType dataSurfaceType, AddrSwizzleMode swizzleMode, AddrResourceType resourceType, UINT_32 metaBlkWidthLog2, UINT_32 metaBlkHeightLog2, UINT_32 metaBlkDepthLog2, UINT_32 compBlkWidthLog2, UINT_32 compBlkHeightLog2, UINT_32 compBlkDepthLog2) const; const CoordEq* GetMetaEquation(const MetaEqParams& metaEqParams); virtual ChipFamily HwlConvertChipFamily(UINT_32 uChipFamily, UINT_32 uChipRevision); VOID GetMetaMipInfo(UINT_32 numMipLevels, Dim3d* pMetaBlkDim, BOOL_32 dataThick, ADDR2_META_MIP_INFO* pInfo, UINT_32 mip0Width, UINT_32 mip0Height, UINT_32 mip0Depth, UINT_32* pNumMetaBlkX, UINT_32* pNumMetaBlkY, UINT_32* pNumMetaBlkZ) const; ADDR_E_RETURNCODE ComputeSurfaceLinearPadding( const ADDR2_COMPUTE_SURFACE_INFO_INPUT* pIn, UINT_32* pMipmap0PaddedWidth, UINT_32* pSlice0PaddedHeight, ADDR2_MIP_INFO* pMipInfo = NULL) const; Gfx9ChipSettings m_settings; CoordEq m_cachedMetaEq[MaxCachedMetaEq]; MetaEqParams m_cachedMetaEqKey[MaxCachedMetaEq]; UINT_32 m_metaEqOverrideIndex; }; } // V2 } // Addr #endif