mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-05-15 11:51:22 +00:00
Fix a bug in ResourceUsageTrackingTests
When we test resource per draw/dispatch, we need to set pipeline, etc., in addition to set bind groups. Bug: dawn:358 Change-Id: Ic51986d0608baf786521158c887a0c1ced7ccacf Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/20800 Commit-Queue: Yunchao He <yunchao.he@intel.com> Reviewed-by: Kai Ninomiya <kainino@chromium.org>
This commit is contained in:
parent
303a3daf0d
commit
ccc40f6ffa
@ -42,6 +42,38 @@ namespace {
|
|||||||
return device.CreateTexture(&descriptor);
|
return device.CreateTexture(&descriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wgpu::RenderPipeline CreateNoOpRenderPipeline() {
|
||||||
|
wgpu::ShaderModule vsModule =
|
||||||
|
utils::CreateShaderModule(device, utils::SingleShaderStage::Vertex, R"(
|
||||||
|
#version 450
|
||||||
|
void main() {
|
||||||
|
})");
|
||||||
|
|
||||||
|
wgpu::ShaderModule fsModule =
|
||||||
|
utils::CreateShaderModule(device, utils::SingleShaderStage::Fragment, R"(
|
||||||
|
#version 450
|
||||||
|
void main() {
|
||||||
|
})");
|
||||||
|
utils::ComboRenderPipelineDescriptor pipelineDescriptor(device);
|
||||||
|
pipelineDescriptor.vertexStage.module = vsModule;
|
||||||
|
pipelineDescriptor.cFragmentStage.module = fsModule;
|
||||||
|
pipelineDescriptor.layout = utils::MakeBasicPipelineLayout(device, nullptr);
|
||||||
|
return device.CreateRenderPipeline(&pipelineDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
wgpu::ComputePipeline CreateNoOpComputePipeline() {
|
||||||
|
wgpu::ShaderModule csModule =
|
||||||
|
utils::CreateShaderModule(device, utils::SingleShaderStage::Compute, R"(
|
||||||
|
#version 450
|
||||||
|
void main() {
|
||||||
|
})");
|
||||||
|
wgpu::ComputePipelineDescriptor pipelineDescriptor;
|
||||||
|
pipelineDescriptor.layout = utils::MakeBasicPipelineLayout(device, nullptr);
|
||||||
|
pipelineDescriptor.computeStage.module = csModule;
|
||||||
|
pipelineDescriptor.computeStage.entryPoint = "main";
|
||||||
|
return device.CreateComputePipeline(&pipelineDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
static constexpr wgpu::TextureFormat kFormat = wgpu::TextureFormat::RGBA8Unorm;
|
static constexpr wgpu::TextureFormat kFormat = wgpu::TextureFormat::RGBA8Unorm;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -217,8 +249,9 @@ namespace {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test that using the same buffer as both readable and writable in the different draws is
|
// Test that it is invalid to use the same buffer as both readable and writable in different
|
||||||
// disallowed
|
// draws in a single render pass. But it is valid in different dispatches in a single compute
|
||||||
|
// pass.
|
||||||
TEST_F(ResourceUsageTrackingTest, BufferWithReadAndWriteUsageInDifferentDrawsOrDispatches) {
|
TEST_F(ResourceUsageTrackingTest, BufferWithReadAndWriteUsageInDifferentDrawsOrDispatches) {
|
||||||
// Test render pass
|
// Test render pass
|
||||||
{
|
{
|
||||||
@ -229,11 +262,16 @@ namespace {
|
|||||||
device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer}});
|
device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::StorageBuffer}});
|
||||||
wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, buffer, 0, 4}});
|
wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, buffer, 0, 4}});
|
||||||
|
|
||||||
|
// Create a no-op render pipeline. Note that bind groups can have more bindings
|
||||||
|
// than pipeline.
|
||||||
|
wgpu::RenderPipeline rp = CreateNoOpRenderPipeline();
|
||||||
|
|
||||||
// It is not allowed to use the same buffer as both readable and writable in different
|
// It is not allowed to use the same buffer as both readable and writable in different
|
||||||
// draws within the same render pass.
|
// draws within the same render pass.
|
||||||
wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
|
wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
|
||||||
DummyRenderPass dummyRenderPass(device);
|
DummyRenderPass dummyRenderPass(device);
|
||||||
wgpu::RenderPassEncoder pass = encoder.BeginRenderPass(&dummyRenderPass);
|
wgpu::RenderPassEncoder pass = encoder.BeginRenderPass(&dummyRenderPass);
|
||||||
|
pass.SetPipeline(rp);
|
||||||
|
|
||||||
pass.SetIndexBuffer(buffer);
|
pass.SetIndexBuffer(buffer);
|
||||||
pass.Draw(3);
|
pass.Draw(3);
|
||||||
@ -258,10 +296,15 @@ namespace {
|
|||||||
wgpu::BindGroup bg0 = utils::MakeBindGroup(device, bgl0, {{0, buffer, 0, 4}});
|
wgpu::BindGroup bg0 = utils::MakeBindGroup(device, bgl0, {{0, buffer, 0, 4}});
|
||||||
wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl1, {{0, buffer, 0, 4}});
|
wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl1, {{0, buffer, 0, 4}});
|
||||||
|
|
||||||
// It is not allowed to use the same buffer as both readable and writable in different
|
// Create a no-op compute pipeline. Note that bind groups can have more bindings
|
||||||
|
// than pipeline.
|
||||||
|
wgpu::ComputePipeline cp = CreateNoOpComputePipeline();
|
||||||
|
|
||||||
|
// It is valid to use the same buffer as both readable and writable in different
|
||||||
// dispatches within the same compute pass.
|
// dispatches within the same compute pass.
|
||||||
wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
|
wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
|
||||||
wgpu::ComputePassEncoder pass = encoder.BeginComputePass();
|
wgpu::ComputePassEncoder pass = encoder.BeginComputePass();
|
||||||
|
pass.SetPipeline(cp);
|
||||||
|
|
||||||
pass.SetBindGroup(0, bg0);
|
pass.SetBindGroup(0, bg0);
|
||||||
pass.Dispatch(1);
|
pass.Dispatch(1);
|
||||||
@ -270,7 +313,7 @@ namespace {
|
|||||||
pass.Dispatch(1);
|
pass.Dispatch(1);
|
||||||
|
|
||||||
pass.EndPass();
|
pass.EndPass();
|
||||||
ASSERT_DEVICE_ERROR(encoder.Finish());
|
encoder.Finish();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -439,17 +482,9 @@ namespace {
|
|||||||
wgpu::BindGroup readBG0 = utils::MakeBindGroup(device, readBGL, {{0, buffer0, 256, 4}});
|
wgpu::BindGroup readBG0 = utils::MakeBindGroup(device, readBGL, {{0, buffer0, 256, 4}});
|
||||||
wgpu::BindGroup readBG1 = utils::MakeBindGroup(device, readBGL, {{0, buffer1, 0, 4}});
|
wgpu::BindGroup readBG1 = utils::MakeBindGroup(device, readBGL, {{0, buffer1, 0, 4}});
|
||||||
|
|
||||||
// Create a passthrough compute pipeline
|
// Create a no-op compute pipeline. Note that bind groups can have more bindings
|
||||||
wgpu::ShaderModule csModule =
|
// than pipeline.
|
||||||
utils::CreateShaderModule(device, utils::SingleShaderStage::Compute, R"(
|
wgpu::ComputePipeline cp = CreateNoOpComputePipeline();
|
||||||
#version 450
|
|
||||||
void main() {
|
|
||||||
})");
|
|
||||||
wgpu::ComputePipelineDescriptor pipelineDescriptor;
|
|
||||||
pipelineDescriptor.layout = utils::MakeBasicPipelineLayout(device, &writeBGL);
|
|
||||||
pipelineDescriptor.computeStage.module = csModule;
|
|
||||||
pipelineDescriptor.computeStage.entryPoint = "main";
|
|
||||||
wgpu::ComputePipeline cp = device.CreateComputePipeline(&pipelineDescriptor);
|
|
||||||
|
|
||||||
// Set bind group against the same index twice. The second one overwrites the first one.
|
// Set bind group against the same index twice. The second one overwrites the first one.
|
||||||
// Then no buffer is used as both read and write in the same pass. But the overwritten
|
// Then no buffer is used as both read and write in the same pass. But the overwritten
|
||||||
@ -631,7 +666,7 @@ namespace {
|
|||||||
wgpu::BindGroup bg0 = utils::MakeBindGroup(device, bgl0, {{0, buffer}});
|
wgpu::BindGroup bg0 = utils::MakeBindGroup(device, bgl0, {{0, buffer}});
|
||||||
wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl1, {{0, buffer}});
|
wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl1, {{0, buffer}});
|
||||||
|
|
||||||
// Create a passthrough render pipeline
|
// Create a passthrough render pipeline with a readonly buffer
|
||||||
wgpu::ShaderModule vsModule =
|
wgpu::ShaderModule vsModule =
|
||||||
utils::CreateShaderModule(device, utils::SingleShaderStage::Vertex, R"(
|
utils::CreateShaderModule(device, utils::SingleShaderStage::Vertex, R"(
|
||||||
#version 450
|
#version 450
|
||||||
@ -678,7 +713,7 @@ namespace {
|
|||||||
wgpu::BindGroup bg0 = utils::MakeBindGroup(device, bgl0, {{0, buffer}});
|
wgpu::BindGroup bg0 = utils::MakeBindGroup(device, bgl0, {{0, buffer}});
|
||||||
wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl1, {{0, buffer}});
|
wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl1, {{0, buffer}});
|
||||||
|
|
||||||
// Create a passthrough compute pipeline
|
// Create a passthrough compute pipeline with a readonly buffer
|
||||||
wgpu::ShaderModule csModule =
|
wgpu::ShaderModule csModule =
|
||||||
utils::CreateShaderModule(device, utils::SingleShaderStage::Compute, R"(
|
utils::CreateShaderModule(device, utils::SingleShaderStage::Compute, R"(
|
||||||
#version 450
|
#version 450
|
||||||
@ -898,17 +933,9 @@ namespace {
|
|||||||
wgpu::BindGroup readBG0 = utils::MakeBindGroup(device, readBGL, {{0, view0}});
|
wgpu::BindGroup readBG0 = utils::MakeBindGroup(device, readBGL, {{0, view0}});
|
||||||
wgpu::BindGroup readBG1 = utils::MakeBindGroup(device, readBGL, {{0, view1}});
|
wgpu::BindGroup readBG1 = utils::MakeBindGroup(device, readBGL, {{0, view1}});
|
||||||
|
|
||||||
// Create a passthrough compute pipeline
|
// Create a no-op compute pipeline. Note that bind groups can have more bindings
|
||||||
wgpu::ShaderModule csModule =
|
// than pipeline.
|
||||||
utils::CreateShaderModule(device, utils::SingleShaderStage::Compute, R"(
|
wgpu::ComputePipeline cp = CreateNoOpComputePipeline();
|
||||||
#version 450
|
|
||||||
void main() {
|
|
||||||
})");
|
|
||||||
wgpu::ComputePipelineDescriptor pipelineDescriptor;
|
|
||||||
pipelineDescriptor.layout = utils::MakeBasicPipelineLayout(device, &writeBGL);
|
|
||||||
pipelineDescriptor.computeStage.module = csModule;
|
|
||||||
pipelineDescriptor.computeStage.entryPoint = "main";
|
|
||||||
wgpu::ComputePipeline cp = device.CreateComputePipeline(&pipelineDescriptor);
|
|
||||||
|
|
||||||
// Set bind group on the same index twice. The second one overwrites the first one.
|
// Set bind group on the same index twice. The second one overwrites the first one.
|
||||||
// No texture is used as both readonly and writeonly storage in the same pass. But the
|
// No texture is used as both readonly and writeonly storage in the same pass. But the
|
||||||
|
Loading…
x
Reference in New Issue
Block a user