[dawn][metal] ArgBufs: fix dynamic offsets buffer index matching There should be one dynamic offsets buffer per bind group. ShaderModuleMTL was accidentally trying to make one per binding. Test: BindGroupTests.DynamicOffsetOrder Bug: 363031535 Change-Id: I997cc6c378d8526f2a1c63022be240d10e7c4503 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/294095 Reviewed-by: dan sinclair <dsinclair@chromium.org> Commit-Queue: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/dawn/native/metal/CommandBufferMTL.mm b/src/dawn/native/metal/CommandBufferMTL.mm index 9e6c35d..e395351 100644 --- a/src/dawn/native/metal/CommandBufferMTL.mm +++ b/src/dawn/native/metal/CommandBufferMTL.mm
@@ -671,18 +671,18 @@ BindGroup* group = ToBackend(mBindGroups[index]); auto* layout = ToBackend(mPipelineLayout->GetBindGroupLayout(index)); - // Note, this argument buffer index must match to the ShaderModuleMTL - // #argument-buffer-index + // Note, both of these buffer index values need to match up to the value set in the + // ShaderModuleMTL #argument-buffer-and-dynamic-offsets-buffer-indices uint32_t argumentBufferIdx = curBufferIdx--; - std::optional<uint32_t> dynamicBufferIdx = std::nullopt; - // TODO(crbug.com/363031535): The dynamic offsets should all be in a single grouping // which is in the immediates buffer. + std::optional<uint32_t> dynamicOffsetsBufferIdx = std::nullopt; if (uint32_t(layout->GetDynamicBufferCount()) > 0u) { - dynamicBufferIdx = curBufferIdx--; + dynamicOffsetsBufferIdx = curBufferIdx--; } + ApplyBindGroup(encoder, index, group, GetDynamicOffsets(index), - ToBackend(mPipelineLayout), argumentBufferIdx, dynamicBufferIdx); + ToBackend(mPipelineLayout), argumentBufferIdx, dynamicOffsetsBufferIdx); } AfterApply();
diff --git a/src/dawn/native/metal/ShaderModuleMTL.mm b/src/dawn/native/metal/ShaderModuleMTL.mm index 1a43806..13f4c0a 100644 --- a/src/dawn/native/metal/ShaderModuleMTL.mm +++ b/src/dawn/native/metal/ShaderModuleMTL.mm
@@ -166,18 +166,25 @@ return {}; } - // TODO(363031535): The dynamic offsets should all move to be immediates and contained into a - // single buffer. std::unordered_map<uint32_t, tint::msl::writer::ArgumentBufferInfo> info = {}; uint32_t curBufferIdx = kArgumentBufferSlotMax; for (BindGroupIndex group : layout->GetBindGroupLayoutsMask()) { const BindGroupLayout* bgl = ToBackend(layout->GetBindGroupLayout(group)); - // Node, this buffer index value needs to match up to the value set in the - // CommandBufferMTL #argument-buffer-index + // Note, both of these buffer index values need to match up to the value set in the + // CommandBufferMTL #argument-buffer-and-dynamic-offsets-buffer-indices + uint32_t argumentBufferIdx = curBufferIdx--; + // TODO(crbug.com/363031535): The dynamic offsets should all be in a single grouping + // which is in the immediates buffer. + std::optional<uint32_t> dynamicOffsetsBufferIdx = std::nullopt; + if (uint32_t(bgl->GetDynamicBufferCount()) > 0u) { + dynamicOffsetsBufferIdx = curBufferIdx--; + } + tint::msl::writer::ArgumentBufferInfo argBufferInfo = { - .id = curBufferIdx--, + .id = argumentBufferIdx, + .dynamic_buffer_id = dynamicOffsetsBufferIdx, }; uint32_t curDynamicOffset = 0; @@ -189,8 +196,6 @@ bindingInfo.bindingLayout, // [&](const BufferBindingInfo& binding) { if (binding.hasDynamicOffset) { - argBufferInfo.dynamic_buffer_id = curBufferIdx--; - argBufferInfo.binding_info_to_offset_index.insert( {static_cast<uint32_t>(bindingInfo.binding), curDynamicOffset++}); }