Use BitSetRangeIterator for immediate data uploading in vulkan

Use BitSetRangeIterator to replace bit iterator in immediate data
uploading part in vulkan backend. It simplifies the code by removing
calculating the range in uploading loop.

Bug: 366291600
Change-Id: I9f6f660184d2f1b6ffed4ae12e67d9552b5c96a4
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/246874
Commit-Queue: Shaobo Yan <shaoboyan@microsoft.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/dawn/native/d3d11/CommandBufferD3D11.cpp b/src/dawn/native/d3d11/CommandBufferD3D11.cpp
index 5d2c2d9..20b58ed 100644
--- a/src/dawn/native/d3d11/CommandBufferD3D11.cpp
+++ b/src/dawn/native/d3d11/CommandBufferD3D11.cpp
@@ -231,12 +231,10 @@
 
         ImmediateConstantMask pipelineMask = lastPipeline->GetImmediateMask();
         ImmediateConstantMask uploadBits = this->mDirty & pipelineMask;
-        uint32_t immediateRangeStartOffset = 0;
-        uint32_t immediateContentStartOffset = 0;
         for (auto&& [offset, size] : IterateRanges(uploadBits)) {
-            immediateContentStartOffset =
+            uint32_t immediateContentStartOffset =
                 static_cast<uint32_t>(offset) * kImmediateConstantElementByteSize;
-            immediateRangeStartOffset =
+            uint32_t immediateRangeStartOffset =
                 GetImmediateIndexInPipeline(static_cast<uint32_t>(offset), pipelineMask);
             commandContext->WriteUniformBufferRange(
                 immediateRangeStartOffset,
diff --git a/src/dawn/native/vulkan/CommandBufferVk.cpp b/src/dawn/native/vulkan/CommandBufferVk.cpp
index 25539fe..1e8573d 100644
--- a/src/dawn/native/vulkan/CommandBufferVk.cpp
+++ b/src/dawn/native/vulkan/CommandBufferVk.cpp
@@ -205,26 +205,18 @@
             return;
         }
 
-        const ImmediateConstantMask& pipelineImmediateMask = lastPipeline->GetImmediateMask();
-
-        uint32_t pushConstantRangeStartOffset = 0;
-        uint32_t immediateContentStartOffset = 0;
-
+        const ImmediateConstantMask& pipelineMask = lastPipeline->GetImmediateMask();
         ImmediateConstantMask uploadBits = this->mDirty & lastPipeline->GetImmediateMask();
-        ImmediateConstantMask prefixBits = ImmediateConstantMask(0u);
-
-        // TODO(crbug.com/366291600): Add IterateBitRanges helper function to achieve iteration on
-        // ranges.
-        for (ImmediateConstantIndex i : lastPipeline->GetImmediateMask()) {
-            uint32_t index = static_cast<uint32_t>(i);
-            prefixBits = (1u << index) - 1u;
-            pushConstantRangeStartOffset =
-                (prefixBits & pipelineImmediateMask).count() * kImmediateConstantElementByteSize;
-            immediateContentStartOffset = index * kImmediateConstantElementByteSize;
+        for (auto&& [offset, size] : IterateRanges(uploadBits)) {
+            uint32_t immediateContentStartOffset =
+                static_cast<uint32_t>(offset) * kImmediateConstantElementByteSize;
+            uint32_t pushConstantRangeStartOffset =
+                GetImmediateIndexInPipeline(static_cast<uint32_t>(offset), pipelineMask) *
+                kImmediateConstantElementByteSize;
             device->fn.CmdPushConstants(
                 commandBuffer, ToBackend(lastPipeline)->GetVkLayout(),
                 ToBackend(lastPipeline->GetLayout())->GetImmediateDataRangeStage(),
-                pushConstantRangeStartOffset, kImmediateConstantElementByteSize,
+                pushConstantRangeStartOffset, size * kImmediateConstantElementByteSize,
                 this->mContent.template Get<uint32_t>(immediateContentStartOffset));
         }