[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