summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIlia Mirkin <[email protected]>2016-11-18 15:36:40 -0500
committerIlia Mirkin <[email protected]>2016-11-28 20:14:48 -0500
commite0fc18a43590e120ae716670804fe26b0dd73878 (patch)
tree5f7afe15b0d0cebdcee3cce0e5d3c938bffc0d4a /src
parent2fca08e550ae0c4b036ee8fc34dcf98d45d6bf20 (diff)
swr: [rasterizer memory] only clear up to the LOD size
Signed-off-by: Ilia Mirkin <[email protected]> Reviewed-by: Tim Rowley <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/swr/rasterizer/memory/ClearTile.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/gallium/drivers/swr/rasterizer/memory/ClearTile.cpp b/src/gallium/drivers/swr/rasterizer/memory/ClearTile.cpp
index 31a40a3feea..ee13f55b5a4 100644
--- a/src/gallium/drivers/swr/rasterizer/memory/ClearTile.cpp
+++ b/src/gallium/drivers/swr/rasterizer/memory/ClearTile.cpp
@@ -60,6 +60,12 @@ struct StoreRasterTileClear
UINT x, UINT y, // (x, y) pixel coordinate to start of raster tile.
uint32_t renderTargetArrayIndex)
{
+ // If we're outside of the surface, stop.
+ uint32_t lodWidth = std::max<uint32_t>(pDstSurface->width >> pDstSurface->lod, 1U);
+ uint32_t lodHeight = std::max<uint32_t>(pDstSurface->height >> pDstSurface->lod, 1U);
+ if (x >= lodWidth || y >= lodHeight)
+ return;
+
// Compute destination address for raster tile.
uint8_t* pDstTile = (uint8_t*)ComputeSurfaceAddress<false, false>(
x, y, pDstSurface->arrayIndex + renderTargetArrayIndex,
@@ -73,7 +79,7 @@ struct StoreRasterTileClear
UINT dstBytesPerRow = 0;
// For each raster tile pixel in row 0 (rx, 0)
- for (UINT rx = 0; (rx < KNOB_TILE_X_DIM) && ((x + rx) < pDstSurface->width); ++rx)
+ for (UINT rx = 0; (rx < KNOB_TILE_X_DIM) && ((x + rx) < lodWidth); ++rx)
{
memcpy(pDst, dstFormattedColor, dstBytesPerPixel);
@@ -86,7 +92,7 @@ struct StoreRasterTileClear
pDst = pDstTile + pDstSurface->pitch;
// For each remaining row in the rest of the raster tile
- for (UINT ry = 1; (ry < KNOB_TILE_Y_DIM) && ((y + ry) < pDstSurface->height); ++ry)
+ for (UINT ry = 1; (ry < KNOB_TILE_Y_DIM) && ((y + ry) < lodHeight); ++ry)
{
// copy row
memcpy(pDst, pDstTile, dstBytesPerRow);