[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.