Validate depthSlice not defined for non-3D color attachments The depthSlice has been initialized with WGPU_DEPTH_SLICE_UNDEFINED in Blink, we can add the validation back for 2D color attachments. And use constexpr instead of macro for the undefined value. Bug: dawn:1020 Change-Id: Idbd275cbcdc8f17f9294c1fb0e5551ce05e1c52b Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/166364 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Austin Eng <enga@chromium.org> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Hao Li <hao.x.li@intel.com>
diff --git a/src/dawn/native/CommandEncoder.cpp b/src/dawn/native/CommandEncoder.cpp index a32aea4..be4d81d 100644 --- a/src/dawn/native/CommandEncoder.cpp +++ b/src/dawn/native/CommandEncoder.cpp
@@ -113,7 +113,7 @@ // attachment in the render pass descriptor. MaybeError AddAttachment(const TextureViewBase* attachment, AttachmentType attachmentType, - uint32_t depthSlice = WGPU_DEPTH_SLICE_UNDEFINED) { + uint32_t depthSlice = wgpu::kDepthSliceUndefined) { if (attachment == nullptr) { return {}; } @@ -168,9 +168,7 @@ DAWN_ASSERT(attachment->GetBaseArrayLayer() == 0); record.depthOrArrayLayer = depthSlice; } else { - // TODO(dawn:1020): Assert depthSlice should be the 'WGPU_DEPTH_SLICE_UNDEFINED' value - // if the attachment is a non-3d texture view after it's initialized correctly in Blink. - // DAWN_ASSERT(depthSlice == WGPU_DEPTH_SLICE_UNDEFINED); + DAWN_ASSERT(depthSlice == wgpu::kDepthSliceUndefined); record.depthOrArrayLayer = attachment->GetBaseArrayLayer(); } @@ -356,16 +354,15 @@ MaybeError ValidateColorAttachmentDepthSlice(const TextureViewBase* attachment, uint32_t depthSlice) { if (attachment->GetDimension() != wgpu::TextureViewDimension::e3D) { - // TODO(dawn:1020): Validate depthSlice must not set for non-3d attachments. The depthSlice - // from WebGPU is not the 'WGPU_DEPTH_SLICE_UNDEFINED' value if it's not defined, we need to - // initialize it in Blink first, otherwise it will always be validated as set. + DAWN_INVALID_IF(depthSlice != wgpu::kDepthSliceUndefined, + "depthSlice (%u) is defined for a non-3D attachment (%s).", depthSlice, + attachment); return {}; } - DAWN_INVALID_IF(depthSlice == WGPU_DEPTH_SLICE_UNDEFINED, - "depthSlice (%u) must be set and must not be undefined value (%u) for a 3D " - "attachment (%s).", - depthSlice, WGPU_DEPTH_SLICE_UNDEFINED, attachment); + DAWN_INVALID_IF(depthSlice == wgpu::kDepthSliceUndefined, + "depthSlice (%u) for a 3D attachment (%s) is undefined.", depthSlice, + attachment); const Extent3D& attachmentSize = attachment->GetSingleSubresourceVirtualSize(); DAWN_INVALID_IF(depthSlice >= attachmentSize.depthOrArrayLayers, @@ -1116,10 +1113,10 @@ cmdColorAttachment.view = colorTarget; // Explicitly set depthSlice to 0 if it's undefined. The - // WGPU_DEPTH_SLICE_UNDEFINED is defined to differentiate between `undefined` + // wgpu::kDepthSliceUndefined is defined to differentiate between `undefined` // and 0 for depthSlice, but we use it as 0 for 2d attachments in backends. cmdColorAttachment.depthSlice = - descColorAttachment.depthSlice == WGPU_DEPTH_SLICE_UNDEFINED + descColorAttachment.depthSlice == wgpu::kDepthSliceUndefined ? 0 : descColorAttachment.depthSlice; cmdColorAttachment.loadOp = descColorAttachment.loadOp;
diff --git a/src/dawn/samples/CHelloTriangle.cpp b/src/dawn/samples/CHelloTriangle.cpp index 67252ba..b2030ea 100644 --- a/src/dawn/samples/CHelloTriangle.cpp +++ b/src/dawn/samples/CHelloTriangle.cpp
@@ -117,6 +117,8 @@ WGPURenderPassColorAttachment colorAttachment = {}; { colorAttachment.view = backbufferView; + // The depthSlice must be initialized with the 'undefined' value for 2d color attachments. + colorAttachment.depthSlice = WGPU_DEPTH_SLICE_UNDEFINED; colorAttachment.resolveTarget = nullptr; colorAttachment.clearValue = {0.0f, 0.0f, 0.0f, 0.0f}; colorAttachment.loadOp = WGPULoadOp_Clear;
diff --git a/src/dawn/tests/unittests/validation/RenderPassDescriptorValidationTests.cpp b/src/dawn/tests/unittests/validation/RenderPassDescriptorValidationTests.cpp index 8444f2d..53fd728 100644 --- a/src/dawn/tests/unittests/validation/RenderPassDescriptorValidationTests.cpp +++ b/src/dawn/tests/unittests/validation/RenderPassDescriptorValidationTests.cpp
@@ -496,7 +496,18 @@ AssertBeginRenderPassError(&renderPass); } - // TODO(dawn:1020): Add tests to check depthSlice must not be set for non-3D attachments. + // Control case: It's valid if depthSlice is unset for a non-3D color attachment. + { + utils::ComboRenderPassDescriptor renderPass({colorView2D}); + AssertBeginRenderPassSuccess(&renderPass); + } + + // It's invalid if depthSlice is set for a non-3D color attachment. + { + utils::ComboRenderPassDescriptor renderPass({colorView2D}); + renderPass.cColorAttachments[0].depthSlice = 0; + AssertBeginRenderPassError(&renderPass); + } } // Check that the depth slices of a 3D color attachment cannot overlap in same render pass.