Fix blitter clears of 2D views of 3D textures
This was stomping all over memory beyond the image.
Bug: b/nnn
Test: dEQP-VK.pipeline.render_to_image.core.*
Change-Id: Ie8738da787ea98c0d6431970cf6301bd6b5b5323
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30528
Tested-by: Chris Forbes <chrisforbes@google.com>
Presubmit-Ready: Chris Forbes <chrisforbes@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Device/Blitter.cpp b/src/Device/Blitter.cpp
index 1b49c92..df15afe 100644
--- a/src/Device/Blitter.cpp
+++ b/src/Device/Blitter.cpp
@@ -101,15 +101,29 @@
0, 0, // sWidth, sHeight
};
- for(subresLayers.baseArrayLayer = subresourceRange.baseArrayLayer; subresLayers.baseArrayLayer <= lastLayer; subresLayers.baseArrayLayer++)
+ if (renderArea && dest->is3DSlice())
{
- for(uint32_t depth = 0; depth < extent.depth; depth++)
+ // Reinterpret layers as depth slices
+ subresLayers.baseArrayLayer = 0;
+ subresLayers.layerCount = 1;
+ for (uint32_t depth = subresourceRange.baseArrayLayer; depth <= lastLayer; depth++)
{
- data.dest = dest->getTexelPointer({ 0, 0, static_cast<int32_t>(depth) }, subresLayers);
-
+ data.dest = dest->getTexelPointer({0, 0, static_cast<int32_t>(depth)}, subresLayers);
blitFunction(&data);
}
}
+ else
+ {
+ for(subresLayers.baseArrayLayer = subresourceRange.baseArrayLayer; subresLayers.baseArrayLayer <= lastLayer; subresLayers.baseArrayLayer++)
+ {
+ for(uint32_t depth = 0; depth < extent.depth; depth++)
+ {
+ data.dest = dest->getTexelPointer({ 0, 0, static_cast<int32_t>(depth) }, subresLayers);
+
+ blitFunction(&data);
+ }
+ }
+ }
}
}