Convert generators over to use external texture options.

This CL updates the generators to receive the exteral texture options
instead of generating them.

Bug: tint:1855 chromium:1421379
Change-Id: Ib38b902aa441e33d394f947d753075ca6a8fe73b
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/123260
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Dan Sinclair <dsinclair@chromium.org>
diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn
index 8d6a3b1..c8d89e4 100644
--- a/src/tint/BUILD.gn
+++ b/src/tint/BUILD.gn
@@ -906,8 +906,6 @@
     "writer/flatten_bindings.h",
     "writer/float_to_string.cc",
     "writer/float_to_string.h",
-    "writer/generate_external_texture_bindings.cc",
-    "writer/generate_external_texture_bindings.h",
     "writer/text.cc",
     "writer/text.h",
     "writer/text_generator.cc",
@@ -1627,7 +1625,6 @@
       "writer/check_supported_extensions_test.cc",
       "writer/flatten_bindings_test.cc",
       "writer/float_to_string_test.cc",
-      "writer/generate_external_texture_bindings_test.cc",
       "writer/text_generator_test.cc",
     ]
     deps = [
@@ -1637,6 +1634,16 @@
     ]
   }
 
+  # Note, this includes the source files along with the test as otherwise the cmd helpers wouldn't
+  # be included in the binary.
+  tint_unittests_source_set("tint_unittests_cmd_src") {
+    sources = [
+      "cmd/generate_external_texture_bindings.cc",
+      "cmd/generate_external_texture_bindings.h",
+      "cmd/generate_external_texture_bindings_test.cc",
+    ]
+  }
+
   tint_unittests_source_set("tint_unittests_spv_reader_src") {
     sources = [
       "reader/spirv/enum_converter_test.cc",
@@ -2033,6 +2040,7 @@
       ":tint_unittests_ast_src",
       ":tint_unittests_base_src",
       ":tint_unittests_builtins_src",
+      ":tint_unittests_cmd_src",
       ":tint_unittests_constant_src",
       ":tint_unittests_core_src",
       ":tint_unittests_demangler_src",
diff --git a/src/tint/CMakeLists.txt b/src/tint/CMakeLists.txt
index 0f442ff..0c2da7a 100644
--- a/src/tint/CMakeLists.txt
+++ b/src/tint/CMakeLists.txt
@@ -550,8 +550,6 @@
   writer/flatten_bindings.h
   writer/float_to_string.cc
   writer/float_to_string.h
-  writer/generate_external_texture_bindings.cc
-  writer/generate_external_texture_bindings.h
   writer/text_generator.cc
   writer/text_generator.h
   writer/text.cc
@@ -1022,10 +1020,17 @@
     writer/check_supported_extensions_test.cc
     writer/flatten_bindings_test.cc
     writer/float_to_string_test.cc
-    writer/generate_external_texture_bindings_test.cc
     writer/text_generator_test.cc
   )
 
+  # Noet, the source files are included here otherwise the cmd sources would not be included in the
+  # test binary.
+  list(APPEND TINT_TEST_SRCS
+    cmd/generate_external_texture_bindings.cc
+    cmd/generate_external_texture_bindings.h
+    cmd/generate_external_texture_bindings_test.cc
+  )
+
   # Uniformity analysis tests depend on WGSL reader
   if(${TINT_BUILD_WGSL_READER})
     list(APPEND TINT_TEST_SRCS
diff --git a/src/tint/cmd/BUILD.gn b/src/tint/cmd/BUILD.gn
index b4ff6d5..946bd36 100644
--- a/src/tint/cmd/BUILD.gn
+++ b/src/tint/cmd/BUILD.gn
@@ -17,6 +17,8 @@
 
 source_set("tint_cmd_helper") {
   sources = [
+    "generate_external_texture_bindings.cc",
+    "generate_external_texture_bindings.h",
     "helper.cc",
     "helper.h",
   ]
diff --git a/src/tint/cmd/CMakeLists.txt b/src/tint/cmd/CMakeLists.txt
index 6da9701..142595b 100644
--- a/src/tint/cmd/CMakeLists.txt
+++ b/src/tint/cmd/CMakeLists.txt
@@ -15,6 +15,8 @@
 ## Tint executable
 add_executable(tint "")
 target_sources(tint PRIVATE
+  "generate_external_texture_bindings.cc"
+  "generate_external_texture_bindings.h"
   "helper.cc"
   "helper.h"
   "main.cc"
diff --git a/src/tint/writer/generate_external_texture_bindings.cc b/src/tint/cmd/generate_external_texture_bindings.cc
similarity index 82%
rename from src/tint/writer/generate_external_texture_bindings.cc
rename to src/tint/cmd/generate_external_texture_bindings.cc
index 6e5daf0..1b6ca74 100644
--- a/src/tint/writer/generate_external_texture_bindings.cc
+++ b/src/tint/cmd/generate_external_texture_bindings.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/writer/generate_external_texture_bindings.h"
+#include "src/tint/cmd/generate_external_texture_bindings.h"
 
 #include <algorithm>
 #include <unordered_map>
@@ -20,12 +20,13 @@
 
 #include "src/tint/ast/module.h"
 #include "src/tint/program.h"
+#include "src/tint/sem/binding_point.h"
 #include "src/tint/sem/variable.h"
 #include "src/tint/type/external_texture.h"
 
-namespace tint::writer {
+namespace tint::cmd {
 
-transform::MultiplanarExternalTexture::BindingsMap GenerateExternalTextureBindings(
+writer::ExternalTextureOptions::BindingsMap GenerateExternalTextureBindings(
     const Program* program) {
     // TODO(tint:1491): Use Inspector once we can get binding info for all
     // variables, not just those referenced by entry points.
@@ -45,15 +46,17 @@
         }
     }
 
-    transform::MultiplanarExternalTexture::BindingsMap new_bindings_map;
+    writer::ExternalTextureOptions::BindingsMap new_bindings_map;
     for (auto bp : ext_tex_bps) {
         uint32_t g = bp.group;
         uint32_t& next_num = group_to_next_binding_number[g];
         auto new_bps =
-            transform::MultiplanarExternalTexture::BindingPoints{{g, next_num++}, {g, next_num++}};
+            writer::ExternalTextureOptions::BindingPoints{{g, next_num++}, {g, next_num++}};
+
         new_bindings_map[bp] = new_bps;
     }
+
     return new_bindings_map;
 }
 
-}  // namespace tint::writer
+}  // namespace tint::cmd
diff --git a/src/tint/cmd/generate_external_texture_bindings.h b/src/tint/cmd/generate_external_texture_bindings.h
new file mode 100644
index 0000000..c6a842d
--- /dev/null
+++ b/src/tint/cmd/generate_external_texture_bindings.h
@@ -0,0 +1,26 @@
+// Copyright 2022 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_CMD_GENERATE_EXTERNAL_TEXTURE_BINDINGS_H_
+#define SRC_TINT_CMD_GENERATE_EXTERNAL_TEXTURE_BINDINGS_H_
+
+#include "tint/tint.h"
+
+namespace tint::cmd {
+
+writer::ExternalTextureOptions::BindingsMap GenerateExternalTextureBindings(const Program* program);
+
+}  // namespace tint::cmd
+
+#endif  // SRC_TINT_CMD_GENERATE_EXTERNAL_TEXTURE_BINDINGS_H_
diff --git a/src/tint/writer/generate_external_texture_bindings_test.cc b/src/tint/cmd/generate_external_texture_bindings_test.cc
similarity index 97%
rename from src/tint/writer/generate_external_texture_bindings_test.cc
rename to src/tint/cmd/generate_external_texture_bindings_test.cc
index b862554..2c19675 100644
--- a/src/tint/writer/generate_external_texture_bindings_test.cc
+++ b/src/tint/cmd/generate_external_texture_bindings_test.cc
@@ -15,11 +15,11 @@
 #include <utility>
 
 #include "gtest/gtest.h"
+#include "src/tint/cmd/generate_external_texture_bindings.h"
 #include "src/tint/program_builder.h"
 #include "src/tint/writer/binding_point.h"
-#include "src/tint/writer/generate_external_texture_bindings.h"
 
-namespace tint::writer {
+namespace tint::cmd {
 namespace {
 
 using namespace tint::number_suffixes;  // NOLINT
@@ -126,4 +126,4 @@
 }
 
 }  // namespace
-}  // namespace tint::writer
+}  // namespace tint::cmd
diff --git a/src/tint/cmd/main.cc b/src/tint/cmd/main.cc
index f4ad19f..2daf75f 100644
--- a/src/tint/cmd/main.cc
+++ b/src/tint/cmd/main.cc
@@ -39,6 +39,7 @@
 #endif  // TINT_BUILD_SPV_READER
 
 #include "src/tint/ast/module.h"
+#include "src/tint/cmd/generate_external_texture_bindings.h"
 #include "src/tint/cmd/helper.h"
 #include "src/tint/utils/io/command.h"
 #include "src/tint/utils/string.h"
@@ -549,7 +550,8 @@
     tint::writer::spirv::Options gen_options;
     gen_options.disable_robustness = !options.enable_robustness;
     gen_options.disable_workgroup_init = options.disable_workgroup_init;
-    gen_options.generate_external_texture_bindings = true;
+    gen_options.external_texture_options.bindings_map =
+        tint::cmd::GenerateExternalTextureBindings(program);
     auto result = tint::writer::spirv::Generate(program, gen_options);
     if (!result.success) {
         tint::cmd::PrintWGSL(std::cerr, *program);
@@ -656,7 +658,8 @@
     tint::writer::msl::Options gen_options;
     gen_options.disable_robustness = !options.enable_robustness;
     gen_options.disable_workgroup_init = options.disable_workgroup_init;
-    gen_options.generate_external_texture_bindings = true;
+    gen_options.external_texture_options.bindings_map =
+        tint::cmd::GenerateExternalTextureBindings(input_program);
     auto result = tint::writer::msl::Generate(input_program, gen_options);
     if (!result.success) {
         tint::cmd::PrintWGSL(std::cerr, *program);
@@ -717,7 +720,8 @@
     tint::writer::hlsl::Options gen_options;
     gen_options.disable_robustness = !options.enable_robustness;
     gen_options.disable_workgroup_init = options.disable_workgroup_init;
-    gen_options.generate_external_texture_bindings = true;
+    gen_options.external_texture_options.bindings_map =
+        tint::cmd::GenerateExternalTextureBindings(program);
     gen_options.root_constant_binding_point = options.hlsl_root_constant_binding_point;
     auto result = tint::writer::hlsl::Generate(program, gen_options);
     if (!result.success) {
@@ -856,7 +860,8 @@
     auto generate = [&](const tint::Program* prg, const std::string entry_point_name) -> bool {
         tint::writer::glsl::Options gen_options;
         gen_options.disable_robustness = !options.enable_robustness;
-        gen_options.generate_external_texture_bindings = true;
+        gen_options.external_texture_options.bindings_map =
+            tint::cmd::GenerateExternalTextureBindings(prg);
         auto result = tint::writer::glsl::Generate(prg, gen_options, entry_point_name);
         if (!result.success) {
             tint::cmd::PrintWGSL(std::cerr, *prg);
@@ -1003,55 +1008,6 @@
              m.Add<tint::transform::SubstituteOverride>();
              return true;
          }},
-        {"multiplaner_external_texture",
-         [](tint::inspector::Inspector& inspector, tint::transform::Manager& m,
-            tint::transform::DataMap& i) {
-             using MET = tint::transform::MultiplanarExternalTexture;
-
-             // Generate the MultiplanarExternalTexture::NewBindingPoints by finding two free
-             // binding points. We may wish to expose these binding points via a command line flag
-             // in the future.
-
-             // Set of all the group-0 bindings in use.
-             std::unordered_set<uint32_t> group0_bindings_in_use;
-             auto allocate_binding = [&] {
-                 for (uint32_t idx = 0;; idx++) {
-                     auto binding = tint::writer::BindingPoint{0u, idx};
-                     if (group0_bindings_in_use.emplace(idx).second) {
-                         return binding;
-                     }
-                 }
-             };
-             // Populate group0_bindings_in_use with the existing bindings across all entry points.
-             for (auto ep : inspector.GetEntryPoints()) {
-                 for (auto binding : inspector.GetResourceBindings(ep.name)) {
-                     if (binding.bind_group == 0) {
-                         group0_bindings_in_use.emplace(binding.binding);
-                     }
-                 }
-             }
-             // Allocate new binding points for the external texture's planes and parameters.
-             MET::BindingsMap met_bindings;
-             for (auto ep : inspector.GetEntryPoints()) {
-                 for (auto ext_tex : inspector.GetExternalTextureResourceBindings(ep.name)) {
-                     auto binding = tint::writer::BindingPoint{
-                         ext_tex.bind_group,
-                         ext_tex.binding,
-                     };
-                     if (met_bindings.count(binding)) {
-                         continue;
-                     }
-                     met_bindings.emplace(binding, MET::BindingPoints{
-                                                       /* plane_1 */ allocate_binding(),
-                                                       /* params */ allocate_binding(),
-                                                   });
-                 }
-             }
-
-             i.Add<MET::NewBindingPoints>(std::move(met_bindings));
-             m.Add<MET>();
-             return true;
-         }},
     };
     auto transform_names = [&] {
         tint::utils::StringStream names;
diff --git a/src/tint/writer/generate_external_texture_bindings.h b/src/tint/writer/generate_external_texture_bindings.h
deleted file mode 100644
index 8d0aad9..0000000
--- a/src/tint/writer/generate_external_texture_bindings.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2022 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_GENERATE_EXTERNAL_TEXTURE_BINDINGS_H_
-#define SRC_TINT_WRITER_GENERATE_EXTERNAL_TEXTURE_BINDINGS_H_
-
-#include "src/tint/transform/multiplanar_external_texture.h"
-
-namespace tint::writer {
-
-transform::MultiplanarExternalTexture::BindingsMap GenerateExternalTextureBindings(
-    const Program* program);
-
-}  // namespace tint::writer
-
-#endif  // SRC_TINT_WRITER_GENERATE_EXTERNAL_TEXTURE_BINDINGS_H_
diff --git a/src/tint/writer/glsl/generator.h b/src/tint/writer/glsl/generator.h
index 5c2de66..ef7b65b 100644
--- a/src/tint/writer/glsl/generator.h
+++ b/src/tint/writer/glsl/generator.h
@@ -74,9 +74,6 @@
     /// Set to `true` to disable workgroup memory zero initialization
     bool disable_workgroup_init = false;
 
-    /// 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 = {};
 
@@ -87,7 +84,6 @@
     TINT_REFLECT(disable_robustness,
                  allow_collisions,
                  disable_workgroup_init,
-                 generate_external_texture_bindings,
                  external_texture_options,
                  version);
 };
diff --git a/src/tint/writer/glsl/generator_impl.cc b/src/tint/writer/glsl/generator_impl.cc
index 29c28ff..cdf4a15 100644
--- a/src/tint/writer/glsl/generator_impl.cc
+++ b/src/tint/writer/glsl/generator_impl.cc
@@ -53,6 +53,7 @@
 #include "src/tint/transform/disable_uniformity_analysis.h"
 #include "src/tint/transform/expand_compound_assignment.h"
 #include "src/tint/transform/manager.h"
+#include "src/tint/transform/multiplanar_external_texture.h"
 #include "src/tint/transform/pad_structs.h"
 #include "src/tint/transform/preserve_padding.h"
 #include "src/tint/transform/promote_initializers_to_let.h"
@@ -81,7 +82,6 @@
 #include "src/tint/utils/string_stream.h"
 #include "src/tint/writer/append_vector.h"
 #include "src/tint/writer/float_to_string.h"
-#include "src/tint/writer/generate_external_texture_bindings.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
@@ -180,10 +180,10 @@
         manager.Add<transform::Robustness>();
     }
 
-    if (options.generate_external_texture_bindings) {
+    if (!options.external_texture_options.bindings_map.empty()) {
         // Note: it is more efficient for MultiplanarExternalTexture to come after Robustness
-        auto new_bindings_map = writer::GenerateExternalTextureBindings(in);
-        data.Add<transform::MultiplanarExternalTexture::NewBindingPoints>(new_bindings_map);
+        data.Add<transform::MultiplanarExternalTexture::NewBindingPoints>(
+            options.external_texture_options.bindings_map);
         manager.Add<transform::MultiplanarExternalTexture>();
     }
 
diff --git a/src/tint/writer/hlsl/generator.h b/src/tint/writer/hlsl/generator.h
index 1c072d8..2cdfe6f 100644
--- a/src/tint/writer/hlsl/generator.h
+++ b/src/tint/writer/hlsl/generator.h
@@ -59,9 +59,6 @@
     /// Set to `true` to disable workgroup memory zero initialization
     bool disable_workgroup_init = false;
 
-    /// 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 = {};
 
@@ -80,7 +77,6 @@
     TINT_REFLECT(disable_robustness,
                  root_constant_binding_point,
                  disable_workgroup_init,
-                 generate_external_texture_bindings,
                  external_texture_options,
                  array_length_from_uniform);
 };
diff --git a/src/tint/writer/hlsl/generator_impl.cc b/src/tint/writer/hlsl/generator_impl.cc
index 84543ab..1cfbf64 100644
--- a/src/tint/writer/hlsl/generator_impl.cc
+++ b/src/tint/writer/hlsl/generator_impl.cc
@@ -53,6 +53,7 @@
 #include "src/tint/transform/expand_compound_assignment.h"
 #include "src/tint/transform/localize_struct_array_assignment.h"
 #include "src/tint/transform/manager.h"
+#include "src/tint/transform/multiplanar_external_texture.h"
 #include "src/tint/transform/num_workgroups_from_uniform.h"
 #include "src/tint/transform/promote_initializers_to_let.h"
 #include "src/tint/transform/promote_side_effects_to_decl.h"
@@ -81,7 +82,6 @@
 #include "src/tint/writer/append_vector.h"
 #include "src/tint/writer/check_supported_extensions.h"
 #include "src/tint/writer/float_to_string.h"
-#include "src/tint/writer/generate_external_texture_bindings.h"
 
 using namespace tint::number_suffixes;  // NOLINT
 
@@ -188,10 +188,10 @@
         manager.Add<transform::Robustness>();
     }
 
-    if (options.generate_external_texture_bindings) {
+    if (!options.external_texture_options.bindings_map.empty()) {
         // Note: it is more efficient for MultiplanarExternalTexture to come after Robustness
-        auto new_bindings_map = GenerateExternalTextureBindings(in);
-        data.Add<transform::MultiplanarExternalTexture::NewBindingPoints>(new_bindings_map);
+        data.Add<transform::MultiplanarExternalTexture::NewBindingPoints>(
+            options.external_texture_options.bindings_map);
         manager.Add<transform::MultiplanarExternalTexture>();
     }
 
diff --git a/src/tint/writer/msl/generator.h b/src/tint/writer/msl/generator.h
index e58ef9e..b4e11d9 100644
--- a/src/tint/writer/msl/generator.h
+++ b/src/tint/writer/msl/generator.h
@@ -63,9 +63,6 @@
     /// Set to `true` to disable workgroup memory zero initialization
     bool disable_workgroup_init = false;
 
-    /// 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 = {};
 
@@ -79,7 +76,6 @@
                  fixed_sample_mask,
                  emit_vertex_point_size,
                  disable_workgroup_init,
-                 generate_external_texture_bindings,
                  external_texture_options,
                  array_length_from_uniform);
 };
diff --git a/src/tint/writer/msl/generator_impl.cc b/src/tint/writer/msl/generator_impl.cc
index 397c961..268736f 100644
--- a/src/tint/writer/msl/generator_impl.cc
+++ b/src/tint/writer/msl/generator_impl.cc
@@ -49,6 +49,7 @@
 #include "src/tint/transform/expand_compound_assignment.h"
 #include "src/tint/transform/manager.h"
 #include "src/tint/transform/module_scope_var_to_entry_point_param.h"
+#include "src/tint/transform/multiplanar_external_texture.h"
 #include "src/tint/transform/packed_vec3.h"
 #include "src/tint/transform/preserve_padding.h"
 #include "src/tint/transform/promote_initializers_to_let.h"
@@ -83,7 +84,6 @@
 #include "src/tint/utils/string_stream.h"
 #include "src/tint/writer/check_supported_extensions.h"
 #include "src/tint/writer/float_to_string.h"
-#include "src/tint/writer/generate_external_texture_bindings.h"
 
 namespace tint::writer::msl {
 namespace {
@@ -232,10 +232,10 @@
         manager.Add<transform::BuiltinPolyfill>();
     }
 
-    if (options.generate_external_texture_bindings) {
+    if (!options.external_texture_options.bindings_map.empty()) {
         // Note: it is more efficient for MultiplanarExternalTexture to come after Robustness
-        auto new_bindings_map = GenerateExternalTextureBindings(in);
-        data.Add<transform::MultiplanarExternalTexture::NewBindingPoints>(new_bindings_map);
+        data.Add<transform::MultiplanarExternalTexture::NewBindingPoints>(
+            options.external_texture_options.bindings_map);
         manager.Add<transform::MultiplanarExternalTexture>();
     }
 
diff --git a/src/tint/writer/spirv/generator.h b/src/tint/writer/spirv/generator.h
index 11660fe..5ad9057 100644
--- a/src/tint/writer/spirv/generator.h
+++ b/src/tint/writer/spirv/generator.h
@@ -46,9 +46,6 @@
     /// Set to `true` to disable workgroup memory zero initialization
     bool disable_workgroup_init = false;
 
-    /// 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 = {};
 
@@ -60,7 +57,6 @@
     TINT_REFLECT(disable_robustness,
                  emit_vertex_point_size,
                  disable_workgroup_init,
-                 generate_external_texture_bindings,
                  external_texture_options,
                  use_zero_initialize_workgroup_memory_extension);
 };
diff --git a/src/tint/writer/spirv/generator_impl.cc b/src/tint/writer/spirv/generator_impl.cc
index 3c74920..f3bbaf3 100644
--- a/src/tint/writer/spirv/generator_impl.cc
+++ b/src/tint/writer/spirv/generator_impl.cc
@@ -28,6 +28,7 @@
 #include "src/tint/transform/for_loop_to_loop.h"
 #include "src/tint/transform/manager.h"
 #include "src/tint/transform/merge_return.h"
+#include "src/tint/transform/multiplanar_external_texture.h"
 #include "src/tint/transform/preserve_padding.h"
 #include "src/tint/transform/promote_side_effects_to_decl.h"
 #include "src/tint/transform/remove_phonies.h"
@@ -41,7 +42,6 @@
 #include "src/tint/transform/vectorize_scalar_matrix_initializers.h"
 #include "src/tint/transform/while_to_loop.h"
 #include "src/tint/transform/zero_init_workgroup_memory.h"
-#include "src/tint/writer/generate_external_texture_bindings.h"
 
 namespace tint::writer::spirv {
 
@@ -73,10 +73,10 @@
         manager.Add<transform::Robustness>();
     }
 
-    if (options.generate_external_texture_bindings) {
+    if (!options.external_texture_options.bindings_map.empty()) {
         // Note: it is more efficient for MultiplanarExternalTexture to come after Robustness
-        auto new_bindings_map = GenerateExternalTextureBindings(in);
-        data.Add<transform::MultiplanarExternalTexture::NewBindingPoints>(new_bindings_map);
+        data.Add<transform::MultiplanarExternalTexture::NewBindingPoints>(
+            options.external_texture_options.bindings_map);
         manager.Add<transform::MultiplanarExternalTexture>();
     }
 
diff --git a/test/tint/bug/tint/1739.wgsl b/test/tint/bug/tint/1739.wgsl
index d513d64..ef45dd5 100644
--- a/test/tint/bug/tint/1739.wgsl
+++ b/test/tint/bug/tint/1739.wgsl
@@ -1,4 +1,4 @@
-// flags: --transform robustness,multiplaner_external_texture
+// flags: --transform robustness
 @group(0) @binding(0) var t : texture_external;
 
 @group(0) @binding(1) var outImage : texture_storage_2d<rgba8unorm, write>;
diff --git a/test/tint/bug/tint/1739.wgsl.expected.dxc.hlsl b/test/tint/bug/tint/1739.wgsl.expected.dxc.hlsl
index e71fad6..27ce96e 100644
--- a/test/tint/bug/tint/1739.wgsl.expected.dxc.hlsl
+++ b/test/tint/bug/tint/1739.wgsl.expected.dxc.hlsl
@@ -31,33 +31,18 @@
 
 float3 gammaCorrection(float3 v, GammaTransferParams params) {
   const bool3 cond = (abs(v) < float3((params.D).xxx));
-  const float3 t_1 = (float3(sign(v)) * ((params.C * abs(v)) + params.F));
+  const float3 t = (float3(sign(v)) * ((params.C * abs(v)) + params.F));
   const float3 f = (float3(sign(v)) * (pow(((params.A * abs(v)) + params.B), float3((params.G).xxx)) + params.E));
-  return (cond ? t_1 : f);
+  return (cond ? t : f);
 }
 
 float4 textureLoadExternal(Texture2D<float4> plane0, Texture2D<float4> plane1, int2 coord, ExternalTextureParams params) {
   const int2 coord1 = (coord >> (1u).xx);
   float3 color = float3(0.0f, 0.0f, 0.0f);
   if ((params.numPlanes == 1u)) {
-    uint3 tint_tmp;
-    plane0.GetDimensions(0, tint_tmp.x, tint_tmp.y, tint_tmp.z);
-    const uint level_idx = min(0u, (tint_tmp.z - 1u));
-    uint3 tint_tmp_1;
-    plane0.GetDimensions(level_idx, tint_tmp_1.x, tint_tmp_1.y, tint_tmp_1.z);
-    color = plane0.Load(int3(tint_clamp(coord, (0).xx, int2((tint_tmp_1.xy - (1u).xx))), int(level_idx))).rgb;
+    color = plane0.Load(int3(coord, 0)).rgb;
   } else {
-    uint3 tint_tmp_2;
-    plane0.GetDimensions(0, tint_tmp_2.x, tint_tmp_2.y, tint_tmp_2.z);
-    const uint level_idx_1 = min(0u, (tint_tmp_2.z - 1u));
-    uint3 tint_tmp_3;
-    plane1.GetDimensions(0, tint_tmp_3.x, tint_tmp_3.y, tint_tmp_3.z);
-    const uint level_idx_2 = min(0u, (tint_tmp_3.z - 1u));
-    uint3 tint_tmp_4;
-    plane0.GetDimensions(level_idx_1, tint_tmp_4.x, tint_tmp_4.y, tint_tmp_4.z);
-    uint3 tint_tmp_5;
-    plane1.GetDimensions(level_idx_2, tint_tmp_5.x, tint_tmp_5.y, tint_tmp_5.z);
-    color = mul(params.yuvToRgbConversionMatrix, float4(plane0.Load(int3(tint_clamp(coord, (0).xx, int2((tint_tmp_4.xy - (1u).xx))), int(level_idx_1))).r, plane1.Load(int3(tint_clamp(coord1, (0).xx, int2((tint_tmp_5.xy - (1u).xx))), int(level_idx_2))).rg, 1.0f));
+    color = mul(params.yuvToRgbConversionMatrix, float4(plane0.Load(int3(coord, 0)).r, plane1.Load(int3(coord1, 0)).rg, 1.0f));
   }
   if ((params.doYuvToRgbConversionOnly == 0u)) {
     color = gammaCorrection(color, params.gammaDecodeParams);
@@ -113,13 +98,17 @@
 
 [numthreads(1, 1, 1)]
 void main() {
-  float4 red = textureLoadExternal(t, ext_tex_plane_1, (10).xx, ext_tex_params_load(0u));
-  uint2 tint_tmp_6;
-  outImage.GetDimensions(tint_tmp_6.x, tint_tmp_6.y);
-  outImage[tint_clamp((0).xx, (0).xx, int2((tint_tmp_6 - (1u).xx)))] = red;
-  float4 green = textureLoadExternal(t, ext_tex_plane_1, int2(70, 118), ext_tex_params_load(0u));
-  uint2 tint_tmp_7;
-  outImage.GetDimensions(tint_tmp_7.x, tint_tmp_7.y);
-  outImage[tint_clamp(int2(1, 0), (0).xx, int2((tint_tmp_7 - (1u).xx)))] = green;
+  uint2 tint_tmp;
+  t.GetDimensions(tint_tmp.x, tint_tmp.y);
+  float4 red = textureLoadExternal(t, ext_tex_plane_1, tint_clamp((10).xx, (0).xx, int2((tint_tmp - (1u).xx))), ext_tex_params_load(0u));
+  uint2 tint_tmp_1;
+  outImage.GetDimensions(tint_tmp_1.x, tint_tmp_1.y);
+  outImage[tint_clamp((0).xx, (0).xx, int2((tint_tmp_1 - (1u).xx)))] = red;
+  uint2 tint_tmp_2;
+  t.GetDimensions(tint_tmp_2.x, tint_tmp_2.y);
+  float4 green = textureLoadExternal(t, ext_tex_plane_1, tint_clamp(int2(70, 118), (0).xx, int2((tint_tmp_2 - (1u).xx))), ext_tex_params_load(0u));
+  uint2 tint_tmp_3;
+  outImage.GetDimensions(tint_tmp_3.x, tint_tmp_3.y);
+  outImage[tint_clamp(int2(1, 0), (0).xx, int2((tint_tmp_3 - (1u).xx)))] = green;
   return;
 }
diff --git a/test/tint/bug/tint/1739.wgsl.expected.fxc.hlsl b/test/tint/bug/tint/1739.wgsl.expected.fxc.hlsl
index e71fad6..27ce96e 100644
--- a/test/tint/bug/tint/1739.wgsl.expected.fxc.hlsl
+++ b/test/tint/bug/tint/1739.wgsl.expected.fxc.hlsl
@@ -31,33 +31,18 @@
 
 float3 gammaCorrection(float3 v, GammaTransferParams params) {
   const bool3 cond = (abs(v) < float3((params.D).xxx));
-  const float3 t_1 = (float3(sign(v)) * ((params.C * abs(v)) + params.F));
+  const float3 t = (float3(sign(v)) * ((params.C * abs(v)) + params.F));
   const float3 f = (float3(sign(v)) * (pow(((params.A * abs(v)) + params.B), float3((params.G).xxx)) + params.E));
-  return (cond ? t_1 : f);
+  return (cond ? t : f);
 }
 
 float4 textureLoadExternal(Texture2D<float4> plane0, Texture2D<float4> plane1, int2 coord, ExternalTextureParams params) {
   const int2 coord1 = (coord >> (1u).xx);
   float3 color = float3(0.0f, 0.0f, 0.0f);
   if ((params.numPlanes == 1u)) {
-    uint3 tint_tmp;
-    plane0.GetDimensions(0, tint_tmp.x, tint_tmp.y, tint_tmp.z);
-    const uint level_idx = min(0u, (tint_tmp.z - 1u));
-    uint3 tint_tmp_1;
-    plane0.GetDimensions(level_idx, tint_tmp_1.x, tint_tmp_1.y, tint_tmp_1.z);
-    color = plane0.Load(int3(tint_clamp(coord, (0).xx, int2((tint_tmp_1.xy - (1u).xx))), int(level_idx))).rgb;
+    color = plane0.Load(int3(coord, 0)).rgb;
   } else {
-    uint3 tint_tmp_2;
-    plane0.GetDimensions(0, tint_tmp_2.x, tint_tmp_2.y, tint_tmp_2.z);
-    const uint level_idx_1 = min(0u, (tint_tmp_2.z - 1u));
-    uint3 tint_tmp_3;
-    plane1.GetDimensions(0, tint_tmp_3.x, tint_tmp_3.y, tint_tmp_3.z);
-    const uint level_idx_2 = min(0u, (tint_tmp_3.z - 1u));
-    uint3 tint_tmp_4;
-    plane0.GetDimensions(level_idx_1, tint_tmp_4.x, tint_tmp_4.y, tint_tmp_4.z);
-    uint3 tint_tmp_5;
-    plane1.GetDimensions(level_idx_2, tint_tmp_5.x, tint_tmp_5.y, tint_tmp_5.z);
-    color = mul(params.yuvToRgbConversionMatrix, float4(plane0.Load(int3(tint_clamp(coord, (0).xx, int2((tint_tmp_4.xy - (1u).xx))), int(level_idx_1))).r, plane1.Load(int3(tint_clamp(coord1, (0).xx, int2((tint_tmp_5.xy - (1u).xx))), int(level_idx_2))).rg, 1.0f));
+    color = mul(params.yuvToRgbConversionMatrix, float4(plane0.Load(int3(coord, 0)).r, plane1.Load(int3(coord1, 0)).rg, 1.0f));
   }
   if ((params.doYuvToRgbConversionOnly == 0u)) {
     color = gammaCorrection(color, params.gammaDecodeParams);
@@ -113,13 +98,17 @@
 
 [numthreads(1, 1, 1)]
 void main() {
-  float4 red = textureLoadExternal(t, ext_tex_plane_1, (10).xx, ext_tex_params_load(0u));
-  uint2 tint_tmp_6;
-  outImage.GetDimensions(tint_tmp_6.x, tint_tmp_6.y);
-  outImage[tint_clamp((0).xx, (0).xx, int2((tint_tmp_6 - (1u).xx)))] = red;
-  float4 green = textureLoadExternal(t, ext_tex_plane_1, int2(70, 118), ext_tex_params_load(0u));
-  uint2 tint_tmp_7;
-  outImage.GetDimensions(tint_tmp_7.x, tint_tmp_7.y);
-  outImage[tint_clamp(int2(1, 0), (0).xx, int2((tint_tmp_7 - (1u).xx)))] = green;
+  uint2 tint_tmp;
+  t.GetDimensions(tint_tmp.x, tint_tmp.y);
+  float4 red = textureLoadExternal(t, ext_tex_plane_1, tint_clamp((10).xx, (0).xx, int2((tint_tmp - (1u).xx))), ext_tex_params_load(0u));
+  uint2 tint_tmp_1;
+  outImage.GetDimensions(tint_tmp_1.x, tint_tmp_1.y);
+  outImage[tint_clamp((0).xx, (0).xx, int2((tint_tmp_1 - (1u).xx)))] = red;
+  uint2 tint_tmp_2;
+  t.GetDimensions(tint_tmp_2.x, tint_tmp_2.y);
+  float4 green = textureLoadExternal(t, ext_tex_plane_1, tint_clamp(int2(70, 118), (0).xx, int2((tint_tmp_2 - (1u).xx))), ext_tex_params_load(0u));
+  uint2 tint_tmp_3;
+  outImage.GetDimensions(tint_tmp_3.x, tint_tmp_3.y);
+  outImage[tint_clamp(int2(1, 0), (0).xx, int2((tint_tmp_3 - (1u).xx)))] = green;
   return;
 }
diff --git a/test/tint/bug/tint/1739.wgsl.expected.glsl b/test/tint/bug/tint/1739.wgsl.expected.glsl
index 3bbb840..c32e19b 100644
--- a/test/tint/bug/tint/1739.wgsl.expected.glsl
+++ b/test/tint/bug/tint/1739.wgsl.expected.glsl
@@ -1,7 +1,10 @@
-SKIP: FAILED
-
 #version 310 es
 
+vec3 tint_select(vec3 param_0, vec3 param_1, bvec3 param_2) {
+    return vec3(param_2[0] ? param_1[0] : param_0[0], param_2[1] ? param_1[1] : param_0[1], param_2[2] ? param_1[2] : param_0[2]);
+}
+
+
 struct GammaTransferParams {
   float G;
   float A;
@@ -50,18 +53,18 @@
 layout(rgba8) uniform highp writeonly image2D outImage;
 vec3 gammaCorrection(vec3 v, GammaTransferParams params) {
   bvec3 cond = lessThan(abs(v), vec3(params.D));
-  vec3 t_1 = (sign(v) * ((params.C * abs(v)) + params.F));
+  vec3 t = (sign(v) * ((params.C * abs(v)) + params.F));
   vec3 f = (sign(v) * (pow(((params.A * abs(v)) + params.B), vec3(params.G)) + params.E));
-  return mix(f, t_1, cond);
+  return tint_select(f, t, cond);
 }
 
 vec4 textureLoadExternal(highp sampler2D plane0_1, highp sampler2D plane1_1, ivec2 coord, ExternalTextureParams params) {
   ivec2 coord1 = (coord >> uvec2(1u));
   vec3 color = vec3(0.0f, 0.0f, 0.0f);
   if ((params.numPlanes == 1u)) {
-    color = texelFetch(plane0_1, clamp(coord, ivec2(0), ivec2((uvec2(uvec2(textureSize(plane0_1, clamp(0, 0, int((uint(uint(textureQueryLevels(plane0_1))) - 1u)))))) - uvec2(1u)))), clamp(0, 0, int((uint(uint(textureQueryLevels(plane0_1))) - 1u)))).rgb;
+    color = texelFetch(plane0_1, coord, 0).rgb;
   } else {
-    color = (vec4(texelFetch(plane0_1, clamp(coord, ivec2(0), ivec2((uvec2(uvec2(textureSize(plane0_1, clamp(0, 0, int((uint(uint(textureQueryLevels(plane0_1))) - 1u)))))) - uvec2(1u)))), clamp(0, 0, int((uint(uint(textureQueryLevels(plane0_1))) - 1u)))).r, texelFetch(plane1_1, clamp(coord1, ivec2(0), ivec2((uvec2(uvec2(textureSize(plane1_1, clamp(0, 0, int((uint(uint(textureQueryLevels(plane1_1))) - 1u)))))) - uvec2(1u)))), clamp(0, 0, int((uint(uint(textureQueryLevels(plane1_1))) - 1u)))).rg, 1.0f) * params.yuvToRgbConversionMatrix);
+    color = (vec4(texelFetch(plane0_1, coord, 0).r, texelFetch(plane1_1, coord1, 0).rg, 1.0f) * params.yuvToRgbConversionMatrix);
   }
   if ((params.doYuvToRgbConversionOnly == 0u)) {
     color = gammaCorrection(color, params.gammaDecodeParams);
@@ -71,17 +74,17 @@
   return vec4(color, 1.0f);
 }
 
-uniform highp sampler2D t_2;
+uniform highp sampler2D t_1;
 uniform highp sampler2D ext_tex_plane_1_1;
 ExternalTextureParams conv_ExternalTextureParams(ExternalTextureParams_std140 val) {
   return ExternalTextureParams(val.numPlanes, val.doYuvToRgbConversionOnly, val.pad, val.pad_1, val.yuvToRgbConversionMatrix, val.gammaDecodeParams, val.gammaEncodeParams, val.gamutConversionMatrix, mat3x2(val.coordTransformationMatrix_0, val.coordTransformationMatrix_1, val.coordTransformationMatrix_2), val.pad_2, val.pad_3);
 }
 
 void tint_symbol() {
-  vec4 red = textureLoadExternal(t_2, ext_tex_plane_1_1, ivec2(10), conv_ExternalTextureParams(ext_tex_params.inner));
-  imageStore(outImage, clamp(ivec2(0), ivec2(0), ivec2((uvec2(uvec2(imageSize(outImage))) - uvec2(1u)))), red);
-  vec4 green = textureLoadExternal(t_2, ext_tex_plane_1_1, ivec2(70, 118), conv_ExternalTextureParams(ext_tex_params.inner));
-  imageStore(outImage, clamp(ivec2(1, 0), ivec2(0), ivec2((uvec2(uvec2(imageSize(outImage))) - uvec2(1u)))), green);
+  vec4 red = textureLoadExternal(t_1, ext_tex_plane_1_1, clamp(ivec2(10), ivec2(0), ivec2((uvec2(textureSize(t_1, 0)) - uvec2(1u)))), conv_ExternalTextureParams(ext_tex_params.inner));
+  imageStore(outImage, clamp(ivec2(0), ivec2(0), ivec2((uvec2(imageSize(outImage)) - uvec2(1u)))), red);
+  vec4 green = textureLoadExternal(t_1, ext_tex_plane_1_1, clamp(ivec2(70, 118), ivec2(0), ivec2((uvec2(textureSize(t_1, 0)) - uvec2(1u)))), conv_ExternalTextureParams(ext_tex_params.inner));
+  imageStore(outImage, clamp(ivec2(1, 0), ivec2(0), ivec2((uvec2(imageSize(outImage)) - uvec2(1u)))), green);
   return;
 }
 
@@ -90,10 +93,3 @@
   tint_symbol();
   return;
 }
-Error parsing GLSL shader:
-ERROR: 0:60: 'textureQueryLevels' : no matching overloaded function found 
-ERROR: 0:60: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/tint/bug/tint/1739.wgsl.expected.msl b/test/tint/bug/tint/1739.wgsl.expected.msl
index 9bcbc79..34134b3 100644
--- a/test/tint/bug/tint/1739.wgsl.expected.msl
+++ b/test/tint/bug/tint/1739.wgsl.expected.msl
@@ -78,21 +78,18 @@
 
 float3 gammaCorrection(float3 v, GammaTransferParams params) {
   bool3 const cond = (fabs(v) < float3(params.D));
-  float3 const t_1 = (sign(v) * ((params.C * fabs(v)) + params.F));
+  float3 const t = (sign(v) * ((params.C * fabs(v)) + params.F));
   float3 const f = (sign(v) * (pow(((params.A * fabs(v)) + params.B), float3(params.G)) + params.E));
-  return select(f, t_1, cond);
+  return select(f, t, cond);
 }
 
 float4 textureLoadExternal(texture2d<float, access::sample> plane0, texture2d<float, access::sample> plane1, int2 coord, ExternalTextureParams params) {
   int2 const coord1 = (coord >> uint2(1u));
   float3 color = 0.0f;
   if ((params.numPlanes == 1u)) {
-    uint const level_idx = min(0u, (plane0.get_num_mip_levels() - 1u));
-    color = plane0.read(uint2(tint_clamp(coord, int2(0), int2((uint2(plane0.get_width(level_idx), plane0.get_height(level_idx)) - uint2(1u))))), level_idx).rgb;
+    color = plane0.read(uint2(coord), 0).rgb;
   } else {
-    uint const level_idx_1 = min(0u, (plane0.get_num_mip_levels() - 1u));
-    uint const level_idx_2 = min(0u, (plane1.get_num_mip_levels() - 1u));
-    color = (float4(plane0.read(uint2(tint_clamp(coord, int2(0), int2((uint2(plane0.get_width(level_idx_1), plane0.get_height(level_idx_1)) - uint2(1u))))), level_idx_1)[0], plane1.read(uint2(tint_clamp(coord1, int2(0), int2((uint2(plane1.get_width(level_idx_2), plane1.get_height(level_idx_2)) - uint2(1u))))), level_idx_2).rg, 1.0f) * params.yuvToRgbConversionMatrix);
+    color = (float4(plane0.read(uint2(coord), 0)[0], plane1.read(uint2(coord1), 0).rg, 1.0f) * params.yuvToRgbConversionMatrix);
   }
   if ((params.doYuvToRgbConversionOnly == 0u)) {
     color = gammaCorrection(color, params.gammaDecodeParams);
@@ -102,10 +99,10 @@
   return float4(color, 1.0f);
 }
 
-kernel void tint_symbol(texture2d<float, access::sample> tint_symbol_1 [[texture(0)]], texture2d<float, access::sample> tint_symbol_2 [[texture(1)]], const constant ExternalTextureParams_tint_packed_vec3* tint_symbol_3 [[buffer(0)]], texture2d<float, access::write> tint_symbol_4 [[texture(2)]]) {
-  float4 red = textureLoadExternal(tint_symbol_1, tint_symbol_2, int2(10), tint_unpack_vec3_in_composite_1(*(tint_symbol_3)));
+kernel void tint_symbol(texture2d<float, access::sample> tint_symbol_1 [[texture(1)]], texture2d<float, access::sample> tint_symbol_2 [[texture(2)]], const constant ExternalTextureParams_tint_packed_vec3* tint_symbol_3 [[buffer(3)]], texture2d<float, access::write> tint_symbol_4 [[texture(0)]]) {
+  float4 red = textureLoadExternal(tint_symbol_1, tint_symbol_2, tint_clamp(int2(10), int2(0), int2((uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height()) - uint2(1u)))), tint_unpack_vec3_in_composite_1(*(tint_symbol_3)));
   tint_symbol_4.write(red, uint2(tint_clamp(int2(0), int2(0), int2((uint2(tint_symbol_4.get_width(), tint_symbol_4.get_height()) - uint2(1u))))));
-  float4 green = textureLoadExternal(tint_symbol_1, tint_symbol_2, int2(70, 118), tint_unpack_vec3_in_composite_1(*(tint_symbol_3)));
+  float4 green = textureLoadExternal(tint_symbol_1, tint_symbol_2, tint_clamp(int2(70, 118), int2(0), int2((uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height()) - uint2(1u)))), tint_unpack_vec3_in_composite_1(*(tint_symbol_3)));
   tint_symbol_4.write(green, uint2(tint_clamp(int2(1, 0), int2(0), int2((uint2(tint_symbol_4.get_width(), tint_symbol_4.get_height()) - uint2(1u))))));
   return;
 }
diff --git a/test/tint/bug/tint/1739.wgsl.expected.spvasm b/test/tint/bug/tint/1739.wgsl.expected.spvasm
index b31df45..01e7c86 100644
--- a/test/tint/bug/tint/1739.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/1739.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 203
+; Bound: 193
 ; Schema: 0
                OpCapability Shader
                OpCapability ImageQuery
@@ -139,24 +139,25 @@
      %v2uint = OpTypeVector %uint 2
      %uint_1 = OpConstant %uint 1
          %81 = OpConstantComposite %v2uint %uint_1 %uint_1
-         %90 = OpConstantNull %uint
-         %95 = OpConstantNull %v2int
+         %90 = OpConstantNull %int
     %float_1 = OpConstant %float 1
-        %142 = OpTypeFunction %ExternalTextureParams %ExternalTextureParams_std140
+        %103 = OpConstantNull %uint
+        %121 = OpTypeFunction %ExternalTextureParams %ExternalTextureParams_std140
        %void = OpTypeVoid
-        %157 = OpTypeFunction %void
+        %136 = OpTypeFunction %void
      %int_10 = OpConstant %int 10
-        %165 = OpConstantComposite %v2int %int_10 %int_10
+        %145 = OpConstantComposite %v2int %int_10 %int_10
+        %146 = OpConstantNull %v2int
+      %int_0 = OpConstant %int 0
      %uint_0 = OpConstant %uint 0
 %_ptr_Uniform_ExternalTextureParams_std140 = OpTypePointer Uniform %ExternalTextureParams_std140
 %_ptr_Function_v4float = OpTypePointer Function %v4float
-        %173 = OpConstantNull %v4float
+        %159 = OpConstantNull %v4float
      %int_70 = OpConstant %int 70
     %int_118 = OpConstant %int 118
-        %187 = OpConstantComposite %v2int %int_70 %int_118
+        %174 = OpConstantComposite %v2int %int_70 %int_118
       %int_1 = OpConstant %int 1
-        %196 = OpConstantNull %int
-        %197 = OpConstantComposite %v2int %int_1 %196
+        %187 = OpConstantComposite %v2int %int_1 %90
  %tint_clamp = OpFunction %v2int None %20
           %e = OpFunctionParameter %v2int
         %low = OpFunctionParameter %v2int
@@ -215,119 +216,108 @@
                OpSelectionMerge %86 None
                OpBranchConditional %85 %87 %88
          %87 = OpLabel
-         %91 = OpImageQueryLevels %uint %plane0
-         %92 = OpISub %uint %91 %uint_1
-         %89 = OpExtInst %uint %29 UMin %90 %92
-         %97 = OpImageQuerySizeLod %v2uint %plane0 %89
-         %98 = OpISub %v2uint %97 %81
-         %96 = OpBitcast %v2int %98
-         %94 = OpFunctionCall %v2int %tint_clamp %coord %95 %96
-         %93 = OpImageFetch %v4float %plane0 %94 Lod %89
-         %99 = OpVectorShuffle %v3float %93 %93 0 1 2
-               OpStore %color %99
+         %89 = OpImageFetch %v4float %plane0 %coord Lod %90
+         %91 = OpVectorShuffle %v3float %89 %89 0 1 2
+               OpStore %color %91
                OpBranch %86
          %88 = OpLabel
-        %101 = OpImageQueryLevels %uint %plane0
-        %102 = OpISub %uint %101 %uint_1
-        %100 = OpExtInst %uint %29 UMin %90 %102
-        %104 = OpImageQueryLevels %uint %plane1
-        %105 = OpISub %uint %104 %uint_1
-        %103 = OpExtInst %uint %29 UMin %90 %105
-        %109 = OpImageQuerySizeLod %v2uint %plane0 %100
-        %110 = OpISub %v2uint %109 %81
-        %108 = OpBitcast %v2int %110
-        %107 = OpFunctionCall %v2int %tint_clamp %coord %95 %108
-        %106 = OpImageFetch %v4float %plane0 %107 Lod %100
-        %111 = OpCompositeExtract %float %106 0
-        %115 = OpImageQuerySizeLod %v2uint %plane1 %103
-        %116 = OpISub %v2uint %115 %81
-        %114 = OpBitcast %v2int %116
-        %113 = OpFunctionCall %v2int %tint_clamp %82 %95 %114
-        %112 = OpImageFetch %v4float %plane1 %113 Lod %103
-        %117 = OpVectorShuffle %v2float %112 %112 0 1
-        %118 = OpCompositeExtract %float %117 0
-        %119 = OpCompositeExtract %float %117 1
-        %121 = OpCompositeConstruct %v4float %111 %118 %119 %float_1
-        %122 = OpCompositeExtract %mat3v4float %params_0 2
-        %123 = OpVectorTimesMatrix %v3float %121 %122
-               OpStore %color %123
+         %92 = OpImageFetch %v4float %plane0 %coord Lod %90
+         %93 = OpCompositeExtract %float %92 0
+         %94 = OpImageFetch %v4float %plane1 %82 Lod %90
+         %95 = OpVectorShuffle %v2float %94 %94 0 1
+         %96 = OpCompositeExtract %float %95 0
+         %97 = OpCompositeExtract %float %95 1
+         %99 = OpCompositeConstruct %v4float %93 %96 %97 %float_1
+        %100 = OpCompositeExtract %mat3v4float %params_0 2
+        %101 = OpVectorTimesMatrix %v3float %99 %100
+               OpStore %color %101
                OpBranch %86
          %86 = OpLabel
-        %124 = OpCompositeExtract %uint %params_0 1
-        %125 = OpIEqual %bool %124 %90
-               OpSelectionMerge %126 None
-               OpBranchConditional %125 %127 %126
-        %127 = OpLabel
-        %129 = OpLoad %v3float %color
-        %130 = OpCompositeExtract %GammaTransferParams %params_0 3
-        %128 = OpFunctionCall %v3float %gammaCorrection %129 %130
-               OpStore %color %128
-        %131 = OpCompositeExtract %mat3v3float %params_0 5
-        %132 = OpLoad %v3float %color
-        %133 = OpMatrixTimesVector %v3float %131 %132
-               OpStore %color %133
-        %135 = OpLoad %v3float %color
-        %136 = OpCompositeExtract %GammaTransferParams %params_0 4
-        %134 = OpFunctionCall %v3float %gammaCorrection %135 %136
-               OpStore %color %134
-               OpBranch %126
-        %126 = OpLabel
-        %137 = OpLoad %v3float %color
-        %138 = OpCompositeExtract %float %137 0
-        %139 = OpCompositeExtract %float %137 1
-        %140 = OpCompositeExtract %float %137 2
-        %141 = OpCompositeConstruct %v4float %138 %139 %140 %float_1
-               OpReturnValue %141
+        %102 = OpCompositeExtract %uint %params_0 1
+        %104 = OpIEqual %bool %102 %103
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %105
+        %106 = OpLabel
+        %108 = OpLoad %v3float %color
+        %109 = OpCompositeExtract %GammaTransferParams %params_0 3
+        %107 = OpFunctionCall %v3float %gammaCorrection %108 %109
+               OpStore %color %107
+        %110 = OpCompositeExtract %mat3v3float %params_0 5
+        %111 = OpLoad %v3float %color
+        %112 = OpMatrixTimesVector %v3float %110 %111
+               OpStore %color %112
+        %114 = OpLoad %v3float %color
+        %115 = OpCompositeExtract %GammaTransferParams %params_0 4
+        %113 = OpFunctionCall %v3float %gammaCorrection %114 %115
+               OpStore %color %113
+               OpBranch %105
+        %105 = OpLabel
+        %116 = OpLoad %v3float %color
+        %117 = OpCompositeExtract %float %116 0
+        %118 = OpCompositeExtract %float %116 1
+        %119 = OpCompositeExtract %float %116 2
+        %120 = OpCompositeConstruct %v4float %117 %118 %119 %float_1
+               OpReturnValue %120
                OpFunctionEnd
-%conv_ExternalTextureParams = OpFunction %ExternalTextureParams None %142
+%conv_ExternalTextureParams = OpFunction %ExternalTextureParams None %121
         %val = OpFunctionParameter %ExternalTextureParams_std140
-        %145 = OpLabel
-        %146 = OpCompositeExtract %uint %val 0
-        %147 = OpCompositeExtract %uint %val 1
-        %148 = OpCompositeExtract %mat3v4float %val 2
-        %149 = OpCompositeExtract %GammaTransferParams %val 3
-        %150 = OpCompositeExtract %GammaTransferParams %val 4
-        %151 = OpCompositeExtract %mat3v3float %val 5
-        %152 = OpCompositeExtract %v2float %val 6
-        %153 = OpCompositeExtract %v2float %val 7
-        %154 = OpCompositeExtract %v2float %val 8
-        %155 = OpCompositeConstruct %mat3v2float %152 %153 %154
-        %156 = OpCompositeConstruct %ExternalTextureParams %146 %147 %148 %149 %150 %151 %155
-               OpReturnValue %156
+        %124 = OpLabel
+        %125 = OpCompositeExtract %uint %val 0
+        %126 = OpCompositeExtract %uint %val 1
+        %127 = OpCompositeExtract %mat3v4float %val 2
+        %128 = OpCompositeExtract %GammaTransferParams %val 3
+        %129 = OpCompositeExtract %GammaTransferParams %val 4
+        %130 = OpCompositeExtract %mat3v3float %val 5
+        %131 = OpCompositeExtract %v2float %val 6
+        %132 = OpCompositeExtract %v2float %val 7
+        %133 = OpCompositeExtract %v2float %val 8
+        %134 = OpCompositeConstruct %mat3v2float %131 %132 %133
+        %135 = OpCompositeConstruct %ExternalTextureParams %125 %126 %127 %128 %129 %130 %134
+               OpReturnValue %135
                OpFunctionEnd
-       %main = OpFunction %void None %157
-        %160 = OpLabel
-        %red = OpVariable %_ptr_Function_v4float Function %173
-      %green = OpVariable %_ptr_Function_v4float Function %173
-        %162 = OpLoad %3 %t
-        %163 = OpLoad %3 %ext_tex_plane_1
-        %169 = OpAccessChain %_ptr_Uniform_ExternalTextureParams_std140 %ext_tex_params %uint_0
-        %170 = OpLoad %ExternalTextureParams_std140 %169
-        %166 = OpFunctionCall %ExternalTextureParams %conv_ExternalTextureParams %170
-        %161 = OpFunctionCall %v4float %textureLoadExternal %162 %163 %165 %166
-               OpStore %red %161
-        %175 = OpLoad %19 %outImage
-        %179 = OpLoad %19 %outImage
-        %178 = OpImageQuerySize %v2uint %179
-        %180 = OpISub %v2uint %178 %81
-        %177 = OpBitcast %v2int %180
-        %176 = OpFunctionCall %v2int %tint_clamp %95 %95 %177
-        %181 = OpLoad %v4float %red
-               OpImageWrite %175 %176 %181
-        %183 = OpLoad %3 %t
-        %184 = OpLoad %3 %ext_tex_plane_1
-        %189 = OpAccessChain %_ptr_Uniform_ExternalTextureParams_std140 %ext_tex_params %uint_0
-        %190 = OpLoad %ExternalTextureParams_std140 %189
-        %188 = OpFunctionCall %ExternalTextureParams %conv_ExternalTextureParams %190
-        %182 = OpFunctionCall %v4float %textureLoadExternal %183 %184 %187 %188
-               OpStore %green %182
-        %193 = OpLoad %19 %outImage
-        %200 = OpLoad %19 %outImage
-        %199 = OpImageQuerySize %v2uint %200
-        %201 = OpISub %v2uint %199 %81
-        %198 = OpBitcast %v2int %201
-        %194 = OpFunctionCall %v2int %tint_clamp %197 %95 %198
-        %202 = OpLoad %v4float %green
-               OpImageWrite %193 %194 %202
+       %main = OpFunction %void None %136
+        %139 = OpLabel
+        %red = OpVariable %_ptr_Function_v4float Function %159
+      %green = OpVariable %_ptr_Function_v4float Function %159
+        %141 = OpLoad %3 %t
+        %142 = OpLoad %3 %ext_tex_plane_1
+        %149 = OpLoad %3 %t
+        %148 = OpImageQuerySizeLod %v2uint %149 %int_0
+        %151 = OpISub %v2uint %148 %81
+        %147 = OpBitcast %v2int %151
+        %143 = OpFunctionCall %v2int %tint_clamp %145 %146 %147
+        %155 = OpAccessChain %_ptr_Uniform_ExternalTextureParams_std140 %ext_tex_params %uint_0
+        %156 = OpLoad %ExternalTextureParams_std140 %155
+        %152 = OpFunctionCall %ExternalTextureParams %conv_ExternalTextureParams %156
+        %140 = OpFunctionCall %v4float %textureLoadExternal %141 %142 %143 %152
+               OpStore %red %140
+        %161 = OpLoad %19 %outImage
+        %165 = OpLoad %19 %outImage
+        %164 = OpImageQuerySize %v2uint %165
+        %166 = OpISub %v2uint %164 %81
+        %163 = OpBitcast %v2int %166
+        %162 = OpFunctionCall %v2int %tint_clamp %146 %146 %163
+        %167 = OpLoad %v4float %red
+               OpImageWrite %161 %162 %167
+        %169 = OpLoad %3 %t
+        %170 = OpLoad %3 %ext_tex_plane_1
+        %177 = OpLoad %3 %t
+        %176 = OpImageQuerySizeLod %v2uint %177 %int_0
+        %178 = OpISub %v2uint %176 %81
+        %175 = OpBitcast %v2int %178
+        %171 = OpFunctionCall %v2int %tint_clamp %174 %146 %175
+        %180 = OpAccessChain %_ptr_Uniform_ExternalTextureParams_std140 %ext_tex_params %uint_0
+        %181 = OpLoad %ExternalTextureParams_std140 %180
+        %179 = OpFunctionCall %ExternalTextureParams %conv_ExternalTextureParams %181
+        %168 = OpFunctionCall %v4float %textureLoadExternal %169 %170 %171 %179
+               OpStore %green %168
+        %184 = OpLoad %19 %outImage
+        %190 = OpLoad %19 %outImage
+        %189 = OpImageQuerySize %v2uint %190
+        %191 = OpISub %v2uint %189 %81
+        %188 = OpBitcast %v2int %191
+        %185 = OpFunctionCall %v2int %tint_clamp %187 %146 %188
+        %192 = OpLoad %v4float %green
+               OpImageWrite %184 %185 %192
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/bug/tint/1739.wgsl.expected.wgsl b/test/tint/bug/tint/1739.wgsl.expected.wgsl
index 403d2d7..83cddcb 100644
--- a/test/tint/bug/tint/1739.wgsl.expected.wgsl
+++ b/test/tint/bug/tint/1739.wgsl.expected.wgsl
@@ -1,60 +1,12 @@
-struct GammaTransferParams {
-  G : f32,
-  A : f32,
-  B : f32,
-  C : f32,
-  D : f32,
-  E : f32,
-  F : f32,
-  padding : u32,
-}
-
-struct ExternalTextureParams {
-  numPlanes : u32,
-  doYuvToRgbConversionOnly : u32,
-  yuvToRgbConversionMatrix : mat3x4<f32>,
-  gammaDecodeParams : GammaTransferParams,
-  gammaEncodeParams : GammaTransferParams,
-  gamutConversionMatrix : mat3x3<f32>,
-  coordTransformationMatrix : mat3x2<f32>,
-}
-
-@group(0) @binding(2) var ext_tex_plane_1 : texture_2d<f32>;
-
-@group(0) @binding(3) var<uniform> ext_tex_params : ExternalTextureParams;
-
-@group(0) @binding(0) var t : texture_2d<f32>;
+@group(0) @binding(0) var t : texture_external;
 
 @group(0) @binding(1) var outImage : texture_storage_2d<rgba8unorm, write>;
 
-fn gammaCorrection(v : vec3<f32>, params : GammaTransferParams) -> vec3<f32> {
-  let cond = (abs(v) < vec3<f32>(params.D));
-  let t = (sign(v) * ((params.C * abs(v)) + params.F));
-  let f = (sign(v) * (pow(((params.A * abs(v)) + params.B), vec3<f32>(params.G)) + params.E));
-  return select(f, t, cond);
-}
-
-fn textureLoadExternal(plane0 : texture_2d<f32>, plane1 : texture_2d<f32>, coord : vec2<i32>, params : ExternalTextureParams) -> vec4<f32> {
-  let coord1 = (coord >> vec2<u32>(1));
-  var color : vec3<f32>;
-  if ((params.numPlanes == 1)) {
-    color = textureLoad(plane0, coord, 0).rgb;
-  } else {
-    color = (vec4<f32>(textureLoad(plane0, coord, 0).r, textureLoad(plane1, coord1, 0).rg, 1) * params.yuvToRgbConversionMatrix);
-  }
-  if ((params.doYuvToRgbConversionOnly == 0)) {
-    color = gammaCorrection(color, params.gammaDecodeParams);
-    color = (params.gamutConversionMatrix * color);
-    color = gammaCorrection(color, params.gammaEncodeParams);
-  }
-  return vec4<f32>(color, 1);
-}
-
 @compute @workgroup_size(1)
 fn main() {
-  var red : vec4<f32> = textureLoadExternal(t, ext_tex_plane_1, vec2<i32>(10, 10), ext_tex_params);
+  var red : vec4<f32> = textureLoad(t, vec2<i32>(10, 10));
   textureStore(outImage, vec2<i32>(0, 0), red);
-  var green : vec4<f32> = textureLoadExternal(t, ext_tex_plane_1, vec2<i32>(70, 118), ext_tex_params);
+  var green : vec4<f32> = textureLoad(t, vec2<i32>(70, 118));
   textureStore(outImage, vec2<i32>(1, 0), green);
   return;
 }