Remove the Multiplanar and BindingRemapper API options

The options for multiplanar and binding remapper are no longer provided
through the API. This CL removes the tint API headers for those options.

The multiplanar defines are shared between the AST and IR
implementations. They currently live in `tint/lang/core/common` but can
move directly into the IR transform when the AST transform is removed.

Bug: 340582170
Change-Id: I09d7af0ea98482a553980135047f971671c1a4c3
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/191920
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/include/tint/tint.h b/include/tint/tint.h
index ac6dd66..e252a1e 100644
--- a/include/tint/tint.h
+++ b/include/tint/tint.h
@@ -35,8 +35,6 @@
 //                headers will need to be moved to include/tint/.
 
 #include "src/tint/api/common/binding_point.h"
-#include "src/tint/api/options/binding_remapper.h"
-#include "src/tint/api/options/external_texture.h"
 #include "src/tint/api/options/pixel_local.h"
 #include "src/tint/api/options/texture_builtins_from_uniform.h"
 #include "src/tint/api/tint.h"
diff --git a/src/dawn/native/TintUtils.cpp b/src/dawn/native/TintUtils.cpp
index 815b366..1dd55f8 100644
--- a/src/dawn/native/TintUtils.cpp
+++ b/src/dawn/native/TintUtils.cpp
@@ -157,21 +157,6 @@
     tlDevice = nullptr;
 }
 
-tint::ExternalTextureOptions BuildExternalTextureTransformBindings(
-    const PipelineLayoutBase* layout) {
-    tint::ExternalTextureOptions options;
-    for (BindGroupIndex i : IterateBitSet(layout->GetBindGroupLayoutsMask())) {
-        const BindGroupLayoutInternalBase* bgl = layout->GetBindGroupLayout(i);
-        for (const auto& [_, expansion] : bgl->GetExternalTextureBindingExpansionMap()) {
-            options.bindings_map[{static_cast<uint32_t>(i),
-                                  static_cast<uint32_t>(expansion.plane0)}] = {
-                {static_cast<uint32_t>(i), static_cast<uint32_t>(expansion.plane1)},
-                {static_cast<uint32_t>(i), static_cast<uint32_t>(expansion.params)}};
-        }
-    }
-    return options;
-}
-
 tint::ast::transform::VertexPulling::Config BuildVertexPullingTransformConfig(
     const RenderPipelineBase& renderPipeline,
     BindGroupIndex pullingBufferBindingSet) {
diff --git a/src/dawn/native/TintUtils.h b/src/dawn/native/TintUtils.h
index 406b536..fc682b8 100644
--- a/src/dawn/native/TintUtils.h
+++ b/src/dawn/native/TintUtils.h
@@ -54,9 +54,6 @@
     ScopedTintICEHandler(ScopedTintICEHandler&&) = delete;
 };
 
-tint::ExternalTextureOptions BuildExternalTextureTransformBindings(
-    const PipelineLayoutBase* layout);
-
 tint::ast::transform::VertexPulling::Config BuildVertexPullingTransformConfig(
     const RenderPipelineBase& renderPipeline,
     BindGroupIndex pullingBufferBindingSet);
diff --git a/src/dawn/tests/unittests/native/StreamTests.cpp b/src/dawn/tests/unittests/native/StreamTests.cpp
index 8e9418c..0f192a0 100644
--- a/src/dawn/tests/unittests/native/StreamTests.cpp
+++ b/src/dawn/tests/unittests/native/StreamTests.cpp
@@ -282,20 +282,6 @@
     EXPECT_CACHE_KEY_EQ(bp, expected);
 }
 
-// Test that ByteVectorSink serializes tint::ExternalTextureOptions::BindingPoints
-// as expected.
-TEST(SerializeTests, TintTransformBindingPoints) {
-    tint::ExternalTextureOptions::BindingPoints points{
-        tint::BindingPoint{1, 4},
-        tint::BindingPoint{3, 7},
-    };
-
-    ByteVectorSink expected;
-    StreamIn(&expected, uint32_t(1), uint32_t(4), uint32_t(3), uint32_t(7));
-
-    EXPECT_CACHE_KEY_EQ(points, expected);
-}
-
 // Test that serializing then deserializing a param pack yields the same values.
 TEST(StreamTests, SerializeDeserializeParamPack) {
     int a = 1;
diff --git a/src/tint/api/options/BUILD.bazel b/src/tint/api/options/BUILD.bazel
index 7bf8d69..91919c2 100644
--- a/src/tint/api/options/BUILD.bazel
+++ b/src/tint/api/options/BUILD.bazel
@@ -42,9 +42,7 @@
     "options.cc",
   ],
   hdrs = [
-    "binding_remapper.h",
     "depth_range_offsets.h",
-    "external_texture.h",
     "pixel_local.h",
     "texture_builtins_from_uniform.h",
   ],
@@ -69,8 +67,6 @@
   name = "test",
   alwayslink = True,
   srcs = [
-    "binding_remapper_test.cc",
-    "external_texture_test.cc",
     "pixel_local_test.cc",
     "texture_builtins_from_uniform_test.cc",
   ],
diff --git a/src/tint/api/options/BUILD.cmake b/src/tint/api/options/BUILD.cmake
index 9629a54..facd62e 100644
--- a/src/tint/api/options/BUILD.cmake
+++ b/src/tint/api/options/BUILD.cmake
@@ -39,9 +39,7 @@
 # Kind:      lib
 ################################################################################
 tint_add_target(tint_api_options lib
-  api/options/binding_remapper.h
   api/options/depth_range_offsets.h
-  api/options/external_texture.h
   api/options/options.cc
   api/options/pixel_local.h
   api/options/texture_builtins_from_uniform.h
@@ -67,8 +65,6 @@
 # Kind:      test
 ################################################################################
 tint_add_target(tint_api_options_test test
-  api/options/binding_remapper_test.cc
-  api/options/external_texture_test.cc
   api/options/pixel_local_test.cc
   api/options/texture_builtins_from_uniform_test.cc
 )
diff --git a/src/tint/api/options/BUILD.gn b/src/tint/api/options/BUILD.gn
index 09a0971..e2dd30a 100644
--- a/src/tint/api/options/BUILD.gn
+++ b/src/tint/api/options/BUILD.gn
@@ -44,9 +44,7 @@
 
 libtint_source_set("options") {
   sources = [
-    "binding_remapper.h",
     "depth_range_offsets.h",
-    "external_texture.h",
     "options.cc",
     "pixel_local.h",
     "texture_builtins_from_uniform.h",
@@ -69,8 +67,6 @@
 if (tint_build_unittests) {
   tint_unittests_source_set("unittests") {
     sources = [
-      "binding_remapper_test.cc",
-      "external_texture_test.cc",
       "pixel_local_test.cc",
       "texture_builtins_from_uniform_test.cc",
     ]
diff --git a/src/tint/api/options/external_texture.h b/src/tint/api/options/external_texture.h
deleted file mode 100644
index a792072..0000000
--- a/src/tint/api/options/external_texture.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2023 The Dawn & Tint Authors
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this
-//    list of conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice,
-//    this list of conditions and the following disclaimer in the documentation
-//    and/or other materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its
-//    contributors may be used to endorse or promote products derived from
-//    this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef SRC_TINT_API_OPTIONS_EXTERNAL_TEXTURE_H_
-#define SRC_TINT_API_OPTIONS_EXTERNAL_TEXTURE_H_
-
-#include <unordered_map>
-
-#include "src/tint/api/common/binding_point.h"
-
-namespace tint {
-
-/// Options used to specify mappings of binding points for external textures.
-struct ExternalTextureOptions {
-    /// 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(BindingPoints, 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>;
-
-    /// 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(ExternalTextureOptions, bindings_map);
-};
-
-}  // namespace tint
-
-#endif  // SRC_TINT_API_OPTIONS_EXTERNAL_TEXTURE_H_
diff --git a/src/tint/api/options/external_texture_test.cc b/src/tint/api/options/external_texture_test.cc
deleted file mode 100644
index de5d17c..0000000
--- a/src/tint/api/options/external_texture_test.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2024 The Dawn & Tint Authors
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this
-//    list of conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice,
-//    this list of conditions and the following disclaimer in the documentation
-//    and/or other materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its
-//    contributors may be used to endorse or promote products derived from
-//    this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include "src/tint/api/options/external_texture.h"
-
-#include <gtest/gtest.h>
-
-namespace tint {
-namespace {
-
-TEST(TintCheckAllFieldsReflected, ApiOptionsExternalTextureTest) {
-    TINT_ASSERT_ALL_FIELDS_REFLECTED(ExternalTextureOptions::BindingPoints);
-    TINT_ASSERT_ALL_FIELDS_REFLECTED(ExternalTextureOptions);
-}
-
-}  // namespace
-}  // namespace tint
diff --git a/src/tint/cmd/common/BUILD.bazel b/src/tint/cmd/common/BUILD.bazel
index affb277..b596753 100644
--- a/src/tint/cmd/common/BUILD.bazel
+++ b/src/tint/cmd/common/BUILD.bazel
@@ -39,16 +39,13 @@
 cc_library(
   name = "common",
   srcs = [
-    "generate_external_texture_bindings.cc",
     "helper.cc",
   ],
   hdrs = [
-    "generate_external_texture_bindings.h",
     "helper.h",
   ],
   deps = [
     "//src/tint/api/common",
-    "//src/tint/api/options",
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/ir",
@@ -99,44 +96,6 @@
   copts = COPTS,
   visibility = ["//visibility:public"],
 )
-cc_library(
-  name = "test",
-  alwayslink = True,
-  srcs = [
-    "generate_external_texture_bindings_test.cc",
-  ],
-  deps = [
-    "//src/tint/api/common",
-    "//src/tint/api/options",
-    "//src/tint/cmd/common",
-    "//src/tint/lang/core",
-    "//src/tint/lang/core/constant",
-    "//src/tint/lang/core/type",
-    "//src/tint/lang/wgsl",
-    "//src/tint/lang/wgsl/ast",
-    "//src/tint/lang/wgsl/common",
-    "//src/tint/lang/wgsl/features",
-    "//src/tint/lang/wgsl/program",
-    "//src/tint/lang/wgsl/resolver",
-    "//src/tint/lang/wgsl/sem",
-    "//src/tint/utils/containers",
-    "//src/tint/utils/diagnostic",
-    "//src/tint/utils/ice",
-    "//src/tint/utils/id",
-    "//src/tint/utils/macros",
-    "//src/tint/utils/math",
-    "//src/tint/utils/memory",
-    "//src/tint/utils/reflection",
-    "//src/tint/utils/result",
-    "//src/tint/utils/rtti",
-    "//src/tint/utils/symbol",
-    "//src/tint/utils/text",
-    "//src/tint/utils/traits",
-    "@gtest",
-  ],
-  copts = COPTS,
-  visibility = ["//visibility:public"],
-)
 
 alias(
   name = "tint_build_spv_reader",
diff --git a/src/tint/cmd/common/BUILD.cmake b/src/tint/cmd/common/BUILD.cmake
index 2c0d823..bded2c4 100644
--- a/src/tint/cmd/common/BUILD.cmake
+++ b/src/tint/cmd/common/BUILD.cmake
@@ -39,15 +39,12 @@
 # Kind:      lib
 ################################################################################
 tint_add_target(tint_cmd_common lib
-  cmd/common/generate_external_texture_bindings.cc
-  cmd/common/generate_external_texture_bindings.h
   cmd/common/helper.cc
   cmd/common/helper.h
 )
 
 tint_target_add_dependencies(tint_cmd_common lib
   tint_api_common
-  tint_api_options
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_ir
@@ -99,44 +96,3 @@
     tint_lang_wgsl_writer
   )
 endif(TINT_BUILD_WGSL_WRITER)
-
-################################################################################
-# Target:    tint_cmd_common_test
-# Kind:      test
-################################################################################
-tint_add_target(tint_cmd_common_test test
-  cmd/common/generate_external_texture_bindings_test.cc
-)
-
-tint_target_add_dependencies(tint_cmd_common_test test
-  tint_api_common
-  tint_api_options
-  tint_cmd_common
-  tint_lang_core
-  tint_lang_core_constant
-  tint_lang_core_type
-  tint_lang_wgsl
-  tint_lang_wgsl_ast
-  tint_lang_wgsl_common
-  tint_lang_wgsl_features
-  tint_lang_wgsl_program
-  tint_lang_wgsl_resolver
-  tint_lang_wgsl_sem
-  tint_utils_containers
-  tint_utils_diagnostic
-  tint_utils_ice
-  tint_utils_id
-  tint_utils_macros
-  tint_utils_math
-  tint_utils_memory
-  tint_utils_reflection
-  tint_utils_result
-  tint_utils_rtti
-  tint_utils_symbol
-  tint_utils_text
-  tint_utils_traits
-)
-
-tint_target_add_external_dependencies(tint_cmd_common_test test
-  "gtest"
-)
diff --git a/src/tint/cmd/common/BUILD.gn b/src/tint/cmd/common/BUILD.gn
index 6026bf5..406273e 100644
--- a/src/tint/cmd/common/BUILD.gn
+++ b/src/tint/cmd/common/BUILD.gn
@@ -38,20 +38,13 @@
 
 import("${tint_src_dir}/tint.gni")
 
-if (tint_build_unittests || tint_build_benchmarks) {
-  import("//testing/test.gni")
-}
-
 libtint_source_set("common") {
   sources = [
-    "generate_external_texture_bindings.cc",
-    "generate_external_texture_bindings.h",
     "helper.cc",
     "helper.h",
   ]
   deps = [
     "${tint_src_dir}/api/common",
-    "${tint_src_dir}/api/options",
     "${tint_src_dir}/lang/core",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/ir",
@@ -101,37 +94,3 @@
     deps += [ "${tint_src_dir}/lang/wgsl/writer" ]
   }
 }
-if (tint_build_unittests) {
-  tint_unittests_source_set("unittests") {
-    sources = [ "generate_external_texture_bindings_test.cc" ]
-    deps = [
-      "${tint_src_dir}:gmock_and_gtest",
-      "${tint_src_dir}/api/common",
-      "${tint_src_dir}/api/options",
-      "${tint_src_dir}/cmd/common",
-      "${tint_src_dir}/lang/core",
-      "${tint_src_dir}/lang/core/constant",
-      "${tint_src_dir}/lang/core/type",
-      "${tint_src_dir}/lang/wgsl",
-      "${tint_src_dir}/lang/wgsl/ast",
-      "${tint_src_dir}/lang/wgsl/common",
-      "${tint_src_dir}/lang/wgsl/features",
-      "${tint_src_dir}/lang/wgsl/program",
-      "${tint_src_dir}/lang/wgsl/resolver",
-      "${tint_src_dir}/lang/wgsl/sem",
-      "${tint_src_dir}/utils/containers",
-      "${tint_src_dir}/utils/diagnostic",
-      "${tint_src_dir}/utils/ice",
-      "${tint_src_dir}/utils/id",
-      "${tint_src_dir}/utils/macros",
-      "${tint_src_dir}/utils/math",
-      "${tint_src_dir}/utils/memory",
-      "${tint_src_dir}/utils/reflection",
-      "${tint_src_dir}/utils/result",
-      "${tint_src_dir}/utils/rtti",
-      "${tint_src_dir}/utils/symbol",
-      "${tint_src_dir}/utils/text",
-      "${tint_src_dir}/utils/traits",
-    ]
-  }
-}
diff --git a/src/tint/cmd/common/generate_external_texture_bindings.cc b/src/tint/cmd/common/generate_external_texture_bindings.cc
deleted file mode 100644
index fdb7704..0000000
--- a/src/tint/cmd/common/generate_external_texture_bindings.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2022 The Dawn & Tint Authors
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this
-//    list of conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice,
-//    this list of conditions and the following disclaimer in the documentation
-//    and/or other materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its
-//    contributors may be used to endorse or promote products derived from
-//    this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include "src/tint/cmd/common/generate_external_texture_bindings.h"
-
-#include <algorithm>
-#include <unordered_map>
-#include <vector>
-
-#include "src/tint/api/common/binding_point.h"
-#include "src/tint/lang/core/type/external_texture.h"
-#include "src/tint/lang/wgsl/ast/module.h"
-#include "src/tint/lang/wgsl/program/program.h"
-#include "src/tint/lang/wgsl/sem/variable.h"
-
-namespace tint::cmd {
-
-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.
-
-    // Collect next valid binding number per group
-    std::unordered_map<uint32_t, uint32_t> group_to_next_binding_number;
-    std::vector<tint::BindingPoint> ext_tex_bps;
-    for (auto* var : program.AST().GlobalVariables()) {
-        if (auto* sem_var = program.Sem().Get(var)->As<sem::GlobalVariable>()) {
-            if (auto bp = sem_var->Attributes().binding_point) {
-                auto& n = group_to_next_binding_number[bp->group];
-                n = std::max(n, bp->binding + 1);
-
-                if (sem_var->Type()->UnwrapRef()->Is<core::type::ExternalTexture>()) {
-                    ext_tex_bps.emplace_back(*bp);
-                }
-            }
-        }
-    }
-
-    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 = ExternalTextureOptions::BindingPoints{{g, next_num++}, {g, next_num++}};
-
-        new_bindings_map[bp] = new_bps;
-    }
-
-    return new_bindings_map;
-}
-
-}  // namespace tint::cmd
diff --git a/src/tint/cmd/common/generate_external_texture_bindings.h b/src/tint/cmd/common/generate_external_texture_bindings.h
deleted file mode 100644
index 7cb014c..0000000
--- a/src/tint/cmd/common/generate_external_texture_bindings.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2022 The Dawn & Tint Authors
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this
-//    list of conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice,
-//    this list of conditions and the following disclaimer in the documentation
-//    and/or other materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its
-//    contributors may be used to endorse or promote products derived from
-//    this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef SRC_TINT_CMD_COMMON_GENERATE_EXTERNAL_TEXTURE_BINDINGS_H_
-#define SRC_TINT_CMD_COMMON_GENERATE_EXTERNAL_TEXTURE_BINDINGS_H_
-
-#include "src/tint/api/options/external_texture.h"
-
-// Forward declarations
-namespace tint {
-class Program;
-}
-
-namespace tint::cmd {
-
-ExternalTextureOptions::BindingsMap GenerateExternalTextureBindings(const Program& program);
-
-}  // namespace tint::cmd
-
-#endif  // SRC_TINT_CMD_COMMON_GENERATE_EXTERNAL_TEXTURE_BINDINGS_H_
diff --git a/src/tint/cmd/common/generate_external_texture_bindings_test.cc b/src/tint/cmd/common/generate_external_texture_bindings_test.cc
deleted file mode 100644
index fad3b15..0000000
--- a/src/tint/cmd/common/generate_external_texture_bindings_test.cc
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2022 The Dawn & Tint Authors
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this
-//    list of conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice,
-//    this list of conditions and the following disclaimer in the documentation
-//    and/or other materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its
-//    contributors may be used to endorse or promote products derived from
-//    this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <utility>
-
-#include "gtest/gtest.h"
-#include "src/tint/api/common/binding_point.h"
-#include "src/tint/cmd/common/generate_external_texture_bindings.h"
-#include "src/tint/lang/wgsl/program/program_builder.h"
-#include "src/tint/lang/wgsl/resolver/resolve.h"
-
-namespace tint::cmd {
-namespace {
-
-using namespace tint::core::number_suffixes;  // NOLINT
-
-constexpr auto kUniform = core::AddressSpace::kUniform;
-
-class GenerateExternalTextureBindingsTest : public ::testing::Test {};
-
-TEST_F(GenerateExternalTextureBindingsTest, None) {
-    ProgramBuilder b;
-
-    tint::Program program(resolver::Resolve(b));
-    ASSERT_TRUE(program.IsValid());
-    auto bindings = GenerateExternalTextureBindings(program);
-    ASSERT_TRUE(bindings.empty());
-}
-
-TEST_F(GenerateExternalTextureBindingsTest, One) {
-    ProgramBuilder b;
-    b.GlobalVar("v0", b.ty.external_texture(), b.Group(0_a), b.Binding(0_a));
-
-    tint::Program program(resolver::Resolve(b));
-    ASSERT_TRUE(program.IsValid());
-    auto bindings = GenerateExternalTextureBindings(program);
-    ASSERT_EQ(bindings.size(), 1u);
-
-    auto to = bindings[BindingPoint{0, 0}];
-    ASSERT_EQ(to.plane_1.group, 0u);
-    ASSERT_EQ(to.params.group, 0u);
-    ASSERT_EQ(to.plane_1.binding, 1u);
-    ASSERT_EQ(to.params.binding, 2u);
-}
-
-TEST_F(GenerateExternalTextureBindingsTest, Two_SameGroup) {
-    ProgramBuilder b;
-    b.GlobalVar("v0", b.ty.external_texture(), b.Group(0_a), b.Binding(0_a));
-    b.GlobalVar("v1", b.ty.external_texture(), b.Group(0_a), b.Binding(1_a));
-
-    tint::Program program(resolver::Resolve(b));
-    ASSERT_TRUE(program.IsValid());
-    auto bindings = GenerateExternalTextureBindings(program);
-    ASSERT_EQ(bindings.size(), 2u);
-
-    auto to0 = bindings[BindingPoint{0, 0}];
-    ASSERT_EQ(to0.plane_1.group, 0u);
-    ASSERT_EQ(to0.params.group, 0u);
-    ASSERT_EQ(to0.plane_1.binding, 2u);
-    ASSERT_EQ(to0.params.binding, 3u);
-
-    auto to1 = bindings[BindingPoint{0, 1}];
-    ASSERT_EQ(to1.plane_1.group, 0u);
-    ASSERT_EQ(to1.params.group, 0u);
-    ASSERT_EQ(to1.plane_1.binding, 4u);
-    ASSERT_EQ(to1.params.binding, 5u);
-}
-
-TEST_F(GenerateExternalTextureBindingsTest, Two_DifferentGroup) {
-    ProgramBuilder b;
-    b.GlobalVar("v0", b.ty.external_texture(), b.Group(0_a), b.Binding(0_a));
-    b.GlobalVar("v1", b.ty.external_texture(), b.Group(1_a), b.Binding(0_a));
-
-    tint::Program program(resolver::Resolve(b));
-    ASSERT_TRUE(program.IsValid());
-    auto bindings = GenerateExternalTextureBindings(program);
-    ASSERT_EQ(bindings.size(), 2u);
-
-    auto to0 = bindings[BindingPoint{0, 0}];
-    ASSERT_EQ(to0.plane_1.group, 0u);
-    ASSERT_EQ(to0.params.group, 0u);
-    ASSERT_EQ(to0.plane_1.binding, 1u);
-    ASSERT_EQ(to0.params.binding, 2u);
-
-    auto to1 = bindings[BindingPoint{1, 0}];
-    ASSERT_EQ(to1.plane_1.group, 1u);
-    ASSERT_EQ(to1.params.group, 1u);
-    ASSERT_EQ(to1.plane_1.binding, 1u);
-    ASSERT_EQ(to1.params.binding, 2u);
-}
-
-TEST_F(GenerateExternalTextureBindingsTest, Two_WithOtherBindingsInSameGroup) {
-    ProgramBuilder b;
-    b.GlobalVar("v0", b.ty.i32(), b.Group(0_a), b.Binding(0_a), kUniform);
-    b.GlobalVar("v1", b.ty.external_texture(), b.Group(0_a), b.Binding(1_a));
-    b.GlobalVar("v2", b.ty.i32(), b.Group(0_a), b.Binding(2_a), kUniform);
-    b.GlobalVar("v3", b.ty.external_texture(), b.Group(0_a), b.Binding(3_a));
-    b.GlobalVar("v4", b.ty.i32(), b.Group(0_a), b.Binding(4_a), kUniform);
-
-    tint::Program program(resolver::Resolve(b));
-    ASSERT_TRUE(program.IsValid()) << program.Diagnostics();
-    auto bindings = GenerateExternalTextureBindings(program);
-    ASSERT_EQ(bindings.size(), 2u);
-
-    auto to0 = bindings[BindingPoint{0, 1}];
-    ASSERT_EQ(to0.plane_1.group, 0u);
-    ASSERT_EQ(to0.params.group, 0u);
-    ASSERT_EQ(to0.plane_1.binding, 5u);
-    ASSERT_EQ(to0.params.binding, 6u);
-
-    auto to1 = bindings[BindingPoint{0, 3}];
-    ASSERT_EQ(to1.plane_1.group, 0u);
-    ASSERT_EQ(to1.params.group, 0u);
-    ASSERT_EQ(to1.plane_1.binding, 7u);
-    ASSERT_EQ(to1.params.binding, 8u);
-}
-
-}  // namespace
-}  // namespace tint::cmd
diff --git a/src/tint/cmd/loopy/main.cc b/src/tint/cmd/loopy/main.cc
index 7019776..bdbd0ca 100644
--- a/src/tint/cmd/loopy/main.cc
+++ b/src/tint/cmd/loopy/main.cc
@@ -28,7 +28,6 @@
 #include <iostream>
 
 #include "src/tint/api/tint.h"
-#include "src/tint/cmd/common/generate_external_texture_bindings.h"
 #include "src/tint/cmd/common/helper.h"
 #include "src/tint/lang/core/ir/module.h"
 
diff --git a/src/tint/cmd/test/BUILD.bazel b/src/tint/cmd/test/BUILD.bazel
index bc1d56f..2a5901b 100644
--- a/src/tint/cmd/test/BUILD.bazel
+++ b/src/tint/cmd/test/BUILD.bazel
@@ -45,7 +45,6 @@
     "//src/tint/api",
     "//src/tint/api/common:test",
     "//src/tint/api/options:test",
-    "//src/tint/cmd/common:test",
     "//src/tint/lang/core/constant:test",
     "//src/tint/lang/core/intrinsic:test",
     "//src/tint/lang/core/ir/transform/common:test",
diff --git a/src/tint/cmd/test/BUILD.cmake b/src/tint/cmd/test/BUILD.cmake
index 098d937..e500500 100644
--- a/src/tint/cmd/test/BUILD.cmake
+++ b/src/tint/cmd/test/BUILD.cmake
@@ -46,7 +46,6 @@
   tint_api
   tint_api_common_test
   tint_api_options_test
-  tint_cmd_common_test
   tint_lang_core_constant_test
   tint_lang_core_intrinsic_test
   tint_lang_core_ir_transform_common_test
diff --git a/src/tint/cmd/test/BUILD.gn b/src/tint/cmd/test/BUILD.gn
index 6e8b377..2942176 100644
--- a/src/tint/cmd/test/BUILD.gn
+++ b/src/tint/cmd/test/BUILD.gn
@@ -51,7 +51,6 @@
       "${tint_src_dir}/api",
       "${tint_src_dir}/api/common:unittests",
       "${tint_src_dir}/api/options:unittests",
-      "${tint_src_dir}/cmd/common:unittests",
       "${tint_src_dir}/lang/core:unittests",
       "${tint_src_dir}/lang/core/constant:unittests",
       "${tint_src_dir}/lang/core/intrinsic:unittests",
diff --git a/src/tint/cmd/tint/main.cc b/src/tint/cmd/tint/main.cc
index 9a42675..708f98a 100644
--- a/src/tint/cmd/tint/main.cc
+++ b/src/tint/cmd/tint/main.cc
@@ -41,7 +41,6 @@
 
 #include "src/tint/api/options/pixel_local.h"
 #include "src/tint/api/tint.h"
-#include "src/tint/cmd/common/generate_external_texture_bindings.h"
 #include "src/tint/cmd/common/helper.h"
 #include "src/tint/lang/core/ir/disassembly.h"
 #include "src/tint/lang/core/ir/module.h"
diff --git a/src/tint/lang/core/BUILD.cmake b/src/tint/lang/core/BUILD.cmake
index fa6fdf7..df3d872 100644
--- a/src/tint/lang/core/BUILD.cmake
+++ b/src/tint/lang/core/BUILD.cmake
@@ -34,6 +34,7 @@
 #                       Do not modify this file directly
 ################################################################################
 
+include(lang/core/common/BUILD.cmake)
 include(lang/core/constant/BUILD.cmake)
 include(lang/core/intrinsic/BUILD.cmake)
 include(lang/core/ir/BUILD.cmake)
diff --git a/src/tint/lang/core/common/BUILD.bazel b/src/tint/lang/core/common/BUILD.bazel
new file mode 100644
index 0000000..407371f
--- /dev/null
+++ b/src/tint/lang/core/common/BUILD.bazel
@@ -0,0 +1,64 @@
+# Copyright 2024 The Dawn & Tint Authors
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice, this
+#    list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+#    this list of conditions and the following disclaimer in the documentation
+#    and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the copyright holder nor the names of its
+#    contributors may be used to endorse or promote products derived from
+#    this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+################################################################################
+# File generated by 'tools/src/cmd/gen' using the template:
+#   tools/src/cmd/gen/build/BUILD.bazel.tmpl
+#
+# To regenerate run: './tools/run gen'
+#
+#                       Do not modify this file directly
+################################################################################
+
+load("//src/tint:flags.bzl", "COPTS")
+load("@bazel_skylib//lib:selects.bzl", "selects")
+cc_library(
+  name = "common",
+  srcs = [
+    "placeholder.cc",
+  ],
+  hdrs = [
+    "multiplanar_options.h",
+  ],
+  deps = [
+    "//src/tint/api/common",
+    "//src/tint/utils/containers",
+    "//src/tint/utils/diagnostic",
+    "//src/tint/utils/ice",
+    "//src/tint/utils/macros",
+    "//src/tint/utils/math",
+    "//src/tint/utils/memory",
+    "//src/tint/utils/reflection",
+    "//src/tint/utils/result",
+    "//src/tint/utils/rtti",
+    "//src/tint/utils/text",
+    "//src/tint/utils/traits",
+  ],
+  copts = COPTS,
+  visibility = ["//visibility:public"],
+)
+
diff --git a/src/tint/lang/core/common/BUILD.cmake b/src/tint/lang/core/common/BUILD.cmake
new file mode 100644
index 0000000..ab7d6ce
--- /dev/null
+++ b/src/tint/lang/core/common/BUILD.cmake
@@ -0,0 +1,59 @@
+# Copyright 2024 The Dawn & Tint Authors
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice, this
+#    list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+#    this list of conditions and the following disclaimer in the documentation
+#    and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the copyright holder nor the names of its
+#    contributors may be used to endorse or promote products derived from
+#    this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+################################################################################
+# File generated by 'tools/src/cmd/gen' using the template:
+#   tools/src/cmd/gen/build/BUILD.cmake.tmpl
+#
+# To regenerate run: './tools/run gen'
+#
+#                       Do not modify this file directly
+################################################################################
+
+################################################################################
+# Target:    tint_lang_core_common
+# Kind:      lib
+################################################################################
+tint_add_target(tint_lang_core_common lib
+  lang/core/common/multiplanar_options.h
+  lang/core/common/placeholder.cc
+)
+
+tint_target_add_dependencies(tint_lang_core_common lib
+  tint_api_common
+  tint_utils_containers
+  tint_utils_diagnostic
+  tint_utils_ice
+  tint_utils_macros
+  tint_utils_math
+  tint_utils_memory
+  tint_utils_reflection
+  tint_utils_result
+  tint_utils_rtti
+  tint_utils_text
+  tint_utils_traits
+)
diff --git a/src/tint/lang/core/common/BUILD.gn b/src/tint/lang/core/common/BUILD.gn
new file mode 100644
index 0000000..76fc9e1
--- /dev/null
+++ b/src/tint/lang/core/common/BUILD.gn
@@ -0,0 +1,60 @@
+# Copyright 2024 The Dawn & Tint Authors
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice, this
+#    list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+#    this list of conditions and the following disclaimer in the documentation
+#    and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the copyright holder nor the names of its
+#    contributors may be used to endorse or promote products derived from
+#    this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+################################################################################
+# File generated by 'tools/src/cmd/gen' using the template:
+#   tools/src/cmd/gen/build/BUILD.gn.tmpl
+#
+# To regenerate run: './tools/run gen'
+#
+#                       Do not modify this file directly
+################################################################################
+
+import("../../../../../scripts/tint_overrides_with_defaults.gni")
+
+import("${tint_src_dir}/tint.gni")
+
+libtint_source_set("common") {
+  sources = [
+    "multiplanar_options.h",
+    "placeholder.cc",
+  ]
+  deps = [
+    "${tint_src_dir}/api/common",
+    "${tint_src_dir}/utils/containers",
+    "${tint_src_dir}/utils/diagnostic",
+    "${tint_src_dir}/utils/ice",
+    "${tint_src_dir}/utils/macros",
+    "${tint_src_dir}/utils/math",
+    "${tint_src_dir}/utils/memory",
+    "${tint_src_dir}/utils/reflection",
+    "${tint_src_dir}/utils/result",
+    "${tint_src_dir}/utils/rtti",
+    "${tint_src_dir}/utils/text",
+    "${tint_src_dir}/utils/traits",
+  ]
+}
diff --git a/src/tint/api/options/binding_remapper.h b/src/tint/lang/core/common/multiplanar_options.h
similarity index 60%
rename from src/tint/api/options/binding_remapper.h
rename to src/tint/lang/core/common/multiplanar_options.h
index 4f5ebc0..f18b508 100644
--- a/src/tint/api/options/binding_remapper.h
+++ b/src/tint/lang/core/common/multiplanar_options.h
@@ -1,4 +1,4 @@
-// Copyright 2023 The Dawn & Tint Authors
+// Copyright 2024 The Dawn & Tint Authors
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are met:
@@ -25,27 +25,34 @@
 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#ifndef SRC_TINT_API_OPTIONS_BINDING_REMAPPER_H_
-#define SRC_TINT_API_OPTIONS_BINDING_REMAPPER_H_
+#ifndef SRC_TINT_LANG_CORE_COMMON_MULTIPLANAR_OPTIONS_H_
+#define SRC_TINT_LANG_CORE_COMMON_MULTIPLANAR_OPTIONS_H_
 
 #include <unordered_map>
 
 #include "src/tint/api/common/binding_point.h"
 
-namespace tint {
+namespace tint::transform::multiplanar {
 
-/// Options used to specify mappings of binding points.
-struct BindingRemapperOptions {
-    /// BindingPoints is a map of old binding point to new binding point
-    using BindingPoints = std::unordered_map<BindingPoint, BindingPoint>;
-
-    /// A map of old binding point to new binding point
-    BindingPoints binding_points;
+/// 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(BindingRemapperOptions, binding_points);
+    TINT_REFLECT(BindingPoints, plane_1, params);
 };
 
-}  // namespace tint
+/// 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>;
 
-#endif  // SRC_TINT_API_OPTIONS_BINDING_REMAPPER_H_
+}  // namespace tint::transform::multiplanar
+
+#endif  // SRC_TINT_LANG_CORE_COMMON_MULTIPLANAR_OPTIONS_H_
diff --git a/src/tint/api/options/binding_remapper_test.cc b/src/tint/lang/core/common/placeholder.cc
similarity index 82%
rename from src/tint/api/options/binding_remapper_test.cc
rename to src/tint/lang/core/common/placeholder.cc
index 3d81b99..60769ee 100644
--- a/src/tint/api/options/binding_remapper_test.cc
+++ b/src/tint/lang/core/common/placeholder.cc
@@ -25,16 +25,12 @@
 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#include "src/tint/api/options/binding_remapper.h"
+// CMake requires that targets contain at least on file. This file is used when we want to create
+// empty targets.
 
-#include <gtest/gtest.h>
+#if defined(__clang__)
+#pragma clang diagnostic ignored "-Wmissing-variable-declarations"
+#endif
 
-namespace tint {
-namespace {
-
-TEST(TintCheckAllFieldsReflected, SrcTintApiOptionsBindingRemapperTest) {
-    TINT_ASSERT_ALL_FIELDS_REFLECTED(BindingRemapperOptions);
-}
-
-}  // namespace
-}  // namespace tint
+// A placeholder symbol used to emit a symbol for this lib target.
+int tint_core_common_symbol = 1;
diff --git a/src/tint/lang/core/ir/transform/BUILD.bazel b/src/tint/lang/core/ir/transform/BUILD.bazel
index f2b02a7..757fac0 100644
--- a/src/tint/lang/core/ir/transform/BUILD.bazel
+++ b/src/tint/lang/core/ir/transform/BUILD.bazel
@@ -86,8 +86,8 @@
   ],
   deps = [
     "//src/tint/api/common",
-    "//src/tint/api/options",
     "//src/tint/lang/core",
+    "//src/tint/lang/core/common",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/intrinsic",
     "//src/tint/lang/core/ir",
@@ -147,8 +147,8 @@
   }),
   deps = [
     "//src/tint/api/common",
-    "//src/tint/api/options",
     "//src/tint/lang/core",
+    "//src/tint/lang/core/common",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/intrinsic",
     "//src/tint/lang/core/ir",
diff --git a/src/tint/lang/core/ir/transform/BUILD.cmake b/src/tint/lang/core/ir/transform/BUILD.cmake
index ce6228e..0395034 100644
--- a/src/tint/lang/core/ir/transform/BUILD.cmake
+++ b/src/tint/lang/core/ir/transform/BUILD.cmake
@@ -87,8 +87,8 @@
 
 tint_target_add_dependencies(tint_lang_core_ir_transform lib
   tint_api_common
-  tint_api_options
   tint_lang_core
+  tint_lang_core_common
   tint_lang_core_constant
   tint_lang_core_intrinsic
   tint_lang_core_ir
@@ -139,8 +139,8 @@
 
 tint_target_add_dependencies(tint_lang_core_ir_transform_test test
   tint_api_common
-  tint_api_options
   tint_lang_core
+  tint_lang_core_common
   tint_lang_core_constant
   tint_lang_core_intrinsic
   tint_lang_core_ir
@@ -221,9 +221,9 @@
 
 tint_target_add_dependencies(tint_lang_core_ir_transform_fuzz fuzz
   tint_api_common
-  tint_api_options
   tint_cmd_fuzz_ir_fuzz
   tint_lang_core
+  tint_lang_core_common
   tint_lang_core_constant
   tint_lang_core_ir
   tint_lang_core_ir_transform
diff --git a/src/tint/lang/core/ir/transform/BUILD.gn b/src/tint/lang/core/ir/transform/BUILD.gn
index 5d27b9f..95d323c 100644
--- a/src/tint/lang/core/ir/transform/BUILD.gn
+++ b/src/tint/lang/core/ir/transform/BUILD.gn
@@ -89,8 +89,8 @@
   ]
   deps = [
     "${tint_src_dir}/api/common",
-    "${tint_src_dir}/api/options",
     "${tint_src_dir}/lang/core",
+    "${tint_src_dir}/lang/core/common",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/intrinsic",
     "${tint_src_dir}/lang/core/ir",
@@ -139,8 +139,8 @@
     deps = [
       "${tint_src_dir}:gmock_and_gtest",
       "${tint_src_dir}/api/common",
-      "${tint_src_dir}/api/options",
       "${tint_src_dir}/lang/core",
+      "${tint_src_dir}/lang/core/common",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/intrinsic",
       "${tint_src_dir}/lang/core/ir",
@@ -211,9 +211,9 @@
   ]
   deps = [
     "${tint_src_dir}/api/common",
-    "${tint_src_dir}/api/options",
     "${tint_src_dir}/cmd/fuzz/ir:fuzz",
     "${tint_src_dir}/lang/core",
+    "${tint_src_dir}/lang/core/common",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/ir",
     "${tint_src_dir}/lang/core/ir/transform",
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 4a0de1f..bb0a3d0 100644
--- a/src/tint/lang/core/ir/transform/multiplanar_external_texture.cc
+++ b/src/tint/lang/core/ir/transform/multiplanar_external_texture.cc
@@ -46,7 +46,7 @@
 /// PIMPL state for the transform.
 struct State {
     /// The external texture options.
-    const ExternalTextureOptions& options;
+    const tint::transform::multiplanar::BindingsMap& multiplanar_map;
 
     /// The IR module.
     Module& ir;
@@ -122,8 +122,8 @@
     Result<SuccessType> ReplaceVar(Var* old_var) {
         auto name = ir.NameOf(old_var);
         auto bp = old_var->BindingPoint();
-        auto itr = options.bindings_map.find(bp.value());
-        if (TINT_UNLIKELY(itr == options.bindings_map.end())) {
+        auto itr = multiplanar_map.find(bp.value());
+        if (TINT_UNLIKELY(itr == multiplanar_map.end())) {
             std::stringstream err;
             err << "ExternalTextureOptions missing binding entry for " << bp.value();
             return Failure{err.str()};
@@ -607,13 +607,15 @@
 
 }  // namespace
 
-Result<SuccessType> MultiplanarExternalTexture(Module& ir, const ExternalTextureOptions& options) {
+Result<SuccessType> MultiplanarExternalTexture(
+    Module& ir,
+    const tint::transform::multiplanar::BindingsMap& multiplanar_map) {
     auto result = ValidateAndDumpIfNeeded(ir, "MultiplanarExternalTexture transform");
     if (result != Success) {
         return result;
     }
 
-    return State{options, ir}.Process();
+    return State{multiplanar_map, ir}.Process();
 }
 
 }  // namespace tint::core::ir::transform
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 a9fa401..da99f8f 100644
--- a/src/tint/lang/core/ir/transform/multiplanar_external_texture.h
+++ b/src/tint/lang/core/ir/transform/multiplanar_external_texture.h
@@ -30,7 +30,8 @@
 
 #include <string>
 
-#include "src/tint/api/options/external_texture.h"
+#include "src/tint/api/common/binding_point.h"
+#include "src/tint/lang/core/common/multiplanar_options.h"
 #include "src/tint/utils/result/result.h"
 
 // Forward declarations.
@@ -46,8 +47,9 @@
 /// @param module the module to transform
 /// @param options the external texture options
 /// @returns success or failure
-Result<SuccessType> MultiplanarExternalTexture(Module& module,
-                                               const ExternalTextureOptions& options);
+Result<SuccessType> MultiplanarExternalTexture(
+    Module& module,
+    const tint::transform::multiplanar::BindingsMap& options);
 
 }  // namespace tint::core::ir::transform
 
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 4a017cf..ab95aa9 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
@@ -33,7 +33,8 @@
 namespace tint::core::ir::transform {
 namespace {
 
-void MultiplanarExternalTextureFuzzer(Module& module, const ExternalTextureOptions& options) {
+void MultiplanarExternalTextureFuzzer(Module& module,
+                                      const tint::transform::multiplanar::BindingsMap& options) {
     if (auto res = MultiplanarExternalTexture(module, options); res != Success) {
         return;
     }
diff --git a/src/tint/lang/core/ir/transform/multiplanar_external_texture_test.cc b/src/tint/lang/core/ir/transform/multiplanar_external_texture_test.cc
index c8dc646..ecbcd98 100644
--- a/src/tint/lang/core/ir/transform/multiplanar_external_texture_test.cc
+++ b/src/tint/lang/core/ir/transform/multiplanar_external_texture_test.cc
@@ -29,6 +29,7 @@
 
 #include <utility>
 
+#include "src/tint/lang/core/common/multiplanar_options.h"
 #include "src/tint/lang/core/ir/transform/helper_test.h"
 #include "src/tint/lang/core/type/external_texture.h"
 
@@ -52,8 +53,7 @@
 }
 )";
 
-    ExternalTextureOptions options;
-    Run(MultiplanarExternalTexture, options);
+    Run(MultiplanarExternalTexture, tint::transform::multiplanar::BindingsMap{});
     EXPECT_EQ(expect, str());
 }
 
@@ -122,8 +122,8 @@
 
     EXPECT_EQ(src, str());
 
-    ExternalTextureOptions options;
-    options.bindings_map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
+    tint::transform::multiplanar::BindingsMap options{};
+    options[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
     Run(MultiplanarExternalTexture, options);
     EXPECT_EQ(expect, str());
 }
@@ -198,9 +198,9 @@
 
     EXPECT_EQ(src, str());
 
-    ExternalTextureOptions options;
-    options.bindings_map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
-    Run(MultiplanarExternalTexture, options);
+    tint::transform::multiplanar::BindingsMap map{};
+    map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
+    Run(MultiplanarExternalTexture, map);
     EXPECT_EQ(expect, str());
 }
 
@@ -279,9 +279,9 @@
 
     EXPECT_EQ(src, str());
 
-    ExternalTextureOptions options;
-    options.bindings_map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
-    Run(MultiplanarExternalTexture, options);
+    tint::transform::multiplanar::BindingsMap map{};
+    map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
+    Run(MultiplanarExternalTexture, map);
     EXPECT_EQ(expect, str());
 }
 
@@ -440,9 +440,9 @@
 
     EXPECT_EQ(src, str());
 
-    ExternalTextureOptions options;
-    options.bindings_map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
-    Run(MultiplanarExternalTexture, options);
+    tint::transform::multiplanar::BindingsMap map{};
+    map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
+    Run(MultiplanarExternalTexture, map);
     EXPECT_EQ(expect, str());
 }
 
@@ -602,9 +602,9 @@
 
     EXPECT_EQ(src, str());
 
-    ExternalTextureOptions options;
-    options.bindings_map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
-    Run(MultiplanarExternalTexture, options);
+    tint::transform::multiplanar::BindingsMap map{};
+    map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
+    Run(MultiplanarExternalTexture, map);
     EXPECT_EQ(expect, str());
 }
 
@@ -763,9 +763,9 @@
 
     EXPECT_EQ(src, str());
 
-    ExternalTextureOptions options;
-    options.bindings_map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
-    Run(MultiplanarExternalTexture, options);
+    tint::transform::multiplanar::BindingsMap map{};
+    map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
+    Run(MultiplanarExternalTexture, map);
     EXPECT_EQ(expect, str());
 }
 
@@ -951,9 +951,9 @@
 
     EXPECT_EQ(src, str());
 
-    ExternalTextureOptions options;
-    options.bindings_map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
-    Run(MultiplanarExternalTexture, options);
+    tint::transform::multiplanar::BindingsMap map{};
+    map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
+    Run(MultiplanarExternalTexture, map);
     EXPECT_EQ(expect, str());
 }
 
@@ -1172,9 +1172,9 @@
 
     EXPECT_EQ(src, str());
 
-    ExternalTextureOptions options;
-    options.bindings_map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
-    Run(MultiplanarExternalTexture, options);
+    tint::transform::multiplanar::BindingsMap map{};
+    map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
+    Run(MultiplanarExternalTexture, map);
     EXPECT_EQ(expect, str());
 }
 
@@ -1364,11 +1364,11 @@
 
     EXPECT_EQ(src, str());
 
-    ExternalTextureOptions options;
-    options.bindings_map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
-    options.bindings_map[{2u, 2u}] = {{2u, 3u}, {2u, 4u}};
-    options.bindings_map[{3u, 2u}] = {{3u, 3u}, {3u, 4u}};
-    Run(MultiplanarExternalTexture, options);
+    tint::transform::multiplanar::BindingsMap map{};
+    map[{1u, 2u}] = {{1u, 3u}, {1u, 4u}};
+    map[{2u, 2u}] = {{2u, 3u}, {2u, 4u}};
+    map[{3u, 2u}] = {{3u, 3u}, {3u, 4u}};
+    Run(MultiplanarExternalTexture, map);
     EXPECT_EQ(expect, str());
 }
 
diff --git a/src/tint/lang/glsl/writer/ast_printer/BUILD.bazel b/src/tint/lang/glsl/writer/ast_printer/BUILD.bazel
index 2841719..88bf0886 100644
--- a/src/tint/lang/glsl/writer/ast_printer/BUILD.bazel
+++ b/src/tint/lang/glsl/writer/ast_printer/BUILD.bazel
@@ -48,6 +48,7 @@
     "//src/tint/api/common",
     "//src/tint/api/options",
     "//src/tint/lang/core",
+    "//src/tint/lang/core/common",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
     "//src/tint/lang/wgsl",
diff --git a/src/tint/lang/glsl/writer/ast_printer/BUILD.cmake b/src/tint/lang/glsl/writer/ast_printer/BUILD.cmake
index a8e36cc..a6cb805 100644
--- a/src/tint/lang/glsl/writer/ast_printer/BUILD.cmake
+++ b/src/tint/lang/glsl/writer/ast_printer/BUILD.cmake
@@ -49,6 +49,7 @@
   tint_api_common
   tint_api_options
   tint_lang_core
+  tint_lang_core_common
   tint_lang_core_constant
   tint_lang_core_type
   tint_lang_wgsl
diff --git a/src/tint/lang/glsl/writer/ast_printer/BUILD.gn b/src/tint/lang/glsl/writer/ast_printer/BUILD.gn
index 692ca9b..ab703e1 100644
--- a/src/tint/lang/glsl/writer/ast_printer/BUILD.gn
+++ b/src/tint/lang/glsl/writer/ast_printer/BUILD.gn
@@ -51,6 +51,7 @@
       "${tint_src_dir}/api/common",
       "${tint_src_dir}/api/options",
       "${tint_src_dir}/lang/core",
+      "${tint_src_dir}/lang/core/common",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/wgsl",
diff --git a/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc
index 513d70b..536ff67 100644
--- a/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc
@@ -187,9 +187,9 @@
         options.texture_builtins_from_uniform.ubo_binding,
         options.texture_builtins_from_uniform.ubo_bindingpoint_ordering);
 
-    ExternalTextureOptions external_texture_options{};
+    tint::transform::multiplanar::BindingsMap multiplanar_map{};
     RemapperData remapper_data{};
-    PopulateBindingInfo(options, remapper_data, external_texture_options);
+    PopulateBindingInfo(options, remapper_data, multiplanar_map);
 
     data.Add<ast::transform::BindingRemapper::Remappings>(
         remapper_data, std::unordered_map<BindingPoint, core::Access>{},
@@ -199,7 +199,7 @@
     // Note: it is more efficient for MultiplanarExternalTexture to come after Robustness
     // Must come before builtin polyfills
     data.Add<ast::transform::MultiplanarExternalTexture::NewBindingPoints>(
-        external_texture_options.bindings_map, /* allow collisions */ true);
+        multiplanar_map, /* allow collisions */ true);
     manager.Add<ast::transform::MultiplanarExternalTexture>();
 
     // Must be after multiplanar and must be before OffsetFirstindex
diff --git a/src/tint/lang/glsl/writer/common/BUILD.bazel b/src/tint/lang/glsl/writer/common/BUILD.bazel
index 86899e9..6082ce9 100644
--- a/src/tint/lang/glsl/writer/common/BUILD.bazel
+++ b/src/tint/lang/glsl/writer/common/BUILD.bazel
@@ -53,6 +53,7 @@
     "//src/tint/api/common",
     "//src/tint/api/options",
     "//src/tint/lang/core",
+    "//src/tint/lang/core/common",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
     "//src/tint/lang/wgsl",
diff --git a/src/tint/lang/glsl/writer/common/BUILD.cmake b/src/tint/lang/glsl/writer/common/BUILD.cmake
index ca99523..bdc8833 100644
--- a/src/tint/lang/glsl/writer/common/BUILD.cmake
+++ b/src/tint/lang/glsl/writer/common/BUILD.cmake
@@ -54,6 +54,7 @@
   tint_api_common
   tint_api_options
   tint_lang_core
+  tint_lang_core_common
   tint_lang_core_constant
   tint_lang_core_type
   tint_lang_wgsl
diff --git a/src/tint/lang/glsl/writer/common/BUILD.gn b/src/tint/lang/glsl/writer/common/BUILD.gn
index 53e551b..ba77251 100644
--- a/src/tint/lang/glsl/writer/common/BUILD.gn
+++ b/src/tint/lang/glsl/writer/common/BUILD.gn
@@ -56,6 +56,7 @@
       "${tint_src_dir}/api/common",
       "${tint_src_dir}/api/options",
       "${tint_src_dir}/lang/core",
+      "${tint_src_dir}/lang/core/common",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/wgsl",
diff --git a/src/tint/lang/glsl/writer/common/option_helpers.cc b/src/tint/lang/glsl/writer/common/option_helpers.cc
index d5d8b3c..c3d72fe 100644
--- a/src/tint/lang/glsl/writer/common/option_helpers.cc
+++ b/src/tint/lang/glsl/writer/common/option_helpers.cc
@@ -143,7 +143,7 @@
 // `sampler` arrays.
 void PopulateBindingInfo(const Options& options,
                          RemapperData& remapper_data,
-                         ExternalTextureOptions& external_texture) {
+                         tint::transform::multiplanar::BindingsMap& multiplanar_map) {
     auto create_remappings = [&remapper_data](const auto& hsh) {
         for (const auto& it : hsh) {
             const BindingPoint& src_binding_point = it.first;
@@ -173,14 +173,14 @@
         const binding::BindingInfo& plane1 = it.second.plane1;
         const binding::BindingInfo& metadata = it.second.metadata;
 
-        BindingPoint plane0_binding_point{0, plane0.binding};
-        BindingPoint plane1_binding_point{0, plane1.binding};
-        BindingPoint metadata_binding_point{0, metadata.binding};
+        const BindingPoint plane0_binding_point{0, plane0.binding};
+        const BindingPoint plane1_binding_point{0, plane1.binding};
+        const BindingPoint metadata_binding_point{0, metadata.binding};
 
         // Use the re-bound glsl plane0 value for the lookup key.
-        external_texture.bindings_map.emplace(
-            BindingPoint{0, plane0_binding_point.binding},
-            ExternalTextureOptions::BindingPoints{plane1_binding_point, metadata_binding_point});
+        multiplanar_map.emplace(BindingPoint{0, plane0_binding_point.binding},
+                                tint::transform::multiplanar::BindingPoints{
+                                    plane1_binding_point, metadata_binding_point});
 
         // Bindings which go to the same slot in GLSL do not need to be re-bound.
         if (src_binding_point == plane0_binding_point) {
diff --git a/src/tint/lang/glsl/writer/common/option_helpers.h b/src/tint/lang/glsl/writer/common/option_helpers.h
index efad6bb..d0f118c 100644
--- a/src/tint/lang/glsl/writer/common/option_helpers.h
+++ b/src/tint/lang/glsl/writer/common/option_helpers.h
@@ -31,7 +31,7 @@
 #include <unordered_map>
 
 #include "src/tint/api/common/binding_point.h"
-#include "src/tint/api/options/external_texture.h"
+#include "src/tint/lang/core/common/multiplanar_options.h"
 #include "src/tint/lang/glsl/writer/common/options.h"
 #include "src/tint/utils/diagnostic/diagnostic.h"
 #include "src/tint/utils/result/result.h"
@@ -47,12 +47,12 @@
 /// Populates data from the writer options for the remapper and external texture.
 /// @param options the writer options
 /// @param remapper_data where to put the remapper data
-/// @param external_texture where to store the external texture options
+/// @param multiplanar_map where to store the multiplanar texture options
 /// Note, these are populated together because there are dependencies between the two types
 /// of data.
 void PopulateBindingInfo(const Options& options,
                          RemapperData& remapper_data,
-                         ExternalTextureOptions& external_texture);
+                         tint::transform::multiplanar::BindingsMap& multiplanar_map);
 
 }  // namespace tint::glsl::writer
 
diff --git a/src/tint/lang/glsl/writer/common/options.h b/src/tint/lang/glsl/writer/common/options.h
index d7f0c9b..c9963ea 100644
--- a/src/tint/lang/glsl/writer/common/options.h
+++ b/src/tint/lang/glsl/writer/common/options.h
@@ -32,9 +32,7 @@
 #include <string>
 #include <unordered_map>
 
-#include "src/tint/api/options/binding_remapper.h"
 #include "src/tint/api/options/depth_range_offsets.h"
-#include "src/tint/api/options/external_texture.h"
 #include "src/tint/api/options/texture_builtins_from_uniform.h"
 #include "src/tint/lang/glsl/writer/common/version.h"
 #include "src/tint/lang/wgsl/ast/transform/transform.h"
diff --git a/src/tint/lang/hlsl/writer/ast_printer/BUILD.bazel b/src/tint/lang/hlsl/writer/ast_printer/BUILD.bazel
index f0031c3..1fabb37 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/BUILD.bazel
+++ b/src/tint/lang/hlsl/writer/ast_printer/BUILD.bazel
@@ -48,6 +48,7 @@
     "//src/tint/api/common",
     "//src/tint/api/options",
     "//src/tint/lang/core",
+    "//src/tint/lang/core/common",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
     "//src/tint/lang/hlsl/writer/common",
diff --git a/src/tint/lang/hlsl/writer/ast_printer/BUILD.cmake b/src/tint/lang/hlsl/writer/ast_printer/BUILD.cmake
index a700a8f..287ed13 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/BUILD.cmake
+++ b/src/tint/lang/hlsl/writer/ast_printer/BUILD.cmake
@@ -49,6 +49,7 @@
   tint_api_common
   tint_api_options
   tint_lang_core
+  tint_lang_core_common
   tint_lang_core_constant
   tint_lang_core_type
   tint_lang_hlsl_writer_common
diff --git a/src/tint/lang/hlsl/writer/ast_printer/BUILD.gn b/src/tint/lang/hlsl/writer/ast_printer/BUILD.gn
index b61ed79..e11ef65 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/BUILD.gn
+++ b/src/tint/lang/hlsl/writer/ast_printer/BUILD.gn
@@ -51,6 +51,7 @@
       "${tint_src_dir}/api/common",
       "${tint_src_dir}/api/options",
       "${tint_src_dir}/lang/core",
+      "${tint_src_dir}/lang/core/common",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/hlsl/writer/common",
diff --git a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
index f528764..26efc27 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
@@ -224,10 +224,10 @@
         data.Add<ast::transform::Robustness::Config>(config);
     }
 
-    ExternalTextureOptions external_texture_options{};
+    tint::transform::multiplanar::BindingsMap multiplanar_map{};
     RemapperData remapper_data{};
     ArrayLengthFromUniformOptions array_length_from_uniform_options{};
-    PopulateBindingRelatedOptions(options, remapper_data, external_texture_options,
+    PopulateBindingRelatedOptions(options, remapper_data, multiplanar_map,
                                   array_length_from_uniform_options);
 
     manager.Add<ast::transform::BindingRemapper>();
@@ -239,8 +239,8 @@
 
     // Note: it is more efficient for MultiplanarExternalTexture to come after Robustness
     // MultiplanarExternalTexture must come after BindingRemapper
-    data.Add<ast::transform::MultiplanarExternalTexture::NewBindingPoints>(
-        external_texture_options.bindings_map, /* may_collide */ true);
+    data.Add<ast::transform::MultiplanarExternalTexture::NewBindingPoints>(multiplanar_map,
+                                                                           /* may_collide */ true);
     manager.Add<ast::transform::MultiplanarExternalTexture>();
 
     {  // Builtin polyfills
diff --git a/src/tint/lang/hlsl/writer/common/BUILD.bazel b/src/tint/lang/hlsl/writer/common/BUILD.bazel
index 05f26bc..f03f44a 100644
--- a/src/tint/lang/hlsl/writer/common/BUILD.bazel
+++ b/src/tint/lang/hlsl/writer/common/BUILD.bazel
@@ -50,6 +50,7 @@
     "//src/tint/api/common",
     "//src/tint/api/options",
     "//src/tint/lang/core",
+    "//src/tint/lang/core/common",
     "//src/tint/utils/containers",
     "//src/tint/utils/diagnostic",
     "//src/tint/utils/ice",
diff --git a/src/tint/lang/hlsl/writer/common/BUILD.cmake b/src/tint/lang/hlsl/writer/common/BUILD.cmake
index bf482d2..626259d 100644
--- a/src/tint/lang/hlsl/writer/common/BUILD.cmake
+++ b/src/tint/lang/hlsl/writer/common/BUILD.cmake
@@ -49,6 +49,7 @@
   tint_api_common
   tint_api_options
   tint_lang_core
+  tint_lang_core_common
   tint_utils_containers
   tint_utils_diagnostic
   tint_utils_ice
diff --git a/src/tint/lang/hlsl/writer/common/BUILD.gn b/src/tint/lang/hlsl/writer/common/BUILD.gn
index a9f0971..f2c5a09 100644
--- a/src/tint/lang/hlsl/writer/common/BUILD.gn
+++ b/src/tint/lang/hlsl/writer/common/BUILD.gn
@@ -53,6 +53,7 @@
     "${tint_src_dir}/api/common",
     "${tint_src_dir}/api/options",
     "${tint_src_dir}/lang/core",
+    "${tint_src_dir}/lang/core/common",
     "${tint_src_dir}/utils/containers",
     "${tint_src_dir}/utils/diagnostic",
     "${tint_src_dir}/utils/ice",
diff --git a/src/tint/lang/hlsl/writer/common/option_helpers.cc b/src/tint/lang/hlsl/writer/common/option_helpers.cc
index ec26be9..dcb4fe1 100644
--- a/src/tint/lang/hlsl/writer/common/option_helpers.cc
+++ b/src/tint/lang/hlsl/writer/common/option_helpers.cc
@@ -157,7 +157,7 @@
 void PopulateBindingRelatedOptions(
     const Options& options,
     RemapperData& remapper_data,
-    ExternalTextureOptions& external_texture,
+    tint::transform::multiplanar::BindingsMap& multiplanar_map,
     ArrayLengthFromUniformOptions& array_length_from_uniform_options) {
     auto create_remappings = [&remapper_data](const auto& hsh) {
         for (const auto& it : hsh) {
@@ -188,14 +188,14 @@
         const binding::BindingInfo& plane1 = it.second.plane1;
         const binding::BindingInfo& metadata = it.second.metadata;
 
-        BindingPoint plane0_binding_point{plane0.group, plane0.binding};
-        BindingPoint plane1_binding_point{plane1.group, plane1.binding};
-        BindingPoint metadata_binding_point{metadata.group, metadata.binding};
+        const BindingPoint plane0_binding_point{plane0.group, plane0.binding};
+        const BindingPoint plane1_binding_point{plane1.group, plane1.binding};
+        const BindingPoint metadata_binding_point{metadata.group, metadata.binding};
 
         // Use the re-bound HLSL plane0 value for the lookup key.
-        external_texture.bindings_map.emplace(
-            plane0_binding_point,
-            ExternalTextureOptions::BindingPoints{plane1_binding_point, metadata_binding_point});
+        multiplanar_map.emplace(plane0_binding_point,
+                                tint::transform::multiplanar::BindingPoints{
+                                    plane1_binding_point, metadata_binding_point});
 
         // Bindings which go to the same slot in HLSL do not need to be re-bound.
         if (src_binding_point == plane0_binding_point) {
diff --git a/src/tint/lang/hlsl/writer/common/option_helpers.h b/src/tint/lang/hlsl/writer/common/option_helpers.h
index bcfc083..0dfd764 100644
--- a/src/tint/lang/hlsl/writer/common/option_helpers.h
+++ b/src/tint/lang/hlsl/writer/common/option_helpers.h
@@ -31,7 +31,7 @@
 #include <unordered_map>
 
 #include "src/tint/api/common/binding_point.h"
-#include "src/tint/api/options/external_texture.h"
+#include "src/tint/lang/core/common/multiplanar_options.h"
 #include "src/tint/lang/hlsl/writer/common/options.h"
 #include "src/tint/utils/diagnostic/diagnostic.h"
 #include "src/tint/utils/result/result.h"
@@ -48,13 +48,13 @@
 /// Populates binding-related option from the writer options
 /// @param options the writer options
 /// @param remapper_data where to put the remapper data
-/// @param external_texture where to store the external texture options
+/// @param multiplanar_map where to store the multiplanar texture options
 /// @param array_length_from_uniform_options where to store the ArrayLengthFromUniform options
 /// Note, these are populated together because there are dependencies between the two types of data.
 void PopulateBindingRelatedOptions(
     const Options& options,
     RemapperData& remapper_data,
-    ExternalTextureOptions& external_texture,
+    tint::transform::multiplanar::BindingsMap& multiplanar_map,
     ArrayLengthFromUniformOptions& array_length_from_uniform_options);
 
 }  // namespace tint::hlsl::writer
diff --git a/src/tint/lang/hlsl/writer/common/options.h b/src/tint/lang/hlsl/writer/common/options.h
index 6bf4719..d2e9878 100644
--- a/src/tint/lang/hlsl/writer/common/options.h
+++ b/src/tint/lang/hlsl/writer/common/options.h
@@ -34,8 +34,6 @@
 #include <vector>
 
 #include "src/tint/api/common/binding_point.h"
-#include "src/tint/api/options/binding_remapper.h"
-#include "src/tint/api/options/external_texture.h"
 #include "src/tint/api/options/pixel_local.h"
 #include "src/tint/lang/core/access.h"
 #include "src/tint/utils/math/hash.h"
diff --git a/src/tint/lang/msl/writer/BUILD.bazel b/src/tint/lang/msl/writer/BUILD.bazel
index c578d9d..0cf8581 100644
--- a/src/tint/lang/msl/writer/BUILD.bazel
+++ b/src/tint/lang/msl/writer/BUILD.bazel
@@ -50,6 +50,7 @@
     "//src/tint/api/common",
     "//src/tint/api/options",
     "//src/tint/lang/core",
+    "//src/tint/lang/core/common",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
diff --git a/src/tint/lang/msl/writer/BUILD.cmake b/src/tint/lang/msl/writer/BUILD.cmake
index 4aeb2ed..cc7850e 100644
--- a/src/tint/lang/msl/writer/BUILD.cmake
+++ b/src/tint/lang/msl/writer/BUILD.cmake
@@ -58,6 +58,7 @@
   tint_api_common
   tint_api_options
   tint_lang_core
+  tint_lang_core_common
   tint_lang_core_constant
   tint_lang_core_ir
   tint_lang_core_type
diff --git a/src/tint/lang/msl/writer/BUILD.gn b/src/tint/lang/msl/writer/BUILD.gn
index 5635792..d711599 100644
--- a/src/tint/lang/msl/writer/BUILD.gn
+++ b/src/tint/lang/msl/writer/BUILD.gn
@@ -53,6 +53,7 @@
       "${tint_src_dir}/api/common",
       "${tint_src_dir}/api/options",
       "${tint_src_dir}/lang/core",
+      "${tint_src_dir}/lang/core/common",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/ir",
       "${tint_src_dir}/lang/core/type",
diff --git a/src/tint/lang/msl/writer/ast_printer/BUILD.bazel b/src/tint/lang/msl/writer/ast_printer/BUILD.bazel
index 87734c8..74343f8 100644
--- a/src/tint/lang/msl/writer/ast_printer/BUILD.bazel
+++ b/src/tint/lang/msl/writer/ast_printer/BUILD.bazel
@@ -48,6 +48,7 @@
     "//src/tint/api/common",
     "//src/tint/api/options",
     "//src/tint/lang/core",
+    "//src/tint/lang/core/common",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
     "//src/tint/lang/wgsl",
diff --git a/src/tint/lang/msl/writer/ast_printer/BUILD.cmake b/src/tint/lang/msl/writer/ast_printer/BUILD.cmake
index e678ba3..30256b6 100644
--- a/src/tint/lang/msl/writer/ast_printer/BUILD.cmake
+++ b/src/tint/lang/msl/writer/ast_printer/BUILD.cmake
@@ -49,6 +49,7 @@
   tint_api_common
   tint_api_options
   tint_lang_core
+  tint_lang_core_common
   tint_lang_core_constant
   tint_lang_core_type
   tint_lang_wgsl
diff --git a/src/tint/lang/msl/writer/ast_printer/BUILD.gn b/src/tint/lang/msl/writer/ast_printer/BUILD.gn
index 75dc19a..28be29f 100644
--- a/src/tint/lang/msl/writer/ast_printer/BUILD.gn
+++ b/src/tint/lang/msl/writer/ast_printer/BUILD.gn
@@ -51,6 +51,7 @@
       "${tint_src_dir}/api/common",
       "${tint_src_dir}/api/options",
       "${tint_src_dir}/lang/core",
+      "${tint_src_dir}/lang/core/common",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/wgsl",
diff --git a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
index 266d26d..869a506 100644
--- a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
@@ -168,10 +168,10 @@
         manager.Add<ast::transform::Robustness>();
     }
 
-    ExternalTextureOptions external_texture_options{};
+    tint::transform::multiplanar::BindingsMap multiplanar_map{};
     RemapperData remapper_data{};
     ArrayLengthFromUniformOptions array_length_from_uniform_options{};
-    PopulateBindingRelatedOptions(options, remapper_data, external_texture_options,
+    PopulateBindingRelatedOptions(options, remapper_data, multiplanar_map,
                                   array_length_from_uniform_options);
 
     manager.Add<ast::transform::BindingRemapper>();
@@ -182,7 +182,7 @@
     // Note: it is more efficient for MultiplanarExternalTexture to come after Robustness
     // MultiplanarExternalTexture must come after BindingRemapper
     data.Add<ast::transform::MultiplanarExternalTexture::NewBindingPoints>(
-        external_texture_options.bindings_map, /* allow_collisions */ true);
+        multiplanar_map, /* allow_collisions */ true);
     manager.Add<ast::transform::MultiplanarExternalTexture>();
 
     {  // Builtin polyfills
diff --git a/src/tint/lang/msl/writer/common/BUILD.bazel b/src/tint/lang/msl/writer/common/BUILD.bazel
index 1147095..d11dbcf 100644
--- a/src/tint/lang/msl/writer/common/BUILD.bazel
+++ b/src/tint/lang/msl/writer/common/BUILD.bazel
@@ -52,6 +52,7 @@
     "//src/tint/api/common",
     "//src/tint/api/options",
     "//src/tint/lang/core",
+    "//src/tint/lang/core/common",
     "//src/tint/lang/core/type",
     "//src/tint/utils/containers",
     "//src/tint/utils/diagnostic",
diff --git a/src/tint/lang/msl/writer/common/BUILD.cmake b/src/tint/lang/msl/writer/common/BUILD.cmake
index 7254efb..f7942e5 100644
--- a/src/tint/lang/msl/writer/common/BUILD.cmake
+++ b/src/tint/lang/msl/writer/common/BUILD.cmake
@@ -53,6 +53,7 @@
   tint_api_common
   tint_api_options
   tint_lang_core
+  tint_lang_core_common
   tint_lang_core_type
   tint_utils_containers
   tint_utils_diagnostic
diff --git a/src/tint/lang/msl/writer/common/BUILD.gn b/src/tint/lang/msl/writer/common/BUILD.gn
index 6338710..852368f 100644
--- a/src/tint/lang/msl/writer/common/BUILD.gn
+++ b/src/tint/lang/msl/writer/common/BUILD.gn
@@ -55,6 +55,7 @@
       "${tint_src_dir}/api/common",
       "${tint_src_dir}/api/options",
       "${tint_src_dir}/lang/core",
+      "${tint_src_dir}/lang/core/common",
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/utils/containers",
       "${tint_src_dir}/utils/diagnostic",
diff --git a/src/tint/lang/msl/writer/common/option_helpers.cc b/src/tint/lang/msl/writer/common/option_helpers.cc
index ace6898..002b32a 100644
--- a/src/tint/lang/msl/writer/common/option_helpers.cc
+++ b/src/tint/lang/msl/writer/common/option_helpers.cc
@@ -151,7 +151,7 @@
 void PopulateBindingRelatedOptions(
     const Options& options,
     RemapperData& remapper_data,
-    ExternalTextureOptions& external_texture,
+    tint::transform::multiplanar::BindingsMap& multiplanar_map,
     ArrayLengthFromUniformOptions& array_length_from_uniform_options) {
     auto create_remappings = [&remapper_data](const auto& hsh) {
         for (const auto& it : hsh) {
@@ -182,15 +182,15 @@
         const binding::BindingInfo& plane1 = it.second.plane1;
         const binding::BindingInfo& metadata = it.second.metadata;
 
-        BindingPoint plane0_binding_point{0, plane0.binding};
-        BindingPoint plane1_binding_point{0, plane1.binding};
-        BindingPoint metadata_binding_point{0, metadata.binding};
+        const BindingPoint plane0_binding_point{0, plane0.binding};
+        const BindingPoint plane1_binding_point{0, plane1.binding};
+        const BindingPoint metadata_binding_point{0, metadata.binding};
 
         // Use the re-bound MSL plane0 value for the lookup key. The group goes to `0` which is the
         // value always used for re-bound data.
-        external_texture.bindings_map.emplace(
-            BindingPoint{0, plane0_binding_point.binding},
-            ExternalTextureOptions::BindingPoints{plane1_binding_point, metadata_binding_point});
+        multiplanar_map.emplace(BindingPoint{0, plane0_binding_point.binding},
+                                tint::transform::multiplanar::BindingPoints{
+                                    plane1_binding_point, metadata_binding_point});
 
         // Bindings which go to the same slot in MSL do not need to be re-bound.
         if (src_binding_point == plane0_binding_point) {
diff --git a/src/tint/lang/msl/writer/common/option_helpers.h b/src/tint/lang/msl/writer/common/option_helpers.h
index f4d6dee..3cc4b8f 100644
--- a/src/tint/lang/msl/writer/common/option_helpers.h
+++ b/src/tint/lang/msl/writer/common/option_helpers.h
@@ -31,7 +31,7 @@
 #include <unordered_map>
 
 #include "src/tint/api/common/binding_point.h"
-#include "src/tint/api/options/external_texture.h"
+#include "src/tint/lang/core/common/multiplanar_options.h"
 #include "src/tint/lang/msl/writer/common/options.h"
 #include "src/tint/utils/diagnostic/diagnostic.h"
 #include "src/tint/utils/result/result.h"
@@ -48,13 +48,13 @@
 /// Populates binding-related option from the writer options
 /// @param options the writer options
 /// @param remapper_data where to put the remapper data
-/// @param external_texture where to store the external texture options
+/// @param multiplanar_map where to store the multiplanar bindings map
 /// @param array_length_from_uniform_options where to store the ArrayLengthFromUniform options
 /// Note, these are populated together because there are dependencies between the two types of data.
 void PopulateBindingRelatedOptions(
     const Options& options,
     RemapperData& remapper_data,
-    ExternalTextureOptions& external_texture,
+    tint::transform::multiplanar::BindingsMap& multiplanar_map,
     ArrayLengthFromUniformOptions& array_length_from_uniform_options);
 
 }  // namespace tint::msl::writer
diff --git a/src/tint/lang/msl/writer/raise/BUILD.bazel b/src/tint/lang/msl/writer/raise/BUILD.bazel
index 0373b09..cfb0711 100644
--- a/src/tint/lang/msl/writer/raise/BUILD.bazel
+++ b/src/tint/lang/msl/writer/raise/BUILD.bazel
@@ -54,6 +54,7 @@
     "//src/tint/api/common",
     "//src/tint/api/options",
     "//src/tint/lang/core",
+    "//src/tint/lang/core/common",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/intrinsic",
     "//src/tint/lang/core/ir",
diff --git a/src/tint/lang/msl/writer/raise/BUILD.cmake b/src/tint/lang/msl/writer/raise/BUILD.cmake
index 1c0a709..9163316 100644
--- a/src/tint/lang/msl/writer/raise/BUILD.cmake
+++ b/src/tint/lang/msl/writer/raise/BUILD.cmake
@@ -55,6 +55,7 @@
   tint_api_common
   tint_api_options
   tint_lang_core
+  tint_lang_core_common
   tint_lang_core_constant
   tint_lang_core_intrinsic
   tint_lang_core_ir
diff --git a/src/tint/lang/msl/writer/raise/BUILD.gn b/src/tint/lang/msl/writer/raise/BUILD.gn
index b7f3e7b..4f00d28 100644
--- a/src/tint/lang/msl/writer/raise/BUILD.gn
+++ b/src/tint/lang/msl/writer/raise/BUILD.gn
@@ -57,6 +57,7 @@
       "${tint_src_dir}/api/common",
       "${tint_src_dir}/api/options",
       "${tint_src_dir}/lang/core",
+      "${tint_src_dir}/lang/core/common",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/intrinsic",
       "${tint_src_dir}/lang/core/ir",
diff --git a/src/tint/lang/msl/writer/raise/raise.cc b/src/tint/lang/msl/writer/raise/raise.cc
index a392a83..3117354c 100644
--- a/src/tint/lang/msl/writer/raise/raise.cc
+++ b/src/tint/lang/msl/writer/raise/raise.cc
@@ -59,10 +59,10 @@
         }                                          \
     } while (false)
 
-    ExternalTextureOptions external_texture_options{};
+    tint::transform::multiplanar::BindingsMap multiplanar_map{};
     RemapperData remapper_data{};
     ArrayLengthFromUniformOptions array_length_from_uniform_options{};
-    PopulateBindingRelatedOptions(options, remapper_data, external_texture_options,
+    PopulateBindingRelatedOptions(options, remapper_data, multiplanar_map,
                                   array_length_from_uniform_options);
     RUN_TRANSFORM(core::ir::transform::BindingRemapper, remapper_data);
 
@@ -96,7 +96,7 @@
         RUN_TRANSFORM(core::ir::transform::Robustness, config);
     }
 
-    RUN_TRANSFORM(core::ir::transform::MultiplanarExternalTexture, external_texture_options);
+    RUN_TRANSFORM(core::ir::transform::MultiplanarExternalTexture, multiplanar_map);
     RUN_TRANSFORM(core::ir::transform::ArrayLengthFromUniform,
                   BindingPoint{0u, array_length_from_uniform_options.ubo_binding},
                   array_length_from_uniform_options.bindpoint_to_size_index);
diff --git a/src/tint/lang/spirv/writer/BUILD.bazel b/src/tint/lang/spirv/writer/BUILD.bazel
index 9cfb1ed..b4b14e7 100644
--- a/src/tint/lang/spirv/writer/BUILD.bazel
+++ b/src/tint/lang/spirv/writer/BUILD.bazel
@@ -48,8 +48,8 @@
   ],
   deps = [
     "//src/tint/api/common",
-    "//src/tint/api/options",
     "//src/tint/lang/core",
+    "//src/tint/lang/core/common",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
diff --git a/src/tint/lang/spirv/writer/BUILD.cmake b/src/tint/lang/spirv/writer/BUILD.cmake
index 0afdfec..f7e2329 100644
--- a/src/tint/lang/spirv/writer/BUILD.cmake
+++ b/src/tint/lang/spirv/writer/BUILD.cmake
@@ -56,8 +56,8 @@
 
 tint_target_add_dependencies(tint_lang_spirv_writer lib
   tint_api_common
-  tint_api_options
   tint_lang_core
+  tint_lang_core_common
   tint_lang_core_constant
   tint_lang_core_ir
   tint_lang_core_type
diff --git a/src/tint/lang/spirv/writer/BUILD.gn b/src/tint/lang/spirv/writer/BUILD.gn
index 02f722a..014de76 100644
--- a/src/tint/lang/spirv/writer/BUILD.gn
+++ b/src/tint/lang/spirv/writer/BUILD.gn
@@ -51,8 +51,8 @@
     ]
     deps = [
       "${tint_src_dir}/api/common",
-      "${tint_src_dir}/api/options",
       "${tint_src_dir}/lang/core",
+      "${tint_src_dir}/lang/core/common",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/ir",
       "${tint_src_dir}/lang/core/type",
diff --git a/src/tint/lang/spirv/writer/ast_printer/BUILD.bazel b/src/tint/lang/spirv/writer/ast_printer/BUILD.bazel
index 1b8df51..e04cdbe 100644
--- a/src/tint/lang/spirv/writer/ast_printer/BUILD.bazel
+++ b/src/tint/lang/spirv/writer/ast_printer/BUILD.bazel
@@ -51,6 +51,7 @@
     "//src/tint/api/common",
     "//src/tint/api/options",
     "//src/tint/lang/core",
+    "//src/tint/lang/core/common",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
     "//src/tint/lang/wgsl",
diff --git a/src/tint/lang/spirv/writer/ast_printer/BUILD.cmake b/src/tint/lang/spirv/writer/ast_printer/BUILD.cmake
index 1acdba0..63b7b79 100644
--- a/src/tint/lang/spirv/writer/ast_printer/BUILD.cmake
+++ b/src/tint/lang/spirv/writer/ast_printer/BUILD.cmake
@@ -52,6 +52,7 @@
   tint_api_common
   tint_api_options
   tint_lang_core
+  tint_lang_core_common
   tint_lang_core_constant
   tint_lang_core_type
   tint_lang_wgsl
diff --git a/src/tint/lang/spirv/writer/ast_printer/BUILD.gn b/src/tint/lang/spirv/writer/ast_printer/BUILD.gn
index 1ee1bb6..abd94d6 100644
--- a/src/tint/lang/spirv/writer/ast_printer/BUILD.gn
+++ b/src/tint/lang/spirv/writer/ast_printer/BUILD.gn
@@ -54,6 +54,7 @@
       "${tint_src_dir}/api/common",
       "${tint_src_dir}/api/options",
       "${tint_src_dir}/lang/core",
+      "${tint_src_dir}/lang/core/common",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/wgsl",
diff --git a/src/tint/lang/spirv/writer/ast_printer/ast_printer.cc b/src/tint/lang/spirv/writer/ast_printer/ast_printer.cc
index 72a0bab..6493419 100644
--- a/src/tint/lang/spirv/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/ast_printer.cc
@@ -110,9 +110,9 @@
         data.Add<ast::transform::Robustness::Config>(config);
     }
 
-    ExternalTextureOptions external_texture_options{};
+    tint::transform::multiplanar::BindingsMap multiplanar_map{};
     RemapperData remapper_data{};
-    PopulateRemapperAndMultiplanarOptions(options, remapper_data, external_texture_options);
+    PopulateRemapperAndMultiplanarOptions(options, remapper_data, multiplanar_map);
 
     manager.Add<ast::transform::BindingRemapper>();
     data.Add<ast::transform::BindingRemapper::Remappings>(
@@ -120,8 +120,7 @@
         /* allow_collisions */ false);
 
     // Note: it is more efficient for MultiplanarExternalTexture to come after Robustness
-    data.Add<ast::transform::MultiplanarExternalTexture::NewBindingPoints>(
-        external_texture_options.bindings_map);
+    data.Add<ast::transform::MultiplanarExternalTexture::NewBindingPoints>(multiplanar_map);
     manager.Add<ast::transform::MultiplanarExternalTexture>();
 
     {  // Builtin polyfills
diff --git a/src/tint/lang/spirv/writer/common/BUILD.bazel b/src/tint/lang/spirv/writer/common/BUILD.bazel
index 8f3b12e..a317f7e 100644
--- a/src/tint/lang/spirv/writer/common/BUILD.bazel
+++ b/src/tint/lang/spirv/writer/common/BUILD.bazel
@@ -57,7 +57,7 @@
   ],
   deps = [
     "//src/tint/api/common",
-    "//src/tint/api/options",
+    "//src/tint/lang/core/common",
     "//src/tint/utils/containers",
     "//src/tint/utils/diagnostic",
     "//src/tint/utils/ice",
diff --git a/src/tint/lang/spirv/writer/common/BUILD.cmake b/src/tint/lang/spirv/writer/common/BUILD.cmake
index 8a65fcf..94860e3 100644
--- a/src/tint/lang/spirv/writer/common/BUILD.cmake
+++ b/src/tint/lang/spirv/writer/common/BUILD.cmake
@@ -58,7 +58,7 @@
 
 tint_target_add_dependencies(tint_lang_spirv_writer_common lib
   tint_api_common
-  tint_api_options
+  tint_lang_core_common
   tint_utils_containers
   tint_utils_diagnostic
   tint_utils_ice
diff --git a/src/tint/lang/spirv/writer/common/BUILD.gn b/src/tint/lang/spirv/writer/common/BUILD.gn
index 6993246..23470d4 100644
--- a/src/tint/lang/spirv/writer/common/BUILD.gn
+++ b/src/tint/lang/spirv/writer/common/BUILD.gn
@@ -60,7 +60,7 @@
     ]
     deps = [
       "${tint_src_dir}/api/common",
-      "${tint_src_dir}/api/options",
+      "${tint_src_dir}/lang/core/common",
       "${tint_src_dir}/utils/containers",
       "${tint_src_dir}/utils/diagnostic",
       "${tint_src_dir}/utils/ice",
diff --git a/src/tint/lang/spirv/writer/common/option_helper.cc b/src/tint/lang/spirv/writer/common/option_helper.cc
index e1723bf..bfc2a6d 100644
--- a/src/tint/lang/spirv/writer/common/option_helper.cc
+++ b/src/tint/lang/spirv/writer/common/option_helper.cc
@@ -181,9 +181,10 @@
 // # Status
 // The below method assumes we run binding remapper first. So it will setup the binding data and
 // switch the value used by the multiplanar.
-void PopulateRemapperAndMultiplanarOptions(const Options& options,
-                                           RemapperData& remapper_data,
-                                           ExternalTextureOptions& external_texture) {
+void PopulateRemapperAndMultiplanarOptions(
+    const Options& options,
+    RemapperData& remapper_data,
+    tint::transform::multiplanar::BindingsMap& multiplanar_map) {
     auto create_remappings = [&remapper_data](const auto& hsh) {
         for (const auto& it : hsh) {
             const BindingPoint& src_binding_point = it.first;
@@ -214,14 +215,14 @@
         const binding::BindingInfo& plane1 = it.second.plane1;
         const binding::BindingInfo& metadata = it.second.metadata;
 
-        BindingPoint plane0_binding_point{plane0.group, plane0.binding};
-        BindingPoint plane1_binding_point{plane1.group, plane1.binding};
-        BindingPoint metadata_binding_point{metadata.group, metadata.binding};
+        const BindingPoint plane0_binding_point{plane0.group, plane0.binding};
+        const BindingPoint plane1_binding_point{plane1.group, plane1.binding};
+        const BindingPoint metadata_binding_point{metadata.group, metadata.binding};
 
         // Use the re-bound spir-v plane0 value for the lookup key.
-        external_texture.bindings_map.emplace(
-            plane0_binding_point,
-            ExternalTextureOptions::BindingPoints{plane1_binding_point, metadata_binding_point});
+        multiplanar_map.emplace(plane0_binding_point,
+                                tint::transform::multiplanar::BindingPoints{
+                                    plane1_binding_point, metadata_binding_point});
 
         // Bindings which go to the same slot in SPIR-V do not need to be re-bound.
         if (src_binding_point.group == plane0.group &&
diff --git a/src/tint/lang/spirv/writer/common/option_helpers.h b/src/tint/lang/spirv/writer/common/option_helpers.h
index 3f51355..896ef0a 100644
--- a/src/tint/lang/spirv/writer/common/option_helpers.h
+++ b/src/tint/lang/spirv/writer/common/option_helpers.h
@@ -31,7 +31,7 @@
 #include <unordered_map>
 
 #include "src/tint/api/common/binding_point.h"
-#include "src/tint/api/options/external_texture.h"
+#include "src/tint/lang/core/common/multiplanar_options.h"
 #include "src/tint/lang/spirv/writer/common/options.h"
 #include "src/tint/utils/diagnostic/diagnostic.h"
 #include "src/tint/utils/result/result.h"
@@ -47,11 +47,12 @@
 /// Populates data from the writer options for the remapper and external texture.
 /// @param options the writer options
 /// @param remapper_data where to put the remapper data
-/// @param external_texture where to store the external texture options
+/// @param multiplanar_map where to store the multiplanar texture options
 /// Note, these are populated together because there are dependencies between the two types of data.
-void PopulateRemapperAndMultiplanarOptions(const Options& options,
-                                           RemapperData& remapper_data,
-                                           ExternalTextureOptions& external_texture);
+void PopulateRemapperAndMultiplanarOptions(
+    const Options& options,
+    RemapperData& remapper_data,
+    tint::transform::multiplanar::BindingsMap& multiplanar_map);
 
 }  // namespace tint::spirv::writer
 
diff --git a/src/tint/lang/spirv/writer/raise/BUILD.bazel b/src/tint/lang/spirv/writer/raise/BUILD.bazel
index 09d9b77..970bbab 100644
--- a/src/tint/lang/spirv/writer/raise/BUILD.bazel
+++ b/src/tint/lang/spirv/writer/raise/BUILD.bazel
@@ -60,8 +60,8 @@
   ],
   deps = [
     "//src/tint/api/common",
-    "//src/tint/api/options",
     "//src/tint/lang/core",
+    "//src/tint/lang/core/common",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/intrinsic",
     "//src/tint/lang/core/ir",
diff --git a/src/tint/lang/spirv/writer/raise/BUILD.cmake b/src/tint/lang/spirv/writer/raise/BUILD.cmake
index f549a39..33ff0e9 100644
--- a/src/tint/lang/spirv/writer/raise/BUILD.cmake
+++ b/src/tint/lang/spirv/writer/raise/BUILD.cmake
@@ -61,8 +61,8 @@
 
 tint_target_add_dependencies(tint_lang_spirv_writer_raise lib
   tint_api_common
-  tint_api_options
   tint_lang_core
+  tint_lang_core_common
   tint_lang_core_constant
   tint_lang_core_intrinsic
   tint_lang_core_ir
diff --git a/src/tint/lang/spirv/writer/raise/BUILD.gn b/src/tint/lang/spirv/writer/raise/BUILD.gn
index 485ad39..a6a8303 100644
--- a/src/tint/lang/spirv/writer/raise/BUILD.gn
+++ b/src/tint/lang/spirv/writer/raise/BUILD.gn
@@ -63,8 +63,8 @@
     ]
     deps = [
       "${tint_src_dir}/api/common",
-      "${tint_src_dir}/api/options",
       "${tint_src_dir}/lang/core",
+      "${tint_src_dir}/lang/core/common",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/intrinsic",
       "${tint_src_dir}/lang/core/ir",
diff --git a/src/tint/lang/spirv/writer/raise/raise.cc b/src/tint/lang/spirv/writer/raise/raise.cc
index bbaeb1f..38b8e63 100644
--- a/src/tint/lang/spirv/writer/raise/raise.cc
+++ b/src/tint/lang/spirv/writer/raise/raise.cc
@@ -65,9 +65,9 @@
         }                                \
     } while (false)
 
-    ExternalTextureOptions external_texture_options{};
+    tint::transform::multiplanar::BindingsMap multiplanar_map{};
     RemapperData remapper_data{};
-    PopulateRemapperAndMultiplanarOptions(options, remapper_data, external_texture_options);
+    PopulateRemapperAndMultiplanarOptions(options, remapper_data, multiplanar_map);
 
     RUN_TRANSFORM(core::ir::transform::BindingRemapper, module, remapper_data);
 
@@ -105,8 +105,7 @@
         RUN_TRANSFORM(core::ir::transform::Robustness, module, config);
     }
 
-    RUN_TRANSFORM(core::ir::transform::MultiplanarExternalTexture, module,
-                  external_texture_options);
+    RUN_TRANSFORM(core::ir::transform::MultiplanarExternalTexture, module, multiplanar_map);
 
     if (!options.disable_workgroup_init &&
         !options.use_zero_initialize_workgroup_memory_extension) {
diff --git a/src/tint/lang/wgsl/ast/transform/BUILD.bazel b/src/tint/lang/wgsl/ast/transform/BUILD.bazel
index afec779..d9d9fb6 100644
--- a/src/tint/lang/wgsl/ast/transform/BUILD.bazel
+++ b/src/tint/lang/wgsl/ast/transform/BUILD.bazel
@@ -120,6 +120,7 @@
     "//src/tint/api/common",
     "//src/tint/api/options",
     "//src/tint/lang/core",
+    "//src/tint/lang/core/common",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
     "//src/tint/lang/wgsl",
@@ -195,6 +196,7 @@
     "//src/tint/api/common",
     "//src/tint/api/options",
     "//src/tint/lang/core",
+    "//src/tint/lang/core/common",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
diff --git a/src/tint/lang/wgsl/ast/transform/BUILD.cmake b/src/tint/lang/wgsl/ast/transform/BUILD.cmake
index 62c3a3e..b5f91ea 100644
--- a/src/tint/lang/wgsl/ast/transform/BUILD.cmake
+++ b/src/tint/lang/wgsl/ast/transform/BUILD.cmake
@@ -119,6 +119,7 @@
   tint_api_common
   tint_api_options
   tint_lang_core
+  tint_lang_core_common
   tint_lang_core_constant
   tint_lang_core_type
   tint_lang_wgsl
@@ -196,6 +197,7 @@
   tint_api_common
   tint_api_options
   tint_lang_core
+  tint_lang_core_common
   tint_lang_core_constant
   tint_lang_core_ir
   tint_lang_core_type
@@ -282,6 +284,7 @@
   tint_api_common
   tint_api_options
   tint_lang_core
+  tint_lang_core_common
   tint_lang_core_constant
   tint_lang_core_type
   tint_lang_wgsl
diff --git a/src/tint/lang/wgsl/ast/transform/BUILD.gn b/src/tint/lang/wgsl/ast/transform/BUILD.gn
index 3db4a21..b014cde 100644
--- a/src/tint/lang/wgsl/ast/transform/BUILD.gn
+++ b/src/tint/lang/wgsl/ast/transform/BUILD.gn
@@ -123,6 +123,7 @@
     "${tint_src_dir}/api/common",
     "${tint_src_dir}/api/options",
     "${tint_src_dir}/lang/core",
+    "${tint_src_dir}/lang/core/common",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/type",
     "${tint_src_dir}/lang/wgsl",
@@ -197,6 +198,7 @@
         "${tint_src_dir}/api/common",
         "${tint_src_dir}/api/options",
         "${tint_src_dir}/lang/core",
+        "${tint_src_dir}/lang/core/common",
         "${tint_src_dir}/lang/core/constant",
         "${tint_src_dir}/lang/core/ir",
         "${tint_src_dir}/lang/core/type",
@@ -271,6 +273,7 @@
       "${tint_src_dir}/api/common",
       "${tint_src_dir}/api/options",
       "${tint_src_dir}/lang/core",
+      "${tint_src_dir}/lang/core/common",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/wgsl",
diff --git a/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.cc b/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.cc
index c9b1313..2190cbc 100644
--- a/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.cc
+++ b/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.cc
@@ -133,7 +133,8 @@
             // binding points into the passed map.
             BindingPoint bp = *sem_var->Attributes().binding_point;
 
-            BindingsMap::const_iterator it = new_binding_points->bindings_map.find(bp);
+            const tint::transform::multiplanar::BindingsMap::const_iterator it =
+                new_binding_points->bindings_map.find(bp);
             if (it == new_binding_points->bindings_map.end()) {
                 b.Diagnostics().AddError(Source{})
                     << "missing new binding points for texture_external at binding {" << bp.group
@@ -141,7 +142,7 @@
                 continue;
             }
 
-            BindingPoints bps = it->second;
+            const tint::transform::multiplanar::BindingPoints bps = it->second;
 
             // Symbols for the newly created bindings must be saved so they can be passed as
             // parameters later. These are placed in a map and keyed by the source symbol associated
@@ -570,8 +571,9 @@
 };
 
 MultiplanarExternalTexture::NewBindingPoints::NewBindingPoints() = default;
-MultiplanarExternalTexture::NewBindingPoints::NewBindingPoints(BindingsMap inputBindingsMap,
-                                                               bool may_collide)
+MultiplanarExternalTexture::NewBindingPoints::NewBindingPoints(
+    tint::transform::multiplanar::BindingsMap inputBindingsMap,
+    bool may_collide)
     : bindings_map(std::move(inputBindingsMap)), allow_collisions(may_collide) {}
 
 MultiplanarExternalTexture::NewBindingPoints::~NewBindingPoints() = default;
diff --git a/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.h b/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.h
index d9ed67a..4157d96 100644
--- a/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.h
+++ b/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.h
@@ -32,11 +32,10 @@
 #include <utility>
 
 #include "src/tint/api/common/binding_point.h"
-#include "src/tint/api/options/external_texture.h"
 #include "src/tint/lang/core/builtin_fn.h"
+#include "src/tint/lang/core/common/multiplanar_options.h"
 #include "src/tint/lang/wgsl/ast/struct_member.h"
 #include "src/tint/lang/wgsl/ast/transform/transform.h"
-#include "src/tint/utils/reflection/reflection.h"
 
 namespace tint::ast::transform {
 
@@ -53,15 +52,6 @@
 // step and skipping all other steps.
 class MultiplanarExternalTexture final : public Castable<MultiplanarExternalTexture, Transform> {
   public:
-    /// This struct identifies the binding groups and locations for new bindings to
-    /// use when transforming a texture_external instance.
-    using BindingPoints = ExternalTextureOptions::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 = ExternalTextureOptions::BindingsMap;
-
     /// NewBindingPoints is consumed by the MultiplanarExternalTexture transform.
     /// Data holds information about location of each texture_external binding and
     /// which binding slots it should expand into.
@@ -73,13 +63,14 @@
         /// @param bm a map to the new binding slots to use.
         /// @param may_collide if true, then validation will be disabled for binding point
         /// collisions generated by this transform
-        explicit NewBindingPoints(BindingsMap bm, bool may_collide = false);
+        explicit NewBindingPoints(tint::transform::multiplanar::BindingsMap bm,
+                                  bool may_collide = false);
 
         /// Destructor
         ~NewBindingPoints() override;
 
         /// A map of new binding points to use.
-        BindingsMap bindings_map;
+        tint::transform::multiplanar::BindingsMap bindings_map;
 
         /// If true, then validation will be disabled for bindign poitn collisions generated by this
         /// transform.
diff --git a/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture_test.cc b/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture_test.cc
index a16eb09..15c4d66 100644
--- a/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture_test.cc
@@ -38,7 +38,7 @@
 
     DataMap data;
     data.Add<MultiplanarExternalTexture::NewBindingPoints>(
-        MultiplanarExternalTexture::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
+        tint::transform::multiplanar::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
 
     EXPECT_FALSE(ShouldRun<MultiplanarExternalTexture>(src, data));
 }
@@ -50,7 +50,7 @@
 
     DataMap data;
     data.Add<MultiplanarExternalTexture::NewBindingPoints>(
-        MultiplanarExternalTexture::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
+        tint::transform::multiplanar::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
 
     EXPECT_TRUE(ShouldRun<MultiplanarExternalTexture>(src, data));
 }
@@ -61,7 +61,7 @@
 
     DataMap data;
     data.Add<MultiplanarExternalTexture::NewBindingPoints>(
-        MultiplanarExternalTexture::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
+        tint::transform::multiplanar::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
 
     EXPECT_TRUE(ShouldRun<MultiplanarExternalTexture>(src, data));
 }
@@ -73,7 +73,7 @@
 
     DataMap data;
     data.Add<MultiplanarExternalTexture::NewBindingPoints>(
-        MultiplanarExternalTexture::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
+        tint::transform::multiplanar::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
 
     EXPECT_TRUE(ShouldRun<MultiplanarExternalTexture>(src, data));
 }
@@ -115,7 +115,7 @@
     // This bindings map specifies 0,0 as the location of the texture_external,
     // which is incorrect.
     data.Add<MultiplanarExternalTexture::NewBindingPoints>(
-        MultiplanarExternalTexture::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
+        tint::transform::multiplanar::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -178,7 +178,7 @@
 
     DataMap data;
     data.Add<MultiplanarExternalTexture::NewBindingPoints>(
-        MultiplanarExternalTexture::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
+        tint::transform::multiplanar::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -262,7 +262,7 @@
 
     DataMap data;
     data.Add<MultiplanarExternalTexture::NewBindingPoints>(
-        MultiplanarExternalTexture::BindingsMap{{{0, 0}, {{0, 1}, {0, 0}}}},
+        tint::transform::multiplanar::BindingsMap{{{0, 0}, {{0, 1}, {0, 0}}}},
         /* allow collisions */ true);
     auto got = Run<MultiplanarExternalTexture>(src, data);
 
@@ -327,7 +327,7 @@
 
     DataMap data;
     data.Add<MultiplanarExternalTexture::NewBindingPoints>(
-        MultiplanarExternalTexture::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
+        tint::transform::multiplanar::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -414,7 +414,7 @@
 
     DataMap data;
     data.Add<MultiplanarExternalTexture::NewBindingPoints>(
-        MultiplanarExternalTexture::BindingsMap{{{0, 1}, {{0, 2}, {0, 3}}}});
+        tint::transform::multiplanar::BindingsMap{{{0, 1}, {{0, 2}, {0, 3}}}});
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -501,7 +501,7 @@
 
     DataMap data;
     data.Add<MultiplanarExternalTexture::NewBindingPoints>(
-        MultiplanarExternalTexture::BindingsMap{{{0, 1}, {{0, 2}, {0, 3}}}});
+        tint::transform::multiplanar::BindingsMap{{{0, 1}, {{0, 2}, {0, 3}}}});
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -607,7 +607,7 @@
 
     DataMap data;
     data.Add<MultiplanarExternalTexture::NewBindingPoints>(
-        MultiplanarExternalTexture::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
+        tint::transform::multiplanar::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -713,7 +713,7 @@
 
     DataMap data;
     data.Add<MultiplanarExternalTexture::NewBindingPoints>(
-        MultiplanarExternalTexture::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
+        tint::transform::multiplanar::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -818,7 +818,7 @@
 
     DataMap data;
     data.Add<MultiplanarExternalTexture::NewBindingPoints>(
-        MultiplanarExternalTexture::BindingsMap{{{0, 1}, {{0, 2}, {0, 3}}}});
+        tint::transform::multiplanar::BindingsMap{{{0, 1}, {{0, 2}, {0, 3}}}});
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -923,7 +923,7 @@
 
     DataMap data;
     data.Add<MultiplanarExternalTexture::NewBindingPoints>(
-        MultiplanarExternalTexture::BindingsMap{{{0, 1}, {{0, 2}, {0, 3}}}});
+        tint::transform::multiplanar::BindingsMap{{{0, 1}, {{0, 2}, {0, 3}}}});
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -1033,12 +1033,13 @@
 )";
 
     DataMap data;
-    data.Add<MultiplanarExternalTexture::NewBindingPoints>(MultiplanarExternalTexture::BindingsMap{
-        {{0, 1}, {{0, 4}, {0, 5}}},
-        {{0, 2}, {{0, 6}, {0, 7}}},
-        {{0, 3}, {{0, 8}, {0, 9}}},
-        {{1, 0}, {{1, 1}, {1, 2}}},
-    });
+    data.Add<MultiplanarExternalTexture::NewBindingPoints>(
+        tint::transform::multiplanar::BindingsMap{
+            {{0, 1}, {{0, 4}, {0, 5}}},
+            {{0, 2}, {{0, 6}, {0, 7}}},
+            {{0, 3}, {{0, 8}, {0, 9}}},
+            {{1, 0}, {{1, 1}, {1, 2}}},
+        });
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -1132,9 +1133,10 @@
 }
 )";
     DataMap data;
-    data.Add<MultiplanarExternalTexture::NewBindingPoints>(MultiplanarExternalTexture::BindingsMap{
-        {{0, 0}, {{0, 2}, {0, 3}}},
-    });
+    data.Add<MultiplanarExternalTexture::NewBindingPoints>(
+        tint::transform::multiplanar::BindingsMap{
+            {{0, 0}, {{0, 2}, {0, 3}}},
+        });
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -1228,9 +1230,10 @@
 @group(0) @binding(1) var smp : sampler;
 )";
     DataMap data;
-    data.Add<MultiplanarExternalTexture::NewBindingPoints>(MultiplanarExternalTexture::BindingsMap{
-        {{0, 0}, {{0, 2}, {0, 3}}},
-    });
+    data.Add<MultiplanarExternalTexture::NewBindingPoints>(
+        tint::transform::multiplanar::BindingsMap{
+            {{0, 0}, {{0, 2}, {0, 3}}},
+        });
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -1324,9 +1327,10 @@
 }
 )";
     DataMap data;
-    data.Add<MultiplanarExternalTexture::NewBindingPoints>(MultiplanarExternalTexture::BindingsMap{
-        {{0, 0}, {{0, 2}, {0, 3}}},
-    });
+    data.Add<MultiplanarExternalTexture::NewBindingPoints>(
+        tint::transform::multiplanar::BindingsMap{
+            {{0, 0}, {{0, 2}, {0, 3}}},
+        });
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -1429,10 +1433,11 @@
 }
 )";
     DataMap data;
-    data.Add<MultiplanarExternalTexture::NewBindingPoints>(MultiplanarExternalTexture::BindingsMap{
-        {{0, 0}, {{0, 3}, {0, 4}}},
-        {{0, 2}, {{0, 5}, {0, 6}}},
-    });
+    data.Add<MultiplanarExternalTexture::NewBindingPoints>(
+        tint::transform::multiplanar::BindingsMap{
+            {{0, 0}, {{0, 3}, {0, 4}}},
+            {{0, 2}, {{0, 5}, {0, 6}}},
+        });
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -1536,10 +1541,11 @@
 @group(0) @binding(2) var ext_tex2 : texture_2d<f32>;
 )";
     DataMap data;
-    data.Add<MultiplanarExternalTexture::NewBindingPoints>(MultiplanarExternalTexture::BindingsMap{
-        {{0, 0}, {{0, 3}, {0, 4}}},
-        {{0, 2}, {{0, 5}, {0, 6}}},
-    });
+    data.Add<MultiplanarExternalTexture::NewBindingPoints>(
+        tint::transform::multiplanar::BindingsMap{
+            {{0, 0}, {{0, 3}, {0, 4}}},
+            {{0, 2}, {{0, 5}, {0, 6}}},
+        });
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -1641,9 +1647,10 @@
 }
 )";
     DataMap data;
-    data.Add<MultiplanarExternalTexture::NewBindingPoints>(MultiplanarExternalTexture::BindingsMap{
-        {{0, 0}, {{0, 2}, {0, 3}}},
-    });
+    data.Add<MultiplanarExternalTexture::NewBindingPoints>(
+        tint::transform::multiplanar::BindingsMap{
+            {{0, 0}, {{0, 2}, {0, 3}}},
+        });
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -1745,9 +1752,10 @@
 }
 )";
     DataMap data;
-    data.Add<MultiplanarExternalTexture::NewBindingPoints>(MultiplanarExternalTexture::BindingsMap{
-        {{0, 0}, {{0, 2}, {0, 3}}},
-    });
+    data.Add<MultiplanarExternalTexture::NewBindingPoints>(
+        tint::transform::multiplanar::BindingsMap{
+            {{0, 0}, {{0, 2}, {0, 3}}},
+        });
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -1797,7 +1805,7 @@
 
     DataMap data;
     data.Add<MultiplanarExternalTexture::NewBindingPoints>(
-        MultiplanarExternalTexture::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
+        tint::transform::multiplanar::BindingsMap{{{0, 0}, {{0, 1}, {0, 2}}}});
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -1894,9 +1902,10 @@
 }
 )";
     DataMap data;
-    data.Add<MultiplanarExternalTexture::NewBindingPoints>(MultiplanarExternalTexture::BindingsMap{
-        {{0, 0}, {{0, 2}, {0, 3}}},
-    });
+    data.Add<MultiplanarExternalTexture::NewBindingPoints>(
+        tint::transform::multiplanar::BindingsMap{
+            {{0, 0}, {{0, 2}, {0, 3}}},
+        });
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }
@@ -1993,9 +2002,10 @@
 alias ET = texture_external;
 )";
     DataMap data;
-    data.Add<MultiplanarExternalTexture::NewBindingPoints>(MultiplanarExternalTexture::BindingsMap{
-        {{0, 0}, {{0, 2}, {0, 3}}},
-    });
+    data.Add<MultiplanarExternalTexture::NewBindingPoints>(
+        tint::transform::multiplanar::BindingsMap{
+            {{0, 0}, {{0, 2}, {0, 3}}},
+        });
     auto got = Run<MultiplanarExternalTexture>(src, data);
     EXPECT_EQ(expect, str(got));
 }