[dawn][native] Require BG have a dynamicArraySize if the BGL has a dynamic array

Bug: 439522242
Change-Id: I15e277a9ad821c6eec550517b0e96de08a582de6
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/258076
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/dawn/native/BindGroup.cpp b/src/dawn/native/BindGroup.cpp
index 1f0c00d..2e987fd 100644
--- a/src/dawn/native/BindGroup.cpp
+++ b/src/dawn/native/BindGroup.cpp
@@ -663,6 +663,10 @@
     // Validate the dynamic entries.
     if (descriptor.Has<BindGroupDynamicBindingArray>()) {
         DAWN_TRY(ValidateBindGroupDynamicBindingArray(device, descriptor, mode));
+    } else {
+        DAWN_INVALID_IF(
+            layout->HasDynamicArray(),
+            "dynamicArraySize is not specified when the layout contains a dynamic binding array.");
     }
 
     return descriptor;
diff --git a/src/dawn/native/BindGroupLayoutInternal.cpp b/src/dawn/native/BindGroupLayoutInternal.cpp
index c710fe1..988f7e4 100644
--- a/src/dawn/native/BindGroupLayoutInternal.cpp
+++ b/src/dawn/native/BindGroupLayoutInternal.cpp
@@ -708,18 +708,22 @@
 }
 
 bool BindGroupLayoutInternalBase::HasDynamicArray() const {
+    DAWN_ASSERT(!IsError());
     return mHasDynamicArray;
 }
 
 BindingNumber BindGroupLayoutInternalBase::GetAPIDynamicArrayStart() const {
+    DAWN_ASSERT(!IsError());
     return mAPIDynamicArrayStart;
 }
 
 BindingIndex BindGroupLayoutInternalBase::GetDynamicArrayStart() const {
+    DAWN_ASSERT(!IsError());
     return mDynamicArrayStart;
 }
 
 wgpu::DynamicBindingKind BindGroupLayoutInternalBase::GetDynamicArrayKind() const {
+    DAWN_ASSERT(!IsError());
     return mDynamicArrayKind;
 }
 
diff --git a/src/dawn/tests/unittests/validation/BindGroupValidationTests.cpp b/src/dawn/tests/unittests/validation/BindGroupValidationTests.cpp
index 8c43144..d036f22 100644
--- a/src/dawn/tests/unittests/validation/BindGroupValidationTests.cpp
+++ b/src/dawn/tests/unittests/validation/BindGroupValidationTests.cpp
@@ -4513,6 +4513,27 @@
     ASSERT_DEVICE_ERROR(device.CreateBindGroup(&desc));
 }
 
+// Check that the dynamic array size must be below the limit.
+TEST_F(BindGroupValidationTest_ChromiumExperimentalBindless, DynamicArrayRequiresASize) {
+    wgpu::BindGroupLayoutDynamicBindingArray layoutDynamic;
+    layoutDynamic.dynamicArray.kind = wgpu::DynamicBindingKind::SampledTexture;
+    wgpu::BindGroupLayoutDescriptor layoutDesc;
+    layoutDesc.nextInChain = &layoutDynamic;
+
+    wgpu::BindGroupDynamicBindingArray dynamic;
+    dynamic.dynamicArraySize = 0;
+    wgpu::BindGroupDescriptor desc;
+    desc.layout = device.CreateBindGroupLayout(&layoutDesc);
+
+    // Control case: a size, even of 0 is valid.
+    desc.nextInChain = &dynamic;
+    device.CreateBindGroup(&desc);
+
+    // Error case: an unspecified size is invalid.
+    desc.nextInChain = nullptr;
+    ASSERT_DEVICE_ERROR(device.CreateBindGroup(&desc));
+}
+
 // Check that specifying an entry that's neither a known static one or a dynamic one is an error.
 TEST_F(BindGroupValidationTest_ChromiumExperimentalBindless, EntryNeitherStaticNorDynamic) {
     // Create a layout with a static entry at 0 and a dynamic binding array starting at 2.