dawn: Validate that depth-stencil attachments encompass all aspects.

Fixed: dawn:1394
Change-Id: I208e130cbe46f50954b73057a9f8fc647d914995
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/90220
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Brandon Jones <bajones@chromium.org>
This commit is contained in:
Corentin Wallez 2022-05-20 16:16:40 +00:00 committed by Dawn LUCI CQ
parent 86b6de56ac
commit ece20a7948
2 changed files with 65 additions and 8 deletions

View File

@ -277,7 +277,16 @@ MaybeError ValidateRenderPassDepthStencilAttachment(
DAWN_TRY(ValidateCanUseAs(attachment->GetTexture(), wgpu::TextureUsage::RenderAttachment, DAWN_TRY(ValidateCanUseAs(attachment->GetTexture(), wgpu::TextureUsage::RenderAttachment,
usageValidationMode)); usageValidationMode));
const Format& format = attachment->GetFormat(); // DS attachments must encompass all aspects of the texture, so we first check that this is
// true, which means that in the rest of the function we can assume that the view's format is
// the same as the texture's format.
const Format& format = attachment->GetTexture()->GetFormat();
DAWN_INVALID_IF(
attachment->GetAspects() != format.aspects,
"The depth stencil attachment %s must encompass all aspects of it's texture's format (%s).",
attachment, format.format);
ASSERT(attachment->GetFormat().format == format.format);
DAWN_INVALID_IF(!format.HasDepthOrStencil(), DAWN_INVALID_IF(!format.HasDepthOrStencil(),
"The depth stencil attachment %s format (%s) is not a depth stencil format.", "The depth stencil attachment %s format (%s) is not a depth stencil format.",
attachment, format.format); attachment, format.format);
@ -286,9 +295,6 @@ MaybeError ValidateRenderPassDepthStencilAttachment(
"The depth stencil attachment %s format (%s) is not renderable.", attachment, "The depth stencil attachment %s format (%s) is not renderable.", attachment,
format.format); format.format);
DAWN_INVALID_IF(attachment->GetAspects() != format.aspects,
"The depth stencil attachment %s must encompass all aspects.", attachment);
DAWN_INVALID_IF( DAWN_INVALID_IF(
attachment->GetAspects() == (Aspect::Depth | Aspect::Stencil) && attachment->GetAspects() == (Aspect::Depth | Aspect::Stencil) &&
depthStencilAttachment->depthReadOnly != depthStencilAttachment->stencilReadOnly, depthStencilAttachment->depthReadOnly != depthStencilAttachment->stencilReadOnly,

View File

@ -1051,6 +1051,7 @@ TEST_F(RenderPassDescriptorValidationTest, ValidateDepthStencilAllAspects) {
// Using all aspects of a depth+stencil texture is allowed. // Using all aspects of a depth+stencil texture is allowed.
{ {
texDesc.format = wgpu::TextureFormat::Depth24PlusStencil8; texDesc.format = wgpu::TextureFormat::Depth24PlusStencil8;
viewDesc.format = wgpu::TextureFormat::Undefined;
viewDesc.aspect = wgpu::TextureAspect::All; viewDesc.aspect = wgpu::TextureAspect::All;
wgpu::TextureView view = device.CreateTexture(&texDesc).CreateView(&viewDesc); wgpu::TextureView view = device.CreateTexture(&texDesc).CreateView(&viewDesc);
@ -1058,29 +1059,68 @@ TEST_F(RenderPassDescriptorValidationTest, ValidateDepthStencilAllAspects) {
AssertBeginRenderPassSuccess(&renderPass); AssertBeginRenderPassSuccess(&renderPass);
} }
// Using only depth of a depth+stencil texture is an error. // Using only depth of a depth+stencil texture is an error, case without format
// reinterpretation.
{ {
texDesc.format = wgpu::TextureFormat::Depth24PlusStencil8; texDesc.format = wgpu::TextureFormat::Depth24PlusStencil8;
viewDesc.format = wgpu::TextureFormat::Undefined;
viewDesc.aspect = wgpu::TextureAspect::DepthOnly; viewDesc.aspect = wgpu::TextureAspect::DepthOnly;
wgpu::TextureView view = device.CreateTexture(&texDesc).CreateView(&viewDesc); wgpu::TextureView view = device.CreateTexture(&texDesc).CreateView(&viewDesc);
utils::ComboRenderPassDescriptor renderPass({}, view); utils::ComboRenderPassDescriptor renderPass({}, view);
renderPass.cDepthStencilAttachmentInfo.stencilLoadOp = wgpu::LoadOp::Undefined;
renderPass.cDepthStencilAttachmentInfo.stencilStoreOp = wgpu::StoreOp::Undefined;
AssertBeginRenderPassError(&renderPass); AssertBeginRenderPassError(&renderPass);
} }
// Using only stencil of a depth+stencil texture is an error. // Using only depth of a depth+stencil texture is an error, case with format reinterpretation.
{ {
texDesc.format = wgpu::TextureFormat::Depth24PlusStencil8; texDesc.format = wgpu::TextureFormat::Depth24PlusStencil8;
viewDesc.format = wgpu::TextureFormat::Depth24Plus;
viewDesc.aspect = wgpu::TextureAspect::DepthOnly;
wgpu::TextureView view = device.CreateTexture(&texDesc).CreateView(&viewDesc);
utils::ComboRenderPassDescriptor renderPass({}, view);
renderPass.cDepthStencilAttachmentInfo.stencilLoadOp = wgpu::LoadOp::Undefined;
renderPass.cDepthStencilAttachmentInfo.stencilStoreOp = wgpu::StoreOp::Undefined;
AssertBeginRenderPassError(&renderPass);
}
// Using only stencil of a depth+stencil texture is an error, case without format
// reinterpration.
{
texDesc.format = wgpu::TextureFormat::Depth24PlusStencil8;
viewDesc.format = wgpu::TextureFormat::Undefined;
viewDesc.aspect = wgpu::TextureAspect::StencilOnly; viewDesc.aspect = wgpu::TextureAspect::StencilOnly;
wgpu::TextureView view = device.CreateTexture(&texDesc).CreateView(&viewDesc); wgpu::TextureView view = device.CreateTexture(&texDesc).CreateView(&viewDesc);
utils::ComboRenderPassDescriptor renderPass({}, view); utils::ComboRenderPassDescriptor renderPass({}, view);
renderPass.cDepthStencilAttachmentInfo.depthLoadOp = wgpu::LoadOp::Undefined;
renderPass.cDepthStencilAttachmentInfo.depthStoreOp = wgpu::StoreOp::Undefined;
AssertBeginRenderPassError(&renderPass);
}
// Using only stencil of a depth+stencil texture is an error, case with format reinterpretation.
{
texDesc.format = wgpu::TextureFormat::Depth24PlusStencil8;
viewDesc.format = wgpu::TextureFormat::Stencil8;
viewDesc.aspect = wgpu::TextureAspect::StencilOnly;
wgpu::TextureView view = device.CreateTexture(&texDesc).CreateView(&viewDesc);
utils::ComboRenderPassDescriptor renderPass({}, view);
renderPass.cDepthStencilAttachmentInfo.depthLoadOp = wgpu::LoadOp::Undefined;
renderPass.cDepthStencilAttachmentInfo.depthStoreOp = wgpu::StoreOp::Undefined;
AssertBeginRenderPassError(&renderPass); AssertBeginRenderPassError(&renderPass);
} }
// Using DepthOnly of a depth only texture is allowed. // Using DepthOnly of a depth only texture is allowed.
{ {
texDesc.format = wgpu::TextureFormat::Depth24Plus; texDesc.format = wgpu::TextureFormat::Depth24Plus;
viewDesc.format = wgpu::TextureFormat::Undefined;
viewDesc.aspect = wgpu::TextureAspect::DepthOnly; viewDesc.aspect = wgpu::TextureAspect::DepthOnly;
wgpu::TextureView view = device.CreateTexture(&texDesc).CreateView(&viewDesc); wgpu::TextureView view = device.CreateTexture(&texDesc).CreateView(&viewDesc);
@ -1091,8 +1131,19 @@ TEST_F(RenderPassDescriptorValidationTest, ValidateDepthStencilAllAspects) {
AssertBeginRenderPassSuccess(&renderPass); AssertBeginRenderPassSuccess(&renderPass);
} }
// TODO(https://crbug.com/dawn/666): Add a test case for stencil-only on stencil8 once this // Using StencilOnly of a stencil only texture is allowed.
// format is supported. {
texDesc.format = wgpu::TextureFormat::Stencil8;
viewDesc.format = wgpu::TextureFormat::Undefined;
viewDesc.aspect = wgpu::TextureAspect::StencilOnly;
wgpu::TextureView view = device.CreateTexture(&texDesc).CreateView(&viewDesc);
utils::ComboRenderPassDescriptor renderPass({}, view);
renderPass.cDepthStencilAttachmentInfo.depthLoadOp = wgpu::LoadOp::Undefined;
renderPass.cDepthStencilAttachmentInfo.depthStoreOp = wgpu::StoreOp::Undefined;
AssertBeginRenderPassSuccess(&renderPass);
}
} }
// TODO(cwallez@chromium.org): Constraints on attachment aliasing? // TODO(cwallez@chromium.org): Constraints on attachment aliasing?