[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++});
                     }