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);
+					}
+				}
+			}
 		}
 	}