Only call WillBeginRenderPass when encoder is current

Fixes an ASSERT when a render pass is started while another pass is
already current.

Bug: chromium:1253090
Change-Id: I085c1de225f9ba30a7f368fad3b1d8a97ed92c63
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/65241
Auto-Submit: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Reviewed-by: Ken Rockot <rockot@google.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Brandon Jones <bajones@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
Corentin Wallez 2021-09-28 15:55:42 +00:00 committed by Dawn LUCI CQ
parent e2c74d0b9d
commit 347a597f7d
2 changed files with 26 additions and 1 deletions

View File

@ -513,7 +513,6 @@ namespace dawn_native {
uint32_t width = 0; uint32_t width = 0;
uint32_t height = 0; uint32_t height = 0;
Ref<AttachmentState> attachmentState; Ref<AttachmentState> attachmentState;
mEncodingContext.WillBeginRenderPass();
bool success = bool success =
mEncodingContext.TryEncode(this, [&](CommandAllocator* allocator) -> MaybeError { mEncodingContext.TryEncode(this, [&](CommandAllocator* allocator) -> MaybeError {
uint32_t sampleCount = 0; uint32_t sampleCount = 0;
@ -523,6 +522,7 @@ namespace dawn_native {
ASSERT(width > 0 && height > 0 && sampleCount > 0); ASSERT(width > 0 && height > 0 && sampleCount > 0);
mEncodingContext.WillBeginRenderPass();
BeginRenderPassCmd* cmd = BeginRenderPassCmd* cmd =
allocator->Allocate<BeginRenderPassCmd>(Command::BeginRenderPass); allocator->Allocate<BeginRenderPassCmd>(Command::BeginRenderPass);

View File

@ -146,6 +146,31 @@ TEST_F(CommandBufferValidationTest, BeginComputePassBeforeEndPreviousPass) {
} }
} }
// Test that beginning a render pass before ending the previous pass causes an error.
TEST_F(CommandBufferValidationTest, BeginRenderPassBeforeEndPreviousPass) {
DummyRenderPass dummyRenderPass(device);
// Beginning a render pass before ending the render pass causes an error.
{
wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
wgpu::RenderPassEncoder renderPass1 = encoder.BeginRenderPass(&dummyRenderPass);
wgpu::RenderPassEncoder renderPass2 = encoder.BeginRenderPass(&dummyRenderPass);
renderPass2.EndPass();
renderPass1.EndPass();
ASSERT_DEVICE_ERROR(encoder.Finish());
}
// Beginning a compute pass before ending a compute pass causes an error.
{
wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
wgpu::ComputePassEncoder computePass = encoder.BeginComputePass();
wgpu::RenderPassEncoder renderPass = encoder.BeginRenderPass(&dummyRenderPass);
renderPass.EndPass();
computePass.EndPass();
ASSERT_DEVICE_ERROR(encoder.Finish());
}
}
// Test that encoding command after a successful finish produces an error // Test that encoding command after a successful finish produces an error
TEST_F(CommandBufferValidationTest, CallsAfterASuccessfulFinish) { TEST_F(CommandBufferValidationTest, CallsAfterASuccessfulFinish) {
// A buffer that can be used in CopyBufferToBuffer // A buffer that can be used in CopyBufferToBuffer