Validate that depth clear values are between 0, 1
Fixes missing validation exposed by the addition of
https://github.com/gpuweb/cts/pull/1640 to the CTS.
Change-Id: Ib51124603a6fcec973eeab9ac1ed989add209c9a
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/96481
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Commit-Queue: Brandon Jones <bajones@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/dawn/native/CommandEncoder.cpp b/src/dawn/native/CommandEncoder.cpp
index 6f32d92..0bc63fa 100644
--- a/src/dawn/native/CommandEncoder.cpp
+++ b/src/dawn/native/CommandEncoder.cpp
@@ -382,10 +382,16 @@
if (!std::isnan(depthStencilAttachment->clearDepth)) {
// TODO(dawn:1269): Remove this branch after the deprecation period.
device->EmitDeprecationWarning("clearDepth is deprecated, prefer depthClearValue instead.");
- } else {
- DAWN_INVALID_IF(depthStencilAttachment->depthLoadOp == wgpu::LoadOp::Clear &&
- std::isnan(depthStencilAttachment->depthClearValue),
+ DAWN_INVALID_IF(
+ depthStencilAttachment->clearDepth < 0.0f || depthStencilAttachment->clearDepth > 1.0f,
+ "clearDepth is not between 0.0 and 1.0");
+
+ } else if (depthStencilAttachment->depthLoadOp == wgpu::LoadOp::Clear) {
+ DAWN_INVALID_IF(std::isnan(depthStencilAttachment->depthClearValue),
"depthClearValue is NaN.");
+ DAWN_INVALID_IF(depthStencilAttachment->depthClearValue < 0.0f ||
+ depthStencilAttachment->depthClearValue > 1.0f,
+ "depthClearValue is not between 0.0 and 1.0");
}
// TODO(dawn:1269): Remove after the deprecation period.
diff --git a/src/dawn/tests/unittests/validation/RenderPassDescriptorValidationTests.cpp b/src/dawn/tests/unittests/validation/RenderPassDescriptorValidationTests.cpp
index 6a85a46..f0cfd3c 100644
--- a/src/dawn/tests/unittests/validation/RenderPassDescriptorValidationTests.cpp
+++ b/src/dawn/tests/unittests/validation/RenderPassDescriptorValidationTests.cpp
@@ -1057,7 +1057,7 @@
AssertBeginRenderPassError(&renderPass);
}
- // Tests that INFINITY can be used in depthClearValue.
+ // Tests that INFINITY cannot be used in depthClearValue.
{
wgpu::TextureView depth =
Create2DAttachment(device, 1, 1, wgpu::TextureFormat::Depth24Plus);
@@ -1065,13 +1065,66 @@
renderPass.cDepthStencilAttachmentInfo.stencilLoadOp = wgpu::LoadOp::Undefined;
renderPass.cDepthStencilAttachmentInfo.stencilStoreOp = wgpu::StoreOp::Undefined;
renderPass.cDepthStencilAttachmentInfo.depthClearValue = INFINITY;
- AssertBeginRenderPassSuccess(&renderPass);
+ AssertBeginRenderPassError(&renderPass);
}
// TODO(https://crbug.com/dawn/666): Add a test case for clearStencil for stencilOnly
// once stencil8 is supported.
}
+// Tests that depth clear values mut be between 0 and 1, inclusive.
+TEST_F(RenderPassDescriptorValidationTest, ValidateDepthClearValueRange) {
+ wgpu::TextureView depth = Create2DAttachment(device, 1, 1, wgpu::TextureFormat::Depth24Plus);
+
+ utils::ComboRenderPassDescriptor renderPass({}, depth);
+ renderPass.cDepthStencilAttachmentInfo.stencilLoadOp = wgpu::LoadOp::Undefined;
+ renderPass.cDepthStencilAttachmentInfo.stencilStoreOp = wgpu::StoreOp::Undefined;
+
+ // 0, 1, and any value in between are be valid.
+ renderPass.cDepthStencilAttachmentInfo.depthClearValue = 0;
+ AssertBeginRenderPassSuccess(&renderPass);
+
+ renderPass.cDepthStencilAttachmentInfo.depthClearValue = 0.1;
+ AssertBeginRenderPassSuccess(&renderPass);
+
+ renderPass.cDepthStencilAttachmentInfo.depthClearValue = 0.5;
+ AssertBeginRenderPassSuccess(&renderPass);
+
+ renderPass.cDepthStencilAttachmentInfo.depthClearValue = 0.82;
+ AssertBeginRenderPassSuccess(&renderPass);
+
+ renderPass.cDepthStencilAttachmentInfo.depthClearValue = 1;
+ AssertBeginRenderPassSuccess(&renderPass);
+
+ // Values less than 0 or greater than 1 are invalid.
+ renderPass.cDepthStencilAttachmentInfo.depthClearValue = -1;
+ AssertBeginRenderPassError(&renderPass);
+
+ renderPass.cDepthStencilAttachmentInfo.depthClearValue = 2;
+ AssertBeginRenderPassError(&renderPass);
+
+ renderPass.cDepthStencilAttachmentInfo.depthClearValue = -0.001;
+ AssertBeginRenderPassError(&renderPass);
+
+ renderPass.cDepthStencilAttachmentInfo.depthClearValue = 1.001;
+ AssertBeginRenderPassError(&renderPass);
+
+ // Clear values are not validated if the depthLoadOp is Load.
+ renderPass.cDepthStencilAttachmentInfo.depthLoadOp = wgpu::LoadOp::Load;
+
+ renderPass.cDepthStencilAttachmentInfo.depthClearValue = -1;
+ AssertBeginRenderPassSuccess(&renderPass);
+
+ renderPass.cDepthStencilAttachmentInfo.depthClearValue = 2;
+ AssertBeginRenderPassSuccess(&renderPass);
+
+ renderPass.cDepthStencilAttachmentInfo.depthClearValue = -0.001;
+ AssertBeginRenderPassSuccess(&renderPass);
+
+ renderPass.cDepthStencilAttachmentInfo.depthClearValue = 1.001;
+ AssertBeginRenderPassSuccess(&renderPass);
+}
+
TEST_F(RenderPassDescriptorValidationTest, ValidateDepthStencilReadOnly) {
wgpu::TextureView colorView = Create2DAttachment(device, 1, 1, wgpu::TextureFormat::RGBA8Unorm);
wgpu::TextureView depthStencilView =