amd/addrlib: Apply input pitch after internal pitch aligning
authorFrans Gu <frans.gu@amd.com>
Fri, 1 Jul 2016 08:54:44 +0000 (04:54 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 30 Mar 2017 12:44:33 +0000 (14:44 +0200)
src/amd/addrlib/r800/egbaddrlib.cpp

index 7942d20d75aff0c6e9da942672310f1d6f94f527..fe98d2ff25d15e32a5128ace19222fa93b19e04e 100644 (file)
@@ -240,18 +240,6 @@ BOOL_32 EgBasedLib::ComputeSurfaceInfoLinear(
                                    &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
@@ -297,6 +285,39 @@ BOOL_32 EgBasedLib::ComputeSurfaceInfoLinear(
                                                   &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;