Remove deprecated BindGroupLayoutEntry fields
Bug: dawn:22
Change-Id: Idf0fd0505fb7e5e5389520fa7bc638e137f4c0b6
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/51765
Commit-Queue: Brandon Jones <bajones@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
diff --git a/dawn.json b/dawn.json
index 14bfbe8..41ed56b 100644
--- a/dawn.json
+++ b/dawn.json
@@ -170,14 +170,6 @@
"members": [
{"name": "binding", "type": "uint32_t"},
{"name": "visibility", "type": "shader stage"},
-
- {"name": "type", "type": "binding type", "default": "undefined"},
- {"name": "has dynamic offset", "type": "bool", "default": "false"},
- {"name": "min buffer binding size", "type": "uint64_t", "default": "0"},
- {"name": "view dimension", "type": "texture view dimension", "default": "undefined"},
- {"name": "texture component type", "type": "texture component type", "default": "float"},
- {"name": "storage texture format", "type": "texture format", "default": "undefined"},
-
{"name": "buffer", "type": "buffer binding layout"},
{"name": "sampler", "type": "sampler binding layout"},
{"name": "texture", "type": "texture binding layout"},
@@ -193,21 +185,6 @@
{"name": "entries", "type": "bind group layout entry", "annotation": "const*", "length": "entry count"}
]
},
- "binding type": {
- "category": "enum",
- "values": [
- {"value": 0, "name": "undefined", "jsrepr": "undefined", "valid": false},
- {"value": 1, "name": "uniform buffer"},
- {"value": 2, "name": "storage buffer"},
- {"value": 3, "name": "readonly storage buffer"},
- {"value": 4, "name": "sampler"},
- {"value": 5, "name": "comparison sampler"},
- {"value": 6, "name": "sampled texture"},
- {"value": 7, "name": "multisampled texture"},
- {"value": 8, "name": "readonly storage texture"},
- {"value": 9, "name": "writeonly storage texture"}
- ]
- },
"blend component": {
"category": "structure",
"extensible": false,
diff --git a/src/dawn_native/BindGroupLayout.cpp b/src/dawn_native/BindGroupLayout.cpp
index 4417610..e07656a 100644
--- a/src/dawn_native/BindGroupLayout.cpp
+++ b/src/dawn_native/BindGroupLayout.cpp
@@ -147,86 +147,10 @@
}
}
- if (bindingMemberCount > 1) {
+ if (bindingMemberCount != 1) {
return DAWN_VALIDATION_ERROR(
- "Only one of buffer, sampler, texture, or storageTexture may be set for each "
- "BindGroupLayoutEntry");
- } else if (bindingMemberCount == 1) {
- if (entry.type != wgpu::BindingType::Undefined) {
- return DAWN_VALIDATION_ERROR(
- "BindGroupLayoutEntry type must be undefined if any of buffer, sampler, "
- "texture, or storageTexture are set");
- }
- } else if (bindingMemberCount == 0) {
- // Deprecated validation path
- device->EmitDeprecationWarning(
- "The format of BindGroupLayoutEntry has changed, and will soon require the "
- "buffer, sampler, texture, or storageTexture members be set rather than "
- "setting type, etc. on the entry directly.");
-
- DAWN_TRY(ValidateBindingType(entry.type));
- DAWN_TRY(ValidateTextureComponentType(entry.textureComponentType));
-
- wgpu::TextureViewDimension viewDimension = wgpu::TextureViewDimension::e2D;
- if (entry.viewDimension != wgpu::TextureViewDimension::Undefined) {
- DAWN_TRY(ValidateTextureViewDimension(entry.viewDimension));
- viewDimension = entry.viewDimension;
- }
-
- bool canBeDynamic = false;
-
- switch (entry.type) {
- case wgpu::BindingType::StorageBuffer:
- allowedStages &= ~wgpu::ShaderStage::Vertex;
- DAWN_FALLTHROUGH;
- case wgpu::BindingType::UniformBuffer:
- case wgpu::BindingType::ReadonlyStorageBuffer:
- canBeDynamic = true;
- break;
-
- case wgpu::BindingType::SampledTexture:
- break;
-
- case wgpu::BindingType::MultisampledTexture:
- if (viewDimension != wgpu::TextureViewDimension::e2D) {
- return DAWN_VALIDATION_ERROR("Multisampled binding must be 2D.");
- }
- if (entry.textureComponentType ==
- wgpu::TextureComponentType::DepthComparison) {
- return DAWN_VALIDATION_ERROR(
- "Multisampled binding must not be DepthComparison.");
- }
- break;
-
- case wgpu::BindingType::WriteonlyStorageTexture:
- allowedStages &= ~wgpu::ShaderStage::Vertex;
- DAWN_FALLTHROUGH;
- case wgpu::BindingType::ReadonlyStorageTexture:
- DAWN_TRY(ValidateStorageTextureFormat(device, entry.storageTextureFormat));
- DAWN_TRY(ValidateStorageTextureViewDimension(viewDimension));
- break;
-
- case wgpu::BindingType::Sampler:
- case wgpu::BindingType::ComparisonSampler:
- break;
-
- case wgpu::BindingType::Undefined:
- UNREACHABLE();
- }
-
- if (entry.hasDynamicOffset && !canBeDynamic) {
- return DAWN_VALIDATION_ERROR("Binding type cannot be dynamic.");
- }
-
- // Dynamic storage buffers aren't bounds checked properly in D3D12. Disallow them as
- // unsafe until the bounds checks are implemented.
- if (device->IsToggleEnabled(Toggle::DisallowUnsafeAPIs) && entry.hasDynamicOffset &&
- (entry.type == wgpu::BindingType::StorageBuffer ||
- entry.type == wgpu::BindingType::ReadonlyStorageBuffer)) {
- return DAWN_VALIDATION_ERROR(
- "Dynamic storage buffers are disallowed because they aren't secure yet. "
- "See https://crbug.com/dawn/429");
- }
+ "Exactly one of buffer, sampler, texture, or storageTexture must be set for "
+ "each BindGroupLayoutEntry");
}
if (!IsSubset(entry.visibility, allowedStages)) {
@@ -269,117 +193,17 @@
}
}
- // TODO(dawn:527): Once the deprecated BindGroupLayoutEntry path has been removed, this can
- // turn into a simple `binding.buffer.type != wgpu::BufferBindingType::Undefined` check.
bool IsBufferBinding(const BindGroupLayoutEntry& binding) {
- if (binding.buffer.type != wgpu::BufferBindingType::Undefined) {
- return true;
- } else if (binding.sampler.type != wgpu::SamplerBindingType::Undefined) {
- return false;
- } else if (binding.texture.sampleType != wgpu::TextureSampleType::Undefined) {
- return false;
- } else if (binding.storageTexture.access != wgpu::StorageTextureAccess::Undefined) {
- return false;
- }
-
- // Deprecated path
- switch (binding.type) {
- case wgpu::BindingType::UniformBuffer:
- case wgpu::BindingType::StorageBuffer:
- case wgpu::BindingType::ReadonlyStorageBuffer:
- return true;
- case wgpu::BindingType::SampledTexture:
- case wgpu::BindingType::MultisampledTexture:
- case wgpu::BindingType::Sampler:
- case wgpu::BindingType::ComparisonSampler:
- case wgpu::BindingType::ReadonlyStorageTexture:
- case wgpu::BindingType::WriteonlyStorageTexture:
- case wgpu::BindingType::Undefined:
- return false;
- }
+ return binding.buffer.type != wgpu::BufferBindingType::Undefined;
}
bool BindingHasDynamicOffset(const BindGroupLayoutEntry& binding) {
if (binding.buffer.type != wgpu::BufferBindingType::Undefined) {
return binding.buffer.hasDynamicOffset;
- } else if (binding.sampler.type != wgpu::SamplerBindingType::Undefined) {
- return false;
- } else if (binding.texture.sampleType != wgpu::TextureSampleType::Undefined) {
- return false;
- } else if (binding.storageTexture.access != wgpu::StorageTextureAccess::Undefined) {
- return false;
- }
-
- return binding.hasDynamicOffset;
- }
-
- bool SortBindingsCompare(const BindGroupLayoutEntry& a, const BindGroupLayoutEntry& b) {
- const bool aIsBuffer = IsBufferBinding(a);
- const bool bIsBuffer = IsBufferBinding(b);
- if (aIsBuffer != bIsBuffer) {
- // Always place buffers first.
- return aIsBuffer;
- } else {
- if (aIsBuffer) {
- bool aHasDynamicOffset = BindingHasDynamicOffset(a);
- bool bHasDynamicOffset = BindingHasDynamicOffset(b);
- ASSERT(bIsBuffer);
- if (aHasDynamicOffset != bHasDynamicOffset) {
- // Buffers with dynamic offsets should come before those without.
- // This makes it easy to iterate over the dynamic buffer bindings
- // [0, dynamicBufferCount) during validation.
- return aHasDynamicOffset;
- }
- if (aHasDynamicOffset) {
- ASSERT(bHasDynamicOffset);
- ASSERT(a.binding != b.binding);
- // Above, we ensured that dynamic buffers are first. Now, ensure that
- // dynamic buffer bindings are in increasing order. This is because dynamic
- // buffer offsets are applied in increasing order of binding number.
- return a.binding < b.binding;
- }
- }
- // Otherwise, sort by type.
- if (a.type != b.type) {
- return a.type < b.type;
- }
- }
- if (a.visibility != b.visibility) {
- return a.visibility < b.visibility;
- }
- if (a.viewDimension != b.viewDimension) {
- return a.viewDimension < b.viewDimension;
- }
- if (a.textureComponentType != b.textureComponentType) {
- return a.textureComponentType < b.textureComponentType;
- }
- if (a.storageTextureFormat != b.storageTextureFormat) {
- return a.storageTextureFormat < b.storageTextureFormat;
- }
- if (a.minBufferBindingSize != b.minBufferBindingSize) {
- return a.minBufferBindingSize < b.minBufferBindingSize;
}
return false;
}
- // This is a utility function to help ASSERT that the BGL-binding comparator places buffers
- // first.
- bool CheckBufferBindingsFirst(ityp::span<BindingIndex, const BindingInfo> bindings) {
- BindingIndex lastBufferIndex{0};
- BindingIndex firstNonBufferIndex = std::numeric_limits<BindingIndex>::max();
- for (BindingIndex i{0}; i < bindings.size(); ++i) {
- if (bindings[i].bindingType == BindingInfoType::Buffer) {
- lastBufferIndex = std::max(i, lastBufferIndex);
- } else {
- firstNonBufferIndex = std::min(i, firstNonBufferIndex);
- }
- }
-
- // If there are no buffers, then |lastBufferIndex| is initialized to 0 and
- // |firstNonBufferIndex| gets set to 0.
- return firstNonBufferIndex >= lastBufferIndex;
- }
-
BindingInfo CreateBindGroupLayoutInfo(const BindGroupLayoutEntry& binding) {
BindingInfo bindingInfo;
bindingInfo.binding = BindingNumber(binding.binding);
@@ -405,92 +229,108 @@
if (binding.storageTexture.viewDimension == wgpu::TextureViewDimension::Undefined) {
bindingInfo.storageTexture.viewDimension = wgpu::TextureViewDimension::e2D;
}
- } else {
- // Deprecated entry layout.
- switch (binding.type) {
- case wgpu::BindingType::UniformBuffer:
- bindingInfo.bindingType = BindingInfoType::Buffer;
- bindingInfo.buffer.type = wgpu::BufferBindingType::Uniform;
- bindingInfo.buffer.hasDynamicOffset = binding.hasDynamicOffset;
- bindingInfo.buffer.minBindingSize = binding.minBufferBindingSize;
- break;
- case wgpu::BindingType::StorageBuffer:
- bindingInfo.bindingType = BindingInfoType::Buffer;
- bindingInfo.buffer.type = wgpu::BufferBindingType::Storage;
- bindingInfo.buffer.hasDynamicOffset = binding.hasDynamicOffset;
- bindingInfo.buffer.minBindingSize = binding.minBufferBindingSize;
- break;
- case wgpu::BindingType::ReadonlyStorageBuffer:
- bindingInfo.bindingType = BindingInfoType::Buffer;
- bindingInfo.buffer.type = wgpu::BufferBindingType::ReadOnlyStorage;
- bindingInfo.buffer.hasDynamicOffset = binding.hasDynamicOffset;
- bindingInfo.buffer.minBindingSize = binding.minBufferBindingSize;
- break;
-
- case wgpu::BindingType::Sampler:
- bindingInfo.bindingType = BindingInfoType::Sampler;
- bindingInfo.sampler.type = wgpu::SamplerBindingType::Filtering;
- break;
- case wgpu::BindingType::ComparisonSampler:
- bindingInfo.bindingType = BindingInfoType::Sampler;
- bindingInfo.sampler.type = wgpu::SamplerBindingType::Comparison;
- break;
-
- case wgpu::BindingType::MultisampledTexture:
- bindingInfo.texture.multisampled = true;
- DAWN_FALLTHROUGH;
- case wgpu::BindingType::SampledTexture:
- bindingInfo.bindingType = BindingInfoType::Texture;
- bindingInfo.texture.viewDimension = binding.viewDimension;
- if (binding.viewDimension == wgpu::TextureViewDimension::Undefined) {
- bindingInfo.texture.viewDimension = wgpu::TextureViewDimension::e2D;
- }
-
- switch (binding.textureComponentType) {
- case wgpu::TextureComponentType::Float:
- bindingInfo.texture.sampleType = wgpu::TextureSampleType::Float;
- break;
- case wgpu::TextureComponentType::Uint:
- bindingInfo.texture.sampleType = wgpu::TextureSampleType::Uint;
- break;
- case wgpu::TextureComponentType::Sint:
- bindingInfo.texture.sampleType = wgpu::TextureSampleType::Sint;
- break;
- case wgpu::TextureComponentType::DepthComparison:
- bindingInfo.texture.sampleType = wgpu::TextureSampleType::Depth;
- break;
- }
- break;
-
- case wgpu::BindingType::ReadonlyStorageTexture:
- bindingInfo.bindingType = BindingInfoType::StorageTexture;
- bindingInfo.storageTexture.access = wgpu::StorageTextureAccess::ReadOnly;
- bindingInfo.storageTexture.format = binding.storageTextureFormat;
- bindingInfo.storageTexture.viewDimension = binding.viewDimension;
- if (binding.viewDimension == wgpu::TextureViewDimension::Undefined) {
- bindingInfo.storageTexture.viewDimension =
- wgpu::TextureViewDimension::e2D;
- }
- break;
- case wgpu::BindingType::WriteonlyStorageTexture:
- bindingInfo.bindingType = BindingInfoType::StorageTexture;
- bindingInfo.storageTexture.access = wgpu::StorageTextureAccess::WriteOnly;
- bindingInfo.storageTexture.format = binding.storageTextureFormat;
- bindingInfo.storageTexture.viewDimension = binding.viewDimension;
- if (binding.viewDimension == wgpu::TextureViewDimension::Undefined) {
- bindingInfo.storageTexture.viewDimension =
- wgpu::TextureViewDimension::e2D;
- }
- break;
-
- case wgpu::BindingType::Undefined:
- UNREACHABLE();
- }
}
return bindingInfo;
}
+ bool SortBindingsCompare(const BindGroupLayoutEntry& a, const BindGroupLayoutEntry& b) {
+ const bool aIsBuffer = IsBufferBinding(a);
+ const bool bIsBuffer = IsBufferBinding(b);
+ if (aIsBuffer != bIsBuffer) {
+ // Always place buffers first.
+ return aIsBuffer;
+ }
+
+ if (aIsBuffer) {
+ bool aHasDynamicOffset = BindingHasDynamicOffset(a);
+ bool bHasDynamicOffset = BindingHasDynamicOffset(b);
+ ASSERT(bIsBuffer);
+ if (aHasDynamicOffset != bHasDynamicOffset) {
+ // Buffers with dynamic offsets should come before those without.
+ // This makes it easy to iterate over the dynamic buffer bindings
+ // [0, dynamicBufferCount) during validation.
+ return aHasDynamicOffset;
+ }
+ if (aHasDynamicOffset) {
+ ASSERT(bHasDynamicOffset);
+ ASSERT(a.binding != b.binding);
+ // Above, we ensured that dynamic buffers are first. Now, ensure that
+ // dynamic buffer bindings are in increasing order. This is because dynamic
+ // buffer offsets are applied in increasing order of binding number.
+ return a.binding < b.binding;
+ }
+ }
+
+ // This applies some defaults and gives us a single value to check for the binding type.
+ BindingInfo aInfo = CreateBindGroupLayoutInfo(a);
+ BindingInfo bInfo = CreateBindGroupLayoutInfo(b);
+
+ // Sort by type.
+ if (aInfo.bindingType != bInfo.bindingType) {
+ return aInfo.bindingType < bInfo.bindingType;
+ }
+
+ if (a.visibility != b.visibility) {
+ return a.visibility < b.visibility;
+ }
+
+ switch (aInfo.bindingType) {
+ case BindingInfoType::Buffer:
+ if (aInfo.buffer.minBindingSize != bInfo.buffer.minBindingSize) {
+ return aInfo.buffer.minBindingSize < bInfo.buffer.minBindingSize;
+ }
+ break;
+ case BindingInfoType::Sampler:
+ if (aInfo.sampler.type != bInfo.sampler.type) {
+ return aInfo.sampler.type < bInfo.sampler.type;
+ }
+ break;
+ case BindingInfoType::Texture:
+ if (aInfo.texture.multisampled != bInfo.texture.multisampled) {
+ return aInfo.texture.multisampled < bInfo.texture.multisampled;
+ }
+ if (aInfo.texture.viewDimension != bInfo.texture.viewDimension) {
+ return aInfo.texture.viewDimension < bInfo.texture.viewDimension;
+ }
+ if (aInfo.texture.sampleType != bInfo.texture.sampleType) {
+ return aInfo.texture.sampleType < bInfo.texture.sampleType;
+ }
+ break;
+ case BindingInfoType::StorageTexture:
+ if (aInfo.storageTexture.access != bInfo.storageTexture.access) {
+ return aInfo.storageTexture.access < bInfo.storageTexture.access;
+ }
+ if (aInfo.storageTexture.viewDimension != bInfo.storageTexture.viewDimension) {
+ return aInfo.storageTexture.viewDimension <
+ bInfo.storageTexture.viewDimension;
+ }
+ if (aInfo.storageTexture.format != bInfo.storageTexture.format) {
+ return aInfo.storageTexture.format < bInfo.storageTexture.format;
+ }
+ break;
+ }
+ return false;
+ }
+
+ // This is a utility function to help ASSERT that the BGL-binding comparator places buffers
+ // first.
+ bool CheckBufferBindingsFirst(ityp::span<BindingIndex, const BindingInfo> bindings) {
+ BindingIndex lastBufferIndex{0};
+ BindingIndex firstNonBufferIndex = std::numeric_limits<BindingIndex>::max();
+ for (BindingIndex i{0}; i < bindings.size(); ++i) {
+ if (bindings[i].bindingType == BindingInfoType::Buffer) {
+ lastBufferIndex = std::max(i, lastBufferIndex);
+ } else {
+ firstNonBufferIndex = std::min(i, firstNonBufferIndex);
+ }
+ }
+
+ // If there are no buffers, then |lastBufferIndex| is initialized to 0 and
+ // |firstNonBufferIndex| gets set to 0.
+ return firstNonBufferIndex >= lastBufferIndex;
+ }
+
} // namespace
// BindGroupLayoutBase
diff --git a/src/dawn_native/BindingInfo.cpp b/src/dawn_native/BindingInfo.cpp
index 6c7f926..3b13a33 100644
--- a/src/dawn_native/BindingInfo.cpp
+++ b/src/dawn_native/BindingInfo.cpp
@@ -56,50 +56,6 @@
perStageBindingCountMember = &PerStageBindingCounts::sampledTextureCount;
} else if (entry.storageTexture.access != wgpu::StorageTextureAccess::Undefined) {
perStageBindingCountMember = &PerStageBindingCounts::storageTextureCount;
- } else {
- // Deprecated path.
- switch (entry.type) {
- case wgpu::BindingType::UniformBuffer:
- ++bindingCounts->bufferCount;
- if (entry.hasDynamicOffset) {
- ++bindingCounts->dynamicUniformBufferCount;
- }
- if (entry.minBufferBindingSize == 0) {
- ++bindingCounts->unverifiedBufferCount;
- }
- perStageBindingCountMember = &PerStageBindingCounts::uniformBufferCount;
- break;
-
- case wgpu::BindingType::StorageBuffer:
- case wgpu::BindingType::ReadonlyStorageBuffer:
- ++bindingCounts->bufferCount;
- if (entry.hasDynamicOffset) {
- ++bindingCounts->dynamicStorageBufferCount;
- }
- if (entry.minBufferBindingSize == 0) {
- ++bindingCounts->unverifiedBufferCount;
- }
- perStageBindingCountMember = &PerStageBindingCounts::storageBufferCount;
- break;
-
- case wgpu::BindingType::SampledTexture:
- case wgpu::BindingType::MultisampledTexture:
- perStageBindingCountMember = &PerStageBindingCounts::sampledTextureCount;
- break;
-
- case wgpu::BindingType::Sampler:
- case wgpu::BindingType::ComparisonSampler:
- perStageBindingCountMember = &PerStageBindingCounts::samplerCount;
- break;
-
- case wgpu::BindingType::ReadonlyStorageTexture:
- case wgpu::BindingType::WriteonlyStorageTexture:
- perStageBindingCountMember = &PerStageBindingCounts::storageTextureCount;
- break;
-
- case wgpu::BindingType::Undefined:
- UNREACHABLE();
- }
}
ASSERT(perStageBindingCountMember != nullptr);
diff --git a/src/tests/end2end/DeprecatedAPITests.cpp b/src/tests/end2end/DeprecatedAPITests.cpp
index 573d095..8205e3b 100644
--- a/src/tests/end2end/DeprecatedAPITests.cpp
+++ b/src/tests/end2end/DeprecatedAPITests.cpp
@@ -85,109 +85,6 @@
pass.EndPass();
}
-// Test that BindGroupLayoutEntry cannot have a type if buffer, sampler, texture, or storageTexture
-// are defined.
-TEST_P(DeprecationTests, BindGroupLayoutEntryTypeConflict) {
- wgpu::BindGroupLayoutEntry binding;
- binding.binding = 0;
- binding.visibility = wgpu::ShaderStage::Vertex;
-
- wgpu::BindGroupLayoutDescriptor descriptor;
- descriptor.entryCount = 1;
- descriptor.entries = &binding;
-
- // Succeeds with only a type.
- binding.type = wgpu::BindingType::UniformBuffer;
- EXPECT_DEPRECATION_WARNING(device.CreateBindGroupLayout(&descriptor));
-
- binding.type = wgpu::BindingType::Undefined;
-
- // Succeeds with only a buffer.type.
- binding.buffer.type = wgpu::BufferBindingType::Uniform;
- device.CreateBindGroupLayout(&descriptor);
- // Fails when both type and a buffer.type are specified.
- binding.type = wgpu::BindingType::UniformBuffer;
- ASSERT_DEVICE_ERROR(device.CreateBindGroupLayout(&descriptor));
-
- binding.buffer.type = wgpu::BufferBindingType::Undefined;
- binding.type = wgpu::BindingType::Undefined;
-
- // Succeeds with only a sampler.type.
- binding.sampler.type = wgpu::SamplerBindingType::Filtering;
- device.CreateBindGroupLayout(&descriptor);
- // Fails when both type and a sampler.type are specified.
- binding.type = wgpu::BindingType::Sampler;
- ASSERT_DEVICE_ERROR(device.CreateBindGroupLayout(&descriptor));
-
- binding.sampler.type = wgpu::SamplerBindingType::Undefined;
- binding.type = wgpu::BindingType::Undefined;
-
- // Succeeds with only a texture.sampleType.
- binding.texture.sampleType = wgpu::TextureSampleType::Float;
- device.CreateBindGroupLayout(&descriptor);
- // Fails when both type and a texture.sampleType are specified.
- binding.type = wgpu::BindingType::SampledTexture;
- ASSERT_DEVICE_ERROR(device.CreateBindGroupLayout(&descriptor));
-
- binding.texture.sampleType = wgpu::TextureSampleType::Undefined;
- binding.type = wgpu::BindingType::Undefined;
-
- // Succeeds with only a storageTexture.access.
- binding.storageTexture.access = wgpu::StorageTextureAccess::ReadOnly;
- binding.storageTexture.format = wgpu::TextureFormat::RGBA8Unorm;
- device.CreateBindGroupLayout(&descriptor);
- // Fails when both type and a storageTexture.access are specified.
- binding.type = wgpu::BindingType::ReadonlyStorageTexture;
- ASSERT_DEVICE_ERROR(device.CreateBindGroupLayout(&descriptor));
-}
-
-// Test that the deprecated BGLEntry path correctly handles the defaulting of viewDimension.
-// This is a regression test for crbug.com/dawn/620
-TEST_P(DeprecationTests, BindGroupLayoutEntryViewDimensionDefaulting) {
- wgpu::BindGroupLayoutEntry binding;
- binding.binding = 0;
- binding.visibility = wgpu::ShaderStage::Vertex;
- binding.type = wgpu::BindingType::SampledTexture;
-
- wgpu::BindGroupLayoutDescriptor bglDesc;
- bglDesc.entryCount = 1;
- bglDesc.entries = &binding;
-
- wgpu::BindGroupLayout bgl;
-
- // Check that the default viewDimension is 2D.
- {
- binding.viewDimension = wgpu::TextureViewDimension::Undefined;
- EXPECT_DEPRECATION_WARNING(bgl = device.CreateBindGroupLayout(&bglDesc));
-
- wgpu::TextureDescriptor desc;
- desc.usage = wgpu::TextureUsage::Sampled;
- desc.size = {1, 1, 1};
- desc.format = wgpu::TextureFormat::RGBA8Unorm;
- desc.dimension = wgpu::TextureDimension::e2D;
- wgpu::Texture texture = device.CreateTexture(&desc);
-
- // Success, the default is 2D and we give it a 2D view.
- utils::MakeBindGroup(device, bgl, {{0, texture.CreateView()}});
- }
-
- // Check that setting a non-default viewDimension works.
- {
- binding.viewDimension = wgpu::TextureViewDimension::e2DArray;
- EXPECT_DEPRECATION_WARNING(bgl = device.CreateBindGroupLayout(&bglDesc));
-
- wgpu::TextureDescriptor desc;
- desc.usage = wgpu::TextureUsage::Sampled;
- desc.size = {1, 1, 4};
- desc.format = wgpu::TextureFormat::RGBA8Unorm;
- desc.dimension = wgpu::TextureDimension::e2D;
- wgpu::Texture texture = device.CreateTexture(&desc);
-
- // Success, the view will be 2DArray and the BGL expects a 2DArray.
- utils::MakeBindGroup(device, bgl, {{0, texture.CreateView()}});
- }
-}
-
DAWN_INSTANTIATE_TEST(DeprecationTests,
D3D12Backend(),
MetalBackend(),
diff --git a/src/tests/unittests/validation/BindGroupValidationTests.cpp b/src/tests/unittests/validation/BindGroupValidationTests.cpp
index 6a8b6de..601f421 100644
--- a/src/tests/unittests/validation/BindGroupValidationTests.cpp
+++ b/src/tests/unittests/validation/BindGroupValidationTests.cpp
@@ -736,75 +736,45 @@
ASSERT_DEVICE_ERROR(utils::MakeBindGroup(device, bgl, {{0, buffer}}));
}
+#define BGLEntryType(...) \
+ utils::BindingLayoutEntryInitializationHelper(0, wgpu::ShaderStage::Compute, __VA_ARGS__)
+
TEST_F(BindGroupLayoutValidationTest, PerStageLimits) {
struct TestInfo {
uint32_t maxCount;
- wgpu::BindingType bindingType;
- wgpu::BindingType otherBindingType;
+ wgpu::BindGroupLayoutEntry entry;
+ wgpu::BindGroupLayoutEntry otherEntry;
};
- constexpr TestInfo kTestInfos[] = {
- {kMaxSampledTexturesPerShaderStage, wgpu::BindingType::SampledTexture,
- wgpu::BindingType::UniformBuffer},
- {kMaxSamplersPerShaderStage, wgpu::BindingType::Sampler, wgpu::BindingType::UniformBuffer},
- {kMaxSamplersPerShaderStage, wgpu::BindingType::ComparisonSampler,
- wgpu::BindingType::UniformBuffer},
- {kMaxStorageBuffersPerShaderStage, wgpu::BindingType::StorageBuffer,
- wgpu::BindingType::UniformBuffer},
- {kMaxStorageTexturesPerShaderStage, wgpu::BindingType::ReadonlyStorageTexture,
- wgpu::BindingType::UniformBuffer},
- {kMaxStorageTexturesPerShaderStage, wgpu::BindingType::WriteonlyStorageTexture,
- wgpu::BindingType::UniformBuffer},
- {kMaxUniformBuffersPerShaderStage, wgpu::BindingType::UniformBuffer,
- wgpu::BindingType::SampledTexture},
+ std::array<TestInfo, 7> kTestInfos = {
+ TestInfo{kMaxSampledTexturesPerShaderStage, BGLEntryType(wgpu::TextureSampleType::Float),
+ BGLEntryType(wgpu::BufferBindingType::Uniform)},
+ TestInfo{kMaxSamplersPerShaderStage, BGLEntryType(wgpu::SamplerBindingType::Filtering),
+ BGLEntryType(wgpu::BufferBindingType::Uniform)},
+ TestInfo{kMaxSamplersPerShaderStage, BGLEntryType(wgpu::SamplerBindingType::Comparison),
+ BGLEntryType(wgpu::BufferBindingType::Uniform)},
+ TestInfo{kMaxStorageBuffersPerShaderStage, BGLEntryType(wgpu::BufferBindingType::Storage),
+ BGLEntryType(wgpu::BufferBindingType::Uniform)},
+ TestInfo{
+ kMaxStorageTexturesPerShaderStage,
+ BGLEntryType(wgpu::StorageTextureAccess::ReadOnly, wgpu::TextureFormat::RGBA8Unorm),
+ BGLEntryType(wgpu::BufferBindingType::Uniform)},
+ TestInfo{
+ kMaxStorageTexturesPerShaderStage,
+ BGLEntryType(wgpu::StorageTextureAccess::WriteOnly, wgpu::TextureFormat::RGBA8Unorm),
+ BGLEntryType(wgpu::BufferBindingType::Uniform)},
+ TestInfo{kMaxUniformBuffersPerShaderStage, BGLEntryType(wgpu::BufferBindingType::Uniform),
+ BGLEntryType(wgpu::TextureSampleType::Float)},
};
for (TestInfo info : kTestInfos) {
wgpu::BindGroupLayout bgl[2];
std::vector<utils::BindingLayoutEntryInitializationHelper> maxBindings;
- auto PopulateEntry = [](utils::BindingLayoutEntryInitializationHelper entry) {
- switch (entry.type) {
- case wgpu::BindingType::UniformBuffer:
- entry.buffer.type = wgpu::BufferBindingType::Uniform;
- break;
- case wgpu::BindingType::StorageBuffer:
- entry.buffer.type = wgpu::BufferBindingType::Storage;
- break;
- case wgpu::BindingType::ReadonlyStorageBuffer:
- entry.buffer.type = wgpu::BufferBindingType::ReadOnlyStorage;
- break;
-
- case wgpu::BindingType::Sampler:
- entry.sampler.type = wgpu::SamplerBindingType::Filtering;
- break;
- case wgpu::BindingType::ComparisonSampler:
- entry.sampler.type = wgpu::SamplerBindingType::Comparison;
- break;
-
- case wgpu::BindingType::SampledTexture:
- entry.texture.sampleType = wgpu::TextureSampleType::Float;
- break;
-
- case wgpu::BindingType::ReadonlyStorageTexture:
- entry.storageTexture.access = wgpu::StorageTextureAccess::ReadOnly;
- entry.storageTexture.format = wgpu::TextureFormat::RGBA8Unorm;
- break;
- case wgpu::BindingType::WriteonlyStorageTexture:
- entry.storageTexture.access = wgpu::StorageTextureAccess::WriteOnly;
- entry.storageTexture.format = wgpu::TextureFormat::RGBA8Unorm;
- break;
- default:
- return entry;
- }
-
- entry.type = wgpu::BindingType::Undefined;
-
- return entry;
- };
-
for (uint32_t i = 0; i < info.maxCount; ++i) {
- maxBindings.push_back(PopulateEntry({i, wgpu::ShaderStage::Compute, info.bindingType}));
+ wgpu::BindGroupLayoutEntry entry = info.entry;
+ entry.binding = i;
+ maxBindings.push_back(entry);
}
// Creating with the maxes works.
@@ -813,24 +783,28 @@
// Adding an extra binding of a different type works.
{
std::vector<utils::BindingLayoutEntryInitializationHelper> bindings = maxBindings;
- bindings.push_back(
- PopulateEntry({info.maxCount, wgpu::ShaderStage::Compute, info.otherBindingType}));
+ wgpu::BindGroupLayoutEntry entry = info.otherEntry;
+ entry.binding = info.maxCount;
+ bindings.push_back(entry);
MakeBindGroupLayout(bindings.data(), bindings.size());
}
// Adding an extra binding of the maxed type in a different stage works
{
std::vector<utils::BindingLayoutEntryInitializationHelper> bindings = maxBindings;
- bindings.push_back(
- PopulateEntry({info.maxCount, wgpu::ShaderStage::Fragment, info.bindingType}));
+ wgpu::BindGroupLayoutEntry entry = info.entry;
+ entry.binding = info.maxCount;
+ entry.visibility = wgpu::ShaderStage::Fragment;
+ bindings.push_back(entry);
MakeBindGroupLayout(bindings.data(), bindings.size());
}
// Adding an extra binding of the maxed type and stage exceeds the per stage limit.
{
std::vector<utils::BindingLayoutEntryInitializationHelper> bindings = maxBindings;
- bindings.push_back(
- PopulateEntry({info.maxCount, wgpu::ShaderStage::Compute, info.bindingType}));
+ wgpu::BindGroupLayoutEntry entry = info.entry;
+ entry.binding = info.maxCount;
+ bindings.push_back(entry);
ASSERT_DEVICE_ERROR(MakeBindGroupLayout(bindings.data(), bindings.size()));
}
@@ -838,18 +812,19 @@
TestCreatePipelineLayout(bgl, 1, true);
// Adding an extra binding of a different type in a different BGL works
- bgl[1] = utils::MakeBindGroupLayout(
- device, {PopulateEntry({0, wgpu::ShaderStage::Compute, info.otherBindingType})});
+ bgl[1] = utils::MakeBindGroupLayout(device, {info.otherEntry});
TestCreatePipelineLayout(bgl, 2, true);
- // Adding an extra binding of the maxed type in a different stage works
- bgl[1] = utils::MakeBindGroupLayout(
- device, {PopulateEntry({0, wgpu::ShaderStage::Fragment, info.bindingType})});
- TestCreatePipelineLayout(bgl, 2, true);
+ {
+ // Adding an extra binding of the maxed type in a different stage works
+ wgpu::BindGroupLayoutEntry entry = info.entry;
+ entry.visibility = wgpu::ShaderStage::Fragment;
+ bgl[1] = utils::MakeBindGroupLayout(device, {entry});
+ TestCreatePipelineLayout(bgl, 2, true);
+ }
// Adding an extra binding of the maxed type in a different BGL exceeds the per stage limit.
- bgl[1] = utils::MakeBindGroupLayout(
- device, {PopulateEntry({0, wgpu::ShaderStage::Compute, info.bindingType})});
+ bgl[1] = utils::MakeBindGroupLayout(device, {info.entry});
TestCreatePipelineLayout(bgl, 2, false);
}
}
diff --git a/src/tests/unittests/validation/StorageTextureValidationTests.cpp b/src/tests/unittests/validation/StorageTextureValidationTests.cpp
index 6827015..6660ca6 100644
--- a/src/tests/unittests/validation/StorageTextureValidationTests.cpp
+++ b/src/tests/unittests/validation/StorageTextureValidationTests.cpp
@@ -567,25 +567,6 @@
}
}
-// Verify that in a bind group layout binding neither read-only nor write-only storage textures
-// are allowed to have dynamic offsets.
-// TODO(dawn:527): No longer be applicable after changes to BindGroupLayoutEntry are complete.
-TEST_F(StorageTextureValidationTests, StorageTextureCannotHaveDynamicOffsets) {
- const std::array<wgpu::BindingType, 2> kSupportedStorageTextureBindingTypes = {
- wgpu::BindingType::ReadonlyStorageTexture, wgpu::BindingType::WriteonlyStorageTexture};
- for (wgpu::BindingType storageBindingType : kSupportedStorageTextureBindingTypes) {
- wgpu::BindGroupLayoutEntry bindGroupLayoutBinding;
- bindGroupLayoutBinding.binding = 0;
- bindGroupLayoutBinding.visibility = wgpu::ShaderStage::Compute;
- bindGroupLayoutBinding.type = storageBindingType;
- bindGroupLayoutBinding.storageTextureFormat = wgpu::TextureFormat::R32Float;
-
- bindGroupLayoutBinding.hasDynamicOffset = true;
- ASSERT_DEVICE_ERROR(EXPECT_DEPRECATION_WARNING(
- utils::MakeBindGroupLayout(device, {bindGroupLayoutBinding})));
- }
-}
-
// Verify that only a texture view can be used as a read-only or write-only storage texture in a
// bind group.
TEST_F(StorageTextureValidationTests, StorageTextureBindingTypeInBindGroup) {
diff --git a/src/tests/unittests/wire/WireArgumentTests.cpp b/src/tests/unittests/wire/WireArgumentTests.cpp
index a72e8ef..4d21fa7 100644
--- a/src/tests/unittests/wire/WireArgumentTests.cpp
+++ b/src/tests/unittests/wire/WireArgumentTests.cpp
@@ -302,39 +302,21 @@
{nullptr,
0,
WGPUShaderStage_Vertex,
- WGPUBindingType_Sampler,
- false,
- 0,
- WGPUTextureViewDimension_2D,
- WGPUTextureComponentType_Float,
- WGPUTextureFormat_RGBA8Unorm,
{},
- {},
+ {nullptr, WGPUSamplerBindingType_Filtering},
{},
{}},
{nullptr,
1,
WGPUShaderStage_Vertex,
- WGPUBindingType_SampledTexture,
- false,
- 0,
- WGPUTextureViewDimension_2D,
- WGPUTextureComponentType_Float,
- WGPUTextureFormat_RGBA8Unorm,
{},
{},
- {},
+ {nullptr, WGPUTextureSampleType_Float, WGPUTextureViewDimension_2D, false},
{}},
{nullptr,
2,
static_cast<WGPUShaderStage>(WGPUShaderStage_Vertex | WGPUShaderStage_Fragment),
- WGPUBindingType_UniformBuffer,
- false,
- 0,
- WGPUTextureViewDimension_2D,
- WGPUTextureComponentType_Float,
- WGPUTextureFormat_RGBA8Unorm,
- {},
+ {nullptr, WGPUBufferBindingType_Uniform, false, 0},
{},
{},
{}},
@@ -353,7 +335,8 @@
const auto& a = desc->entries[i];
const auto& b = entries[i];
if (a.binding != b.binding || a.visibility != b.visibility ||
- a.type != b.type) {
+ a.buffer.type != b.buffer.type || a.sampler.type != b.sampler.type ||
+ a.texture.sampleType != b.texture.sampleType) {
return false;
}
}
diff --git a/src/utils/ComboRenderPipelineDescriptor.h b/src/utils/ComboRenderPipelineDescriptor.h
index ade8375..036ce1c 100644
--- a/src/utils/ComboRenderPipelineDescriptor.h
+++ b/src/utils/ComboRenderPipelineDescriptor.h
@@ -23,6 +23,7 @@
namespace utils {
+ // Primarily used by tests to easily set up the vertex buffer state portion of a RenderPipeline.
class ComboVertexStateDescriptor {
public:
ComboVertexStateDescriptor();
@@ -37,7 +38,6 @@
std::array<wgpu::VertexAttributeDescriptor, kMaxVertexAttributes> cAttributes;
};
- // For creating the new style of render pipeline descriptors
class ComboRenderPipelineDescriptor : public wgpu::RenderPipelineDescriptor {
public:
ComboRenderPipelineDescriptor();
diff --git a/src/utils/WGPUHelpers.cpp b/src/utils/WGPUHelpers.cpp
index c560c39..7f29e62 100644
--- a/src/utils/WGPUHelpers.cpp
+++ b/src/utils/WGPUHelpers.cpp
@@ -297,25 +297,6 @@
}
BindingLayoutEntryInitializationHelper::BindingLayoutEntryInitializationHelper(
- uint32_t entryBinding,
- wgpu::ShaderStage entryVisibility,
- wgpu::BindingType entryType,
- bool bufferHasDynamicOffset,
- uint64_t bufferMinBindingSize,
- wgpu::TextureViewDimension textureViewDimension,
- wgpu::TextureComponentType textureComponent,
- wgpu::TextureFormat storageFormat) {
- binding = entryBinding;
- visibility = entryVisibility;
- type = entryType;
- hasDynamicOffset = bufferHasDynamicOffset;
- minBufferBindingSize = bufferMinBindingSize;
- viewDimension = textureViewDimension;
- textureComponentType = textureComponent;
- storageTextureFormat = storageFormat;
- }
-
- BindingLayoutEntryInitializationHelper::BindingLayoutEntryInitializationHelper(
const wgpu::BindGroupLayoutEntry& entry)
: wgpu::BindGroupLayoutEntry(entry) {
}
diff --git a/src/utils/WGPUHelpers.h b/src/utils/WGPUHelpers.h
index 26c01fe..1ae082e 100644
--- a/src/utils/WGPUHelpers.h
+++ b/src/utils/WGPUHelpers.h
@@ -127,16 +127,6 @@
wgpu::TextureFormat format,
wgpu::TextureViewDimension viewDimension = wgpu::TextureViewDimension::e2D);
- // Backwards compat support for the deprecated path
- BindingLayoutEntryInitializationHelper(
- uint32_t entryBinding,
- wgpu::ShaderStage entryVisibility,
- wgpu::BindingType entryType,
- bool bufferHasDynamicOffset = false,
- uint64_t bufferMinBindingSize = 0,
- wgpu::TextureViewDimension textureViewDimension = wgpu::TextureViewDimension::Undefined,
- wgpu::TextureComponentType textureComponent = wgpu::TextureComponentType::Float,
- wgpu::TextureFormat storageFormat = wgpu::TextureFormat::Undefined);
BindingLayoutEntryInitializationHelper(const wgpu::BindGroupLayoutEntry& entry);
};