Validate 3d texture view cannot be resolve targets
WebGPU Spec is changed to disallow 3d texture view used as resolve
targets.
Bug: 340363660
Change-Id: Idc16a5ab7b9ebee73ae6ef5804ff4fe77ad85b69
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/188200
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Hao Li <hao.x.li@intel.com>
diff --git a/src/dawn/native/CommandEncoder.cpp b/src/dawn/native/CommandEncoder.cpp
index 8f1988f..f7033ee 100644
--- a/src/dawn/native/CommandEncoder.cpp
+++ b/src/dawn/native/CommandEncoder.cpp
@@ -397,6 +397,11 @@
"Cannot use %s as resolve target. Sample count (%u) is greater than 1.",
resolveTarget, resolveTarget->GetTexture()->GetSampleCount());
+ DAWN_INVALID_IF(resolveTarget->GetDimension() != wgpu::TextureViewDimension::e2D &&
+ resolveTarget->GetDimension() != wgpu::TextureViewDimension::e2DArray,
+ "The dimension (%s) of resolve target %s is not 2D or 2DArray.",
+ resolveTarget->GetDimension(), resolveTarget);
+
DAWN_INVALID_IF(resolveTarget->GetLayerCount() > 1,
"The resolve target %s array layer count (%u) is not 1.", resolveTarget,
resolveTarget->GetLayerCount());
diff --git a/src/dawn/tests/unittests/validation/RenderPassDescriptorValidationTests.cpp b/src/dawn/tests/unittests/validation/RenderPassDescriptorValidationTests.cpp
index 50a97a9..13198c3 100644
--- a/src/dawn/tests/unittests/validation/RenderPassDescriptorValidationTests.cpp
+++ b/src/dawn/tests/unittests/validation/RenderPassDescriptorValidationTests.cpp
@@ -985,6 +985,39 @@
AssertBeginRenderPassError(&renderPass);
}
+// Test the view dimension of resolve target.
+TEST_F(MultisampledRenderPassDescriptorValidationTest, ResolveTargetDimension) {
+ wgpu::Texture resolveTexture2D = CreateTexture(
+ device, wgpu::TextureDimension::e2D, kColorFormat, kSize, kSize, kArrayLayers, kLevelCount);
+
+ // It is allowed to use a 2d texture view as resolve target.
+ {
+ utils::ComboRenderPassDescriptor renderPass = CreateMultisampledRenderPass();
+ renderPass.cColorAttachments[0].resolveTarget = resolveTexture2D.CreateView();
+ AssertBeginRenderPassSuccess(&renderPass);
+ }
+
+ // It is allowed to use a 2d-array texture view as resolve target.
+ {
+ wgpu::TextureViewDescriptor viewDesc;
+ viewDesc.dimension = wgpu::TextureViewDimension::e2DArray;
+
+ utils::ComboRenderPassDescriptor renderPass = CreateMultisampledRenderPass();
+ renderPass.cColorAttachments[0].resolveTarget = resolveTexture2D.CreateView(&viewDesc);
+ AssertBeginRenderPassSuccess(&renderPass);
+ }
+
+ // It is not allowed to use a 3d texture view as resolve target.
+ {
+ wgpu::Texture resolveTexture3D =
+ CreateTexture(device, wgpu::TextureDimension::e3D, kColorFormat, kSize, kSize,
+ kArrayLayers, kLevelCount);
+ utils::ComboRenderPassDescriptor renderPass = CreateMultisampledRenderPass();
+ renderPass.cColorAttachments[0].resolveTarget = resolveTexture3D.CreateView();
+ AssertBeginRenderPassError(&renderPass);
+ }
+}
+
// It is not allowed to use a resolve target with array layer count > 1.
TEST_F(MultisampledRenderPassDescriptorValidationTest, ResolveTargetArrayLayerMoreThanOne) {
constexpr uint32_t kArrayLayers2 = 2;