Add ExternalTextureOptions This CL adds a `writer/ExternalTextureOptions` to allow providing external texture information to the generators. The generators are updated to have the option in their config, but do not use it yet. Bug: tint:1855 chromium:1421379 Change-Id: I99b122c5cae145e8527158f300da81743f89775a Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/123160 Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: Ben Clayton <bclayton@google.com> Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn index a9871da..8d6a3b1 100644 --- a/src/tint/BUILD.gn +++ b/src/tint/BUILD.gn
@@ -659,6 +659,7 @@ "sem/evaluation_stage.h", "sem/expression.cc", "sem/expression.h", + "sem/external_texture.h", "sem/for_loop_statement.cc", "sem/for_loop_statement.h", "sem/function.cc", @@ -899,6 +900,8 @@ "writer/binding_point.h", "writer/check_supported_extensions.cc", "writer/check_supported_extensions.h", + "writer/external_texture_options.cc", + "writer/external_texture_options.h", "writer/flatten_bindings.cc", "writer/flatten_bindings.h", "writer/float_to_string.cc",
diff --git a/src/tint/CMakeLists.txt b/src/tint/CMakeLists.txt index 91f8178..db51dfb 100644 --- a/src/tint/CMakeLists.txt +++ b/src/tint/CMakeLists.txt
@@ -301,6 +301,7 @@ sem/evaluation_stage.h sem/expression.cc sem/expression.h + sem/external_texture.h sem/for_loop_statement.cc sem/for_loop_statement.h sem/function_expression.cc @@ -543,6 +544,8 @@ writer/binding_point.h writer/check_supported_extensions.cc writer/check_supported_extensions.h + writer/external_texture_options.cc + writer/external_texture_options.h writer/flatten_bindings.cc writer/flatten_bindings.h writer/float_to_string.cc
diff --git a/src/tint/sem/external_texture.h b/src/tint/sem/external_texture.h new file mode 100644 index 0000000..2ad5673 --- /dev/null +++ b/src/tint/sem/external_texture.h
@@ -0,0 +1,45 @@ +// Copyright 2023 The Tint Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SRC_TINT_SEM_EXTERNAL_TEXTURE_H_ +#define SRC_TINT_SEM_EXTERNAL_TEXTURE_H_ + +#include <unordered_map> + +#include "src/tint/sem/binding_point.h" + +namespace tint::sem::external_texture { + +/// This struct identifies the binding groups and locations for new bindings to +/// use when transforming a texture_external instance. +struct BindingPoints { + /// The desired binding location of the texture_2d representing plane #1 when + /// a texture_external binding is expanded. + BindingPoint plane_1; + /// The desired binding location of the ExternalTextureParams uniform when a + /// texture_external binding is expanded. + BindingPoint params; + + /// Reflect the fields of this class so that it can be used by tint::ForeachField() + TINT_REFLECT(plane_1, params); +}; + +/// BindingsMap is a map where the key is the binding location of a +/// texture_external and the value is a struct containing the desired +/// locations for new bindings expanded from the texture_external instance. +using BindingsMap = std::unordered_map<BindingPoint, BindingPoints>; + +} // namespace tint::sem::external_texture + +#endif // SRC_TINT_SEM_EXTERNAL_TEXTURE_H_
diff --git a/src/tint/transform/multiplanar_external_texture.h b/src/tint/transform/multiplanar_external_texture.h index 625c756..656d0ad 100644 --- a/src/tint/transform/multiplanar_external_texture.h +++ b/src/tint/transform/multiplanar_external_texture.h
@@ -21,6 +21,7 @@ #include "src/tint/ast/struct_member.h" #include "src/tint/builtin/function.h" #include "src/tint/sem/binding_point.h" +#include "src/tint/sem/external_texture.h" #include "src/tint/transform/transform.h" namespace tint::transform { @@ -40,22 +41,12 @@ public: /// This struct identifies the binding groups and locations for new bindings to /// use when transforming a texture_external instance. - struct BindingPoints { - /// The desired binding location of the texture_2d representing plane #1 when - /// a texture_external binding is expanded. - sem::BindingPoint plane_1; - /// The desired binding location of the ExternalTextureParams uniform when a - /// texture_external binding is expanded. - sem::BindingPoint params; - - /// Reflect the fields of this class so that it can be used by tint::ForeachField() - TINT_REFLECT(plane_1, params); - }; + using BindingPoints = sem::external_texture::BindingPoints; /// BindingsMap is a map where the key is the binding location of a /// texture_external and the value is a struct containing the desired /// locations for new bindings expanded from the texture_external instance. - using BindingsMap = std::unordered_map<sem::BindingPoint, BindingPoints>; + using BindingsMap = sem::external_texture::BindingsMap; /// NewBindingPoints is consumed by the MultiplanarExternalTexture transform. /// Data holds information about location of each texture_external binding and
diff --git a/src/tint/writer/array_length_from_uniform_options.cc b/src/tint/writer/array_length_from_uniform_options.cc index 7fd6e63..275867f 100644 --- a/src/tint/writer/array_length_from_uniform_options.cc +++ b/src/tint/writer/array_length_from_uniform_options.cc
@@ -17,11 +17,15 @@ namespace tint::writer { ArrayLengthFromUniformOptions::ArrayLengthFromUniformOptions() = default; + ArrayLengthFromUniformOptions::~ArrayLengthFromUniformOptions() = default; + ArrayLengthFromUniformOptions::ArrayLengthFromUniformOptions(const ArrayLengthFromUniformOptions&) = default; + ArrayLengthFromUniformOptions& ArrayLengthFromUniformOptions::operator=( const ArrayLengthFromUniformOptions&) = default; + ArrayLengthFromUniformOptions::ArrayLengthFromUniformOptions(ArrayLengthFromUniformOptions&&) = default;
diff --git a/src/tint/writer/external_texture_options.cc b/src/tint/writer/external_texture_options.cc new file mode 100644 index 0000000..e5ea26f --- /dev/null +++ b/src/tint/writer/external_texture_options.cc
@@ -0,0 +1,29 @@ +// Copyright 2023 The Tint Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "src/tint/writer/external_texture_options.h" + +namespace tint::writer { + +ExternalTextureOptions::ExternalTextureOptions() = default; + +ExternalTextureOptions::~ExternalTextureOptions() = default; + +ExternalTextureOptions::ExternalTextureOptions(const ExternalTextureOptions&) = default; + +ExternalTextureOptions& ExternalTextureOptions::operator=(const ExternalTextureOptions&) = default; + +ExternalTextureOptions::ExternalTextureOptions(ExternalTextureOptions&&) = default; + +} // namespace tint::writer
diff --git a/src/tint/writer/external_texture_options.h b/src/tint/writer/external_texture_options.h new file mode 100644 index 0000000..926eabd --- /dev/null +++ b/src/tint/writer/external_texture_options.h
@@ -0,0 +1,57 @@ +// Copyright 2023 The Tint Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SRC_TINT_WRITER_EXTERNAL_TEXTURE_OPTIONS_H_ +#define SRC_TINT_WRITER_EXTERNAL_TEXTURE_OPTIONS_H_ + +#include <unordered_map> + +#include "src/tint/sem/external_texture.h" + +namespace tint::writer { + +/// Options used to specify mappings of binding points for external textures. +class ExternalTextureOptions { + public: + /// This struct identifies the binding groups and locations for new bindings to + /// use when transforming a texture_external instance. + using BindingPoints = sem::external_texture::BindingPoints; + + /// BindingsMap is a map where the key is the binding location of a + /// texture_external and the value is a struct containing the desired + /// locations for new bindings expanded from the texture_external instance. + using BindingsMap = sem::external_texture::BindingsMap; + + /// Constructor + ExternalTextureOptions(); + /// Destructor + ~ExternalTextureOptions(); + /// Copy constructor + ExternalTextureOptions(const ExternalTextureOptions&); + /// Copy assignment + /// @returns this ExternalTextureOptions + ExternalTextureOptions& operator=(const ExternalTextureOptions&); + /// Move constructor + ExternalTextureOptions(ExternalTextureOptions&&); + + /// A map of new binding points to use. + BindingsMap bindings_map; + + /// Reflect the fields of this class so that it can be used by tint::ForeachField() + TINT_REFLECT(bindings_map); +}; + +} // namespace tint::writer + +#endif // SRC_TINT_WRITER_EXTERNAL_TEXTURE_OPTIONS_H_
diff --git a/src/tint/writer/glsl/generator.h b/src/tint/writer/glsl/generator.h index 2bb4b03..5c2de66 100644 --- a/src/tint/writer/glsl/generator.h +++ b/src/tint/writer/glsl/generator.h
@@ -25,6 +25,7 @@ #include "src/tint/builtin/access.h" #include "src/tint/sem/binding_point.h" #include "src/tint/sem/sampler_texture_pair.h" +#include "src/tint/writer/external_texture_options.h" #include "src/tint/writer/glsl/version.h" #include "src/tint/writer/text.h" @@ -76,6 +77,9 @@ /// Set to 'true' to generates binding mappings for external textures bool generate_external_texture_bindings = false; + /// Options used in the binding mappings for external textures + ExternalTextureOptions external_texture_options = {}; + /// The GLSL version to emit Version version; @@ -84,6 +88,7 @@ allow_collisions, disable_workgroup_init, generate_external_texture_bindings, + external_texture_options, version); };
diff --git a/src/tint/writer/hlsl/generator.h b/src/tint/writer/hlsl/generator.h index 74d79ba..1c072d8 100644 --- a/src/tint/writer/hlsl/generator.h +++ b/src/tint/writer/hlsl/generator.h
@@ -28,6 +28,7 @@ #include "src/tint/sem/binding_point.h" #include "src/tint/utils/bitset.h" #include "src/tint/writer/array_length_from_uniform_options.h" +#include "src/tint/writer/external_texture_options.h" #include "src/tint/writer/text.h" // Forward declarations @@ -61,6 +62,9 @@ /// Set to 'true' to generates binding mappings for external textures bool generate_external_texture_bindings = false; + /// Options used in the binding mappings for external textures + ExternalTextureOptions external_texture_options = {}; + /// Options used to specify a mapping of binding points to indices into a UBO /// from which to load buffer sizes. ArrayLengthFromUniformOptions array_length_from_uniform = {}; @@ -77,6 +81,7 @@ root_constant_binding_point, disable_workgroup_init, generate_external_texture_bindings, + external_texture_options, array_length_from_uniform); };
diff --git a/src/tint/writer/msl/generator.h b/src/tint/writer/msl/generator.h index 1add259..e58ef9e 100644 --- a/src/tint/writer/msl/generator.h +++ b/src/tint/writer/msl/generator.h
@@ -23,6 +23,7 @@ #include "src/tint/reflection.h" #include "src/tint/writer/array_length_from_uniform_options.h" +#include "src/tint/writer/external_texture_options.h" #include "src/tint/writer/text.h" // Forward declarations @@ -65,6 +66,9 @@ /// Set to 'true' to generates binding mappings for external textures bool generate_external_texture_bindings = false; + /// Options used in the binding mappings for external textures + ExternalTextureOptions external_texture_options = {}; + /// Options used to specify a mapping of binding points to indices into a UBO /// from which to load buffer sizes. ArrayLengthFromUniformOptions array_length_from_uniform = {}; @@ -76,6 +80,7 @@ emit_vertex_point_size, disable_workgroup_init, generate_external_texture_bindings, + external_texture_options, array_length_from_uniform); };
diff --git a/src/tint/writer/spirv/generator.h b/src/tint/writer/spirv/generator.h index 8b34032..11660fe 100644 --- a/src/tint/writer/spirv/generator.h +++ b/src/tint/writer/spirv/generator.h
@@ -20,6 +20,7 @@ #include <vector> #include "src/tint/reflection.h" +#include "src/tint/writer/external_texture_options.h" #include "src/tint/writer/writer.h" // Forward declarations @@ -48,6 +49,9 @@ /// Set to 'true' to generates binding mappings for external textures bool generate_external_texture_bindings = false; + /// Options used in the binding mappings for external textures + ExternalTextureOptions external_texture_options = {}; + /// Set to `true` to initialize workgroup memory with OpConstantNull when /// VK_KHR_zero_initialize_workgroup_memory is enabled. bool use_zero_initialize_workgroup_memory_extension = false; @@ -57,6 +61,7 @@ emit_vertex_point_size, disable_workgroup_init, generate_external_texture_bindings, + external_texture_options, use_zero_initialize_workgroup_memory_extension); };