Deprecate BG[L]Desc::binding[s|Count] in favor of entr[ies|yCount]

Bug: dawn:22

Change-Id: I02188d70103a1bee25b9b2024a2ea9f785656236
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/19862
Reviewed-by: Austin Eng <enga@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
diff --git a/dawn.json b/dawn.json
index 7564e53..29b99c7 100644
--- a/dawn.json
+++ b/dawn.json
@@ -77,8 +77,10 @@
         "members": [
             {"name": "label", "type": "char", "annotation": "const*", "length": "strlen", "optional": true},
             {"name": "layout", "type": "bind group layout"},
-            {"name": "binding count", "type": "uint32_t"},
-            {"name": "bindings", "type": "bind group entry", "annotation": "const*", "length": "binding count"}
+            {"name": "binding count", "type": "uint32_t", "default": 0},
+            {"name": "bindings", "type": "bind group entry", "annotation": "const*", "length": "binding count"},
+            {"name": "entry count", "type": "uint32_t", "default": 0},
+            {"name": "entries", "type": "bind group entry", "annotation": "const*", "length": "entry count"}
         ]
     },
     "bind group layout": {
@@ -104,8 +106,10 @@
         "extensible": true,
         "members": [
             {"name": "label", "type": "char", "annotation": "const*", "length": "strlen", "optional": true},
-            {"name": "binding count", "type": "uint32_t"},
-            {"name": "bindings", "type": "bind group layout entry", "annotation": "const*", "length": "binding count"}
+            {"name": "binding count", "type": "uint32_t", "default": 0},
+            {"name": "bindings", "type": "bind group layout entry", "annotation": "const*", "length": "binding count"},
+            {"name": "entry count", "type": "uint32_t", "default": 0},
+            {"name": "entries", "type": "bind group layout entry", "annotation": "const*", "length": "entry count"}
         ]
     },
     "binding type": {
diff --git a/src/dawn_native/BindGroup.cpp b/src/dawn_native/BindGroup.cpp
index 85d2a38..840c404 100644
--- a/src/dawn_native/BindGroup.cpp
+++ b/src/dawn_native/BindGroup.cpp
@@ -29,22 +29,22 @@
         // Helper functions to perform binding-type specific validation
 
         MaybeError ValidateBufferBinding(const DeviceBase* device,
-                                         const BindGroupEntry& binding,
+                                         const BindGroupEntry& entry,
                                          wgpu::BufferUsage requiredUsage) {
-            if (binding.buffer == nullptr || binding.sampler != nullptr ||
-                binding.textureView != nullptr) {
+            if (entry.buffer == nullptr || entry.sampler != nullptr ||
+                entry.textureView != nullptr) {
                 return DAWN_VALIDATION_ERROR("expected buffer binding");
             }
-            DAWN_TRY(device->ValidateObject(binding.buffer));
+            DAWN_TRY(device->ValidateObject(entry.buffer));
 
-            uint64_t bufferSize = binding.buffer->GetSize();
+            uint64_t bufferSize = entry.buffer->GetSize();
 
             // Handle wgpu::WholeSize, avoiding overflows.
-            if (binding.offset > bufferSize) {
+            if (entry.offset > bufferSize) {
                 return DAWN_VALIDATION_ERROR("Buffer binding doesn't fit in the buffer");
             }
             uint64_t bindingSize =
-                (binding.size == wgpu::kWholeSize) ? bufferSize - binding.offset : binding.size;
+                (entry.size == wgpu::kWholeSize) ? bufferSize - entry.offset : entry.size;
 
             if (bindingSize > bufferSize) {
                 return DAWN_VALIDATION_ERROR("Buffer binding size larger than the buffer");
@@ -56,16 +56,16 @@
 
             // Note that no overflow can happen because we already checked that
             // bufferSize >= bindingSize
-            if (binding.offset > bufferSize - bindingSize) {
+            if (entry.offset > bufferSize - bindingSize) {
                 return DAWN_VALIDATION_ERROR("Buffer binding doesn't fit in the buffer");
             }
 
-            if (!IsAligned(binding.offset, 256)) {
+            if (!IsAligned(entry.offset, 256)) {
                 return DAWN_VALIDATION_ERROR(
                     "Buffer offset for bind group needs to be 256-byte aligned");
             }
 
-            if (!(binding.buffer->GetUsage() & requiredUsage)) {
+            if (!(entry.buffer->GetUsage() & requiredUsage)) {
                 return DAWN_VALIDATION_ERROR("buffer binding usage mismatch");
             }
 
@@ -73,16 +73,16 @@
         }
 
         MaybeError ValidateTextureBinding(const DeviceBase* device,
-                                          const BindGroupEntry& binding,
+                                          const BindGroupEntry& entry,
                                           wgpu::TextureUsage requiredUsage,
                                           const BindingInfo& bindingInfo) {
-            if (binding.textureView == nullptr || binding.sampler != nullptr ||
-                binding.buffer != nullptr) {
+            if (entry.textureView == nullptr || entry.sampler != nullptr ||
+                entry.buffer != nullptr) {
                 return DAWN_VALIDATION_ERROR("expected texture binding");
             }
-            DAWN_TRY(device->ValidateObject(binding.textureView));
+            DAWN_TRY(device->ValidateObject(entry.textureView));
 
-            TextureBase* texture = binding.textureView->GetTexture();
+            TextureBase* texture = entry.textureView->GetTexture();
 
             if (!(texture->GetUsage() & requiredUsage)) {
                 return DAWN_VALIDATION_ERROR("texture binding usage mismatch");
@@ -110,7 +110,7 @@
                     break;
             }
 
-            if (binding.textureView->GetDimension() != bindingInfo.viewDimension) {
+            if (entry.textureView->GetDimension() != bindingInfo.viewDimension) {
                 return DAWN_VALIDATION_ERROR("texture view dimension mismatch");
             }
 
@@ -118,22 +118,22 @@
         }
 
         MaybeError ValidateSamplerBinding(const DeviceBase* device,
-                                          const BindGroupEntry& binding,
+                                          const BindGroupEntry& entry,
                                           wgpu::BindingType bindingType) {
-            if (binding.sampler == nullptr || binding.textureView != nullptr ||
-                binding.buffer != nullptr) {
+            if (entry.sampler == nullptr || entry.textureView != nullptr ||
+                entry.buffer != nullptr) {
                 return DAWN_VALIDATION_ERROR("expected sampler binding");
             }
-            DAWN_TRY(device->ValidateObject(binding.sampler));
+            DAWN_TRY(device->ValidateObject(entry.sampler));
 
             switch (bindingType) {
                 case wgpu::BindingType::Sampler:
-                    if (binding.sampler->HasCompareFunction()) {
+                    if (entry.sampler->HasCompareFunction()) {
                         return DAWN_VALIDATION_ERROR("Did not expect comparison sampler");
                     }
                     break;
                 case wgpu::BindingType::ComparisonSampler:
-                    if (!binding.sampler->HasCompareFunction()) {
+                    if (!entry.sampler->HasCompareFunction()) {
                         return DAWN_VALIDATION_ERROR("Expected comparison sampler");
                     }
                     break;
@@ -153,17 +153,17 @@
         }
 
         DAWN_TRY(device->ValidateObject(descriptor->layout));
-        if (descriptor->bindingCount != descriptor->layout->GetBindingCount()) {
+        if (descriptor->entryCount != descriptor->layout->GetBindingCount()) {
             return DAWN_VALIDATION_ERROR("numBindings mismatch");
         }
 
         const BindGroupLayoutBase::BindingMap& bindingMap = descriptor->layout->GetBindingMap();
 
         std::bitset<kMaxBindingsPerGroup> bindingsSet;
-        for (uint32_t i = 0; i < descriptor->bindingCount; ++i) {
-            const BindGroupEntry& binding = descriptor->bindings[i];
+        for (uint32_t i = 0; i < descriptor->entryCount; ++i) {
+            const BindGroupEntry& entry = descriptor->entries[i];
 
-            const auto& it = bindingMap.find(BindingNumber(binding.binding));
+            const auto& it = bindingMap.find(BindingNumber(entry.binding));
             if (it == bindingMap.end()) {
                 return DAWN_VALIDATION_ERROR("setting non-existent binding");
             }
@@ -180,25 +180,25 @@
             // Perform binding-type specific validation.
             switch (bindingInfo.type) {
                 case wgpu::BindingType::UniformBuffer:
-                    DAWN_TRY(ValidateBufferBinding(device, binding, wgpu::BufferUsage::Uniform));
+                    DAWN_TRY(ValidateBufferBinding(device, entry, wgpu::BufferUsage::Uniform));
                     break;
                 case wgpu::BindingType::StorageBuffer:
                 case wgpu::BindingType::ReadonlyStorageBuffer:
-                    DAWN_TRY(ValidateBufferBinding(device, binding, wgpu::BufferUsage::Storage));
+                    DAWN_TRY(ValidateBufferBinding(device, entry, wgpu::BufferUsage::Storage));
                     break;
                 case wgpu::BindingType::SampledTexture:
-                    DAWN_TRY(ValidateTextureBinding(device, binding, wgpu::TextureUsage::Sampled,
+                    DAWN_TRY(ValidateTextureBinding(device, entry, wgpu::TextureUsage::Sampled,
                                                     bindingInfo));
                     break;
                 case wgpu::BindingType::Sampler:
                 case wgpu::BindingType::ComparisonSampler:
-                    DAWN_TRY(ValidateSamplerBinding(device, binding, bindingInfo.type));
+                    DAWN_TRY(ValidateSamplerBinding(device, entry, bindingInfo.type));
                     break;
                 // TODO(jiawei.shao@intel.com): support creating bind group with read-only and
                 // write-only storage textures.
                 case wgpu::BindingType::ReadonlyStorageTexture:
                 case wgpu::BindingType::WriteonlyStorageTexture:
-                    DAWN_TRY(ValidateTextureBinding(device, binding, wgpu::TextureUsage::Storage,
+                    DAWN_TRY(ValidateTextureBinding(device, entry, wgpu::TextureUsage::Storage,
                                                     bindingInfo));
                     break;
                 case wgpu::BindingType::StorageTexture:
@@ -231,36 +231,36 @@
             new (&mBindingData.bindings[i]) Ref<ObjectBase>();
         }
 
-        for (uint32_t i = 0; i < descriptor->bindingCount; ++i) {
-            const BindGroupEntry& binding = descriptor->bindings[i];
+        for (uint32_t i = 0; i < descriptor->entryCount; ++i) {
+            const BindGroupEntry& entry = descriptor->entries[i];
 
             BindingIndex bindingIndex =
-                descriptor->layout->GetBindingIndex(BindingNumber(binding.binding));
+                descriptor->layout->GetBindingIndex(BindingNumber(entry.binding));
             ASSERT(bindingIndex < mLayout->GetBindingCount());
 
             // Only a single binding type should be set, so once we found it we can skip to the
             // next loop iteration.
 
-            if (binding.buffer != nullptr) {
+            if (entry.buffer != nullptr) {
                 ASSERT(mBindingData.bindings[bindingIndex].Get() == nullptr);
-                mBindingData.bindings[bindingIndex] = binding.buffer;
-                mBindingData.bufferData[bindingIndex].offset = binding.offset;
-                uint64_t bufferSize = (binding.size == wgpu::kWholeSize)
-                                          ? binding.buffer->GetSize() - binding.offset
-                                          : binding.size;
+                mBindingData.bindings[bindingIndex] = entry.buffer;
+                mBindingData.bufferData[bindingIndex].offset = entry.offset;
+                uint64_t bufferSize = (entry.size == wgpu::kWholeSize)
+                                          ? entry.buffer->GetSize() - entry.offset
+                                          : entry.size;
                 mBindingData.bufferData[bindingIndex].size = bufferSize;
                 continue;
             }
 
-            if (binding.textureView != nullptr) {
+            if (entry.textureView != nullptr) {
                 ASSERT(mBindingData.bindings[bindingIndex].Get() == nullptr);
-                mBindingData.bindings[bindingIndex] = binding.textureView;
+                mBindingData.bindings[bindingIndex] = entry.textureView;
                 continue;
             }
 
-            if (binding.sampler != nullptr) {
+            if (entry.sampler != nullptr) {
                 ASSERT(mBindingData.bindings[bindingIndex].Get() == nullptr);
-                mBindingData.bindings[bindingIndex] = binding.sampler;
+                mBindingData.bindings[bindingIndex] = entry.sampler;
                 continue;
             }
         }
diff --git a/src/dawn_native/BindGroupLayout.cpp b/src/dawn_native/BindGroupLayout.cpp
index 891fb89..880e38e 100644
--- a/src/dawn_native/BindGroupLayout.cpp
+++ b/src/dawn_native/BindGroupLayout.cpp
@@ -102,26 +102,26 @@
         std::set<BindingNumber> bindingsSet;
         uint32_t dynamicUniformBufferCount = 0;
         uint32_t dynamicStorageBufferCount = 0;
-        for (BindingIndex i = 0; i < descriptor->bindingCount; ++i) {
-            const BindGroupLayoutEntry& binding = descriptor->bindings[i];
-            BindingNumber bindingNumber = BindingNumber(binding.binding);
+        for (uint32_t i = 0; i < descriptor->entryCount; ++i) {
+            const BindGroupLayoutEntry& entry = descriptor->entries[i];
+            BindingNumber bindingNumber = BindingNumber(entry.binding);
 
-            DAWN_TRY(ValidateShaderStage(binding.visibility));
-            DAWN_TRY(ValidateBindingType(binding.type));
-            DAWN_TRY(ValidateTextureComponentType(binding.textureComponentType));
+            DAWN_TRY(ValidateShaderStage(entry.visibility));
+            DAWN_TRY(ValidateBindingType(entry.type));
+            DAWN_TRY(ValidateTextureComponentType(entry.textureComponentType));
 
-            if (binding.viewDimension != wgpu::TextureViewDimension::Undefined) {
-                DAWN_TRY(ValidateTextureViewDimension(binding.viewDimension));
+            if (entry.viewDimension != wgpu::TextureViewDimension::Undefined) {
+                DAWN_TRY(ValidateTextureViewDimension(entry.viewDimension));
 
                 // TODO(dawn:22): Remove this once users use viewDimension
-                if (binding.textureDimension != wgpu::TextureViewDimension::Undefined) {
+                if (entry.textureDimension != wgpu::TextureViewDimension::Undefined) {
                     return DAWN_VALIDATION_ERROR(
                         "Cannot use both viewDimension and textureDimension");
                 }
             } else {
                 // TODO(dawn:22): Remove this once users use viewDimension
-                if (binding.textureDimension != wgpu::TextureViewDimension::Undefined) {
-                    DAWN_TRY(ValidateTextureViewDimension(binding.textureDimension));
+                if (entry.textureDimension != wgpu::TextureViewDimension::Undefined) {
+                    DAWN_TRY(ValidateTextureViewDimension(entry.textureDimension));
                     device->EmitDeprecationWarning(
                         "BindGroupLayoutEntry::textureDimension is deprecated, use viewDimension "
                         "instead");
@@ -132,21 +132,19 @@
                 return DAWN_VALIDATION_ERROR("some binding index was specified more than once");
             }
 
-            DAWN_TRY(
-                ValidateBindingTypeWithShaderStageVisibility(binding.type, binding.visibility));
+            DAWN_TRY(ValidateBindingTypeWithShaderStageVisibility(entry.type, entry.visibility));
 
-            DAWN_TRY(
-                ValidateStorageTextureFormat(device, binding.type, binding.storageTextureFormat));
+            DAWN_TRY(ValidateStorageTextureFormat(device, entry.type, entry.storageTextureFormat));
 
-            switch (binding.type) {
+            switch (entry.type) {
                 case wgpu::BindingType::UniformBuffer:
-                    if (binding.hasDynamicOffset) {
+                    if (entry.hasDynamicOffset) {
                         ++dynamicUniformBufferCount;
                     }
                     break;
                 case wgpu::BindingType::StorageBuffer:
                 case wgpu::BindingType::ReadonlyStorageBuffer:
-                    if (binding.hasDynamicOffset) {
+                    if (entry.hasDynamicOffset) {
                         ++dynamicStorageBufferCount;
                     }
                     break;
@@ -155,7 +153,7 @@
                 case wgpu::BindingType::ComparisonSampler:
                 case wgpu::BindingType::ReadonlyStorageTexture:
                 case wgpu::BindingType::WriteonlyStorageTexture:
-                    if (binding.hasDynamicOffset) {
+                    if (entry.hasDynamicOffset) {
                         return DAWN_VALIDATION_ERROR("Samplers and textures cannot be dynamic");
                     }
                     break;
@@ -163,7 +161,7 @@
                     return DAWN_VALIDATION_ERROR("storage textures aren't supported (yet)");
             }
 
-            if (binding.multisampled) {
+            if (entry.multisampled) {
                 return DAWN_VALIDATION_ERROR(
                     "BindGroupLayoutEntry::multisampled must be false (for now)");
             }
@@ -273,9 +271,9 @@
 
     BindGroupLayoutBase::BindGroupLayoutBase(DeviceBase* device,
                                              const BindGroupLayoutDescriptor* descriptor)
-        : CachedObject(device), mBindingCount(descriptor->bindingCount) {
+        : CachedObject(device), mBindingCount(descriptor->entryCount) {
         std::vector<BindGroupLayoutEntry> sortedBindings(
-            descriptor->bindings, descriptor->bindings + descriptor->bindingCount);
+            descriptor->entries, descriptor->entries + descriptor->entryCount);
 
         std::sort(sortedBindings.begin(), sortedBindings.end(), SortBindingsCompare);
 
diff --git a/src/dawn_native/Device.cpp b/src/dawn_native/Device.cpp
index 3de861f..41c7664 100644
--- a/src/dawn_native/Device.cpp
+++ b/src/dawn_native/Device.cpp
@@ -731,10 +731,25 @@
     MaybeError DeviceBase::CreateBindGroupInternal(BindGroupBase** result,
                                                    const BindGroupDescriptor* descriptor) {
         DAWN_TRY(ValidateIsAlive());
-        if (IsValidationEnabled()) {
-            DAWN_TRY(ValidateBindGroupDescriptor(this, descriptor));
+
+        // TODO(dawn:22): Remove this once users use entries/entryCount
+        BindGroupDescriptor fixedDescriptor = *descriptor;
+        if (fixedDescriptor.bindingCount != 0) {
+            if (fixedDescriptor.entryCount != 0) {
+                return DAWN_VALIDATION_ERROR("Cannot use bindings and entries at the same time");
+            } else {
+                EmitDeprecationWarning(
+                    "BindGroupEntry::bindings/bindingCount is deprecated, use entries/entryCount "
+                    "instead");
+                fixedDescriptor.entryCount = fixedDescriptor.bindingCount;
+                fixedDescriptor.entries = fixedDescriptor.bindings;
+            }
         }
-        DAWN_TRY_ASSIGN(*result, CreateBindGroupImpl(descriptor));
+
+        if (IsValidationEnabled()) {
+            DAWN_TRY(ValidateBindGroupDescriptor(this, &fixedDescriptor));
+        }
+        DAWN_TRY_ASSIGN(*result, CreateBindGroupImpl(&fixedDescriptor));
         return {};
     }
 
@@ -742,10 +757,25 @@
         BindGroupLayoutBase** result,
         const BindGroupLayoutDescriptor* descriptor) {
         DAWN_TRY(ValidateIsAlive());
-        if (IsValidationEnabled()) {
-            DAWN_TRY(ValidateBindGroupLayoutDescriptor(this, descriptor));
+
+        // TODO(dawn:22): Remove this once users use entries/entryCount
+        BindGroupLayoutDescriptor fixedDescriptor = *descriptor;
+        if (fixedDescriptor.bindingCount != 0) {
+            if (fixedDescriptor.entryCount != 0) {
+                return DAWN_VALIDATION_ERROR("Cannot use bindings and entries at the same time");
+            } else {
+                EmitDeprecationWarning(
+                    "BindGroupLayoutEntry::bindings/bindingCount is deprecated, use "
+                    "entries/entryCount instead");
+                fixedDescriptor.entryCount = fixedDescriptor.bindingCount;
+                fixedDescriptor.entries = fixedDescriptor.bindings;
+            }
         }
-        DAWN_TRY_ASSIGN(*result, GetOrCreateBindGroupLayout(descriptor));
+
+        if (IsValidationEnabled()) {
+            DAWN_TRY(ValidateBindGroupLayoutDescriptor(this, &fixedDescriptor));
+        }
+        DAWN_TRY_ASSIGN(*result, GetOrCreateBindGroupLayout(&fixedDescriptor));
         return {};
     }
 
diff --git a/src/dawn_native/Pipeline.cpp b/src/dawn_native/Pipeline.cpp
index 4a0b653..6ca811f 100644
--- a/src/dawn_native/Pipeline.cpp
+++ b/src/dawn_native/Pipeline.cpp
@@ -89,8 +89,8 @@
             // a Ref<BindGroupLayoutBase>, then the VkDevice will be destroyed before the
             // VkDescriptorSetLayout.
             BindGroupLayoutDescriptor desc = {};
-            desc.bindingCount = 0;
-            desc.bindings = nullptr;
+            desc.entryCount = 0;
+            desc.entries = nullptr;
 
             BindGroupLayoutBase* bgl = nullptr;
             if (GetDevice()->ConsumedError(GetDevice()->GetOrCreateBindGroupLayout(&desc), &bgl)) {
diff --git a/src/dawn_native/PipelineLayout.cpp b/src/dawn_native/PipelineLayout.cpp
index 7626c04..0f32ec6 100644
--- a/src/dawn_native/PipelineLayout.cpp
+++ b/src/dawn_native/PipelineLayout.cpp
@@ -126,13 +126,13 @@
 
         // Data which BindGroupLayoutDescriptor will point to for creation
         std::array<std::array<BindGroupLayoutEntry, kMaxBindingsPerGroup>, kMaxBindGroups>
-            bindingData = {};
+            entryData = {};
 
-        // A map of bindings to the index in |bindingData|
+        // A map of bindings to the index in |entryData|
         std::array<std::map<BindingNumber, BindingIndex>, kMaxBindGroups> usedBindingsMap = {};
 
-        // A counter of how many bindings we've populated in |bindingData|
-        std::array<uint32_t, kMaxBindGroups> bindingCounts = {};
+        // A counter of how many bindings we've populated in |entryData|
+        std::array<uint32_t, kMaxBindGroups> entryCounts = {};
 
         uint32_t bindGroupLayoutCount = 0;
         for (uint32_t moduleIndex = 0; moduleIndex < count; ++moduleIndex) {
@@ -170,7 +170,7 @@
                     {
                         const auto& it = usedBindingsMap[group].find(bindingNumber);
                         if (it != usedBindingsMap[group].end()) {
-                            if (bindingSlot == bindingData[group][it->second]) {
+                            if (bindingSlot == entryData[group][it->second]) {
                                 // Already used and the data is the same. Continue.
                                 continue;
                             } else {
@@ -181,12 +181,12 @@
                         }
                     }
 
-                    uint32_t currentBindingCount = bindingCounts[group];
-                    bindingData[group][currentBindingCount] = bindingSlot;
+                    uint32_t currentBindingCount = entryCounts[group];
+                    entryData[group][currentBindingCount] = bindingSlot;
 
                     usedBindingsMap[group][bindingNumber] = currentBindingCount;
 
-                    bindingCounts[group]++;
+                    entryCounts[group]++;
 
                     bindGroupLayoutCount = std::max(bindGroupLayoutCount, group + 1);
                 }
@@ -196,8 +196,8 @@
         std::array<BindGroupLayoutBase*, kMaxBindGroups> bindGroupLayouts = {};
         for (uint32_t group = 0; group < bindGroupLayoutCount; ++group) {
             BindGroupLayoutDescriptor desc = {};
-            desc.bindings = bindingData[group].data();
-            desc.bindingCount = bindingCounts[group];
+            desc.entries = entryData[group].data();
+            desc.entryCount = entryCounts[group];
 
             // We should never produce a bad descriptor.
             ASSERT(!ValidateBindGroupLayoutDescriptor(device, &desc).IsError());
diff --git a/src/tests/end2end/BindGroupTests.cpp b/src/tests/end2end/BindGroupTests.cpp
index 1efdb46..e3289cf 100644
--- a/src/tests/end2end/BindGroupTests.cpp
+++ b/src/tests/end2end/BindGroupTests.cpp
@@ -750,11 +750,11 @@
 TEST_P(BindGroupTests, BindGroupLayoutVisibilityCanBeNone) {
     utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
 
-    wgpu::BindGroupLayoutEntry binding = {0, wgpu::ShaderStage::None,
-                                          wgpu::BindingType::UniformBuffer};
+    wgpu::BindGroupLayoutEntry entry = {0, wgpu::ShaderStage::None,
+                                        wgpu::BindingType::UniformBuffer};
     wgpu::BindGroupLayoutDescriptor descriptor;
-    descriptor.bindingCount = 1;
-    descriptor.bindings = &binding;
+    descriptor.entryCount = 1;
+    descriptor.entries = &entry;
     wgpu::BindGroupLayout layout = device.CreateBindGroupLayout(&descriptor);
 
     wgpu::RenderPipeline pipeline = MakeTestPipeline(renderPass, {}, {layout});
diff --git a/src/tests/end2end/DeprecatedAPITests.cpp b/src/tests/end2end/DeprecatedAPITests.cpp
index 5ee8cf4..23fc1b9 100644
--- a/src/tests/end2end/DeprecatedAPITests.cpp
+++ b/src/tests/end2end/DeprecatedAPITests.cpp
@@ -79,8 +79,8 @@
     };
 
     wgpu::BindGroupLayoutDescriptor bglDesc = {
-        .bindingCount = 1,
-        .bindings = &entryDesc,
+        .entryCount = 1,
+        .entries = &entryDesc,
     };
     EXPECT_DEPRECATION_WARNING(device.CreateBindGroupLayout(&bglDesc));
 }
@@ -92,8 +92,8 @@
     };
 
     wgpu::BindGroupLayoutDescriptor bglDesc = {
-        .bindingCount = 1,
-        .bindings = &entryDesc,
+        .entryCount = 1,
+        .entries = &entryDesc,
     };
     device.CreateBindGroupLayout(&bglDesc);
 }
@@ -106,8 +106,8 @@
     };
 
     wgpu::BindGroupLayoutDescriptor bglDesc = {
-        .bindingCount = 1,
-        .bindings = &entryDesc,
+        .entryCount = 1,
+        .entries = &entryDesc,
     };
     ASSERT_DEVICE_ERROR(device.CreateBindGroupLayout(&bglDesc));
 }
@@ -121,8 +121,8 @@
     };
 
     wgpu::BindGroupLayoutDescriptor bglDesc = {
-        .bindingCount = 1,
-        .bindings = &entryDesc,
+        .entryCount = 1,
+        .entries = &entryDesc,
     };
     wgpu::BindGroupLayout layout;
     EXPECT_DEPRECATION_WARNING(layout = device.CreateBindGroupLayout(&bglDesc));
@@ -152,6 +152,161 @@
     ASSERT_DEVICE_ERROR(utils::MakeBindGroup(device, layout, {{0, arrayView}}));
 }
 
+// Test for BindGroupLayout::bindings/bindingCount -> entries/entryCount
+
+// Test that creating a BGL with bindings emits a deprecation warning.
+TEST_P(DeprecationTests, BGLDescBindingIsDeprecated) {
+    wgpu::BindGroupLayoutEntry entryDesc = {
+        .type = wgpu::BindingType::Sampler,
+    };
+
+    wgpu::BindGroupLayoutDescriptor bglDesc = {
+        .bindingCount = 1,
+        .bindings = &entryDesc,
+    };
+    EXPECT_DEPRECATION_WARNING(device.CreateBindGroupLayout(&bglDesc));
+}
+
+// Test that creating a BGL with both entries and bindings is an error
+TEST_P(DeprecationTests, BGLDescBindingAndEntriesIsInvalid) {
+    wgpu::BindGroupLayoutEntry entryDesc = {
+        .type = wgpu::BindingType::Sampler,
+    };
+
+    wgpu::BindGroupLayoutDescriptor bglDesc = {
+        .bindingCount = 1,
+        .bindings = &entryDesc,
+        .entryCount = 1,
+        .entries = &entryDesc,
+    };
+    ASSERT_DEVICE_ERROR(device.CreateBindGroupLayout(&bglDesc));
+}
+
+// Test that creating a BGL with both entries and bindings to 0 doesn't emit warnings
+TEST_P(DeprecationTests, BGLDescBindingAndEntriesBothZeroEmitsNoWarning) {
+    // TODO(cwallez@chromium.org): In Vulkan it is disallowed to create 0-sized descriptor pools
+    // but the Vulkan backend doesn't special case it yet.
+    DAWN_SKIP_TEST_IF(IsVulkan());
+
+    wgpu::BindGroupLayoutDescriptor bglDesc = {
+        .bindingCount = 0,
+        .bindings = nullptr,
+        .entryCount = 0,
+        .entries = nullptr,
+    };
+    device.CreateBindGroupLayout(&bglDesc);
+}
+
+// Test that creating a BGL with bindings still does correct state tracking
+TEST_P(DeprecationTests, BGLDescBindingStateTracking) {
+    wgpu::BindGroupLayoutEntry entryDesc = {
+        .binding = 0,
+        .type = wgpu::BindingType::Sampler,
+    };
+
+    wgpu::BindGroupLayoutDescriptor bglDesc = {
+        .bindingCount = 1,
+        .bindings = &entryDesc,
+    };
+    wgpu::BindGroupLayout layout;
+    EXPECT_DEPRECATION_WARNING(layout = device.CreateBindGroupLayout(&bglDesc));
+
+    // Test a case where if |bindings| wasn't taken into account, no validation error would happen
+    // because the layout would be empty
+    wgpu::BindGroupDescriptor badBgDesc = {
+        .layout = layout,
+        .entryCount = 0,
+        .entries = nullptr,
+    };
+    ASSERT_DEVICE_ERROR(device.CreateBindGroup(&badBgDesc));
+}
+
+// Test for BindGroup::bindings/bindingCount -> entries/entryCount
+
+// Test that creating a BG with bindings emits a deprecation warning.
+TEST_P(DeprecationTests, BGDescBindingIsDeprecated) {
+    wgpu::SamplerDescriptor samplerDesc = {};
+    wgpu::Sampler sampler = device.CreateSampler(&samplerDesc);
+
+    wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::Sampler}});
+
+    wgpu::BindGroupEntry entryDesc = {
+        .binding = 0,
+        .sampler = sampler,
+    };
+
+    wgpu::BindGroupDescriptor bgDesc = {
+        .layout = layout,
+        .bindingCount = 1,
+        .bindings = &entryDesc,
+    };
+    EXPECT_DEPRECATION_WARNING(device.CreateBindGroup(&bgDesc));
+}
+
+// Test that creating a BG with both entries and bindings is an error
+TEST_P(DeprecationTests, BGDescBindingAndEntriesIsInvalid) {
+    wgpu::SamplerDescriptor samplerDesc = {};
+    wgpu::Sampler sampler = device.CreateSampler(&samplerDesc);
+
+    wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
+        device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::Sampler}});
+
+    wgpu::BindGroupEntry entryDesc = {
+        .binding = 0,
+        .sampler = sampler,
+    };
+
+    wgpu::BindGroupDescriptor bgDesc = {
+        .layout = layout,
+        .bindingCount = 1,
+        .bindings = &entryDesc,
+        .entryCount = 1,
+        .entries = &entryDesc,
+    };
+    ASSERT_DEVICE_ERROR(device.CreateBindGroup(&bgDesc));
+}
+
+// Test that creating a BG with both entries and bindings to 0 doesn't emit warnings
+TEST_P(DeprecationTests, BGDescBindingAndEntriesBothZeroEmitsNoWarning) {
+    // TODO(cwallez@chromium.org): In Vulkan it is disallowed to create 0-sized descriptor pools
+    // but the Vulkan backend doesn't special case it yet.
+    DAWN_SKIP_TEST_IF(IsVulkan());
+
+    wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(device, {});
+
+    wgpu::BindGroupDescriptor bgDesc = {
+        .layout = layout,
+        .bindingCount = 0,
+        .bindings = nullptr,
+        .entryCount = 0,
+        .entries = nullptr,
+    };
+    device.CreateBindGroup(&bgDesc);
+}
+
+// Test that creating a BG with bindings still does correct state tracking
+TEST_P(DeprecationTests, BGDescBindingStateTracking) {
+    wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(device, {});
+
+    // Test a case where if |bindings| wasn't taken into account, no validation error would happen
+    // because it would match the empty layout.
+    wgpu::SamplerDescriptor samplerDesc = {};
+    wgpu::Sampler sampler = device.CreateSampler(&samplerDesc);
+
+    wgpu::BindGroupEntry entryDesc = {
+        .binding = 0,
+        .sampler = sampler,
+    };
+
+    wgpu::BindGroupDescriptor bgDesc = {
+        .layout = layout,
+        .bindingCount = 1,
+        .bindings = &entryDesc,
+    };
+    EXPECT_DEPRECATION_WARNING(ASSERT_DEVICE_ERROR(device.CreateBindGroup(&bgDesc)));
+}
+
 DAWN_INSTANTIATE_TEST(DeprecationTests,
                       D3D12Backend(),
                       MetalBackend(),
diff --git a/src/tests/end2end/DeviceLostTests.cpp b/src/tests/end2end/DeviceLostTests.cpp
index 427c7a8..6ee0367 100644
--- a/src/tests/end2end/DeviceLostTests.cpp
+++ b/src/tests/end2end/DeviceLostTests.cpp
@@ -105,11 +105,11 @@
 TEST_P(DeviceLostTest, CreateBindGroupLayoutFails) {
     SetCallbackAndLoseForTesting();
 
-    wgpu::BindGroupLayoutEntry binding = {0, wgpu::ShaderStage::None,
-                                          wgpu::BindingType::UniformBuffer};
+    wgpu::BindGroupLayoutEntry entry = {0, wgpu::ShaderStage::None,
+                                        wgpu::BindingType::UniformBuffer};
     wgpu::BindGroupLayoutDescriptor descriptor;
-    descriptor.bindingCount = 1;
-    descriptor.bindings = &binding;
+    descriptor.entryCount = 1;
+    descriptor.entries = &entry;
     ASSERT_DEVICE_ERROR(device.CreateBindGroupLayout(&descriptor));
 }
 
@@ -139,18 +139,18 @@
 TEST_P(DeviceLostTest, CreateBindGroupFails) {
     SetCallbackAndLoseForTesting();
 
-    wgpu::BindGroupEntry binding;
-    binding.binding = 0;
-    binding.sampler = nullptr;
-    binding.textureView = nullptr;
-    binding.buffer = nullptr;
-    binding.offset = 0;
-    binding.size = 0;
+    wgpu::BindGroupEntry entry;
+    entry.binding = 0;
+    entry.sampler = nullptr;
+    entry.textureView = nullptr;
+    entry.buffer = nullptr;
+    entry.offset = 0;
+    entry.size = 0;
 
     wgpu::BindGroupDescriptor descriptor;
     descriptor.layout = nullptr;
-    descriptor.bindingCount = 1;
-    descriptor.bindings = &binding;
+    descriptor.entryCount = 1;
+    descriptor.entries = &entry;
     ASSERT_DEVICE_ERROR(device.CreateBindGroup(&descriptor));
 }
 
diff --git a/src/tests/end2end/StorageTextureTests.cpp b/src/tests/end2end/StorageTextureTests.cpp
index e09e79a..c13a3a1 100644
--- a/src/tests/end2end/StorageTextureTests.cpp
+++ b/src/tests/end2end/StorageTextureTests.cpp
@@ -23,24 +23,24 @@
     // wgpu::BindingType::ReadonlyStorageTexture is a valid binding type to create a bind group
     // layout.
     {
-        wgpu::BindGroupLayoutEntry binding = {0, wgpu::ShaderStage::Compute,
-                                              wgpu::BindingType::ReadonlyStorageTexture};
-        binding.storageTextureFormat = wgpu::TextureFormat::R32Float;
+        wgpu::BindGroupLayoutEntry entry = {0, wgpu::ShaderStage::Compute,
+                                            wgpu::BindingType::ReadonlyStorageTexture};
+        entry.storageTextureFormat = wgpu::TextureFormat::R32Float;
         wgpu::BindGroupLayoutDescriptor descriptor;
-        descriptor.bindingCount = 1;
-        descriptor.bindings = &binding;
+        descriptor.entryCount = 1;
+        descriptor.entries = &entry;
         device.CreateBindGroupLayout(&descriptor);
     }
 
     // wgpu::BindingType::WriteonlyStorageTexture is a valid binding type to create a bind group
     // layout.
     {
-        wgpu::BindGroupLayoutEntry binding = {0, wgpu::ShaderStage::Compute,
-                                              wgpu::BindingType::WriteonlyStorageTexture};
-        binding.storageTextureFormat = wgpu::TextureFormat::R32Float;
+        wgpu::BindGroupLayoutEntry entry = {0, wgpu::ShaderStage::Compute,
+                                            wgpu::BindingType::WriteonlyStorageTexture};
+        entry.storageTextureFormat = wgpu::TextureFormat::R32Float;
         wgpu::BindGroupLayoutDescriptor descriptor;
-        descriptor.bindingCount = 1;
-        descriptor.bindings = &binding;
+        descriptor.entryCount = 1;
+        descriptor.entries = &entry;
         device.CreateBindGroupLayout(&descriptor);
     }
 }
diff --git a/src/tests/unittests/validation/BindGroupValidationTests.cpp b/src/tests/unittests/validation/BindGroupValidationTests.cpp
index 05b6527..95a1b02 100644
--- a/src/tests/unittests/validation/BindGroupValidationTests.cpp
+++ b/src/tests/unittests/validation/BindGroupValidationTests.cpp
@@ -75,8 +75,8 @@
 
     wgpu::BindGroupDescriptor descriptor;
     descriptor.layout = layout;
-    descriptor.bindingCount = 0;
-    descriptor.bindings = nullptr;
+    descriptor.entryCount = 0;
+    descriptor.entries = nullptr;
 
     // Control case: check that nextInChain = nullptr is valid
     descriptor.nextInChain = nullptr;
@@ -88,15 +88,15 @@
     ASSERT_DEVICE_ERROR(device.CreateBindGroup(&descriptor));
 }
 
-// Check constraints on bindingCount
-TEST_F(BindGroupValidationTest, bindingCountMismatch) {
+// Check constraints on entryCount
+TEST_F(BindGroupValidationTest, EntryCountMismatch) {
     wgpu::BindGroupLayout layout = utils::MakeBindGroupLayout(
         device, {{0, wgpu::ShaderStage::Fragment, wgpu::BindingType::Sampler}});
 
     // Control case: check that a descriptor with one binding is ok
     utils::MakeBindGroup(device, layout, {{0, mSampler}});
 
-    // Check that bindingCount != layout.bindingCount fails.
+    // Check that entryCount != layout.entryCount fails.
     ASSERT_DEVICE_ERROR(utils::MakeBindGroup(device, layout, {}));
 }
 
@@ -149,8 +149,8 @@
 
     wgpu::BindGroupDescriptor descriptor;
     descriptor.layout = layout;
-    descriptor.bindingCount = 1;
-    descriptor.bindings = &binding;
+    descriptor.entryCount = 1;
+    descriptor.entries = &binding;
 
     // Not setting anything fails
     ASSERT_DEVICE_ERROR(device.CreateBindGroup(&descriptor));
@@ -198,8 +198,8 @@
 
     wgpu::BindGroupDescriptor descriptor;
     descriptor.layout = layout;
-    descriptor.bindingCount = 1;
-    descriptor.bindings = &binding;
+    descriptor.entryCount = 1;
+    descriptor.entries = &binding;
 
     // Not setting anything fails
     ASSERT_DEVICE_ERROR(device.CreateBindGroup(&descriptor));
@@ -252,8 +252,8 @@
 
     wgpu::BindGroupDescriptor descriptor;
     descriptor.layout = layout;
-    descriptor.bindingCount = 1;
-    descriptor.bindings = &binding;
+    descriptor.entryCount = 1;
+    descriptor.entries = &binding;
 
     // Not setting anything fails
     ASSERT_DEVICE_ERROR(device.CreateBindGroup(&descriptor));
@@ -473,8 +473,8 @@
                                    bool expected) {
         wgpu::BindGroupLayoutDescriptor descriptor;
 
-        descriptor.bindingCount = count;
-        descriptor.bindings = binding;
+        descriptor.entryCount = count;
+        descriptor.entries = binding;
 
         if (!expected) {
             ASSERT_DEVICE_ERROR(device.CreateBindGroupLayout(&descriptor));
@@ -526,23 +526,23 @@
 
 // Test that there can't be more than kMaxBindingPerGroup bindings per group
 TEST_F(BindGroupLayoutValidationTest, BindGroupLayoutMaxBindings) {
-    wgpu::BindGroupLayoutEntry bindings[kMaxBindingsPerGroup + 1];
+    wgpu::BindGroupLayoutEntry entries[kMaxBindingsPerGroup + 1];
 
     for (uint32_t i = 0; i < kMaxBindingsPerGroup + 1; i++) {
-        bindings[i].type = wgpu::BindingType::UniformBuffer;
-        bindings[i].binding = i;
-        bindings[i].visibility = wgpu::ShaderStage::Compute;
+        entries[i].type = wgpu::BindingType::UniformBuffer;
+        entries[i].binding = i;
+        entries[i].visibility = wgpu::ShaderStage::Compute;
     }
 
     wgpu::BindGroupLayoutDescriptor desc;
-    desc.bindings = bindings;
+    desc.entries = entries;
 
     // Control case: kMaxBindingsPerGroup bindings is allowed.
-    desc.bindingCount = kMaxBindingsPerGroup;
+    desc.entryCount = kMaxBindingsPerGroup;
     device.CreateBindGroupLayout(&desc);
 
     // Error case: kMaxBindingsPerGroup + 1 bindings is not allowed.
-    desc.bindingCount = kMaxBindingsPerGroup + 1;
+    desc.entryCount = kMaxBindingsPerGroup + 1;
     ASSERT_DEVICE_ERROR(device.CreateBindGroupLayout(&desc));
 }
 
@@ -594,8 +594,8 @@
     wgpu::BindGroupLayoutEntry binding = {0, wgpu::ShaderStage::None,
                                           wgpu::BindingType::UniformBuffer};
     wgpu::BindGroupLayoutDescriptor descriptor;
-    descriptor.bindingCount = 1;
-    descriptor.bindings = &binding;
+    descriptor.entryCount = 1;
+    descriptor.entries = &binding;
     device.CreateBindGroupLayout(&descriptor);
 }
 
@@ -642,8 +642,8 @@
     auto MakeBindGroupLayout = [&](wgpu::BindGroupLayoutEntry* binding,
                                    uint32_t count) -> wgpu::BindGroupLayout {
         wgpu::BindGroupLayoutDescriptor descriptor;
-        descriptor.bindingCount = count;
-        descriptor.bindings = binding;
+        descriptor.entryCount = count;
+        descriptor.entries = binding;
         return device.CreateBindGroupLayout(&descriptor);
     };
 
@@ -1055,8 +1055,8 @@
 
             // Create the bind group layout.
             wgpu::BindGroupLayoutDescriptor bglDescriptor;
-            bglDescriptor.bindingCount = static_cast<uint32_t>(bindings.size());
-            bglDescriptor.bindings = bindings.data();
+            bglDescriptor.entryCount = static_cast<uint32_t>(bindings.size());
+            bglDescriptor.entries = bindings.data();
             bindGroupLayouts[l] = device.CreateBindGroupLayout(&bglDescriptor);
         }
 
diff --git a/src/tests/unittests/validation/GetBindGroupLayoutValidationTests.cpp b/src/tests/unittests/validation/GetBindGroupLayoutValidationTests.cpp
index 8afeb2b..821958c 100644
--- a/src/tests/unittests/validation/GetBindGroupLayoutValidationTests.cpp
+++ b/src/tests/unittests/validation/GetBindGroupLayoutValidationTests.cpp
@@ -108,8 +108,8 @@
     binding.multisampled = false;
 
     wgpu::BindGroupLayoutDescriptor desc = {};
-    desc.bindingCount = 1;
-    desc.bindings = &binding;
+    desc.entryCount = 1;
+    desc.entries = &binding;
 
     // Check that visibility and dynamic offsets match
     binding.hasDynamicOffset = false;
@@ -157,8 +157,8 @@
     binding.hasDynamicOffset = false;
 
     wgpu::BindGroupLayoutDescriptor desc = {};
-    desc.bindingCount = 1;
-    desc.bindings = &binding;
+    desc.entryCount = 1;
+    desc.entries = &binding;
 
     EXPECT_EQ(device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get());
 }
@@ -171,8 +171,8 @@
     binding.multisampled = false;
 
     wgpu::BindGroupLayoutDescriptor desc = {};
-    desc.bindingCount = 1;
-    desc.bindings = &binding;
+    desc.entryCount = 1;
+    desc.entries = &binding;
 
     {
         // Storage buffer binding is not supported in vertex shader.
@@ -243,8 +243,8 @@
     binding.hasDynamicOffset = false;
 
     wgpu::BindGroupLayoutDescriptor desc = {};
-    desc.bindingCount = 1;
-    desc.bindings = &binding;
+    desc.entryCount = 1;
+    desc.entries = &binding;
 
     {
         binding.multisampled = false;
@@ -281,8 +281,8 @@
     binding.multisampled = false;
 
     wgpu::BindGroupLayoutDescriptor desc = {};
-    desc.bindingCount = 1;
-    desc.bindings = &binding;
+    desc.entryCount = 1;
+    desc.entries = &binding;
 
     {
         binding.viewDimension = wgpu::TextureViewDimension::e1D;
@@ -355,8 +355,8 @@
     binding.multisampled = false;
 
     wgpu::BindGroupLayoutDescriptor desc = {};
-    desc.bindingCount = 1;
-    desc.bindings = &binding;
+    desc.entryCount = 1;
+    desc.entries = &binding;
 
     {
         binding.textureComponentType = wgpu::TextureComponentType::Float;
@@ -398,8 +398,8 @@
     binding.multisampled = false;
 
     wgpu::BindGroupLayoutDescriptor desc = {};
-    desc.bindingCount = 1;
-    desc.bindings = &binding;
+    desc.entryCount = 1;
+    desc.entries = &binding;
 
     {
         binding.binding = 0;
@@ -605,8 +605,8 @@
         void main() {})");
 
     wgpu::BindGroupLayoutDescriptor desc = {};
-    desc.bindingCount = 0;
-    desc.bindings = nullptr;
+    desc.entryCount = 0;
+    desc.entries = nullptr;
 
     wgpu::BindGroupLayout emptyBindGroupLayout = device.CreateBindGroupLayout(&desc);
 
@@ -625,8 +625,8 @@
     binding.visibility = wgpu::ShaderStage::Vertex;
 
     wgpu::BindGroupLayoutDescriptor bglDesc = {};
-    bglDesc.bindingCount = 1;
-    bglDesc.bindings = &binding;
+    bglDesc.entryCount = 1;
+    bglDesc.entries = &binding;
 
     wgpu::BindGroupLayout bindGroupLayout = device.CreateBindGroupLayout(&bglDesc);
 
@@ -663,8 +663,8 @@
 
     {
         wgpu::BindGroupLayoutDescriptor emptyDesc = {};
-        emptyDesc.bindingCount = 0;
-        emptyDesc.bindings = nullptr;
+        emptyDesc.entryCount = 0;
+        emptyDesc.entries = nullptr;
 
         wgpu::BindGroupLayout emptyBindGroupLayout = device.CreateBindGroupLayout(&emptyDesc);
 
diff --git a/src/tests/unittests/validation/StorageTextureValidationTests.cpp b/src/tests/unittests/validation/StorageTextureValidationTests.cpp
index 4a6a8e9..82d514c 100644
--- a/src/tests/unittests/validation/StorageTextureValidationTests.cpp
+++ b/src/tests/unittests/validation/StorageTextureValidationTests.cpp
@@ -381,11 +381,12 @@
          {wgpu::ShaderStage::Compute, wgpu::BindingType::StorageTexture, false}}};
 
     for (const auto& testSpec : kTestSpecs) {
-        wgpu::BindGroupLayoutEntry binding = {0, testSpec.stage, testSpec.type};
-        binding.storageTextureFormat = wgpu::TextureFormat::R32Uint;
+        wgpu::BindGroupLayoutEntry entry = {0, testSpec.stage, testSpec.type};
+        entry.storageTextureFormat = wgpu::TextureFormat::R32Uint;
+
         wgpu::BindGroupLayoutDescriptor descriptor;
-        descriptor.bindingCount = 1;
-        descriptor.bindings = &binding;
+        descriptor.entryCount = 1;
+        descriptor.entries = &entry;
 
         if (testSpec.valid) {
             device.CreateBindGroupLayout(&descriptor);
diff --git a/src/tests/unittests/wire/WireArgumentTests.cpp b/src/tests/unittests/wire/WireArgumentTests.cpp
index cbcd793..fe2b141 100644
--- a/src/tests/unittests/wire/WireArgumentTests.cpp
+++ b/src/tests/unittests/wire/WireArgumentTests.cpp
@@ -49,8 +49,8 @@
 TEST_F(WireArgumentTests, ValueArrayArgument) {
     // Create a bindgroup.
     WGPUBindGroupLayoutDescriptor bglDescriptor = {};
-    bglDescriptor.bindingCount = 0;
-    bglDescriptor.bindings = nullptr;
+    bglDescriptor.entryCount = 0;
+    bglDescriptor.entries = nullptr;
 
     WGPUBindGroupLayout bgl = wgpuDeviceCreateBindGroupLayout(device, &bglDescriptor);
     WGPUBindGroupLayout apiBgl = api.GetNewBindGroupLayout();
@@ -58,8 +58,8 @@
 
     WGPUBindGroupDescriptor bindGroupDescriptor = {};
     bindGroupDescriptor.layout = bgl;
-    bindGroupDescriptor.bindingCount = 0;
-    bindGroupDescriptor.bindings = nullptr;
+    bindGroupDescriptor.entryCount = 0;
+    bindGroupDescriptor.entries = nullptr;
 
     WGPUBindGroup bindGroup = wgpuDeviceCreateBindGroup(device, &bindGroupDescriptor);
     WGPUBindGroup apiBindGroup = api.GetNewBindGroup();
@@ -284,8 +284,8 @@
 // Test that the wire is able to send structures that contain objects
 TEST_F(WireArgumentTests, StructureOfObjectArrayArgument) {
     WGPUBindGroupLayoutDescriptor bglDescriptor = {};
-    bglDescriptor.bindingCount = 0;
-    bglDescriptor.bindings = nullptr;
+    bglDescriptor.entryCount = 0;
+    bglDescriptor.entries = nullptr;
 
     WGPUBindGroupLayout bgl = wgpuDeviceCreateBindGroupLayout(device, &bglDescriptor);
     WGPUBindGroupLayout apiBgl = api.GetNewBindGroupLayout();
@@ -313,7 +313,7 @@
 // Test that the wire is able to send structures that contain objects
 TEST_F(WireArgumentTests, StructureOfStructureArrayArgument) {
     static constexpr int NUM_BINDINGS = 3;
-    WGPUBindGroupLayoutEntry bindings[NUM_BINDINGS]{
+    WGPUBindGroupLayoutEntry entries[NUM_BINDINGS]{
         {0,
          WGPUShaderStage_Vertex,
          WGPUBindingType_Sampler,
@@ -343,24 +343,24 @@
          WGPUTextureFormat_RGBA8Unorm},
     };
     WGPUBindGroupLayoutDescriptor bglDescriptor = {};
-    bglDescriptor.bindingCount = NUM_BINDINGS;
-    bglDescriptor.bindings = bindings;
+    bglDescriptor.entryCount = NUM_BINDINGS;
+    bglDescriptor.entries = entries;
 
     wgpuDeviceCreateBindGroupLayout(device, &bglDescriptor);
     WGPUBindGroupLayout apiBgl = api.GetNewBindGroupLayout();
     EXPECT_CALL(
         api,
         DeviceCreateBindGroupLayout(
-            apiDevice, MatchesLambda([bindings](const WGPUBindGroupLayoutDescriptor* desc) -> bool {
+            apiDevice, MatchesLambda([entries](const WGPUBindGroupLayoutDescriptor* desc) -> bool {
                 for (int i = 0; i < NUM_BINDINGS; ++i) {
-                    const auto& a = desc->bindings[i];
-                    const auto& b = bindings[i];
+                    const auto& a = desc->entries[i];
+                    const auto& b = entries[i];
                     if (a.binding != b.binding || a.visibility != b.visibility ||
                         a.type != b.type) {
                         return false;
                     }
                 }
-                return desc->nextInChain == nullptr && desc->bindingCount == 3;
+                return desc->nextInChain == nullptr && desc->entryCount == 3;
             })))
         .WillOnce(Return(apiBgl));
 
diff --git a/src/tests/unittests/wire/WireMultipleDeviceTests.cpp b/src/tests/unittests/wire/WireMultipleDeviceTests.cpp
index da6f1e0..103702b 100644
--- a/src/tests/unittests/wire/WireMultipleDeviceTests.cpp
+++ b/src/tests/unittests/wire/WireMultipleDeviceTests.cpp
@@ -166,11 +166,11 @@
 
     wireA.FlushClient();
 
-    std::array<WGPUBindGroupBinding, 2> bindings = {};
+    std::array<WGPUBindGroupBinding, 2> entries = {};
 
     // Create a buffer on wire A.
     WGPUBufferDescriptor bufferDesc = {};
-    bindings[0].buffer = wgpuDeviceCreateBuffer(wireA.ClientDevice(), &bufferDesc);
+    entries[0].buffer = wgpuDeviceCreateBuffer(wireA.ClientDevice(), &bufferDesc);
     EXPECT_CALL(*wireA.Api(), DeviceCreateBuffer(wireA.ServerDevice(), _))
         .WillOnce(Return(wireA.Api()->GetNewBuffer()));
 
@@ -178,7 +178,7 @@
 
     // Create a sampler on wire B.
     WGPUSamplerDescriptor samplerDesc = {};
-    bindings[1].sampler = wgpuDeviceCreateSampler(wireB.ClientDevice(), &samplerDesc);
+    entries[1].sampler = wgpuDeviceCreateSampler(wireB.ClientDevice(), &samplerDesc);
     EXPECT_CALL(*wireB.Api(), DeviceCreateSampler(wireB.ServerDevice(), _))
         .WillOnce(Return(wireB.Api()->GetNewSampler()));
 
@@ -187,8 +187,8 @@
     // Create a bind group on wire A using the bgl (A), buffer (A), and sampler (B).
     WGPUBindGroupDescriptor bgDesc = {};
     bgDesc.layout = bglA;
-    bgDesc.bindingCount = bindings.size();
-    bgDesc.bindings = bindings.data();
+    bgDesc.entryCount = entries.size();
+    bgDesc.entries = entries.data();
     WGPUBindGroup bindGroupA = wgpuDeviceCreateBindGroup(wireA.ClientDevice(), &bgDesc);
 
     // It should inject an error because the sampler is from a different device.
diff --git a/src/tests/unittests/wire/WireOptionalTests.cpp b/src/tests/unittests/wire/WireOptionalTests.cpp
index 5695dc5..ca80994 100644
--- a/src/tests/unittests/wire/WireOptionalTests.cpp
+++ b/src/tests/unittests/wire/WireOptionalTests.cpp
@@ -27,7 +27,7 @@
 // Test passing nullptr instead of objects - object as value version
 TEST_F(WireOptionalTests, OptionalObjectValue) {
     WGPUBindGroupLayoutDescriptor bglDesc = {};
-    bglDesc.bindingCount = 0;
+    bglDesc.entryCount = 0;
     WGPUBindGroupLayout bgl = wgpuDeviceCreateBindGroupLayout(device, &bglDesc);
 
     WGPUBindGroupLayout apiBindGroupLayout = api.GetNewBindGroupLayout();
@@ -35,27 +35,27 @@
         .WillOnce(Return(apiBindGroupLayout));
 
     // The `sampler`, `textureView` and `buffer` members of a binding are optional.
-    WGPUBindGroupEntry binding;
-    binding.binding = 0;
-    binding.sampler = nullptr;
-    binding.textureView = nullptr;
-    binding.buffer = nullptr;
+    WGPUBindGroupEntry entry;
+    entry.binding = 0;
+    entry.sampler = nullptr;
+    entry.textureView = nullptr;
+    entry.buffer = nullptr;
 
     WGPUBindGroupDescriptor bgDesc = {};
     bgDesc.layout = bgl;
-    bgDesc.bindingCount = 1;
-    bgDesc.bindings = &binding;
+    bgDesc.entryCount = 1;
+    bgDesc.entries = &entry;
 
     wgpuDeviceCreateBindGroup(device, &bgDesc);
 
     WGPUBindGroup apiDummyBindGroup = api.GetNewBindGroup();
     EXPECT_CALL(api, DeviceCreateBindGroup(
                          apiDevice, MatchesLambda([](const WGPUBindGroupDescriptor* desc) -> bool {
-                             return desc->nextInChain == nullptr && desc->bindingCount == 1 &&
-                                    desc->bindings[0].binding == 0 &&
-                                    desc->bindings[0].sampler == nullptr &&
-                                    desc->bindings[0].buffer == nullptr &&
-                                    desc->bindings[0].textureView == nullptr;
+                             return desc->nextInChain == nullptr && desc->entryCount == 1 &&
+                                    desc->entries[0].binding == 0 &&
+                                    desc->entries[0].sampler == nullptr &&
+                                    desc->entries[0].buffer == nullptr &&
+                                    desc->entries[0].textureView == nullptr;
                          })))
         .WillOnce(Return(apiDummyBindGroup));
 
diff --git a/src/utils/WGPUHelpers.cpp b/src/utils/WGPUHelpers.cpp
index 98227d6..9eb3912 100644
--- a/src/utils/WGPUHelpers.cpp
+++ b/src/utils/WGPUHelpers.cpp
@@ -271,16 +271,15 @@
 
     wgpu::BindGroupLayout MakeBindGroupLayout(
         const wgpu::Device& device,
-        std::initializer_list<wgpu::BindGroupLayoutEntry> bindingsInitializer) {
-
-        std::vector<wgpu::BindGroupLayoutEntry> bindings;
-        for (const wgpu::BindGroupLayoutEntry& binding : bindingsInitializer) {
-            bindings.push_back(binding);
+        std::initializer_list<wgpu::BindGroupLayoutEntry> entriesInitializer) {
+        std::vector<wgpu::BindGroupLayoutEntry> entries;
+        for (const wgpu::BindGroupLayoutEntry& entry : entriesInitializer) {
+            entries.push_back(entry);
         }
 
         wgpu::BindGroupLayoutDescriptor descriptor;
-        descriptor.bindingCount = static_cast<uint32_t>(bindings.size());
-        descriptor.bindings = bindings.data();
+        descriptor.entryCount = static_cast<uint32_t>(entries.size());
+        descriptor.entries = entries.data();
         return device.CreateBindGroupLayout(&descriptor);
     }
 
@@ -317,16 +316,16 @@
     wgpu::BindGroup MakeBindGroup(
         const wgpu::Device& device,
         const wgpu::BindGroupLayout& layout,
-        std::initializer_list<BindingInitializationHelper> bindingsInitializer) {
-        std::vector<wgpu::BindGroupEntry> bindings;
-        for (const BindingInitializationHelper& helper : bindingsInitializer) {
-            bindings.push_back(helper.GetAsBinding());
+        std::initializer_list<BindingInitializationHelper> entriesInitializer) {
+        std::vector<wgpu::BindGroupEntry> entries;
+        for (const BindingInitializationHelper& helper : entriesInitializer) {
+            entries.push_back(helper.GetAsBinding());
         }
 
         wgpu::BindGroupDescriptor descriptor;
         descriptor.layout = layout;
-        descriptor.bindingCount = bindings.size();
-        descriptor.bindings = bindings.data();
+        descriptor.entryCount = entries.size();
+        descriptor.entries = entries.data();
 
         return device.CreateBindGroup(&descriptor);
     }
diff --git a/src/utils/WGPUHelpers.h b/src/utils/WGPUHelpers.h
index 3fdeb6d..8e2f963 100644
--- a/src/utils/WGPUHelpers.h
+++ b/src/utils/WGPUHelpers.h
@@ -91,7 +91,7 @@
                                                  const wgpu::BindGroupLayout* bindGroupLayout);
     wgpu::BindGroupLayout MakeBindGroupLayout(
         const wgpu::Device& device,
-        std::initializer_list<wgpu::BindGroupLayoutEntry> bindingsInitializer);
+        std::initializer_list<wgpu::BindGroupLayoutEntry> entriesInitializer);
 
     // Helpers to make creating bind groups look nicer:
     //
@@ -124,7 +124,7 @@
     wgpu::BindGroup MakeBindGroup(
         const wgpu::Device& device,
         const wgpu::BindGroupLayout& layout,
-        std::initializer_list<BindingInitializationHelper> bindingsInitializer);
+        std::initializer_list<BindingInitializationHelper> entriesInitializer);
 
 }  // namespace utils