Revert "Fix dynamic buffer offset issues on D3D12 backend" This reverts commit 421584173cae282ee496291b1cb08eebcad71be7. Reason for revert: Some of the newly added tests are failing on Windows NVIDIA GTX 1660 https://ci.chromium.org/p/chromium/builders/ci/Win10%20FYI%20x64%20Release%20%28NVIDIA%20GeForce%20GTX%201660%29/21 Original change's description: > Fix dynamic buffer offset issues on D3D12 backend > > This patch fixes > 1. Inherit dynamic buffer offsets : dawn chooses vulkan > like inherit behaviour, so dynamic offsets need to be inherited. > This patch adds inherit dynamic offsets between pipelines support and > adds tests to cover it. > > 2. Dynamic offsets are skipped when groups have been set : in D3D12 > backend, when invoke SetBindGroup, dawn will check whether this group > has already been set and skip updating root signature if the answer is > yes. However, this behaviour will affect dynamic offsets update. With > the latest patch, we always update dynamic offsets, even if they didn't > change and adds tests to cover it. > > This patch also hit a dawn's issue about storage buffer validation in compute pass. > Currently the validation is a workaround to avoid access conflicts but will impact > using dynamic buffer offset in compute pipeline. Fix this issue is hard so disable > related test for now and will enable it after the issue been fixed. File dawn bug > 198 to track this > > BUG=dawn:55 > > Change-Id: I2b0f179b3555d37d5b350292eb729767b0d60ab6 > Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/9621 > Commit-Queue: Austin Eng <enga@chromium.org> > Reviewed-by: Austin Eng <enga@chromium.org> > Reviewed-by: Kai Ninomiya <kainino@chromium.org> TBR=kainino@chromium.org,shaobo.yan@intel.com,enga@chromium.org # Not skipping CQ checks because original CL landed > 1 day ago. Bug: dawn:55 Change-Id: I018e6fa9b4b0905de602ab4ba3294ef537c53759 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/9900 Reviewed-by: Austin Eng <enga@chromium.org> Commit-Queue: Austin Eng <enga@chromium.org>
diff --git a/src/dawn_native/d3d12/CommandBufferD3D12.cpp b/src/dawn_native/d3d12/CommandBufferD3D12.cpp index dc9d5f0..e041f8c 100644 --- a/src/dawn_native/d3d12/CommandBufferD3D12.cpp +++ b/src/dawn_native/d3d12/CommandBufferD3D12.cpp
@@ -154,24 +154,21 @@ uint32_t dynamicOffsetCount, uint64_t* dynamicOffsets, bool force = false) { - // Usually, the application won't set the same offsets many times, - // so always try to apply dynamic offsets even if the offsets stay the same - if (dynamicOffsetCount) { - // Update dynamic offsets - const BindGroupLayout::LayoutBindingInfo& layout = - group->GetLayout()->GetBindingInfo(); + if (mBindGroups[index] != group || force) { + mBindGroups[index] = group; uint32_t currentDynamicBufferIndex = 0; + const BindGroupLayout::LayoutBindingInfo& layout = + group->GetLayout()->GetBindingInfo(); for (uint32_t bindingIndex : IterateBitSet(layout.dynamic)) { ASSERT(dynamicOffsetCount > 0); uint32_t parameterIndex = pipelineLayout->GetDynamicRootParameterIndex(index, bindingIndex); BufferBinding binding = group->GetBindingAsBufferBinding(bindingIndex); - // Calculate buffer locations that root descriptors links to. The location - // is (base buffer location + initial offset + dynamic offset) - uint64_t dynamicOffset = dynamicOffsets[currentDynamicBufferIndex]; - uint64_t offset = binding.offset + dynamicOffset; + // Calculate buffer locations that root descriptors links to. The location is + // (base buffer location + initial offset + dynamic offset) + uint64_t offset = dynamicOffsets[currentDynamicBufferIndex++] + binding.offset; D3D12_GPU_VIRTUAL_ADDRESS bufferLocation = ToBackend(binding.buffer)->GetVA() + offset; @@ -201,15 +198,7 @@ UNREACHABLE(); break; } - - // Record current dynamic offsets for inheriting - mLastDynamicOffsets[index][currentDynamicBufferIndex] = dynamicOffset; - ++currentDynamicBufferIndex; } - } - - if (mBindGroups[index] != group || force) { - mBindGroups[index] = group; uint32_t cbvUavSrvCount = ToBackend(group->GetLayout())->GetCbvUavSrvDescriptorCount(); uint32_t samplerCount = ToBackend(group->GetLayout())->GetSamplerDescriptorCount(); @@ -255,11 +244,12 @@ for (uint32_t i = 0; i < inheritUntil; ++i) { const BindGroupLayout* layout = ToBackend(mBindGroups[i]->GetLayout()); const uint32_t dynamicBufferCount = layout->GetDynamicBufferCount(); - - // Inherit dynamic offsets + // TODO(shaobo.yan@intel.com) : Need to handle dynamic resources inherited with last + // dynamic offsets. if (dynamicBufferCount > 0) { + std::vector<uint64_t> zeroOffsets(dynamicBufferCount, 0); SetBindGroup(commandList, newLayout, mBindGroups[i], i, dynamicBufferCount, - mLastDynamicOffsets[i].data(), true); + zeroOffsets.data(), true); } else { SetBindGroup(commandList, newLayout, mBindGroups[i], i, 0, nullptr, true); } @@ -290,8 +280,6 @@ uint32_t mSamplerDescriptorHeapSize = 0; std::array<BindGroup*, kMaxBindGroups> mBindGroups = {}; std::deque<BindGroup*> mBindGroupsList = {}; - std::array<std::array<uint64_t, kMaxDynamicBufferCount>, kMaxBindGroups> - mLastDynamicOffsets; bool mInCompute = false; DescriptorHeapHandle mCbvSrvUavGPUDescriptorHeap = {}; @@ -817,11 +805,9 @@ SetBindGroupCmd* cmd = mCommands.NextCommand<SetBindGroupCmd>(); BindGroup* group = ToBackend(cmd->group.Get()); uint64_t* dynamicOffsets = nullptr; - if (cmd->dynamicOffsetCount > 0) { dynamicOffsets = mCommands.NextData<uint64_t>(cmd->dynamicOffsetCount); } - bindingTracker->SetBindGroup(commandList, lastLayout, group, cmd->index, cmd->dynamicOffsetCount, dynamicOffsets); } break; @@ -1118,7 +1104,6 @@ SetBindGroupCmd* cmd = mCommands.NextCommand<SetBindGroupCmd>(); BindGroup* group = ToBackend(cmd->group.Get()); uint64_t* dynamicOffsets = nullptr; - if (cmd->dynamicOffsetCount > 0) { dynamicOffsets = mCommands.NextData<uint64_t>(cmd->dynamicOffsetCount); }
diff --git a/src/dawn_native/d3d12/PipelineLayoutD3D12.cpp b/src/dawn_native/d3d12/PipelineLayoutD3D12.cpp index 6cbb308..f5ae7c7 100644 --- a/src/dawn_native/d3d12/PipelineLayoutD3D12.cpp +++ b/src/dawn_native/d3d12/PipelineLayoutD3D12.cpp
@@ -165,7 +165,7 @@ return mSamplerRootParameterInfo[group]; } - ComPtr<ID3D12RootSignature> PipelineLayout::GetRootSignature() const { + ComPtr<ID3D12RootSignature> PipelineLayout::GetRootSignature() { return mRootSignature; }
diff --git a/src/dawn_native/d3d12/PipelineLayoutD3D12.h b/src/dawn_native/d3d12/PipelineLayoutD3D12.h index b2ee9e6..2b8358c 100644 --- a/src/dawn_native/d3d12/PipelineLayoutD3D12.h +++ b/src/dawn_native/d3d12/PipelineLayoutD3D12.h
@@ -33,7 +33,7 @@ // Returns the index of the root parameter reserved for a dynamic buffer binding uint32_t GetDynamicRootParameterIndex(uint32_t group, uint32_t binding) const; - ComPtr<ID3D12RootSignature> GetRootSignature() const; + ComPtr<ID3D12RootSignature> GetRootSignature(); private: std::array<uint32_t, kMaxBindGroups> mCbvUavSrvRootParameterInfo;
diff --git a/src/tests/end2end/DynamicBufferOffsetTests.cpp b/src/tests/end2end/DynamicBufferOffsetTests.cpp index 46c888e..f55b9e5 100644 --- a/src/tests/end2end/DynamicBufferOffsetTests.cpp +++ b/src/tests/end2end/DynamicBufferOffsetTests.cpp
@@ -52,7 +52,7 @@ mDynamicStorageBuffer = device.CreateBuffer(&storageBufferDescriptor); - mDefaultBindGroupLayout = utils::MakeBindGroupLayout( + mBindGroupLayout = utils::MakeBindGroupLayout( device, {{0, dawn::ShaderStageBit::Compute | dawn::ShaderStageBit::Fragment, dawn::BindingType::UniformBuffer}, {1, dawn::ShaderStageBit::Compute | dawn::ShaderStageBit::Fragment, @@ -62,9 +62,7 @@ {4, dawn::ShaderStageBit::Compute | dawn::ShaderStageBit::Fragment, dawn::BindingType::StorageBuffer, true}}); - mDefaultPipelineLayout = utils::MakeBasicPipelineLayout(device, &mDefaultBindGroupLayout); - - mBindGroup = utils::MakeBindGroup(device, mDefaultBindGroupLayout, + mBindGroup = utils::MakeBindGroup(device, mBindGroupLayout, {{0, mUniformBuffer, 0, kBindingSize}, {1, mStorageBuffer, 0, kBindingSize}, {3, mDynamicUniformBuffer, 0, kBindingSize}, @@ -73,48 +71,24 @@ // Create objects to use as resources inside test bind groups. dawn::BindGroup mBindGroup; - dawn::BindGroupLayout mDefaultBindGroupLayout; - dawn::PipelineLayout mDefaultPipelineLayout; + dawn::BindGroupLayout mBindGroupLayout; dawn::Buffer mUniformBuffer; dawn::Buffer mStorageBuffer; dawn::Buffer mDynamicUniformBuffer; dawn::Buffer mDynamicStorageBuffer; dawn::Texture mColorAttachment; - dawn::ShaderModule CreateDefaultCsModule() { - return utils::CreateShaderModule(device, utils::ShaderStage::Compute, R"( - #version 450 - layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; - layout(std140, set = 0, binding = 0) uniform uBufferNotDynamic { - uvec2 notDynamicValue; - }; - layout(std140, set = 0, binding = 1) buffer sBufferNotDynamic { - uvec2 notDynamicResult; - } mid; - layout(std140, set = 0, binding = 3) uniform uBuffer { - uvec2 value; - }; - layout(std140, set = 0, binding = 4) buffer SBuffer { - uvec2 result; - } sBuffer; - - void main() { - mid.notDynamicResult.xy = notDynamicValue.xy; - sBuffer.result.xy = value.xy + mid.notDynamicResult.xy; - })"); - } - - dawn::ShaderModule CreateDefaultVsModule() { - return utils::CreateShaderModule(device, utils::ShaderStage::Vertex, R"( + dawn::RenderPipeline CreateRenderPipeline() { + dawn::ShaderModule vsModule = + utils::CreateShaderModule(device, utils::ShaderStage::Vertex, R"( #version 450 void main() { const vec2 pos[3] = vec2[3](vec2(-1.0f, 0.0f), vec2(-1.0f, -1.0f), vec2(0.0f, -1.0f)); gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0); })"); - } - dawn::ShaderModule CreateDefaultFsModule() { - return utils::CreateShaderModule(device, utils::ShaderStage::Fragment, R"( + dawn::ShaderModule fsModule = + utils::CreateShaderModule(device, utils::ShaderStage::Fragment, R"( #version 450 layout(std140, set = 0, binding = 0) uniform uBufferNotDynamic { uvec2 notDynamicValue; @@ -134,10 +108,21 @@ sBuffer.result.xy = value.xy + mid.notDynamicResult.xy; fragColor = vec4(value.x / 255.0f, value.y / 255.0f, 1.0f, 1.0f); })"); + + utils::ComboRenderPipelineDescriptor pipelineDescriptor(device); + pipelineDescriptor.cVertexStage.module = vsModule; + pipelineDescriptor.cFragmentStage.module = fsModule; + pipelineDescriptor.cColorStates[0]->format = dawn::TextureFormat::RGBA8Unorm; + dawn::PipelineLayout pipelineLayout = + utils::MakeBasicPipelineLayout(device, &mBindGroupLayout); + pipelineDescriptor.layout = pipelineLayout; + + return device.CreateRenderPipeline(&pipelineDescriptor); } - dawn::ShaderModule CreateInheritCsModule() { - return utils::CreateShaderModule(device, utils::ShaderStage::Compute, R"( + dawn::ComputePipeline CreateComputePipeline() { + dawn::ShaderModule csModule = + utils::CreateShaderModule(device, utils::ShaderStage::Compute, R"( #version 450 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; layout(std140, set = 0, binding = 0) uniform uBufferNotDynamic { @@ -152,85 +137,29 @@ layout(std140, set = 0, binding = 4) buffer SBuffer { uvec2 result; } sBuffer; - layout(std140, set = 1, binding = 0) uniform paddingBlock { - uvec2 padding; - }; void main() { mid.notDynamicResult.xy = notDynamicValue.xy; - sBuffer.result.xy = 2 * (value.xy + mid.notDynamicResult.xy); + sBuffer.result.xy = value.xy + mid.notDynamicResult.xy; })"); - } - dawn::ShaderModule CreateInheritFsModule() { - return utils::CreateShaderModule(device, utils::ShaderStage::Fragment, R"( - #version 450 - layout(std140, set = 0, binding = 0) uniform uBufferNotDynamic { - uvec2 notDynamicValue; - }; - layout(std140, set = 0, binding = 1) buffer sBufferNotDynamic { - uvec2 notDynamicResult; - } mid; - layout(std140, set = 0, binding = 3) uniform uBuffer { - uvec2 value; - }; - layout(std140, set = 0, binding = 4) buffer SBuffer { - uvec2 result; - } sBuffer; - layout(std140, set = 1, binding = 0) uniform paddingBlock { - uvec2 padding; - }; - layout(location = 0) out vec4 fragColor; - - void main() { - mid.notDynamicResult.xy = notDynamicValue.xy; - sBuffer.result.xy = 2 * (value.xy + mid.notDynamicResult.xy); - fragColor = vec4(value.x / 255.0f, value.y / 255.0f, 1.0f, 1.0f); - })"); - } - - dawn::RenderPipeline CreateRenderPipeline(dawn::PipelineLayout layout, - dawn::ShaderModule vs, - dawn::ShaderModule fs) { - utils::ComboRenderPipelineDescriptor pipelineDescriptor(device); - pipelineDescriptor.cVertexStage.module = vs; - pipelineDescriptor.cFragmentStage.module = fs; - pipelineDescriptor.cColorStates[0]->format = dawn::TextureFormat::RGBA8Unorm; - pipelineDescriptor.layout = layout; - - return device.CreateRenderPipeline(&pipelineDescriptor); - } - - dawn::ComputePipeline CreateComputePipeline(dawn::PipelineLayout layout, - dawn::ShaderModule cs) { dawn::ComputePipelineDescriptor csDesc; - csDesc.layout = layout; + dawn::PipelineLayout pipelineLayout = + utils::MakeBasicPipelineLayout(device, &mBindGroupLayout); + csDesc.layout = pipelineLayout; dawn::PipelineStageDescriptor computeStage; - computeStage.module = cs; + computeStage.module = csModule; computeStage.entryPoint = "main"; csDesc.computeStage = &computeStage; return device.CreateComputePipeline(&csDesc); } - - dawn::RenderPipeline CreateDefaultRenderPipeline() { - dawn::ShaderModule vs = this->CreateDefaultVsModule(); - dawn::ShaderModule fs = this->CreateDefaultFsModule(); - - return this->CreateRenderPipeline(mDefaultPipelineLayout, vs, fs); - } - - dawn::ComputePipeline CreateDefaultComputePipeline() { - dawn::ShaderModule cs = this->CreateDefaultCsModule(); - - return this->CreateComputePipeline(mDefaultPipelineLayout, cs); - } }; // Dynamic offsets are all zero and no effect to result. TEST_P(DynamicBufferOffsetTests, BasicRenderPipeline) { - dawn::RenderPipeline pipeline = CreateDefaultRenderPipeline(); + dawn::RenderPipeline pipeline = CreateRenderPipeline(); utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize); dawn::CommandEncoder commandEncoder = device.CreateCommandEncoder(); @@ -251,7 +180,7 @@ // Have non-zero dynamic offsets. TEST_P(DynamicBufferOffsetTests, SetDynamicOffestsRenderPipeline) { - dawn::RenderPipeline pipeline = CreateDefaultRenderPipeline(); + dawn::RenderPipeline pipeline = CreateRenderPipeline(); utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize); dawn::CommandEncoder commandEncoder = device.CreateCommandEncoder(); @@ -274,7 +203,7 @@ // Dynamic offsets are all zero and no effect to result. TEST_P(DynamicBufferOffsetTests, BasicComputePipeline) { - dawn::ComputePipeline pipeline = CreateDefaultComputePipeline(); + dawn::ComputePipeline pipeline = CreateComputePipeline(); std::array<uint64_t, 2> offsets = {0, 0}; @@ -293,7 +222,7 @@ // Have non-zero dynamic offsets. TEST_P(DynamicBufferOffsetTests, SetDynamicOffestsComputePipeline) { - dawn::ComputePipeline pipeline = CreateDefaultComputePipeline(); + dawn::ComputePipeline pipeline = CreateComputePipeline(); std::array<uint64_t, 2> offsets = {kMinDynamicBufferOffsetAlignment, kMinDynamicBufferOffsetAlignment}; @@ -312,147 +241,6 @@ kMinDynamicBufferOffsetAlignment, expectedData.size()); } -// Test inherit dynamic offsets on render pipeline -TEST_P(DynamicBufferOffsetTests, InheritDynamicOffestsRenderPipeline) { - // Using default pipeline and setting dynamic offsets - dawn::RenderPipeline pipeline = CreateDefaultRenderPipeline(); - - dawn::ShaderModule testVs = CreateDefaultVsModule(); - dawn::ShaderModule testFs = CreateInheritFsModule(); - dawn::BindGroupLayout bgl[2]; - bgl[0] = mDefaultBindGroupLayout; - bgl[1] = utils::MakeBindGroupLayout( - device, {{0, dawn::ShaderStageBit::Fragment, dawn::BindingType::UniformBuffer}}); - dawn::PipelineLayoutDescriptor descriptor; - descriptor.bindGroupLayoutCount = 2; - descriptor.bindGroupLayouts = bgl; - dawn::PipelineLayout layout = device.CreatePipelineLayout(&descriptor); - dawn::RenderPipeline testPipeline = CreateRenderPipeline(layout, testVs, testFs); - - std::array<uint32_t, kBufferElementsCount> uniformData = {0}; - - dawn::Buffer uniformBuffer = utils::CreateBufferFromData( - device, uniformData.data(), kBufferSize, dawn::BufferUsageBit::Uniform); - dawn::BindGroup bindGroup = - utils::MakeBindGroup(device, bgl[1], {{0, uniformBuffer, 0, kBindingSize}}); - - utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize); - - dawn::CommandEncoder commandEncoder = device.CreateCommandEncoder(); - std::array<uint64_t, 2> offsets = {kMinDynamicBufferOffsetAlignment, - kMinDynamicBufferOffsetAlignment}; - dawn::RenderPassEncoder renderPassEncoder = - commandEncoder.BeginRenderPass(&renderPass.renderPassInfo); - renderPassEncoder.SetPipeline(pipeline); - renderPassEncoder.SetBindGroup(0, mBindGroup, offsets.size(), offsets.data()); - renderPassEncoder.Draw(3, 1, 0, 0); - renderPassEncoder.SetPipeline(testPipeline); - renderPassEncoder.SetBindGroup(1, bindGroup, 0, nullptr); - renderPassEncoder.Draw(3, 1, 0, 0); - renderPassEncoder.EndPass(); - dawn::CommandBuffer commands = commandEncoder.Finish(); - queue.Submit(1, &commands); - - std::vector<uint32_t> expectedData = {12, 16}; - EXPECT_PIXEL_RGBA8_EQ(RGBA8(5, 6, 255, 255), renderPass.color, 0, 0); - EXPECT_BUFFER_U32_RANGE_EQ(expectedData.data(), mDynamicStorageBuffer, - kMinDynamicBufferOffsetAlignment, expectedData.size()); -} - -// Test inherit dynamic offsets on compute pipeline -TEST_P(DynamicBufferOffsetTests, InheritDynamicOffestsComputePipeline) { - dawn::ComputePipeline pipeline = CreateDefaultComputePipeline(); - - dawn::ShaderModule testCs = CreateInheritCsModule(); - dawn::BindGroupLayout bgl[2]; - bgl[0] = mDefaultBindGroupLayout; - bgl[1] = utils::MakeBindGroupLayout( - device, {{0, dawn::ShaderStageBit::Compute, dawn::BindingType::UniformBuffer}}); - dawn::PipelineLayoutDescriptor descriptor; - descriptor.bindGroupLayoutCount = 2; - descriptor.bindGroupLayouts = bgl; - dawn::PipelineLayout layout = device.CreatePipelineLayout(&descriptor); - dawn::ComputePipeline testPipeline = CreateComputePipeline(layout, testCs); - - std::array<uint32_t, kBufferElementsCount> uniformData = {0}; - - dawn::Buffer uniformBuffer = utils::CreateBufferFromData( - device, uniformData.data(), kBufferSize, dawn::BufferUsageBit::Uniform); - dawn::BindGroup bindGroup = - utils::MakeBindGroup(device, bgl[1], {{0, uniformBuffer, 0, kBindingSize}}); - - std::array<uint64_t, 2> offsets = {kMinDynamicBufferOffsetAlignment, - kMinDynamicBufferOffsetAlignment}; - - dawn::CommandEncoder commandEncoder = device.CreateCommandEncoder(); - dawn::ComputePassEncoder computePassEncoder = commandEncoder.BeginComputePass(); - computePassEncoder.SetPipeline(pipeline); - computePassEncoder.SetBindGroup(0, mBindGroup, offsets.size(), offsets.data()); - computePassEncoder.Dispatch(1, 1, 1); - computePassEncoder.SetPipeline(testPipeline); - computePassEncoder.SetBindGroup(1, bindGroup, 0, nullptr); - computePassEncoder.Dispatch(1, 1, 1); - computePassEncoder.EndPass(); - dawn::CommandBuffer commands = commandEncoder.Finish(); - queue.Submit(1, &commands); - - std::vector<uint32_t> expectedData = {12, 16}; - EXPECT_BUFFER_U32_RANGE_EQ(expectedData.data(), mDynamicStorageBuffer, - kMinDynamicBufferOffsetAlignment, expectedData.size()); -} - -// Setting multiple dynamic offsets for the same bindgroup in one render pass. -TEST_P(DynamicBufferOffsetTests, UpdateDynamicOffestsMultipleTimesRenderPipeline) { - // Using default pipeline and setting dynamic offsets - dawn::RenderPipeline pipeline = CreateDefaultRenderPipeline(); - - utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize); - - dawn::CommandEncoder commandEncoder = device.CreateCommandEncoder(); - std::array<uint64_t, 2> offsets = {kMinDynamicBufferOffsetAlignment, - kMinDynamicBufferOffsetAlignment}; - std::array<uint64_t, 2> testOffsets = {0, 0}; - - dawn::RenderPassEncoder renderPassEncoder = - commandEncoder.BeginRenderPass(&renderPass.renderPassInfo); - renderPassEncoder.SetPipeline(pipeline); - renderPassEncoder.SetBindGroup(0, mBindGroup, offsets.size(), offsets.data()); - renderPassEncoder.Draw(3, 1, 0, 0); - renderPassEncoder.SetBindGroup(0, mBindGroup, testOffsets.size(), testOffsets.data()); - renderPassEncoder.Draw(3, 1, 0, 0); - renderPassEncoder.EndPass(); - dawn::CommandBuffer commands = commandEncoder.Finish(); - queue.Submit(1, &commands); - - std::vector<uint32_t> expectedData = {2, 4}; - EXPECT_PIXEL_RGBA8_EQ(RGBA8(1, 2, 255, 255), renderPass.color, 0, 0); - EXPECT_BUFFER_U32_RANGE_EQ(expectedData.data(), mDynamicStorageBuffer, 0, expectedData.size()); -} - -// Setting multiple dynamic offsets for the same bindgroup in one compute pass. -// TODO(shaobo.yan@intel.com) : enable this test after resolving dawn issue 198. -TEST_P(DynamicBufferOffsetTests, DISABLED_UpdateDynamicOffestsMultipleTimesComputePipeline) { - dawn::ComputePipeline pipeline = CreateDefaultComputePipeline(); - - std::array<uint64_t, 2> offsets = {kMinDynamicBufferOffsetAlignment, - kMinDynamicBufferOffsetAlignment}; - std::array<uint64_t, 2> testOffsets = {0, 0}; - - dawn::CommandEncoder commandEncoder = device.CreateCommandEncoder(); - dawn::ComputePassEncoder computePassEncoder = commandEncoder.BeginComputePass(); - computePassEncoder.SetPipeline(pipeline); - computePassEncoder.SetBindGroup(0, mBindGroup, offsets.size(), offsets.data()); - computePassEncoder.Dispatch(1, 1, 1); - computePassEncoder.SetBindGroup(0, mBindGroup, testOffsets.size(), testOffsets.data()); - computePassEncoder.Dispatch(1, 1, 1); - computePassEncoder.EndPass(); - dawn::CommandBuffer commands = commandEncoder.Finish(); - queue.Submit(1, &commands); - - std::vector<uint32_t> expectedData = {2, 4}; - EXPECT_BUFFER_U32_RANGE_EQ(expectedData.data(), mDynamicStorageBuffer, 0, expectedData.size()); -} - DAWN_INSTANTIATE_TEST(DynamicBufferOffsetTests, D3D12Backend, MetalBackend,