amdgpu/addrlib: Let Kaveri go general stereo right eye offset padding path
authorXavi Zhang <xavi.zhang@amd.com>
Fri, 1 Aug 2014 06:18:00 +0000 (02:18 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 30 Mar 2017 12:44:33 +0000 (14:44 +0200)
Kaveri (2-pipe) macro tiling mode table was initially set to all
4-aspect-ratio so the swizzling path did not work for it and then we
chose to pad the offset. We now discover the root cause is that if
ratio > 2, the swizzling path does not work. So we can safely use the
same path for Kaveri.

src/amd/addrlib/r800/ciaddrlib.cpp
src/amd/addrlib/r800/ciaddrlib.h
src/amd/addrlib/r800/egbaddrlib.cpp
src/amd/addrlib/r800/egbaddrlib.h

index 1024ff24549fba23c94a027629f6e1c85f0a7122..5e5110a7016f2df283806378a18505751d6ea292 100644 (file)
@@ -1612,36 +1612,6 @@ VOID CiAddrLib::HwlComputeTileDataWidthAndHeightLinear(
     *pMacroHeight   = numTiles * MicroTileHeight;
 }
 
-/**
-***************************************************************************************************
-*   CiAddrLib::HwlStereoCheckRightOffsetPadding
-*
-*   @brief
-*       check if the height needs extra padding for stereo right eye offset, to avoid swizzling
-*
-*   @return
-*       TRUE is the extra padding is needed
-*
-*   @note
-*       Kalindi (Kabini) is the only one that needs this padding as there is a uncertain
-*       possible HW issue where the right eye displays incorrectly with some type of swizzles, if
-*       the right eye offset is not 64KB aligned - EPR#366461
-*       Other Kaveri APUs also need the padding according to DXX team's report otherwise
-*       corruption observed. - EPR#374788
-***************************************************************************************************
-*/
-BOOL_32 CiAddrLib::HwlStereoCheckRightOffsetPadding() const
-{
-    BOOL_32 bNeedPadding = FALSE;
-
-    if (m_settings.isKaveri)
-    {
-        bNeedPadding = TRUE;
-    }
-
-    return bNeedPadding;
-}
-
 /**
 ***************************************************************************************************
 *   CiAddrLib::HwlComputeMetadataNibbleAddress
index 05e9eda2dbb1a46897c200376d8ba882cb2270e8..4862babb483b7a3c2a2fc2fad70b0a90375e8438 100644 (file)
@@ -146,8 +146,6 @@ protected:
         AddrTileMode* pTileMode,
         AddrTileType* pTileType) const;
 
-    virtual BOOL_32 HwlStereoCheckRightOffsetPadding() const;
-
     virtual ADDR_E_RETURNCODE HwlComputeDccInfo(
         const ADDR_COMPUTE_DCCINFO_INPUT* pIn,
         ADDR_COMPUTE_DCCINFO_OUTPUT* pOut) const;
index 5d80906aea313aa42d9ec86504005c26a241bef0..2085dc57cb048829a4ee0f9df2d36b5fbc5bed3d 100644 (file)
@@ -525,24 +525,14 @@ BOOL_32 EgBasedAddrLib::ComputeSurfaceInfoMacroTiled(
                       &expNumSlices, microTileThickness);
 
         if (pIn->flags.qbStereo &&
-            (pOut->pStereoInfo != NULL) &&
-            HwlStereoCheckRightOffsetPadding())
+            (pOut->pStereoInfo != NULL))
         {
-            // Eye height's bank bits are different from y == 0?
-            // Since 3D rendering treats right eye buffer starting from y == "eye height" while
-            // display engine treats it to be 0, so the bank bits may be different, we pad
-            // more in height to make sure y == "eye height" has the same bank bits as y == 0.
-            UINT_32 checkMask = pOut->pTileInfo->banks - 1;
-            UINT_32 bankBits = 0;
-            do
-            {
-                bankBits = (paddedHeight / 8 / pOut->pTileInfo->bankHeight) & checkMask;
+            UINT_32 stereoHeightAlign = HwlStereoCheckRightOffsetPadding(pOut->pTileInfo);
 
-                if (bankBits)
-                {
-                   paddedHeight += pOut->heightAlign;
-                }
-            } while (bankBits);
+            if (stereoHeightAlign != 0)
+            {
+                paddedHeight = PowTwoAlign(paddedHeight, stereoHeightAlign);
+            }
         }
 
         //
@@ -4591,3 +4581,37 @@ UINT_64 EgBasedAddrLib::HwlGetSizeAdjustmentMicroTiled(
     return logicalSliceSize;
 }
 
+/**
+***************************************************************************************************
+*   EgBasedAddrLib::HwlStereoCheckRightOffsetPadding
+*
+*   @brief
+*       check if the height needs extra padding for stereo right eye offset, to avoid swizzling
+*
+*   @return
+*       TRUE is the extra padding is needed
+*
+***************************************************************************************************
+*/
+UINT_32 EgBasedAddrLib::HwlStereoCheckRightOffsetPadding(
+    ADDR_TILEINFO* pTileInfo    ///< Tiling info
+    ) const
+{
+    UINT_32 stereoHeightAlign = 0;
+
+    if (pTileInfo->macroAspectRatio > 2)
+    {
+        // Since 3D rendering treats right eye surface starting from y == "eye height" while
+        // display engine treats it to be 0, so the bank bits may be different.
+        // Additional padding in height is required to make sure it's possible
+        // to achieve synonym by adjusting bank swizzle of right eye surface.
+
+        static const UINT_32 StereoAspectRatio = 2;
+        stereoHeightAlign = pTileInfo->banks *
+            pTileInfo->bankHeight *
+            MicroTileHeight /
+            StereoAspectRatio;
+    }
+
+    return stereoHeightAlign;
+}
index 25e38964be0dbe092eae746c8039853efba4bc37..ca1d07d062f884600bc5906896caa3519464c5ef 100644 (file)
@@ -224,12 +224,7 @@ protected:
     {
     }
 
-    /// Virtual function to check if the height needs extra padding
-    /// for stereo right eye offset, to avoid bank pipe swizzle
-    virtual BOOL_32 HwlStereoCheckRightOffsetPadding() const
-    {
-        return FALSE;
-    }
+    virtual UINT_32 HwlStereoCheckRightOffsetPadding(ADDR_TILEINFO* pTileInfo) const;
 
     virtual BOOL_32 HwlReduceBankWidthHeight(
         UINT_32 tileSize, UINT_32 bpp, ADDR_SURFACE_FLAGS flags, UINT_32 numSamples,