Support and pack unbounded binding numbers in the BGL

Also fixes a bug where we weren't validating duplicating
bindings in the shader, and where dynamic offset validation
could be incorrectly fetching the wrong bindings.

Bug: dawn:354
Change-Id: I93178c34eb4d43119e8b9de5738ae4596e9277cd
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/17240
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Commit-Queue: Austin Eng <enga@chromium.org>
diff --git a/src/dawn_native/opengl/PipelineLayoutGL.cpp b/src/dawn_native/opengl/PipelineLayoutGL.cpp
index 18fd4f2..7048d5e 100644
--- a/src/dawn_native/opengl/PipelineLayoutGL.cpp
+++ b/src/dawn_native/opengl/PipelineLayoutGL.cpp
@@ -28,30 +28,28 @@
         GLuint ssboIndex = 0;
 
         for (uint32_t group : IterateBitSet(GetBindGroupLayoutsMask())) {
-            const auto& groupInfo = GetBindGroupLayout(group)->GetBindingInfo();
+            const BindGroupLayoutBase::LayoutBindingInfo& groupInfo =
+                GetBindGroupLayout(group)->GetBindingInfo();
 
-            for (size_t binding = 0; binding < kMaxBindingsPerGroup; ++binding) {
-                if (!groupInfo.mask[binding]) {
-                    continue;
-                }
-
-                switch (groupInfo.types[binding]) {
+            for (BindingIndex bindingIndex = 0; bindingIndex < groupInfo.bindingCount;
+                 ++bindingIndex) {
+                switch (groupInfo.types[bindingIndex]) {
                     case wgpu::BindingType::UniformBuffer:
-                        mIndexInfo[group][binding] = uboIndex;
+                        mIndexInfo[group][bindingIndex] = uboIndex;
                         uboIndex++;
                         break;
                     case wgpu::BindingType::Sampler:
-                        mIndexInfo[group][binding] = samplerIndex;
+                        mIndexInfo[group][bindingIndex] = samplerIndex;
                         samplerIndex++;
                         break;
                     case wgpu::BindingType::SampledTexture:
-                        mIndexInfo[group][binding] = sampledTextureIndex;
+                        mIndexInfo[group][bindingIndex] = sampledTextureIndex;
                         sampledTextureIndex++;
                         break;
 
                     case wgpu::BindingType::StorageBuffer:
                     case wgpu::BindingType::ReadonlyStorageBuffer:
-                        mIndexInfo[group][binding] = ssboIndex;
+                        mIndexInfo[group][bindingIndex] = ssboIndex;
                         ssboIndex++;
                         break;