diff options
Diffstat (limited to 'src/amd/addrlib/src/core/addrlib2.cpp')
-rw-r--r-- | src/amd/addrlib/src/core/addrlib2.cpp | 197 |
1 files changed, 82 insertions, 115 deletions
diff --git a/src/amd/addrlib/src/core/addrlib2.cpp b/src/amd/addrlib/src/core/addrlib2.cpp index 8bea9ecf91e..11f1ba40bdc 100644 --- a/src/amd/addrlib/src/core/addrlib2.cpp +++ b/src/amd/addrlib/src/core/addrlib2.cpp @@ -1,28 +1,11 @@ /* - * Copyright © 2007-2019 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. - */ +************************************************************************************************************************ +* +* Copyright (C) 2007-2022 Advanced Micro Devices, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +* +***********************************************************************************************************************/ + /** ************************************************************************************************************************ @@ -132,13 +115,15 @@ Lib* Lib::GetLib( ADDR_HANDLE hLib) ///< [in] handle of ADDR_HANDLE { Addr::Lib* pAddrLib = Addr::Lib::GetLib(hLib); + if ((pAddrLib != NULL) && (pAddrLib->GetChipFamily() <= ADDR_CHIP_FAMILY_VI)) { - // only valid and GFX9+ ASIC can use AddrLib2 function. + // only GFX9+ ASIC can use AddrLib2 function. ADDR_ASSERT_ALWAYS(); hLib = NULL; } + return static_cast<Lib*>(hLib); } @@ -303,6 +288,12 @@ ADDR_E_RETURNCODE Lib::ComputeSurfaceInfo( if (localIn.flags.needEquation && (Log2(localIn.numFrags) == 0)) { pOut->equationIndex = GetEquationIndex(&localIn, pOut); + if ((localIn.flags.allowExtEquation == 0) && + (pOut->equationIndex != ADDR_INVALID_EQUATION_INDEX) && + (m_equationTable[pOut->equationIndex].numBitComponents > ADDR_MAX_LEGACY_EQUATION_COMP)) + { + pOut->equationIndex = ADDR_INVALID_EQUATION_INDEX; + } } if (localIn.flags.qbStereo) @@ -1178,8 +1169,10 @@ ADDR_E_RETURNCODE Lib::ComputeSurfaceAddrFromCoordLinear( ADDR2_COMPUTE_SURFACE_INFO_INPUT localIn = {0}; ADDR2_COMPUTE_SURFACE_INFO_OUTPUT localOut = {0}; ADDR2_MIP_INFO mipInfo[MaxMipLevels]; + ADDR_ASSERT(pIn->numMipLevels <= MaxMipLevels); localIn.bpp = pIn->bpp; + localIn.swizzleMode = pIn->swizzleMode; localIn.flags = pIn->flags; localIn.width = Max(pIn->unalignedWidth, 1u); localIn.height = Max(pIn->unalignedHeight, 1u); @@ -1269,6 +1262,7 @@ ADDR_E_RETURNCODE Lib::ComputeSurfaceCoordFromAddrLinear( ADDR2_COMPUTE_SURFACE_INFO_INPUT localIn = {0}; ADDR2_COMPUTE_SURFACE_INFO_OUTPUT localOut = {0}; localIn.bpp = pIn->bpp; + localIn.swizzleMode = pIn->swizzleMode; localIn.flags = pIn->flags; localIn.width = Max(pIn->unalignedWidth, 1u); localIn.height = Max(pIn->unalignedHeight, 1u); @@ -1855,6 +1849,61 @@ ADDR_E_RETURNCODE Lib::Addr2GetPreferredSurfaceSetting( /** ************************************************************************************************************************ +* Lib::GetPossibleSwizzleModes +* +* @brief +* Returns a list of swizzle modes that are valid from the hardware's perspective for the client to choose from +* +* @return +* ADDR_E_RETURNCODE +************************************************************************************************************************ +*/ +ADDR_E_RETURNCODE Lib::GetPossibleSwizzleModes( + const ADDR2_GET_PREFERRED_SURF_SETTING_INPUT* pIn, + ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT* pOut) const +{ + return HwlGetPossibleSwizzleModes(pIn, pOut); +} + +/** +************************************************************************************************************************ +* Lib::GetAllowedBlockSet +* +* @brief +* Returns the set of allowed block sizes given the allowed swizzle modes and resource type +* +* @return +* ADDR_E_RETURNCODE +************************************************************************************************************************ +*/ +ADDR_E_RETURNCODE Lib::GetAllowedBlockSet( + ADDR2_SWMODE_SET allowedSwModeSet, + AddrResourceType rsrcType, + ADDR2_BLOCK_SET* pAllowedBlockSet) const +{ + return HwlGetAllowedBlockSet(allowedSwModeSet, rsrcType, pAllowedBlockSet); +} + +/** +************************************************************************************************************************ +* Lib::GetAllowedSwSet +* +* @brief +* Returns the set of allowed swizzle types given the allowed swizzle modes +* +* @return +* ADDR_E_RETURNCODE +************************************************************************************************************************ +*/ +ADDR_E_RETURNCODE Lib::GetAllowedSwSet( + ADDR2_SWMODE_SET allowedSwModeSet, + ADDR2_SWTYPE_SET* pAllowedSwSet) const +{ + return HwlGetAllowedSwSet(allowedSwModeSet, pAllowedSwSet); +} + +/** +************************************************************************************************************************ * Lib::ComputeBlock256Equation * * @brief @@ -2001,7 +2050,8 @@ VOID Lib::ComputeQbStereoInfo( VOID Lib::FilterInvalidEqSwizzleMode( ADDR2_SWMODE_SET& allowedSwModeSet, AddrResourceType resourceType, - UINT_32 elemLog2 + UINT_32 elemLog2, + UINT_32 maxComponents ) const { if (resourceType != ADDR_RSRC_TEX_1D) @@ -2014,7 +2064,12 @@ VOID Lib::FilterInvalidEqSwizzleMode( { if (validSwModeSet & 1) { - if (m_equationLookupTable[rsrcTypeIdx][swModeIdx][elemLog2] == ADDR_INVALID_EQUATION_INDEX) + UINT_32 equation = m_equationLookupTable[rsrcTypeIdx][swModeIdx][elemLog2]; + if (equation == ADDR_INVALID_EQUATION_INDEX) + { + allowedSwModeSetVal &= ~(1u << swModeIdx); + } + else if (m_equationTable[equation].numBitComponents > maxComponents) { allowedSwModeSetVal &= ~(1u << swModeIdx); } @@ -2031,94 +2086,6 @@ VOID Lib::FilterInvalidEqSwizzleMode( } } -/** -************************************************************************************************************************ -* Lib::IsBlockTypeAvaiable -* -* @brief -* Determine whether a block type is allowed in a given blockSet -* -* @return -* N/A -************************************************************************************************************************ -*/ -BOOL_32 Lib::IsBlockTypeAvaiable( - ADDR2_BLOCK_SET blockSet, - AddrBlockType blockType) -{ - BOOL_32 avail; - - if (blockType == AddrBlockLinear) - { - avail = blockSet.linear ? TRUE : FALSE; - } - else - { - avail = blockSet.value & (1 << (static_cast<UINT_32>(blockType) - 1)) ? TRUE : FALSE; - } - - return avail; -} - -/** -************************************************************************************************************************ -* Lib::BlockTypeWithinMemoryBudget -* -* @brief -* Determine whether a new block type is acceptible based on memory waste ratio -* -* @return -* N/A -************************************************************************************************************************ -*/ -BOOL_32 Lib::BlockTypeWithinMemoryBudget( - UINT_64 minSize, - UINT_64 newBlockTypeSize, - UINT_32 ratioLow, - UINT_32 ratioHi, - DOUBLE memoryBudget, - BOOL_32 newBlockTypeBigger) -{ - BOOL_32 accept = FALSE; - - if (memoryBudget >= 1.0) - { - if (newBlockTypeBigger) - { - if ((static_cast<DOUBLE>(newBlockTypeSize) / minSize) <= memoryBudget) - { - accept = TRUE; - } - } - else - { - if ((static_cast<DOUBLE>(minSize) / newBlockTypeSize) > memoryBudget) - { - accept = TRUE; - } - } - } - else - { - if (newBlockTypeBigger) - { - if ((newBlockTypeSize * ratioHi) <= (minSize * ratioLow)) - { - accept = TRUE; - } - } - else - { - if ((newBlockTypeSize * ratioLow) < (minSize * ratioHi)) - { - accept = TRUE; - } - } - } - - return accept; -} - #if DEBUG /** ************************************************************************************************************************ |