From 199912a9bc7621baa9f1cd185194df133fe338e6 Mon Sep 17 00:00:00 2001 From: Xavi Zhang Date: Fri, 17 Apr 2015 03:22:34 -0400 Subject: [PATCH] amdgpu/addrlib: Add a flag to skip calculate indices This is useful for debugging and special cases for stencil surfaces do not require texture fetch compatible. --- src/amd/addrlib/addrinterface.h | 3 ++- src/amd/addrlib/r800/egbaddrlib.cpp | 30 +++++++++++++++++------------ src/amd/addrlib/r800/siaddrlib.cpp | 2 +- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/amd/addrlib/addrinterface.h b/src/amd/addrlib/addrinterface.h index 95b187fbebc..3604fb11ce5 100644 --- a/src/amd/addrlib/addrinterface.h +++ b/src/amd/addrlib/addrinterface.h @@ -513,7 +513,8 @@ typedef union _ADDR_SURFACE_FLAGS /// 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 reserved : 8; ///< Reserved bits + UINT_32 skipIndicesOutput : 1; ///< Skipping indices in output. + UINT_32 reserved : 7; ///< Reserved bits }; UINT_32 value; diff --git a/src/amd/addrlib/r800/egbaddrlib.cpp b/src/amd/addrlib/r800/egbaddrlib.cpp index 854d5725df2..0c1ddca10a3 100644 --- a/src/amd/addrlib/r800/egbaddrlib.cpp +++ b/src/amd/addrlib/r800/egbaddrlib.cpp @@ -4486,19 +4486,25 @@ ADDR_E_RETURNCODE EgBasedAddrLib::HwlComputeSurfaceInfo( retCode = ADDR_INVALIDPARAMS; } - // Returns an index - pOut->tileIndex = HwlPostCheckTileIndex(pOut->pTileInfo, - pOut->tileMode, - pOut->tileType, - pOut->tileIndex); - - if (IsMacroTiled(pOut->tileMode) && (pOut->macroModeIndex == TileIndexInvalid)) + // In case client uses tile info as input and would like to calculate a correct size and + // alignment together with tile info as output when the tile info is not suppose to have any + // matching indices in tile mode tables. + if (pIn->flags.skipIndicesOutput == FALSE) { - pOut->macroModeIndex = HwlComputeMacroModeIndex(pOut->tileIndex, - pIn->flags, - pIn->bpp, - pIn->numSamples, - pOut->pTileInfo); + // Returns an index + pOut->tileIndex = HwlPostCheckTileIndex(pOut->pTileInfo, + pOut->tileMode, + pOut->tileType, + pOut->tileIndex); + + if (IsMacroTiled(pOut->tileMode) && (pOut->macroModeIndex == TileIndexInvalid)) + { + pOut->macroModeIndex = HwlComputeMacroModeIndex(pOut->tileIndex, + pIn->flags, + pIn->bpp, + pIn->numSamples, + pOut->pTileInfo); + } } // Resets pTileInfo to NULL if the internal tile info is used diff --git a/src/amd/addrlib/r800/siaddrlib.cpp b/src/amd/addrlib/r800/siaddrlib.cpp index 686bb7fc343..4822d77a4c2 100644 --- a/src/amd/addrlib/r800/siaddrlib.cpp +++ b/src/amd/addrlib/r800/siaddrlib.cpp @@ -3274,7 +3274,7 @@ VOID SiAddrLib::InitEquationTable() UINT_32 bpp = 1 << (log2ElementBytes + 3); // Loop all possible tile index - for (INT_32 tileIndex = 0; tileIndex < m_noOfEntries; tileIndex++) + for (INT_32 tileIndex = 0; tileIndex < static_cast(m_noOfEntries); tileIndex++) { UINT_32 equationIndex = ADDR_INVALID_EQUATION_INDEX; -- 2.30.2