[Mesa-dev] [PATCH 052/140] amd/addrlib: Apply input pitch after internal pitch aligning

Marek Olšák maraeo at gmail.com
Mon Mar 20 22:43:02 UTC 2017


From: Frans Gu <frans.gu at amd.com>

---
 src/amd/addrlib/r800/egbaddrlib.cpp | 45 +++++++++++++++++++++++++++----------
 1 file changed, 33 insertions(+), 12 deletions(-)

diff --git a/src/amd/addrlib/r800/egbaddrlib.cpp b/src/amd/addrlib/r800/egbaddrlib.cpp
index 7942d20..fe98d2f 100644
--- a/src/amd/addrlib/r800/egbaddrlib.cpp
+++ b/src/amd/addrlib/r800/egbaddrlib.cpp
@@ -233,32 +233,20 @@ BOOL_32 EgBasedLib::ComputeSurfaceInfoLinear(
     //
     // Compute the surface alignments.
     //
     ComputeSurfaceAlignmentsLinear(pIn->tileMode,
                                    pIn->bpp,
                                    pIn->flags,
                                    &pOut->baseAlign,
                                    &pOut->pitchAlign,
                                    &pOut->heightAlign);
 
-    if (pIn->pitchAlign != 0)
-    {
-       ADDR_ASSERT((pIn->pitchAlign % pOut->pitchAlign) == 0);
-       pOut->pitchAlign = pIn->pitchAlign;
-    }
-
-    if (pIn->heightAlign != 0)
-    {
-       ADDR_ASSERT((pIn->heightAlign % pOut->heightAlign) == 0);
-       pOut->heightAlign = pIn->heightAlign;
-    }
-
     if ((pIn->tileMode == ADDR_TM_LINEAR_GENERAL) && pIn->flags.color && (pIn->height > 1))
     {
 #if !ALT_TEST
         // When linear_general surface is accessed in multiple lines, it requires 8 pixels in pitch
         // alignment since PITCH_TILE_MAX is in unit of 8 pixels.
         // It is OK if it is accessed per line.
         ADDR_ASSERT((pIn->width % 8) == 0);
 #endif
     }
 
@@ -290,20 +278,53 @@ BOOL_32 EgBasedLib::ComputeSurfaceInfoLinear(
 
     logicalSliceSize = HwlGetSizeAdjustmentLinear(pIn->tileMode,
                                                   pIn->bpp,
                                                   numSamples,
                                                   pOut->baseAlign,
                                                   pOut->pitchAlign,
                                                   &expPitch,
                                                   &expHeight,
                                                   &pOut->heightAlign);
 
+    if (pIn->pitchAlign != 0)
+    {
+       ADDR_ASSERT((pIn->pitchAlign % pOut->pitchAlign) == 0);
+       pOut->pitchAlign = pIn->pitchAlign;
+
+        if (IsPow2(pOut->pitchAlign))
+        {
+            expPitch = PowTwoAlign(expPitch, pOut->pitchAlign);
+        }
+        else
+        {
+            expPitch += pOut->pitchAlign - 1;
+            expPitch /= pOut->pitchAlign;
+            expPitch *= pOut->pitchAlign;
+        }
+    }
+
+    if (pIn->heightAlign != 0)
+    {
+       ADDR_ASSERT((pIn->heightAlign % pOut->heightAlign) == 0);
+       pOut->heightAlign = pIn->heightAlign;
+
+        if (IsPow2(pOut->heightAlign))
+        {
+            expHeight = PowTwoAlign(expHeight, pOut->heightAlign);
+        }
+        else
+        {
+            expHeight += pOut->heightAlign - 1;
+            expHeight /= pOut->heightAlign;
+            expHeight *= pOut->heightAlign;
+        }
+    }
 
     pOut->pitch = expPitch;
     pOut->height = expHeight;
     pOut->depth = expNumSlices;
 
     pOut->surfSize = logicalSliceSize * expNumSlices;
 
     pOut->tileMode = pIn->tileMode;
 
     return TRUE;
-- 
2.7.4



More information about the mesa-dev mailing list