[tint][ir][val] Reject duplicate binding points in entry points Also adds a capability for allowing duplicate binding points after BindingRemapper has run. Fixes: 416291256 Change-Id: Icff6c1fb4581b1cf5b08af61de6192bb02cdf870 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/242597 Reviewed-by: James Price <jrprice@google.com> Commit-Queue: Ryan Harrison <rharrison@chromium.org> Auto-Submit: Ryan Harrison <rharrison@chromium.org>
diff --git a/src/tint/lang/core/ir/transform/add_empty_entry_point.h b/src/tint/lang/core/ir/transform/add_empty_entry_point.h index 12a9233..f21041a 100644 --- a/src/tint/lang/core/ir/transform/add_empty_entry_point.h +++ b/src/tint/lang/core/ir/transform/add_empty_entry_point.h
@@ -41,7 +41,7 @@ /// The capabilities that the transform can support. const core::ir::Capabilities kAddEmptyEntryPointCapabilities{ core::ir::Capability::kAllowHandleVarsWithoutBindings, -}; + core::ir::Capability::kAllowDuplicateBindings}; /// Add an empty entry point to the module, if no other entry points exist. /// @param module the module to transform
diff --git a/src/tint/lang/core/ir/transform/array_length_from_uniform.cc b/src/tint/lang/core/ir/transform/array_length_from_uniform.cc index 33897bb..129b7da 100644 --- a/src/tint/lang/core/ir/transform/array_length_from_uniform.cc +++ b/src/tint/lang/core/ir/transform/array_length_from_uniform.cc
@@ -234,7 +234,8 @@ Module& ir, BindingPoint ubo_binding, const std::unordered_map<BindingPoint, uint32_t>& bindpoint_to_size_index) { - auto validated = ValidateAndDumpIfNeeded(ir, "core.ArrayLengthFromUniform"); + auto validated = ValidateAndDumpIfNeeded(ir, "core.ArrayLengthFromUniform", + kArrayLengthFromUniformCapabilities); if (validated != Success) { return validated.Failure(); }
diff --git a/src/tint/lang/core/ir/transform/array_length_from_uniform.h b/src/tint/lang/core/ir/transform/array_length_from_uniform.h index 0b1288e..e6e2cb1 100644 --- a/src/tint/lang/core/ir/transform/array_length_from_uniform.h +++ b/src/tint/lang/core/ir/transform/array_length_from_uniform.h
@@ -29,6 +29,7 @@ #define SRC_TINT_LANG_CORE_IR_TRANSFORM_ARRAY_LENGTH_FROM_UNIFORM_H_ #include <unordered_map> +#include "src/tint/lang/core/ir/validator.h" #include "src/tint/api/common/binding_point.h" #include "src/tint/utils/result.h" @@ -40,6 +41,9 @@ namespace tint::core::ir::transform { +/// The capabilities that the transform can support. +const Capabilities kArrayLengthFromUniformCapabilities{Capability::kAllowDuplicateBindings}; + /// The result of running the ArrayLengthFromUniform transform. struct ArrayLengthFromUniformResult { /// `true` if the transformed module needs the storage buffer sizes UBO.
diff --git a/src/tint/lang/core/ir/transform/array_length_from_uniform_fuzz.cc b/src/tint/lang/core/ir/transform/array_length_from_uniform_fuzz.cc index 5f26884..e3547bf 100644 --- a/src/tint/lang/core/ir/transform/array_length_from_uniform_fuzz.cc +++ b/src/tint/lang/core/ir/transform/array_length_from_uniform_fuzz.cc
@@ -52,4 +52,4 @@ } // namespace tint::core::ir::transform TINT_IR_MODULE_FUZZER(tint::core::ir::transform::ArrayLengthFromUniformFuzzer, - tint::core::ir::Capabilities{}); + tint::core::ir::transform::kArrayLengthFromUniformCapabilities);
diff --git a/src/tint/lang/core/ir/transform/bgra8unorm_polyfill.cc b/src/tint/lang/core/ir/transform/bgra8unorm_polyfill.cc index f6d6edd..f31bad7 100644 --- a/src/tint/lang/core/ir/transform/bgra8unorm_polyfill.cc +++ b/src/tint/lang/core/ir/transform/bgra8unorm_polyfill.cc
@@ -182,7 +182,8 @@ } // namespace Result<SuccessType> Bgra8UnormPolyfill(Module& ir) { - auto result = ValidateAndDumpIfNeeded(ir, "core.Bgra8UnormPolyfill"); + auto result = + ValidateAndDumpIfNeeded(ir, "core.Bgra8UnormPolyfill", kBgra8UnormPolyfillCapabilities); if (result != Success) { return result; }
diff --git a/src/tint/lang/core/ir/transform/bgra8unorm_polyfill.h b/src/tint/lang/core/ir/transform/bgra8unorm_polyfill.h index e17454a..0a44980 100644 --- a/src/tint/lang/core/ir/transform/bgra8unorm_polyfill.h +++ b/src/tint/lang/core/ir/transform/bgra8unorm_polyfill.h
@@ -28,6 +28,7 @@ #ifndef SRC_TINT_LANG_CORE_IR_TRANSFORM_BGRA8UNORM_POLYFILL_H_ #define SRC_TINT_LANG_CORE_IR_TRANSFORM_BGRA8UNORM_POLYFILL_H_ +#include "src/tint/lang/core/ir/validator.h" #include "src/tint/utils/result.h" // Forward declarations. @@ -37,6 +38,9 @@ namespace tint::core::ir::transform { +/// The capabilities that the transform can support. +const Capabilities kBgra8UnormPolyfillCapabilities{Capability::kAllowDuplicateBindings}; + /// Bgra8UnormPolyfill is a transform that changes the texel format of storage textures from /// bgra8unorm to rgba8unorm, inserting swizzles before and after texture accesses as necessary. /// @param module the module to transform
diff --git a/src/tint/lang/core/ir/transform/bgra8unorm_polyfill_fuzz.cc b/src/tint/lang/core/ir/transform/bgra8unorm_polyfill_fuzz.cc index d6252ad..e4aa5be 100644 --- a/src/tint/lang/core/ir/transform/bgra8unorm_polyfill_fuzz.cc +++ b/src/tint/lang/core/ir/transform/bgra8unorm_polyfill_fuzz.cc
@@ -41,4 +41,4 @@ } // namespace tint::core::ir::transform TINT_IR_MODULE_FUZZER(tint::core::ir::transform::Bgra8UnormPolyfillFuzzer, - tint::core::ir::Capabilities{}); + tint::core::ir::transform::kBgra8UnormPolyfillCapabilities);
diff --git a/src/tint/lang/core/ir/transform/binary_polyfill.cc b/src/tint/lang/core/ir/transform/binary_polyfill.cc index 7e5bc51..5780e7b 100644 --- a/src/tint/lang/core/ir/transform/binary_polyfill.cc +++ b/src/tint/lang/core/ir/transform/binary_polyfill.cc
@@ -201,7 +201,7 @@ } // namespace Result<SuccessType> BinaryPolyfill(Module& ir, const BinaryPolyfillConfig& config) { - auto result = ValidateAndDumpIfNeeded(ir, "core.BinaryPolyfill"); + auto result = ValidateAndDumpIfNeeded(ir, "core.BinaryPolyfill", kBinaryPolyfillCapabilities); if (result != Success) { return result; }
diff --git a/src/tint/lang/core/ir/transform/binary_polyfill.h b/src/tint/lang/core/ir/transform/binary_polyfill.h index 1af3933..a3621d2 100644 --- a/src/tint/lang/core/ir/transform/binary_polyfill.h +++ b/src/tint/lang/core/ir/transform/binary_polyfill.h
@@ -28,6 +28,7 @@ #ifndef SRC_TINT_LANG_CORE_IR_TRANSFORM_BINARY_POLYFILL_H_ #define SRC_TINT_LANG_CORE_IR_TRANSFORM_BINARY_POLYFILL_H_ +#include "src/tint/lang/core/ir/validator.h" #include "src/tint/utils/reflection.h" #include "src/tint/utils/result.h" @@ -38,6 +39,9 @@ namespace tint::core::ir::transform { +/// The capabilities that the transform can support. +const Capabilities kBinaryPolyfillCapabilities{Capability::kAllowDuplicateBindings}; + /// The set of polyfills that should be applied. struct BinaryPolyfillConfig { /// Should the RHS of a shift be masked to make it modulo the bit-width of the LHS?
diff --git a/src/tint/lang/core/ir/transform/binary_polyfill_fuzz.cc b/src/tint/lang/core/ir/transform/binary_polyfill_fuzz.cc index 666bde9..0dc81b0 100644 --- a/src/tint/lang/core/ir/transform/binary_polyfill_fuzz.cc +++ b/src/tint/lang/core/ir/transform/binary_polyfill_fuzz.cc
@@ -43,4 +43,4 @@ } // namespace tint::core::ir::transform TINT_IR_MODULE_FUZZER(tint::core::ir::transform::BinaryPolyfillFuzzer, - tint::core::ir::Capabilities{}); + tint::core::ir::transform::kBinaryPolyfillCapabilities);
diff --git a/src/tint/lang/core/ir/transform/binding_remapper.cc b/src/tint/lang/core/ir/transform/binding_remapper.cc index ac6bb74..1852972 100644 --- a/src/tint/lang/core/ir/transform/binding_remapper.cc +++ b/src/tint/lang/core/ir/transform/binding_remapper.cc
@@ -72,7 +72,7 @@ Result<SuccessType> BindingRemapper( Module& ir, const std::unordered_map<BindingPoint, BindingPoint>& binding_points) { - auto result = ValidateAndDumpIfNeeded(ir, "core.BindingRemapper"); + auto result = ValidateAndDumpIfNeeded(ir, "core.BindingRemapper", kBindingRemapperCapabilities); if (result != Success) { return result; }
diff --git a/src/tint/lang/core/ir/transform/binding_remapper.h b/src/tint/lang/core/ir/transform/binding_remapper.h index 83dbb08..efdc23c 100644 --- a/src/tint/lang/core/ir/transform/binding_remapper.h +++ b/src/tint/lang/core/ir/transform/binding_remapper.h
@@ -31,6 +31,7 @@ #include <unordered_map> #include "src/tint/api/common/binding_point.h" +#include "src/tint/lang/core/ir/validator.h" #include "src/tint/utils/result.h" // Forward declarations. @@ -40,6 +41,18 @@ namespace tint::core::ir::transform { +/// The capabilities that the transform can support. +/// +/// Note: BindingRemapper is the transform that introduces duplicate +/// bindings, so in theory shouldn't need the capability to allow +/// them. Except that in the MSL backend BindingRemapper is invoked multiple +/// times, (FlattenBindings and Raise specifically), so may encounter IR with +/// duplicate bindings when called the second time. +// TODO(crbug.com/363031535): Remove kAllowDuplicateBindings when MSL no +// longer needs FlattenBindings. binding_remapper_fuzz.cc will need to be +// updated to have kAllowDuplicateBindings as a post-run capability. +const Capabilities kBindingRemapperCapabilities{Capability::kAllowDuplicateBindings}; + /// BindingRemapper is a transform that remaps binding point indices and access controls. /// @param module the module to transform /// @param binding_points the remapping data
diff --git a/src/tint/lang/core/ir/transform/binding_remapper_fuzz.cc b/src/tint/lang/core/ir/transform/binding_remapper_fuzz.cc index d38cc04..0dc244f 100644 --- a/src/tint/lang/core/ir/transform/binding_remapper_fuzz.cc +++ b/src/tint/lang/core/ir/transform/binding_remapper_fuzz.cc
@@ -44,4 +44,4 @@ } // namespace tint::core::ir::transform TINT_IR_MODULE_FUZZER(tint::core::ir::transform::BindingRemapperFuzzer, - tint::core::ir::Capabilities{}); + tint::core::ir::transform::kBindingRemapperCapabilities);
diff --git a/src/tint/lang/core/ir/transform/binding_remapper_test.cc b/src/tint/lang/core/ir/transform/binding_remapper_test.cc index 63563c4..9e9d886 100644 --- a/src/tint/lang/core/ir/transform/binding_remapper_test.cc +++ b/src/tint/lang/core/ir/transform/binding_remapper_test.cc
@@ -37,7 +37,10 @@ using namespace tint::core::fluent_types; // NOLINT using namespace tint::core::number_suffixes; // NOLINT -using IR_BindingRemapperTest = TransformTest; +class IR_BindingRemapperTest : public TransformTest { + public: + IR_BindingRemapperTest() { capabilities = kBindingRemapperCapabilities; } +}; TEST_F(IR_BindingRemapperTest, NoModify_NoRemappings) { auto* buffer = b.Var("buffer", ty.ptr<uniform, i32>());
diff --git a/src/tint/lang/core/ir/transform/block_decorated_structs.cc b/src/tint/lang/core/ir/transform/block_decorated_structs.cc index 6dca4d6..075fc86 100644 --- a/src/tint/lang/core/ir/transform/block_decorated_structs.cc +++ b/src/tint/lang/core/ir/transform/block_decorated_structs.cc
@@ -118,7 +118,8 @@ } // namespace Result<SuccessType> BlockDecoratedStructs(Module& ir) { - auto result = ValidateAndDumpIfNeeded(ir, "core.BlockDecoratedStructs"); + auto result = ValidateAndDumpIfNeeded(ir, "core.BlockDecoratedStructs", + kBlockDecoratedStructsCapabilities); if (result != Success) { return result; }
diff --git a/src/tint/lang/core/ir/transform/block_decorated_structs.h b/src/tint/lang/core/ir/transform/block_decorated_structs.h index 551ac66..232405f 100644 --- a/src/tint/lang/core/ir/transform/block_decorated_structs.h +++ b/src/tint/lang/core/ir/transform/block_decorated_structs.h
@@ -28,6 +28,7 @@ #ifndef SRC_TINT_LANG_CORE_IR_TRANSFORM_BLOCK_DECORATED_STRUCTS_H_ #define SRC_TINT_LANG_CORE_IR_TRANSFORM_BLOCK_DECORATED_STRUCTS_H_ +#include "src/tint/lang/core/ir/validator.h" #include "src/tint/utils/result.h" // Forward declarations. @@ -37,6 +38,9 @@ namespace tint::core::ir::transform { +/// The capabilities that the transform can support. +const Capabilities kBlockDecoratedStructsCapabilities{Capability::kAllowDuplicateBindings}; + /// BlockDecoratedStructs is a transform that changes the store type of a buffer to be a special /// structure that is recognized as needing a block decoration in SPIR-V, potentially wrapping the /// existing store type in a new structure if necessary.
diff --git a/src/tint/lang/core/ir/transform/block_decorated_structs_fuzz.cc b/src/tint/lang/core/ir/transform/block_decorated_structs_fuzz.cc index 93c5fde..f5ac095 100644 --- a/src/tint/lang/core/ir/transform/block_decorated_structs_fuzz.cc +++ b/src/tint/lang/core/ir/transform/block_decorated_structs_fuzz.cc
@@ -41,4 +41,4 @@ } // namespace tint::core::ir::transform TINT_IR_MODULE_FUZZER(tint::core::ir::transform::BlockDecoratedStructsFuzzer, - tint::core::ir::Capabilities{}); + tint::core::ir::transform::kBlockDecoratedStructsCapabilities);
diff --git a/src/tint/lang/core/ir/transform/builtin_polyfill.cc b/src/tint/lang/core/ir/transform/builtin_polyfill.cc index 9faa6ac..d576f96 100644 --- a/src/tint/lang/core/ir/transform/builtin_polyfill.cc +++ b/src/tint/lang/core/ir/transform/builtin_polyfill.cc
@@ -1145,7 +1145,7 @@ } // namespace Result<SuccessType> BuiltinPolyfill(Module& ir, const BuiltinPolyfillConfig& config) { - auto result = ValidateAndDumpIfNeeded(ir, "core.BuiltinPolyfill"); + auto result = ValidateAndDumpIfNeeded(ir, "core.BuiltinPolyfill", kBuiltinPolyfillCapabilities); if (result != Success) { return result; }
diff --git a/src/tint/lang/core/ir/transform/builtin_polyfill.h b/src/tint/lang/core/ir/transform/builtin_polyfill.h index 17c6206..94bbe0f 100644 --- a/src/tint/lang/core/ir/transform/builtin_polyfill.h +++ b/src/tint/lang/core/ir/transform/builtin_polyfill.h
@@ -28,6 +28,7 @@ #ifndef SRC_TINT_LANG_CORE_IR_TRANSFORM_BUILTIN_POLYFILL_H_ #define SRC_TINT_LANG_CORE_IR_TRANSFORM_BUILTIN_POLYFILL_H_ +#include "src/tint/lang/core/ir/validator.h" #include "src/tint/utils/reflection.h" #include "src/tint/utils/result.h" @@ -38,6 +39,9 @@ namespace tint::core::ir::transform { +/// The capabilities that the transform can support. +const Capabilities kBuiltinPolyfillCapabilities{Capability::kAllowDuplicateBindings}; + /// Enumerator of polyfill levels. enum class BuiltinPolyfillLevel { /// No polyfill needed, supported by the backend.
diff --git a/src/tint/lang/core/ir/transform/builtin_polyfill_fuzz.cc b/src/tint/lang/core/ir/transform/builtin_polyfill_fuzz.cc index b37d755..6d5fb29 100644 --- a/src/tint/lang/core/ir/transform/builtin_polyfill_fuzz.cc +++ b/src/tint/lang/core/ir/transform/builtin_polyfill_fuzz.cc
@@ -43,4 +43,4 @@ } // namespace tint::core::ir::transform TINT_IR_MODULE_FUZZER(tint::core::ir::transform::BuiltinPolyfillFuzzer, - tint::core::ir::Capabilities{}); + tint::core::ir::transform::kBuiltinPolyfillCapabilities);
diff --git a/src/tint/lang/core/ir/transform/conversion_polyfill.cc b/src/tint/lang/core/ir/transform/conversion_polyfill.cc index f1f17fb..193e38d 100644 --- a/src/tint/lang/core/ir/transform/conversion_polyfill.cc +++ b/src/tint/lang/core/ir/transform/conversion_polyfill.cc
@@ -189,7 +189,8 @@ } // namespace Result<SuccessType> ConversionPolyfill(Module& ir, const ConversionPolyfillConfig& config) { - auto result = ValidateAndDumpIfNeeded(ir, "core.ConversionPolyfill"); + auto result = + ValidateAndDumpIfNeeded(ir, "core.ConversionPolyfill", kConversionPolyfillCapabilities); if (result != Success) { return result; }
diff --git a/src/tint/lang/core/ir/transform/conversion_polyfill.h b/src/tint/lang/core/ir/transform/conversion_polyfill.h index ca09eb4..666e3b3 100644 --- a/src/tint/lang/core/ir/transform/conversion_polyfill.h +++ b/src/tint/lang/core/ir/transform/conversion_polyfill.h
@@ -28,6 +28,7 @@ #ifndef SRC_TINT_LANG_CORE_IR_TRANSFORM_CONVERSION_POLYFILL_H_ #define SRC_TINT_LANG_CORE_IR_TRANSFORM_CONVERSION_POLYFILL_H_ +#include "src/tint/lang/core/ir/validator.h" #include "src/tint/utils/reflection.h" #include "src/tint/utils/result.h" @@ -38,6 +39,9 @@ namespace tint::core::ir::transform { +/// The capabilities that the transform can support. +const Capabilities kConversionPolyfillCapabilities{Capability::kAllowDuplicateBindings}; + /// The set of polyfills that should be applied. struct ConversionPolyfillConfig { /// Should converting floating point values to integers be polyfilled?
diff --git a/src/tint/lang/core/ir/transform/conversion_polyfill_fuzz.cc b/src/tint/lang/core/ir/transform/conversion_polyfill_fuzz.cc index 0003daf..32d7d45 100644 --- a/src/tint/lang/core/ir/transform/conversion_polyfill_fuzz.cc +++ b/src/tint/lang/core/ir/transform/conversion_polyfill_fuzz.cc
@@ -43,4 +43,4 @@ } // namespace tint::core::ir::transform TINT_IR_MODULE_FUZZER(tint::core::ir::transform::ConversionPolyfillFuzzer, - tint::core::ir::Capabilities{}); + tint::core::ir::transform::kConversionPolyfillCapabilities);
diff --git a/src/tint/lang/core/ir/transform/demote_to_helper.h b/src/tint/lang/core/ir/transform/demote_to_helper.h index dff14cc..90020fa 100644 --- a/src/tint/lang/core/ir/transform/demote_to_helper.h +++ b/src/tint/lang/core/ir/transform/demote_to_helper.h
@@ -41,8 +41,7 @@ /// The capabilities that the transform can support. const core::ir::Capabilities kDemoteToHelperCapabilities{ core::ir::Capability::kAllowVectorElementPointer, - core::ir::Capability::kAllowClipDistancesOnF32, -}; + core::ir::Capability::kAllowClipDistancesOnF32, core::ir::Capability::kAllowDuplicateBindings}; /// DemoteToHelper is a transform that emulates demote-to-helper semantics for discard instructions. ///
diff --git a/src/tint/lang/core/ir/transform/direct_variable_access.h b/src/tint/lang/core/ir/transform/direct_variable_access.h index 77902eb..a57a8ed 100644 --- a/src/tint/lang/core/ir/transform/direct_variable_access.h +++ b/src/tint/lang/core/ir/transform/direct_variable_access.h
@@ -41,8 +41,7 @@ /// The capabilities that the transform can support. const core::ir::Capabilities kDirectVariableAccessCapabilities{ - core::ir::Capability::kAllowClipDistancesOnF32, -}; + core::ir::Capability::kAllowClipDistancesOnF32, core::ir::Capability::kAllowDuplicateBindings}; /// DirectVariableAccessOptions adjusts the behaviour of the transform. struct DirectVariableAccessOptions {
diff --git a/src/tint/lang/core/ir/transform/multiplanar_external_texture.cc b/src/tint/lang/core/ir/transform/multiplanar_external_texture.cc index 298563b..b68fbe1 100644 --- a/src/tint/lang/core/ir/transform/multiplanar_external_texture.cc +++ b/src/tint/lang/core/ir/transform/multiplanar_external_texture.cc
@@ -609,7 +609,8 @@ Result<SuccessType> MultiplanarExternalTexture( Module& ir, const tint::transform::multiplanar::BindingsMap& multiplanar_map) { - auto result = ValidateAndDumpIfNeeded(ir, "core.MultiplanarExternalTexture"); + auto result = ValidateAndDumpIfNeeded(ir, "core.MultiplanarExternalTexture", + kMultiplanarExternalTextureCapabilities); if (result != Success) { return result; }
diff --git a/src/tint/lang/core/ir/transform/multiplanar_external_texture.h b/src/tint/lang/core/ir/transform/multiplanar_external_texture.h index 6ed53c1..fd09675 100644 --- a/src/tint/lang/core/ir/transform/multiplanar_external_texture.h +++ b/src/tint/lang/core/ir/transform/multiplanar_external_texture.h
@@ -29,6 +29,7 @@ #define SRC_TINT_LANG_CORE_IR_TRANSFORM_MULTIPLANAR_EXTERNAL_TEXTURE_H_ #include "src/tint/lang/core/ir/transform/multiplanar_options.h" +#include "src/tint/lang/core/ir/validator.h" #include "src/tint/utils/result.h" // Forward declarations. @@ -38,6 +39,9 @@ namespace tint::core::ir::transform { +/// The capabilities that the transform can support. +const Capabilities kMultiplanarExternalTextureCapabilities{Capability::kAllowDuplicateBindings}; + /// MultiplanarExternalTexture is a transform that splits texture_external bindings into two /// separate texture_2d<f32> bindings for two possible planes, along with a uniform buffer of /// parameters that describe how the texture should be sampled.
diff --git a/src/tint/lang/core/ir/transform/multiplanar_external_texture_fuzz.cc b/src/tint/lang/core/ir/transform/multiplanar_external_texture_fuzz.cc index b8e7b0d..537ceac 100644 --- a/src/tint/lang/core/ir/transform/multiplanar_external_texture_fuzz.cc +++ b/src/tint/lang/core/ir/transform/multiplanar_external_texture_fuzz.cc
@@ -44,4 +44,4 @@ } // namespace tint::core::ir::transform TINT_IR_MODULE_FUZZER(tint::core::ir::transform::MultiplanarExternalTextureFuzzer, - tint::core::ir::Capabilities{}); + tint::core::ir::transform::kMultiplanarExternalTextureCapabilities);
diff --git a/src/tint/lang/core/ir/transform/preserve_padding.h b/src/tint/lang/core/ir/transform/preserve_padding.h index c4f7c89..b9c2ed5 100644 --- a/src/tint/lang/core/ir/transform/preserve_padding.h +++ b/src/tint/lang/core/ir/transform/preserve_padding.h
@@ -41,7 +41,7 @@ /// The capabilities that the transform can support. const core::ir::Capabilities kPreservePaddingCapabilities{ core::ir::Capability::kAllowHandleVarsWithoutBindings, -}; + core::ir::Capability::kAllowDuplicateBindings}; /// PreservePadding is a transform that decomposes stores of whole structure and array types to /// preserve padding bytes.
diff --git a/src/tint/lang/core/ir/transform/prevent_infinite_loops.cc b/src/tint/lang/core/ir/transform/prevent_infinite_loops.cc index 7406c85..80bd749 100644 --- a/src/tint/lang/core/ir/transform/prevent_infinite_loops.cc +++ b/src/tint/lang/core/ir/transform/prevent_infinite_loops.cc
@@ -116,7 +116,8 @@ } // namespace Result<SuccessType> PreventInfiniteLoops(Module& ir) { - auto result = ValidateAndDumpIfNeeded(ir, "core.PreventInfiniteLoops"); + auto result = + ValidateAndDumpIfNeeded(ir, "core.PreventInfiniteLoops", kPreventInfiniteLoopsCapabilities); if (result != Success) { return result; }
diff --git a/src/tint/lang/core/ir/transform/prevent_infinite_loops.h b/src/tint/lang/core/ir/transform/prevent_infinite_loops.h index 82fa555..292642e 100644 --- a/src/tint/lang/core/ir/transform/prevent_infinite_loops.h +++ b/src/tint/lang/core/ir/transform/prevent_infinite_loops.h
@@ -28,6 +28,7 @@ #ifndef SRC_TINT_LANG_CORE_IR_TRANSFORM_PREVENT_INFINITE_LOOPS_H_ #define SRC_TINT_LANG_CORE_IR_TRANSFORM_PREVENT_INFINITE_LOOPS_H_ +#include "src/tint/lang/core/ir/validator.h" #include "src/tint/utils/result.h" // Forward declarations. @@ -37,6 +38,9 @@ namespace tint::core::ir::transform { +/// The capabilities that the transform can support. +const Capabilities kPreventInfiniteLoopsCapabilities{Capability::kAllowDuplicateBindings}; + /// PreventInfiniteLoops is a transform that injects an additional exit condition into loops that /// may be infinite, to prevent downstream compilers from making bad assumptions due to the /// undefined behavior of infinite loops.
diff --git a/src/tint/lang/core/ir/transform/remove_continue_in_switch.cc b/src/tint/lang/core/ir/transform/remove_continue_in_switch.cc index 445b2ca..5c02fb0 100644 --- a/src/tint/lang/core/ir/transform/remove_continue_in_switch.cc +++ b/src/tint/lang/core/ir/transform/remove_continue_in_switch.cc
@@ -118,6 +118,7 @@ core::ir::Capability::kAllowVectorElementPointer, core::ir::Capability::kAllowHandleVarsWithoutBindings, core::ir::Capability::kAllowClipDistancesOnF32, + core::ir::Capability::kAllowDuplicateBindings, }); if (result != Success) { return result;
diff --git a/src/tint/lang/core/ir/transform/remove_terminator_args.h b/src/tint/lang/core/ir/transform/remove_terminator_args.h index 89cc1d7..24832fb 100644 --- a/src/tint/lang/core/ir/transform/remove_terminator_args.h +++ b/src/tint/lang/core/ir/transform/remove_terminator_args.h
@@ -51,6 +51,7 @@ core::ir::Capability::kAllowAnyLetType, core::ir::Capability::kAllowModuleScopeLets, core::ir::Capability::kAllowWorkspacePointerInputToEntryPoint, + core::ir::Capability::kAllowDuplicateBindings, }; /// RemoveTerminatorArgs is a transform that removes all arguments from terminator instructions and
diff --git a/src/tint/lang/core/ir/transform/rename_conflicts.h b/src/tint/lang/core/ir/transform/rename_conflicts.h index 8787904..dbd83c7 100644 --- a/src/tint/lang/core/ir/transform/rename_conflicts.h +++ b/src/tint/lang/core/ir/transform/rename_conflicts.h
@@ -51,6 +51,7 @@ core::ir::Capability::kAllowAnyLetType, core::ir::Capability::kAllowModuleScopeLets, core::ir::Capability::kAllowWorkspacePointerInputToEntryPoint, + core::ir::Capability::kAllowDuplicateBindings, }; /// RenameConflicts is a transform that renames declarations which prevent identifiers from
diff --git a/src/tint/lang/core/ir/transform/robustness.cc b/src/tint/lang/core/ir/transform/robustness.cc index 9d716c9..bebbb22 100644 --- a/src/tint/lang/core/ir/transform/robustness.cc +++ b/src/tint/lang/core/ir/transform/robustness.cc
@@ -568,7 +568,7 @@ } // namespace Result<SuccessType> Robustness(Module& ir, const RobustnessConfig& config) { - auto result = ValidateAndDumpIfNeeded(ir, "core.Robustness"); + auto result = ValidateAndDumpIfNeeded(ir, "core.Robustness", kRobustnessCapabilities); if (result != Success) { return result; }
diff --git a/src/tint/lang/core/ir/transform/robustness.h b/src/tint/lang/core/ir/transform/robustness.h index 2f0044a..db1755e 100644 --- a/src/tint/lang/core/ir/transform/robustness.h +++ b/src/tint/lang/core/ir/transform/robustness.h
@@ -29,6 +29,7 @@ #define SRC_TINT_LANG_CORE_IR_TRANSFORM_ROBUSTNESS_H_ #include <unordered_set> +#include "src/tint/lang/core/ir/validator.h" #include "src/tint/api/common/binding_point.h" #include "src/tint/utils/reflection.h" @@ -41,6 +42,9 @@ namespace tint::core::ir::transform { +/// The capabilities that the transform can support. +const Capabilities kRobustnessCapabilities{Capability::kAllowDuplicateBindings}; + /// Configuration options that control when to clamp accesses. struct RobustnessConfig { /// Should non-pointer accesses be clamped?
diff --git a/src/tint/lang/core/ir/transform/robustness_fuzz.cc b/src/tint/lang/core/ir/transform/robustness_fuzz.cc index b553293..d8a740a 100644 --- a/src/tint/lang/core/ir/transform/robustness_fuzz.cc +++ b/src/tint/lang/core/ir/transform/robustness_fuzz.cc
@@ -42,4 +42,5 @@ } // namespace } // namespace tint::core::ir::transform -TINT_IR_MODULE_FUZZER(tint::core::ir::transform::RobustnessFuzzer, tint::core::ir::Capabilities{}); +TINT_IR_MODULE_FUZZER(tint::core::ir::transform::RobustnessFuzzer, + tint::core::ir::transform::kRobustnessCapabilities);
diff --git a/src/tint/lang/core/ir/transform/std140.h b/src/tint/lang/core/ir/transform/std140.h index c63d4e7..4d0cc42 100644 --- a/src/tint/lang/core/ir/transform/std140.h +++ b/src/tint/lang/core/ir/transform/std140.h
@@ -42,6 +42,7 @@ const core::ir::Capabilities kStd140Capabilities{ core::ir::Capability::kAllowHandleVarsWithoutBindings, core::ir::Capability::kAllowAnyInputAttachmentIndexType, + core::ir::Capability::kAllowDuplicateBindings, }; /// Std140 is a transform that rewrites matrix types in the uniform address space to conform to
diff --git a/src/tint/lang/core/ir/transform/value_to_let.h b/src/tint/lang/core/ir/transform/value_to_let.h index f60921e..d44f0d7 100644 --- a/src/tint/lang/core/ir/transform/value_to_let.h +++ b/src/tint/lang/core/ir/transform/value_to_let.h
@@ -51,6 +51,7 @@ core::ir::Capability::kAllowAnyLetType, core::ir::Capability::kAllowWorkspacePointerInputToEntryPoint, core::ir::Capability::kAllowModuleScopeLets, + core::ir::Capability::kAllowDuplicateBindings, }; /// Configuration for ValueToLet transform.
diff --git a/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.h b/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.h index 6954ffe..2d0e376 100644 --- a/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.h +++ b/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.h
@@ -43,6 +43,7 @@ core::ir::Capability::kAllowVectorElementPointer, core::ir::Capability::kAllowHandleVarsWithoutBindings, core::ir::Capability::kAllowClipDistancesOnF32, + core::ir::Capability::kAllowDuplicateBindings, }; /// VectorizeScalarMatrixConstructors is a transform that replaces construct instructions that
diff --git a/src/tint/lang/core/ir/transform/vertex_pulling.cc b/src/tint/lang/core/ir/transform/vertex_pulling.cc index d8d8938..09f36c8 100644 --- a/src/tint/lang/core/ir/transform/vertex_pulling.cc +++ b/src/tint/lang/core/ir/transform/vertex_pulling.cc
@@ -684,7 +684,7 @@ } // namespace Result<SuccessType> VertexPulling(core::ir::Module& ir, const VertexPullingConfig& config) { - auto result = ValidateAndDumpIfNeeded(ir, "core.VertexPulling"); + auto result = ValidateAndDumpIfNeeded(ir, "core.VertexPulling", kVertexPullingCapabilities); if (result != Success) { return result.Failure(); }
diff --git a/src/tint/lang/core/ir/transform/vertex_pulling.h b/src/tint/lang/core/ir/transform/vertex_pulling.h index fe6fe51..34fd6b7 100644 --- a/src/tint/lang/core/ir/transform/vertex_pulling.h +++ b/src/tint/lang/core/ir/transform/vertex_pulling.h
@@ -29,6 +29,7 @@ #define SRC_TINT_LANG_CORE_IR_TRANSFORM_VERTEX_PULLING_H_ #include "src/tint/api/common/vertex_pulling_config.h" +#include "src/tint/lang/core/ir/validator.h" #include "src/tint/utils/result.h" // Forward declarations. @@ -38,6 +39,11 @@ namespace tint::core::ir::transform { +/// The capabilities that the transform can support. +// TODO(crbug.com/363031535): Remove kAllowDuplicateBindings when MSL no +// longer needs FlattenBindings. +const Capabilities kVertexPullingCapabilities{Capability::kAllowDuplicateBindings}; + /// This transform replaces vertex shader inputs with storage buffers, so that we can apply /// robustness to the vertex input accesses. ///
diff --git a/src/tint/lang/core/ir/transform/zero_init_workgroup_memory.cc b/src/tint/lang/core/ir/transform/zero_init_workgroup_memory.cc index aecbde3..fcb0840 100644 --- a/src/tint/lang/core/ir/transform/zero_init_workgroup_memory.cc +++ b/src/tint/lang/core/ir/transform/zero_init_workgroup_memory.cc
@@ -306,7 +306,8 @@ } // namespace Result<SuccessType> ZeroInitWorkgroupMemory(Module& ir) { - auto result = ValidateAndDumpIfNeeded(ir, "core.ZeroInitWorkgroupMemory"); + auto result = ValidateAndDumpIfNeeded(ir, "core.ZeroInitWorkgroupMemory", + kZeroInitWorkgroupMemoryCapabilities); if (result != Success) { return result; }
diff --git a/src/tint/lang/core/ir/transform/zero_init_workgroup_memory.h b/src/tint/lang/core/ir/transform/zero_init_workgroup_memory.h index f73df08..01feb70 100644 --- a/src/tint/lang/core/ir/transform/zero_init_workgroup_memory.h +++ b/src/tint/lang/core/ir/transform/zero_init_workgroup_memory.h
@@ -28,6 +28,7 @@ #ifndef SRC_TINT_LANG_CORE_IR_TRANSFORM_ZERO_INIT_WORKGROUP_MEMORY_H_ #define SRC_TINT_LANG_CORE_IR_TRANSFORM_ZERO_INIT_WORKGROUP_MEMORY_H_ +#include "src/tint/lang/core/ir/validator.h" #include "src/tint/utils/result.h" // Forward declarations. @@ -37,6 +38,9 @@ namespace tint::core::ir::transform { +/// The capabilities that the transform can support. +const Capabilities kZeroInitWorkgroupMemoryCapabilities{Capability::kAllowDuplicateBindings}; + /// ZeroInitWorkgroupMemory is a transform that injects code at the top of each entry point to /// zero-initialize workgroup memory used by that entry point. /// @param module the module to transform
diff --git a/src/tint/lang/core/ir/transform/zero_init_workgroup_memory_fuzz.cc b/src/tint/lang/core/ir/transform/zero_init_workgroup_memory_fuzz.cc index 970217d..b197f6b 100644 --- a/src/tint/lang/core/ir/transform/zero_init_workgroup_memory_fuzz.cc +++ b/src/tint/lang/core/ir/transform/zero_init_workgroup_memory_fuzz.cc
@@ -41,4 +41,4 @@ } // namespace tint::core::ir::transform TINT_IR_MODULE_FUZZER(tint::core::ir::transform::ZeroInitWorkgroupMemoryFuzzer, - tint::core::ir::Capabilities{}); + tint::core::ir::transform::kZeroInitWorkgroupMemoryCapabilities);
diff --git a/src/tint/lang/core/ir/validator.cc b/src/tint/lang/core/ir/validator.cc index 58bfacb..b3ed46a 100644 --- a/src/tint/lang/core/ir/validator.cc +++ b/src/tint/lang/core/ir/validator.cc
@@ -1385,7 +1385,6 @@ core::ir::ReferencedModuleVars<const Module> referenced_module_vars_; Hashset<OverrideId, 8> seen_override_ids_; Hashset<std::string, 4> entry_point_names_; - Hashset<ValidatedType, 16> validated_types_{}; }; @@ -2251,7 +2250,18 @@ func, CheckFrontFacingIfBoolFunc<Function>("entry point returns can not be 'bool'"), CheckFrontFacingIfBoolFunc<Function>("entry point return members can not be 'bool'")); + Hashset<BindingPoint, 4> binding_points{}; + for (auto var : referenced_module_vars_.TransitiveReferences(func)) { + if (!capabilities_.Contains(Capability::kAllowDuplicateBindings) && + var->BindingPoint().has_value()) { + auto bp = var->BindingPoint().value(); + if (!binding_points.Add(bp)) { + AddError(var) << "found non-unique binding point, " << bp + << ", being referenced in entry point, " << NameOf(func); + } + } + const auto* mv = var->Result()->Type()->As<core::type::MemoryView>(); const auto* ty = var->Result()->Type()->UnwrapPtrOrRef(); const auto attr = var->Attributes();
diff --git a/src/tint/lang/core/ir/validator.h b/src/tint/lang/core/ir/validator.h index b7efa1d..919aeb0 100644 --- a/src/tint/lang/core/ir/validator.h +++ b/src/tint/lang/core/ir/validator.h
@@ -70,6 +70,9 @@ /// Allows workgroup address space pointers as entry point inputs. Used by /// the MSL backend. kAllowWorkspacePointerInputToEntryPoint, + /// Allows binding points to be non-unique. Used after BindingRemapper is + /// invoked by MSL & GLSL backends. + kAllowDuplicateBindings, }; /// Capabilities is a set of Capability
diff --git a/src/tint/lang/core/ir/validator_value_test.cc b/src/tint/lang/core/ir/validator_value_test.cc index 4ee3573..31c283c 100644 --- a/src/tint/lang/core/ir/validator_value_test.cc +++ b/src/tint/lang/core/ir/validator_value_test.cc
@@ -521,6 +521,110 @@ )")) << res.Failure(); } +TEST_F(IR_ValidatorTest, Var_DuplicateBindingPoints_NeitherReferenced) { + auto* var_a = b.Var<uniform, f32>(); + var_a->SetBindingPoint(1, 2); + mod.root_block->Append(var_a); + + auto* var_b = b.Var<uniform, i32>(); + var_b->SetBindingPoint(1, 2); + mod.root_block->Append(var_b); + + auto res = ir::Validate(mod); + ASSERT_EQ(res, Success); +} + +TEST_F(IR_ValidatorTest, Var_DuplicateBindingPoints_OnlyOneReferenced) { + auto* var_a = b.Var<uniform, f32>(); + var_a->SetBindingPoint(1, 2); + mod.root_block->Append(var_a); + + auto* var_b = b.Var<uniform, i32>(); + var_b->SetBindingPoint(1, 2); + mod.root_block->Append(var_b); + + auto* f = FragmentEntryPoint(); + b.Append(f->Block(), [&] { + b.Let(var_a->Result()); + b.Return(f); + }); + + auto res = ir::Validate(mod); + ASSERT_EQ(res, Success); +} + +TEST_F(IR_ValidatorTest, Var_DuplicateBindingPoints_ReferencedInDifferentFunctions) { + auto* var_a = b.Var<uniform, f32>(); + var_a->SetBindingPoint(1, 2); + mod.root_block->Append(var_a); + + auto* var_b = b.Var<uniform, i32>(); + var_b->SetBindingPoint(1, 2); + mod.root_block->Append(var_b); + + auto* func_a = FragmentEntryPoint("func_a"); + b.Append(func_a->Block(), [&] { + b.Let(var_a->Result()); + b.Return(func_a); + }); + + auto* func_b = FragmentEntryPoint("func_b"); + b.Append(func_b->Block(), [&] { + b.Let(var_a->Result()); + b.Return(func_b); + }); + + auto res = ir::Validate(mod); + ASSERT_EQ(res, Success); +} + +TEST_F(IR_ValidatorTest, Var_DuplicateBindingPoints_BothReferenced) { + auto* var_a = b.Var<uniform, f32>(); + var_a->SetBindingPoint(1, 2); + mod.root_block->Append(var_a); + + auto* var_b = b.Var<uniform, i32>(); + var_b->SetBindingPoint(1, 2); + mod.root_block->Append(var_b); + + auto* f = FragmentEntryPoint(); + b.Append(f->Block(), [&] { + b.Let(var_a->Result()); + b.Let(var_b->Result()); + b.Return(f); + }); + + auto res = ir::Validate(mod); + ASSERT_NE(res, Success); + EXPECT_THAT( + res.Failure().reason, + testing::HasSubstr( + R"(:3:32 error: var: found non-unique binding point, [group: 1, binding: 2], being referenced in entry point, %f + %2:ptr<uniform, i32, read> = var undef @binding_point(1, 2) + ^^^ +)")) << res.Failure(); +} + +TEST_F(IR_ValidatorTest, Var_DuplicateBindingPoints_CapabilityOverride) { + auto* var_a = b.Var<uniform, f32>(); + var_a->SetBindingPoint(1, 2); + mod.root_block->Append(var_a); + + auto* var_b = b.Var<uniform, i32>(); + var_b->SetBindingPoint(1, 2); + mod.root_block->Append(var_b); + + auto* f = FragmentEntryPoint(); + b.Append(f->Block(), [&] { + b.Let(var_a->Result()); + b.Let(var_b->Result()); + b.Return(f); + }); + + auto res = ir::Validate(mod, Capabilities{Capability::kAllowDuplicateBindings}); + ASSERT_EQ(res, Success); +} + TEST_F(IR_ValidatorTest, Var_MultipleIOAnnotations) { auto* v = b.Var<AddressSpace::kIn, vec4<f32>>(); v->SetBuiltin(BuiltinValue::kPosition);
diff --git a/src/tint/lang/glsl/writer/builtin_test.cc b/src/tint/lang/glsl/writer/builtin_test.cc index 2bca6ab..bed60c8 100644 --- a/src/tint/lang/glsl/writer/builtin_test.cc +++ b/src/tint/lang/glsl/writer/builtin_test.cc
@@ -877,6 +877,7 @@ }); Options opts{}; + opts.bindings.texture_builtins_from_uniform.ubo_binding = {0, 1}; opts.bindings.texture_builtins_from_uniform.ubo_bindingpoint_ordering = {{0, 0}}; ASSERT_TRUE(Generate(opts)) << err_ << output_.glsl; EXPECT_EQ(output_.glsl, GlslHeader() + R"(precision highp float; @@ -887,7 +888,7 @@ uint tint_builtin_value_0; }; -layout(binding = 0, std140) +layout(binding = 1, std140) uniform f_tint_symbol_ubo { TintTextureUniformData inner; } v_1;
diff --git a/src/tint/lang/glsl/writer/printer/printer.cc b/src/tint/lang/glsl/writer/printer/printer.cc index 6cb1fff..cbde070 100644 --- a/src/tint/lang/glsl/writer/printer/printer.cc +++ b/src/tint/lang/glsl/writer/printer/printer.cc
@@ -128,7 +128,8 @@ tint::Result<Output> Generate() { auto valid = core::ir::ValidateAndDumpIfNeeded( ir_, "glsl.Printer", - core::ir::Capabilities{core::ir::Capability::kAllowHandleVarsWithoutBindings}); + core::ir::Capabilities{core::ir::Capability::kAllowHandleVarsWithoutBindings, + core::ir::Capability::kAllowDuplicateBindings}); if (valid != Success) { return std::move(valid.Failure()); }
diff --git a/src/tint/lang/glsl/writer/raise/binary_polyfill.cc b/src/tint/lang/glsl/writer/raise/binary_polyfill.cc index 7e4f0a3..988071e 100644 --- a/src/tint/lang/glsl/writer/raise/binary_polyfill.cc +++ b/src/tint/lang/glsl/writer/raise/binary_polyfill.cc
@@ -216,7 +216,9 @@ } // namespace Result<SuccessType> BinaryPolyfill(core::ir::Module& ir) { - auto result = ValidateAndDumpIfNeeded(ir, "glsl.BinaryPolyfill"); + auto result = ValidateAndDumpIfNeeded( + ir, "glsl.BinaryPolyfill", + core::ir::Capabilities{core::ir::Capability::kAllowDuplicateBindings}); if (result != Success) { return result.Failure(); }
diff --git a/src/tint/lang/glsl/writer/raise/bitcast_polyfill.cc b/src/tint/lang/glsl/writer/raise/bitcast_polyfill.cc index df80ab9..93ee29b 100644 --- a/src/tint/lang/glsl/writer/raise/bitcast_polyfill.cc +++ b/src/tint/lang/glsl/writer/raise/bitcast_polyfill.cc
@@ -278,7 +278,8 @@ Result<SuccessType> BitcastPolyfill(core::ir::Module& ir) { auto result = ValidateAndDumpIfNeeded( ir, "glsl.BitcastPolyfill", - core::ir::Capabilities{core::ir::Capability::kAllowHandleVarsWithoutBindings}); + core::ir::Capabilities{core::ir::Capability::kAllowHandleVarsWithoutBindings, + core::ir::Capability::kAllowDuplicateBindings}); if (result != Success) { return result.Failure(); }
diff --git a/src/tint/lang/glsl/writer/raise/builtin_polyfill.cc b/src/tint/lang/glsl/writer/raise/builtin_polyfill.cc index 9cd25f4..2478f76 100644 --- a/src/tint/lang/glsl/writer/raise/builtin_polyfill.cc +++ b/src/tint/lang/glsl/writer/raise/builtin_polyfill.cc
@@ -526,7 +526,9 @@ } // namespace Result<SuccessType> BuiltinPolyfill(core::ir::Module& ir) { - auto result = ValidateAndDumpIfNeeded(ir, "glsl.BuiltinPolyfill"); + auto result = ValidateAndDumpIfNeeded( + ir, "glsl.BuiltinPolyfill", + core::ir::Capabilities{core::ir::Capability::kAllowDuplicateBindings}); if (result != Success) { return result.Failure(); }
diff --git a/src/tint/lang/glsl/writer/raise/offset_first_index.cc b/src/tint/lang/glsl/writer/raise/offset_first_index.cc index cfc5897..ec785fd 100644 --- a/src/tint/lang/glsl/writer/raise/offset_first_index.cc +++ b/src/tint/lang/glsl/writer/raise/offset_first_index.cc
@@ -115,6 +115,7 @@ auto result = ValidateAndDumpIfNeeded(ir, "glsl.OffsetFirstIndex", core::ir::Capabilities{ core::ir::Capability::kAllowHandleVarsWithoutBindings, + core::ir::Capability::kAllowDuplicateBindings, }); if (result != Success) { return result.Failure();
diff --git a/src/tint/lang/glsl/writer/raise/raise.cc b/src/tint/lang/glsl/writer/raise/raise.cc index 69e3f0b..eeb9feb 100644 --- a/src/tint/lang/glsl/writer/raise/raise.cc +++ b/src/tint/lang/glsl/writer/raise/raise.cc
@@ -126,7 +126,7 @@ RemapperData remapper_data{}; PopulateBindingInfo(options, remapper_data, multiplanar_map); RUN_TRANSFORM(core::ir::transform::BindingRemapper, module, remapper_data); - + // Capability::kAllowDuplicateBindings needed after BindingRemapper { core::ir::transform::BinaryPolyfillConfig binary_polyfills{}; binary_polyfills.int_div_mod = !options.disable_polyfill_integer_div_mod;
diff --git a/src/tint/lang/glsl/writer/raise/shader_io.cc b/src/tint/lang/glsl/writer/raise/shader_io.cc index 9b3d99c..9709e48 100644 --- a/src/tint/lang/glsl/writer/raise/shader_io.cc +++ b/src/tint/lang/glsl/writer/raise/shader_io.cc
@@ -239,7 +239,8 @@ Result<SuccessType> ShaderIO(core::ir::Module& ir, const ShaderIOConfig& config) { auto result = ValidateAndDumpIfNeeded( ir, "glsl.ShaderIO", - core::ir::Capabilities{core::ir::Capability::kAllowHandleVarsWithoutBindings}); + core::ir::Capabilities{core::ir::Capability::kAllowHandleVarsWithoutBindings, + core::ir::Capability::kAllowDuplicateBindings}); if (result != Success) { return result; }
diff --git a/src/tint/lang/glsl/writer/raise/texture_polyfill.cc b/src/tint/lang/glsl/writer/raise/texture_polyfill.cc index a3cfd3b..7430896 100644 --- a/src/tint/lang/glsl/writer/raise/texture_polyfill.cc +++ b/src/tint/lang/glsl/writer/raise/texture_polyfill.cc
@@ -1228,7 +1228,9 @@ } // namespace Result<SuccessType> TexturePolyfill(core::ir::Module& ir, const TexturePolyfillConfig& cfg) { - auto result = ValidateAndDumpIfNeeded(ir, "glsl.TexturePolyfill"); + auto result = ValidateAndDumpIfNeeded( + ir, "glsl.TexturePolyfill", + core::ir::Capabilities{core::ir::Capability::kAllowDuplicateBindings}); if (result != Success) { return result.Failure(); }
diff --git a/src/tint/lang/msl/writer/raise/argument_buffers.cc b/src/tint/lang/msl/writer/raise/argument_buffers.cc index b37028c..8166a2d 100644 --- a/src/tint/lang/msl/writer/raise/argument_buffers.cc +++ b/src/tint/lang/msl/writer/raise/argument_buffers.cc
@@ -308,7 +308,9 @@ } // namespace Result<SuccessType> ArgumentBuffers(core::ir::Module& ir) { - auto result = ValidateAndDumpIfNeeded(ir, "msl.ArgumentBuffers"); + auto result = ValidateAndDumpIfNeeded( + ir, "msl.ArgumentBuffers", + tint::core::ir::Capabilities{tint::core::ir::Capability::kAllowDuplicateBindings}); if (result != Success) { return result.Failure(); }
diff --git a/src/tint/lang/msl/writer/raise/module_scope_vars.cc b/src/tint/lang/msl/writer/raise/module_scope_vars.cc index 87fe418..113606b 100644 --- a/src/tint/lang/msl/writer/raise/module_scope_vars.cc +++ b/src/tint/lang/msl/writer/raise/module_scope_vars.cc
@@ -346,6 +346,7 @@ core::ir::Capabilities{ core::ir::Capability::kAllowPointersAndHandlesInStructures, core::ir::Capability::kAllowWorkspacePointerInputToEntryPoint, + core::ir::Capability::kAllowDuplicateBindings, }); if (result != Success) { return result.Failure();
diff --git a/src/tint/lang/msl/writer/raise/packed_vec3.cc b/src/tint/lang/msl/writer/raise/packed_vec3.cc index d382ab8..b58799c 100644 --- a/src/tint/lang/msl/writer/raise/packed_vec3.cc +++ b/src/tint/lang/msl/writer/raise/packed_vec3.cc
@@ -640,7 +640,9 @@ } // namespace Result<SuccessType> PackedVec3(core::ir::Module& ir) { - auto result = ValidateAndDumpIfNeeded(ir, "msl.PackedVec3"); + auto result = ValidateAndDumpIfNeeded( + ir, "msl.PackedVec3", + tint::core::ir::Capabilities{tint::core::ir::Capability::kAllowDuplicateBindings}); if (result != Success) { return result.Failure(); }
diff --git a/src/tint/lang/msl/writer/raise/shader_io.cc b/src/tint/lang/msl/writer/raise/shader_io.cc index 8c53bfd..e1c715d 100644 --- a/src/tint/lang/msl/writer/raise/shader_io.cc +++ b/src/tint/lang/msl/writer/raise/shader_io.cc
@@ -237,7 +237,9 @@ } // namespace Result<SuccessType> ShaderIO(core::ir::Module& ir, const ShaderIOConfig& config) { - auto result = ValidateAndDumpIfNeeded(ir, "msl.ShaderIO"); + auto result = ValidateAndDumpIfNeeded( + ir, "msl.ShaderIO", + tint::core::ir::Capabilities{tint::core::ir::Capability::kAllowDuplicateBindings}); if (result != Success) { return result; }
diff --git a/src/tint/lang/msl/writer/raise/simd_ballot.cc b/src/tint/lang/msl/writer/raise/simd_ballot.cc index 27283c6..ea16af5 100644 --- a/src/tint/lang/msl/writer/raise/simd_ballot.cc +++ b/src/tint/lang/msl/writer/raise/simd_ballot.cc
@@ -158,7 +158,9 @@ } // namespace Result<SuccessType> SimdBallot(core::ir::Module& ir) { - auto result = ValidateAndDumpIfNeeded(ir, "msl.SimdBallot"); + auto result = ValidateAndDumpIfNeeded( + ir, "msl.SimdBallot", + tint::core::ir::Capabilities{tint::core::ir::Capability::kAllowDuplicateBindings}); if (result != Success) { return result.Failure(); }