Avoid clamping uninitialized values when clearing depth images The Blitter was always clamping the input clear values for normalized formats as if they were always used for clearing a color image, but VK_FORMAT_D16_UNORM is also a normalized format, so this code was also reached in this case. This CL adds a check for which aspect of the image is getting cleared, in order to avoid clamping uninitialized values. Bug: chromium:1336057 Change-Id: I423f14ff333382275b0882933b3b134c7980c0ba Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/66513 Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by: Nicolas Capens <nicolascapens@google.com> Commit-Queue: Alexis Hétu <sugoi@google.com> Tested-by: Alexis Hétu <sugoi@google.com> Presubmit-Ready: Alexis Hétu <sugoi@google.com>
diff --git a/src/Device/Blitter.cpp b/src/Device/Blitter.cpp index 1c18a23..41c7d65 100644 --- a/src/Device/Blitter.cpp +++ b/src/Device/Blitter.cpp
@@ -61,16 +61,28 @@ return; } - VkClearColorValue clampedPixel; + VkClearValue clampedPixel; if(viewFormat.isSignedNormalized() || viewFormat.isUnsignedNormalized()) { const float minValue = viewFormat.isSignedNormalized() ? -1.0f : 0.0f; - memcpy(clampedPixel.float32, pixel, sizeof(VkClearColorValue)); - clampedPixel.float32[0] = sw::clamp(clampedPixel.float32[0], minValue, 1.0f); - clampedPixel.float32[1] = sw::clamp(clampedPixel.float32[1], minValue, 1.0f); - clampedPixel.float32[2] = sw::clamp(clampedPixel.float32[2], minValue, 1.0f); - clampedPixel.float32[3] = sw::clamp(clampedPixel.float32[3], minValue, 1.0f); - pixel = clampedPixel.float32; + + if(aspect & VK_IMAGE_ASPECT_COLOR_BIT) + { + memcpy(clampedPixel.color.float32, pixel, sizeof(VkClearColorValue)); + clampedPixel.color.float32[0] = sw::clamp(clampedPixel.color.float32[0], minValue, 1.0f); + clampedPixel.color.float32[1] = sw::clamp(clampedPixel.color.float32[1], minValue, 1.0f); + clampedPixel.color.float32[2] = sw::clamp(clampedPixel.color.float32[2], minValue, 1.0f); + clampedPixel.color.float32[3] = sw::clamp(clampedPixel.color.float32[3], minValue, 1.0f); + pixel = clampedPixel.color.float32; + } + + // Stencil never requires clamping, so we can check for Depth only + if(aspect & VK_IMAGE_ASPECT_DEPTH_BIT) + { + memcpy(&(clampedPixel.depthStencil), pixel, sizeof(VkClearDepthStencilValue)); + clampedPixel.depthStencil.depth = sw::clamp(clampedPixel.depthStencil.depth, minValue, 1.0f); + pixel = &(clampedPixel.depthStencil); + } } if(fastClear(pixel, format, dest, dstFormat, subresourceRange, renderArea))