Validate that DS attachment must cover all aspects of the texture.
It isn't clear if this should be a limitation of the WebGPU
specification. Until further investigation is done, disallow it in Dawn
to avoid undefiend behavior.
Bug: dawn:812
Change-Id: Iab8208f1ea479263b08ede41374ce1a680ce191e
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/53387
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Reviewed-by: Jiawei Shao <jiawei.shao@intel.com>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/dawn_native/CommandEncoder.cpp b/src/dawn_native/CommandEncoder.cpp
index 7676a49..2e1c605 100644
--- a/src/dawn_native/CommandEncoder.cpp
+++ b/src/dawn_native/CommandEncoder.cpp
@@ -286,12 +286,23 @@
DAWN_TRY(
ValidateCanUseAs(attachment->GetTexture(), wgpu::TextureUsage::RenderAttachment));
- if ((attachment->GetAspects() & (Aspect::Depth | Aspect::Stencil)) == Aspect::None ||
- !attachment->GetFormat().isRenderable) {
+ const Format& format = attachment->GetFormat();
+ if (!format.HasDepthOrStencil()) {
return DAWN_VALIDATION_ERROR(
"The format of the texture view used as depth stencil attachment is not a "
"depth stencil format");
}
+ if (!format.isRenderable) {
+ return DAWN_VALIDATION_ERROR(
+ "The format of the texture view used as depth stencil attachment is not "
+ "renderable");
+ }
+ if (attachment->GetAspects() != format.aspects) {
+ // TODO(https://crbug.com/dawn/812): Investigate if this limitation should be added
+ // to the WebGPU spec of lifted from Dawn.
+ return DAWN_VALIDATION_ERROR(
+ "The texture view used as depth stencil view must encompass all aspects");
+ }
DAWN_TRY(ValidateLoadOp(depthStencilAttachment->depthLoadOp));
DAWN_TRY(ValidateLoadOp(depthStencilAttachment->stencilLoadOp));
diff --git a/src/tests/unittests/validation/RenderPassDescriptorValidationTests.cpp b/src/tests/unittests/validation/RenderPassDescriptorValidationTests.cpp
index 06ee368..f82a6cb 100644
--- a/src/tests/unittests/validation/RenderPassDescriptorValidationTests.cpp
+++ b/src/tests/unittests/validation/RenderPassDescriptorValidationTests.cpp
@@ -880,6 +880,62 @@
}
}
+ // Check that the depth stencil attachment must use all aspects.
+ TEST_F(RenderPassDescriptorValidationTest, ValidateDepthStencilAllAspects) {
+ wgpu::TextureDescriptor texDesc;
+ texDesc.usage = wgpu::TextureUsage::RenderAttachment;
+ texDesc.size = {1, 1, 1};
+
+ wgpu::TextureViewDescriptor viewDesc;
+ viewDesc.baseMipLevel = 0;
+ viewDesc.mipLevelCount = 1;
+ viewDesc.baseArrayLayer = 0;
+ viewDesc.arrayLayerCount = 1;
+
+ // Using all aspects of a depth+stencil texture is allowed.
+ {
+ texDesc.format = wgpu::TextureFormat::Depth24PlusStencil8;
+ viewDesc.aspect = wgpu::TextureAspect::All;
+
+ wgpu::TextureView view = device.CreateTexture(&texDesc).CreateView(&viewDesc);
+ utils::ComboRenderPassDescriptor renderPass({}, view);
+ AssertBeginRenderPassSuccess(&renderPass);
+ }
+
+ // Using only depth of a depth+stencil texture is an error.
+ {
+ texDesc.format = wgpu::TextureFormat::Depth24PlusStencil8;
+ viewDesc.aspect = wgpu::TextureAspect::DepthOnly;
+
+ wgpu::TextureView view = device.CreateTexture(&texDesc).CreateView(&viewDesc);
+ utils::ComboRenderPassDescriptor renderPass({}, view);
+ AssertBeginRenderPassError(&renderPass);
+ }
+
+ // Using only stencil of a depth+stencil texture is an error.
+ {
+ texDesc.format = wgpu::TextureFormat::Depth24PlusStencil8;
+ viewDesc.aspect = wgpu::TextureAspect::StencilOnly;
+
+ wgpu::TextureView view = device.CreateTexture(&texDesc).CreateView(&viewDesc);
+ utils::ComboRenderPassDescriptor renderPass({}, view);
+ AssertBeginRenderPassError(&renderPass);
+ }
+
+ // Using DepthOnly of a depth only texture us allowed.
+ {
+ texDesc.format = wgpu::TextureFormat::Depth24Plus;
+ viewDesc.aspect = wgpu::TextureAspect::DepthOnly;
+
+ wgpu::TextureView view = device.CreateTexture(&texDesc).CreateView(&viewDesc);
+ utils::ComboRenderPassDescriptor renderPass({}, view);
+ AssertBeginRenderPassSuccess(&renderPass);
+ }
+
+ // TODO(https://crbug.com/dawn/666): Add a test case for stencil-only on stencil8 once this
+ // format is supported.
+ }
+
// TODO(cwallez@chromium.org): Constraints on attachment aliasing?
} // anonymous namespace