diff options
author | Ilia Mirkin <[email protected]> | 2016-11-12 03:01:15 -0500 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2016-11-21 21:11:26 -0500 |
commit | c5a654786b5b68c5c215e3bd1bc83b02d7e2a0e9 (patch) | |
tree | 9d090444fff59a18cb10ace02c6bdec1d3b93ad2 | |
parent | bf75ef3f9201e11bb08a4d03dab20d5ff86f1ebc (diff) |
swr: [rasterizer memory] minify original sizes for block formats
There's no guarantee that mip width/height will be a multiple of the
compressed block size. Doing a divide by the block size first yields
different results than GL expects, so we do the divide at the end.
Signed-off-by: Ilia Mirkin <[email protected]>
Reviewed-by: Tim Rowley <[email protected]>
-rw-r--r-- | src/gallium/drivers/swr/rasterizer/memory/TilingFunctions.h | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/src/gallium/drivers/swr/rasterizer/memory/TilingFunctions.h b/src/gallium/drivers/swr/rasterizer/memory/TilingFunctions.h index 0694a99808f..11ed4518f2e 100644 --- a/src/gallium/drivers/swr/rasterizer/memory/TilingFunctions.h +++ b/src/gallium/drivers/swr/rasterizer/memory/TilingFunctions.h @@ -274,9 +274,12 @@ INLINE void ComputeLODOffset1D( else { uint32_t curWidth = baseWidth; - // translate mip width from pixels to blocks for block compressed formats - // @note hAlign is already in blocks for compressed formats so no need to convert - if (info.isBC) curWidth /= info.bcWidth; + // @note hAlign is already in blocks for compressed formats so upconvert + // so that we have the desired alignment post-divide. + if (info.isBC) + { + hAlign *= info.bcWidth; + } offset = GFX_ALIGN(curWidth, hAlign); for (uint32_t l = 1; l < lod; ++l) @@ -285,7 +288,7 @@ INLINE void ComputeLODOffset1D( offset += curWidth; } - if (info.isSubsampled) + if (info.isSubsampled || info.isBC) { offset /= info.bcWidth; } @@ -312,14 +315,17 @@ INLINE void ComputeLODOffsetX( else { uint32_t curWidth = baseWidth; - // convert mip width from pixels to blocks for block compressed formats - // @note hAlign is already in blocks for compressed formats so no need to convert - if (info.isBC) curWidth /= info.bcWidth; + // @note hAlign is already in blocks for compressed formats so upconvert + // so that we have the desired alignment post-divide. + if (info.isBC) + { + hAlign *= info.bcWidth; + } curWidth = std::max<uint32_t>(curWidth >> 1, 1U); curWidth = GFX_ALIGN(curWidth, hAlign); - if (info.isSubsampled) + if (info.isSubsampled || info.isBC) { curWidth /= info.bcWidth; } @@ -350,9 +356,12 @@ INLINE void ComputeLODOffsetY( offset = 0; uint32_t mipHeight = baseHeight; - // translate mip height from pixels to blocks for block compressed formats - // @note VAlign is already in blocks for compressed formats so no need to convert - if (info.isBC) mipHeight /= info.bcHeight; + // @note vAlign is already in blocks for compressed formats so upconvert + // so that we have the desired alignment post-divide. + if (info.isBC) + { + vAlign *= info.bcHeight; + } for (uint32_t l = 1; l <= lod; ++l) { @@ -360,6 +369,11 @@ INLINE void ComputeLODOffsetY( offset += ((l != 2) ? alignedMipHeight : 0); mipHeight = std::max<uint32_t>(mipHeight >> 1, 1U); } + + if (info.isBC) + { + offset /= info.bcHeight; + } } } |