Validate there are at most kMaxBindingsPerGroup entries per layout.
This is a regression that was caught by the WebGPU CTS after
https://dawn-review.googlesource.com/c/dawn/+/17240 where the
BindGroupLayout validation was changed to use a set, and the check for
KMaxBindingsPerGroup removed.
This CL also adds a regression test.
Bug: dawn:354
Change-Id: I0cda545b9df7220ca53216878cf24ac8ce880648
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/17620
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/dawn_native/BindGroupLayout.cpp b/src/dawn_native/BindGroupLayout.cpp
index a14e53c..7556724 100644
--- a/src/dawn_native/BindGroupLayout.cpp
+++ b/src/dawn_native/BindGroupLayout.cpp
@@ -152,6 +152,10 @@
bindingsSet.insert(bindingNumber);
}
+ if (bindingsSet.size() > kMaxBindingsPerGroup) {
+ return DAWN_VALIDATION_ERROR("The number of bindings exceeds kMaxBindingsPerGroup.");
+ }
+
if (dynamicUniformBufferCount > kMaxDynamicUniformBufferCount) {
return DAWN_VALIDATION_ERROR(
"The number of dynamic uniform buffer exceeds the maximum value");
diff --git a/src/tests/unittests/validation/BindGroupValidationTests.cpp b/src/tests/unittests/validation/BindGroupValidationTests.cpp
index b7f0120..2c441d6 100644
--- a/src/tests/unittests/validation/BindGroupValidationTests.cpp
+++ b/src/tests/unittests/validation/BindGroupValidationTests.cpp
@@ -521,6 +521,28 @@
wgpu::BindingType::UniformBuffer}});
}
+// Test that there can't be more than kMaxBindingPerGroup bindings per group
+TEST_F(BindGroupLayoutValidationTest, BindGroupLayoutMaxBindings) {
+ wgpu::BindGroupLayoutBinding bindings[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;
+ }
+
+ wgpu::BindGroupLayoutDescriptor desc;
+ desc.bindings = bindings;
+
+ // Control case: kMaxBindingsPerGroup bindings is allowed.
+ desc.bindingCount = kMaxBindingsPerGroup;
+ device.CreateBindGroupLayout(&desc);
+
+ // Error case: kMaxBindingsPerGroup + 1 bindings is not allowed.
+ desc.bindingCount = kMaxBindingsPerGroup + 1;
+ ASSERT_DEVICE_ERROR(device.CreateBindGroupLayout(&desc));
+}
+
// This test verifies that the BindGroupLayout bindings are correctly validated, even if the
// binding ids are out-of-order.
TEST_F(BindGroupLayoutValidationTest, BindGroupBinding) {