Delete Single-Plane External Texture Transform
The multiplanar external texture transform has been integrated into
Dawn, which means we have no use for the single plane transform - so it
should be deleted.
Bug: dawn:1082
Change-Id: Id8977d03839b76c90ae6e70400d048c13fbe85f4
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/80120
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Brandon1 Jones <brandon1.jones@intel.com>
diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn
index 98ad682..53f557a 100644
--- a/src/tint/BUILD.gn
+++ b/src/tint/BUILD.gn
@@ -450,8 +450,6 @@
"transform/decompose_strided_array.h",
"transform/decompose_strided_matrix.cc",
"transform/decompose_strided_matrix.h",
- "transform/external_texture_transform.cc",
- "transform/external_texture_transform.h",
"transform/first_index_offset.cc",
"transform/first_index_offset.h",
"transform/fold_constants.cc",
diff --git a/src/tint/CMakeLists.txt b/src/tint/CMakeLists.txt
index 1eba18f..8abbc93 100644
--- a/src/tint/CMakeLists.txt
+++ b/src/tint/CMakeLists.txt
@@ -326,8 +326,6 @@
transform/decompose_strided_array.h
transform/decompose_strided_matrix.cc
transform/decompose_strided_matrix.h
- transform/external_texture_transform.cc
- transform/external_texture_transform.h
transform/first_index_offset.cc
transform/first_index_offset.h
transform/fold_constants.cc
@@ -1015,7 +1013,6 @@
transform/decompose_memory_access_test.cc
transform/decompose_strided_array_test.cc
transform/decompose_strided_matrix_test.cc
- transform/external_texture_transform_test.cc
transform/first_index_offset_test.cc
transform/fold_constants_test.cc
transform/fold_trivial_single_use_lets_test.cc
diff --git a/src/tint/transform/external_texture_transform.cc b/src/tint/transform/external_texture_transform.cc
deleted file mode 100644
index eefa4c0..0000000
--- a/src/tint/transform/external_texture_transform.cc
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2021 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/transform/external_texture_transform.h"
-
-#include "src/tint/program_builder.h"
-#include "src/tint/sem/call.h"
-#include "src/tint/sem/variable.h"
-
-TINT_INSTANTIATE_TYPEINFO(tint::transform::ExternalTextureTransform);
-
-namespace tint {
-namespace transform {
-
-ExternalTextureTransform::ExternalTextureTransform() = default;
-ExternalTextureTransform::~ExternalTextureTransform() = default;
-
-void ExternalTextureTransform::Run(CloneContext& ctx,
- const DataMap&,
- DataMap&) const {
- auto& sem = ctx.src->Sem();
-
- // Within this transform, usages of texture_external are replaced with a
- // texture_2d<f32>, which will allow us perform operations on a
- // texture_external without maintaining texture_external-specific code
- // generation paths in the backends.
-
- // When replacing instances of texture_external with texture_2d<f32> we must
- // also modify calls to the texture_external overloads of textureLoad and
- // textureSampleLevel, which unlike their texture_2d<f32> overloads do not
- // require a level parameter. To do this we identify calls to textureLoad and
- // textureSampleLevel that use texture_external as the first parameter and add
- // a parameter for the level (which is always 0).
-
- // Scan the AST nodes for calls to textureLoad or textureSampleLevel.
- for (auto* node : ctx.src->ASTNodes().Objects()) {
- if (auto* call_expr = node->As<ast::CallExpression>()) {
- if (auto* builtin = sem.Get(call_expr)->Target()->As<sem::Builtin>()) {
- if (builtin->Type() == sem::BuiltinType::kTextureLoad ||
- builtin->Type() == sem::BuiltinType::kTextureSampleLevel) {
- // When a textureLoad or textureSampleLevel has been identified, check
- // if the first parameter is an external texture.
- if (auto* var =
- sem.Get(call_expr->args[0])->As<sem::VariableUser>()) {
- if (var->Variable()
- ->Type()
- ->UnwrapRef()
- ->Is<sem::ExternalTexture>()) {
- if (builtin->Type() == sem::BuiltinType::kTextureLoad &&
- call_expr->args.size() != 2) {
- TINT_ICE(Transform, ctx.dst->Diagnostics())
- << "expected textureLoad call with a texture_external to "
- "have 2 parameters, found "
- << call_expr->args.size() << " parameters";
- }
-
- if (builtin->Type() == sem::BuiltinType::kTextureSampleLevel &&
- call_expr->args.size() != 3) {
- TINT_ICE(Transform, ctx.dst->Diagnostics())
- << "expected textureSampleLevel call with a "
- "texture_external to have 3 parameters, found "
- << call_expr->args.size() << " parameters";
- }
-
- // Replace the call with another that has the same parameters in
- // addition to a level parameter (always zero for external
- // textures).
- auto* exp = ctx.Clone(call_expr->target.name);
- auto* externalTextureParam = ctx.Clone(call_expr->args[0]);
-
- ast::ExpressionList params;
- if (builtin->Type() == sem::BuiltinType::kTextureLoad) {
- auto* coordsParam = ctx.Clone(call_expr->args[1]);
- auto* levelParam = ctx.dst->Expr(0);
- params = {externalTextureParam, coordsParam, levelParam};
- } else if (builtin->Type() ==
- sem::BuiltinType::kTextureSampleLevel) {
- auto* samplerParam = ctx.Clone(call_expr->args[1]);
- auto* coordsParam = ctx.Clone(call_expr->args[2]);
- auto* levelParam = ctx.dst->Expr(0.0f);
- params = {externalTextureParam, samplerParam, coordsParam,
- levelParam};
- }
-
- auto* newCall = ctx.dst->create<ast::CallExpression>(exp, params);
- ctx.Replace(call_expr, newCall);
- }
- }
- }
- }
- }
- }
-
- // Scan the AST nodes for external texture declarations.
- for (auto* node : ctx.src->ASTNodes().Objects()) {
- if (auto* var = node->As<ast::Variable>()) {
- if (::tint::Is<ast::ExternalTexture>(var->type)) {
- // Replace a single-plane external texture with a 2D, f32 sampled
- // texture.
- auto* newType = ctx.dst->ty.sampled_texture(ast::TextureDimension::k2d,
- ctx.dst->ty.f32());
- auto clonedSrc = ctx.Clone(var->source);
- auto clonedSym = ctx.Clone(var->symbol);
- auto* clonedConstructor = ctx.Clone(var->constructor);
- auto clonedAttributes = ctx.Clone(var->attributes);
- auto* newVar = ctx.dst->create<ast::Variable>(
- clonedSrc, clonedSym, var->declared_storage_class,
- var->declared_access, newType, false, false, clonedConstructor,
- clonedAttributes);
-
- ctx.Replace(var, newVar);
- }
- }
- }
-
- ctx.Clone();
-}
-
-} // namespace transform
-} // namespace tint
diff --git a/src/tint/transform/external_texture_transform.h b/src/tint/transform/external_texture_transform.h
deleted file mode 100644
index f0669f4..0000000
--- a/src/tint/transform/external_texture_transform.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2021 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_TRANSFORM_EXTERNAL_TEXTURE_TRANSFORM_H_
-#define SRC_TINT_TRANSFORM_EXTERNAL_TEXTURE_TRANSFORM_H_
-
-#include <utility>
-
-#include "src/tint/transform/transform.h"
-
-namespace tint {
-namespace transform {
-
-/// Because an external texture is comprised of 1-3 texture views we can simply
-/// transform external textures into the appropriate number of sampled textures.
-/// This allows us to share SPIR-V/HLSL writer paths for sampled textures
-/// instead of adding dedicated writer paths for external textures.
-/// ExternalTextureTransform performs this transformation.
-class ExternalTextureTransform
- : public Castable<ExternalTextureTransform, Transform> {
- public:
- /// Constructor
- ExternalTextureTransform();
- /// Destructor
- ~ExternalTextureTransform() override;
-
- protected:
- /// Runs the transform using the CloneContext built for transforming a
- /// program. Run() is responsible for calling Clone() on the CloneContext.
- /// @param ctx the CloneContext primed with the input program and
- /// ProgramBuilder
- /// @param inputs optional extra transform-specific input data
- /// @param outputs optional extra transform-specific output data
- void Run(CloneContext& ctx,
- const DataMap& inputs,
- DataMap& outputs) const override;
-};
-
-} // namespace transform
-} // namespace tint
-
-#endif // SRC_TINT_TRANSFORM_EXTERNAL_TEXTURE_TRANSFORM_H_
diff --git a/src/tint/transform/external_texture_transform_test.cc b/src/tint/transform/external_texture_transform_test.cc
deleted file mode 100644
index 5434039..0000000
--- a/src/tint/transform/external_texture_transform_test.cc
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2021 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/transform/external_texture_transform.h"
-
-#include "src/tint/transform/test_helper.h"
-
-namespace tint {
-namespace transform {
-namespace {
-
-using ExternalTextureTransformTest = TransformTest;
-
-TEST_F(ExternalTextureTransformTest, SampleLevelSinglePlane) {
- auto* src = R"(
-@group(0) @binding(0) var s : sampler;
-
-@group(0) @binding(1) var t : texture_external;
-
-@stage(fragment)
-fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
- return textureSampleLevel(t, s, (coord.xy / vec2<f32>(4.0, 4.0)));
-}
-)";
-
- auto* expect = R"(
-@group(0) @binding(0) var s : sampler;
-
-@group(0) @binding(1) var t : texture_2d<f32>;
-
-@stage(fragment)
-fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
- return textureSampleLevel(t, s, (coord.xy / vec2<f32>(4.0, 4.0)), 0.0);
-}
-)";
-
- auto got = Run<ExternalTextureTransform>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(ExternalTextureTransformTest, SampleLevelSinglePlane_OutOfOrder) {
- auto* src = R"(
-@stage(fragment)
-fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
- return textureSampleLevel(t, s, (coord.xy / vec2<f32>(4.0, 4.0)));
-}
-
-@group(0) @binding(1) var t : texture_external;
-
-@group(0) @binding(0) var s : sampler;
-)";
-
- auto* expect = R"(
-@stage(fragment)
-fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
- return textureSampleLevel(t, s, (coord.xy / vec2<f32>(4.0, 4.0)), 0.0);
-}
-
-@group(0) @binding(1) var t : texture_2d<f32>;
-
-@group(0) @binding(0) var s : sampler;
-)";
-
- auto got = Run<ExternalTextureTransform>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(ExternalTextureTransformTest, LoadSinglePlane) {
- auto* src = R"(
-@group(0) @binding(0) var t : texture_external;
-
-@stage(fragment)
-fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
- return textureLoad(t, vec2<i32>(1, 1));
-}
-)";
-
- auto* expect = R"(
-@group(0) @binding(0) var t : texture_2d<f32>;
-
-@stage(fragment)
-fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
- return textureLoad(t, vec2<i32>(1, 1), 0);
-}
-)";
-
- auto got = Run<ExternalTextureTransform>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(ExternalTextureTransformTest, LoadSinglePlane_OutOfOrder) {
- auto* src = R"(
-@stage(fragment)
-fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
- return textureLoad(t, vec2<i32>(1, 1));
-}
-
-@group(0) @binding(0) var t : texture_external;
-)";
-
- auto* expect = R"(
-@stage(fragment)
-fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
- return textureLoad(t, vec2<i32>(1, 1), 0);
-}
-
-@group(0) @binding(0) var t : texture_2d<f32>;
-)";
-
- auto got = Run<ExternalTextureTransform>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(ExternalTextureTransformTest, DimensionsSinglePlane) {
- auto* src = R"(
-@group(0) @binding(0) var t : texture_external;
-
-@stage(fragment)
-fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
- var dim : vec2<i32>;
- dim = textureDimensions(t);
- return vec4<f32>(0.0, 0.0, 0.0, 0.0);
-}
-)";
-
- auto* expect = R"(
-@group(0) @binding(0) var t : texture_2d<f32>;
-
-@stage(fragment)
-fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
- var dim : vec2<i32>;
- dim = textureDimensions(t);
- return vec4<f32>(0.0, 0.0, 0.0, 0.0);
-}
-)";
-
- auto got = Run<ExternalTextureTransform>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-TEST_F(ExternalTextureTransformTest, DimensionsSinglePlane_OutOfOrder) {
- auto* src = R"(
-@stage(fragment)
-fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
- var dim : vec2<i32>;
- dim = textureDimensions(t);
- return vec4<f32>(0.0, 0.0, 0.0, 0.0);
-}
-
-@group(0) @binding(0) var t : texture_external;
-)";
-
- auto* expect = R"(
-@stage(fragment)
-fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
- var dim : vec2<i32>;
- dim = textureDimensions(t);
- return vec4<f32>(0.0, 0.0, 0.0, 0.0);
-}
-
-@group(0) @binding(0) var t : texture_2d<f32>;
-)";
-
- auto got = Run<ExternalTextureTransform>(src);
-
- EXPECT_EQ(expect, str(got));
-}
-
-} // namespace
-} // namespace transform
-} // namespace tint
diff --git a/src/tint/transform/glsl.cc b/src/tint/transform/glsl.cc
index 4eae520..5a9b4d3 100644
--- a/src/tint/transform/glsl.cc
+++ b/src/tint/transform/glsl.cc
@@ -24,7 +24,6 @@
#include "src/tint/transform/canonicalize_entry_point_io.h"
#include "src/tint/transform/combine_samplers.h"
#include "src/tint/transform/decompose_memory_access.h"
-#include "src/tint/transform/external_texture_transform.h"
#include "src/tint/transform/fold_trivial_single_use_lets.h"
#include "src/tint/transform/loop_to_for_loop.h"
#include "src/tint/transform/manager.h"
@@ -102,7 +101,6 @@
BindingRemapper::AccessControls ac;
data.Add<BindingRemapper::Remappings>(bp, ac, /* mayCollide */ true);
}
- manager.Add<ExternalTextureTransform>();
manager.Add<PromoteInitializersToConstVar>();
manager.Add<PadArrayElements>();
diff --git a/src/tint/writer/glsl/generator_impl.cc b/src/tint/writer/glsl/generator_impl.cc
index 01c1d88..58e564a 100644
--- a/src/tint/writer/glsl/generator_impl.cc
+++ b/src/tint/writer/glsl/generator_impl.cc
@@ -2552,6 +2552,12 @@
} else if (auto* str = type->As<sem::Struct>()) {
out << StructName(str);
} else if (auto* tex = type->As<sem::Texture>()) {
+ if (tex->Is<sem::ExternalTexture>()) {
+ TINT_ICE(Writer, diagnostics_)
+ << "Multiplanar external texture transform was not run.";
+ return false;
+ }
+
auto* storage = tex->As<sem::StorageTexture>();
auto* ms = tex->As<sem::MultisampledTexture>();
auto* depth_ms = tex->As<sem::DepthMultisampledTexture>();
diff --git a/src/tint/writer/hlsl/generator_impl.cc b/src/tint/writer/hlsl/generator_impl.cc
index 79664ae..0ddd070 100644
--- a/src/tint/writer/hlsl/generator_impl.cc
+++ b/src/tint/writer/hlsl/generator_impl.cc
@@ -52,7 +52,6 @@
#include "src/tint/transform/calculate_array_length.h"
#include "src/tint/transform/canonicalize_entry_point_io.h"
#include "src/tint/transform/decompose_memory_access.h"
-#include "src/tint/transform/external_texture_transform.h"
#include "src/tint/transform/fold_trivial_single_use_lets.h"
#include "src/tint/transform/localize_struct_array_assignment.h"
#include "src/tint/transform/loop_to_for_loop.h"
@@ -206,7 +205,6 @@
// DecomposeMemoryAccess special-cases the arrayLength() intrinsic, which
// will be transformed by CalculateArrayLength
manager.Add<transform::CalculateArrayLength>();
- manager.Add<transform::ExternalTextureTransform>();
manager.Add<transform::PromoteInitializersToConstVar>();
manager.Add<transform::PadArrayElements>();
@@ -3645,6 +3643,12 @@
return true;
},
[&](const sem::Texture* tex) {
+ if (tex->Is<sem::ExternalTexture>()) {
+ TINT_ICE(Writer, diagnostics_)
+ << "Multiplanar external texture transform was not run.";
+ return false;
+ }
+
auto* storage = tex->As<sem::StorageTexture>();
auto* ms = tex->As<sem::MultisampledTexture>();
auto* depth_ms = tex->As<sem::DepthMultisampledTexture>();
diff --git a/src/tint/writer/msl/generator_impl.cc b/src/tint/writer/msl/generator_impl.cc
index 3a8c1dc..f29675e 100644
--- a/src/tint/writer/msl/generator_impl.cc
+++ b/src/tint/writer/msl/generator_impl.cc
@@ -61,7 +61,6 @@
#include "src/tint/transform/array_length_from_uniform.h"
#include "src/tint/transform/builtin_polyfill.h"
#include "src/tint/transform/canonicalize_entry_point_io.h"
-#include "src/tint/transform/external_texture_transform.h"
#include "src/tint/transform/manager.h"
#include "src/tint/transform/module_scope_var_to_entry_point_param.h"
#include "src/tint/transform/pad_array_elements.h"
@@ -174,7 +173,6 @@
manager.Add<transform::ZeroInitWorkgroupMemory>();
}
manager.Add<transform::CanonicalizeEntryPointIO>();
- manager.Add<transform::ExternalTextureTransform>();
manager.Add<transform::PromoteInitializersToConstVar>();
manager.Add<transform::VectorizeScalarMatrixConstructors>();
@@ -2366,6 +2364,12 @@
return true;
},
[&](const sem::Texture* tex) {
+ if (tex->Is<sem::ExternalTexture>()) {
+ TINT_ICE(Writer, diagnostics_)
+ << "Multiplanar external texture transform was not run.";
+ return false;
+ }
+
if (tex->IsAnyOf<sem::DepthTexture, sem::DepthMultisampledTexture>()) {
out << "depth";
} else {
diff --git a/src/tint/writer/spirv/builder.cc b/src/tint/writer/spirv/builder.cc
index f3eff71..83f2666 100644
--- a/src/tint/writer/spirv/builder.cc
+++ b/src/tint/writer/spirv/builder.cc
@@ -45,7 +45,6 @@
#include "src/tint/transform/add_spirv_block_attribute.h"
#include "src/tint/transform/builtin_polyfill.h"
#include "src/tint/transform/canonicalize_entry_point_io.h"
-#include "src/tint/transform/external_texture_transform.h"
#include "src/tint/transform/fold_constants.h"
#include "src/tint/transform/for_loop_to_loop.h"
#include "src/tint/transform/manager.h"
@@ -279,7 +278,6 @@
manager.Add<transform::RemoveUnreachableStatements>();
manager.Add<transform::SimplifyPointers>(); // Required for arrayLength()
manager.Add<transform::FoldConstants>();
- manager.Add<transform::ExternalTextureTransform>();
manager.Add<transform::VectorizeScalarMatrixConstructors>();
manager.Add<transform::ForLoopToLoop>(); // Must come after
// ZeroInitWorkgroupMemory
@@ -4033,6 +4031,12 @@
bool Builder::GenerateTextureType(const sem::Texture* texture,
const Operand& result) {
+ if (texture->Is<sem::ExternalTexture>()) {
+ TINT_ICE(Writer, builder_.Diagnostics())
+ << "Multiplanar external texture transform was not run.";
+ return false;
+ }
+
uint32_t array_literal = 0u;
const auto dim = texture->dim();
if (dim == ast::TextureDimension::k2dArray ||