summaryrefslogtreecommitdiff
path: root/src/amd/addrlib/src/core/addrlib2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/amd/addrlib/src/core/addrlib2.cpp')
-rw-r--r--src/amd/addrlib/src/core/addrlib2.cpp197
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
/**
************************************************************************************************************************