Minor fixed to render bundle indirect draw test Simplifies the indirect buffer usage and fixes some minor issues that were revealed when working on a fix for the behavior under test in Dawn. Bug: 495489174 Change-Id: I0dd4ce6eb70eb0cc5ada1ad9b62f1267062c3339 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/305696 Auto-Submit: Brandon Jones <bajones@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Brandon Jones <bajones@chromium.org>
diff --git a/src/dawn/tests/end2end/RenderBundleTests.cpp b/src/dawn/tests/end2end/RenderBundleTests.cpp index 37e79ea..a954888 100644 --- a/src/dawn/tests/end2end/RenderBundleTests.cpp +++ b/src/dawn/tests/end2end/RenderBundleTests.cpp
@@ -357,10 +357,8 @@ bufferDesc.usage = wgpu::BufferUsage::Index; wgpu::Buffer bigIdx = device.CreateBuffer(&bufferDesc); - // Indirect buffers - wgpu::Buffer indirect[2]; - indirect[0] = CreateIndirectBuffer({3, 1, 100, 0, 0}); - indirect[1] = CreateIndirectBuffer({3, 1, 0, 0, 0, OOB_COUNT, 1, 0, 0, 0}); + // Indirect buffer + wgpu::Buffer indirect = CreateIndirectBuffer({3, 1, 0, 0, 0, OOB_COUNT, 1, 0, 0, 0}); // Buffers to use for simple fragment counter uint32_t data[] = {0}; @@ -404,7 +402,7 @@ renderBundleEncoder.SetPipeline(pipeline); renderBundleEncoder.SetBindGroup(0, bindGroup); renderBundleEncoder.SetIndexBuffer(smallIdx, wgpu::IndexFormat::Uint32); - renderBundleEncoder.DrawIndexedIndirect(indirect[0], 0); + renderBundleEncoder.DrawIndexedIndirect(indirect, 0); wgpu::RenderBundle renderBundle = renderBundleEncoder.Finish(); // @@ -418,14 +416,21 @@ pass.SetPipeline(pipeline); pass.SetBindGroup(0, bindGroup); pass.SetIndexBuffer(bigIdx, wgpu::IndexFormat::Uint32); - pass.DrawIndexedIndirect(indirect[1], 0); - pass.DrawIndexedIndirect(indirect[1], 20); + pass.DrawIndexedIndirect(indirect, 0); + pass.DrawIndexedIndirect(indirect, 20); pass.End(); + + // Copy the fragment counter results to the readback buffer. + encoder.CopyBufferToBuffer(counterBuffer, 0, counterRead, 0, 4); + wgpu::CommandBuffer commands = encoder.Finish(); queue.Submit(1, &commands); queue.WriteBuffer(counterBuffer, 0, data, sizeof(uint32_t)); } + // The warm up pass should always produce OOB_COUNT + 3 fragments from the two indirect draws. + EXPECT_BUFFER_U32_EQ(OOB_COUNT + 3, counterRead, 0); + // // Bug - Same bundle executed in two render passes of one encoder. // Pass 1: Bundle only. Validation rewrites the bundle's persistent @@ -455,7 +460,7 @@ pass.SetPipeline(pipeline); pass.SetBindGroup(0, bindGroup); pass.SetIndexBuffer(smallIdx, wgpu::IndexFormat::Uint32); - pass.DrawIndexedIndirect(indirect[0], 0); + pass.DrawIndexedIndirect(indirect, 0); pass.ExecuteBundles(1, &renderBundle); pass.End(); }