amdgpu/addrlib: Disable tcComaptible when depth surface is not macro tiled
authorRoy Zhan <roy.zhan@amd.com>
Tue, 9 Jun 2015 08:46:59 +0000 (04:46 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 30 Mar 2017 12:44:33 +0000 (14:44 +0200)
Experiment show 1D tiling + TcCompatible cannot work together.

src/amd/addrlib/r800/ciaddrlib.cpp

index 3322d952165b1f9ab8e19b2fcd2695c804454cdb..f88741e84d1f62e5d9e525a466ecfffc4c70163c 100644 (file)
@@ -1317,30 +1317,33 @@ VOID CiAddrLib::HwlSetupTileInfo(
         *pTileInfo = m_tileTable[8].info;
     }
 
-    // Turn off tcCompatible for color surface if tileSplit happens. Depth/stencil is
-    // handled at tileIndex selecting time.
-    if (pOut->tcCompatible && (inTileType != ADDR_DEPTH_SAMPLE_ORDER))
+    if (pOut->tcCompatible)
     {
         if (IsMacroTiled(tileMode))
         {
-            INT_32 tileIndex = pOut->tileIndex;
-
-            if ((tileIndex == TileIndexInvalid) && (IsTileInfoAllZero(pTileInfo) == FALSE))
+            if (inTileType != ADDR_DEPTH_SAMPLE_ORDER)
             {
-                tileIndex = HwlPostCheckTileIndex(pTileInfo, tileMode, inTileType, tileIndex);
-            }
+                // Turn off tcCompatible for color surface if tileSplit happens. Depth/stencil
+                // tileSplit case was handled at tileIndex selecting time.
+                INT_32 tileIndex = pOut->tileIndex;
 
-            if (tileIndex != TileIndexInvalid)
-            {
-                ADDR_ASSERT(static_cast<UINT_32>(tileIndex) < TileTableSize);
-                // Non-depth entries store a split factor
-                UINT_32 sampleSplit = m_tileTable[tileIndex].info.tileSplitBytes;
-                UINT_32 tileBytes1x = BITS_TO_BYTES(bpp * MicroTilePixels * thickness);
-                UINT_32 colorTileSplit = Max(256u, sampleSplit * tileBytes1x);
+                if ((tileIndex == TileIndexInvalid) && (IsTileInfoAllZero(pTileInfo) == FALSE))
+                {
+                    tileIndex = HwlPostCheckTileIndex(pTileInfo, tileMode, inTileType, tileIndex);
+                }
 
-                if (m_rowSize < colorTileSplit)
+                if (tileIndex != TileIndexInvalid)
                 {
-                    pOut->tcCompatible = FALSE;
+                    ADDR_ASSERT(static_cast<UINT_32>(tileIndex) < TileTableSize);
+                    // Non-depth entries store a split factor
+                    UINT_32 sampleSplit = m_tileTable[tileIndex].info.tileSplitBytes;
+                    UINT_32 tileBytes1x = BITS_TO_BYTES(bpp * MicroTilePixels * thickness);
+                    UINT_32 colorTileSplit = Max(256u, sampleSplit * tileBytes1x);
+
+                    if (m_rowSize < colorTileSplit)
+                    {
+                        pOut->tcCompatible = FALSE;
+                    }
                 }
             }
         }