HLSL-IR: implement pixel_local feature

Bug: 373991286
Bug: 42242273
Change-Id: I47bfcef471d0e30063a1b4ac4879a27f2e5cbec6
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/211274
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
diff --git a/src/tint/lang/core/ir/transform/shader_io.cc b/src/tint/lang/core/ir/transform/shader_io.cc
index 20c295e..4e18bba 100644
--- a/src/tint/lang/core/ir/transform/shader_io.cc
+++ b/src/tint/lang/core/ir/transform/shader_io.cc
@@ -80,11 +80,6 @@
                 continue;
             }
 
-            // Skip entry points with no inputs or outputs.
-            if (func->Params().IsEmpty() && func->ReturnType()->Is<core::type::Void>()) {
-                continue;
-            }
-
             ProcessEntryPoint(func, make_backend_state(ir, func));
         }
 
@@ -127,6 +122,11 @@
         auto new_params = backend->FinalizeInputs();
         auto* new_ret_ty = backend->FinalizeOutputs();
 
+        // Skip entry points with no new inputs or outputs.
+        if (!backend->HasInputs() && !backend->HasOutputs()) {
+            return;
+        }
+
         // Rename the old function and remove its pipeline stage and workgroup size, as we will be
         // wrapping it with a new entry point.
         auto name = ir.NameOf(ep).Name();
diff --git a/src/tint/lang/core/ir/transform/shader_io.h b/src/tint/lang/core/ir/transform/shader_io.h
index 689cf87..30c9db37 100644
--- a/src/tint/lang/core/ir/transform/shader_io.h
+++ b/src/tint/lang/core/ir/transform/shader_io.h
@@ -51,9 +51,7 @@
     /// @param type the type of the input
     /// @param attributes the IO attributes
     /// @returns the index of the input
-    virtual uint32_t AddInput(Symbol name,
-                              const core::type::Type* type,
-                              core::IOAttributes attributes) {
+    uint32_t AddInput(Symbol name, const core::type::Type* type, core::IOAttributes attributes) {
         inputs.Push({name, type, std::move(attributes)});
         return uint32_t(inputs.Length() - 1);
     }
@@ -63,13 +61,17 @@
     /// @param type the type of the output
     /// @param attributes the IO attributes
     /// @returns the index of the output
-    virtual uint32_t AddOutput(Symbol name,
-                               const core::type::Type* type,
-                               core::IOAttributes attributes) {
+    uint32_t AddOutput(Symbol name, const core::type::Type* type, core::IOAttributes attributes) {
         outputs.Push({name, type, std::move(attributes)});
         return uint32_t(outputs.Length() - 1);
     }
 
+    /// @returns true if inputs were added
+    bool HasInputs() const { return !inputs.IsEmpty(); }
+
+    // @returns true if outputs were added
+    bool HasOutputs() const { return !outputs.IsEmpty(); }
+
     /// Finalize the shader inputs and create any state needed for the new entry point function.
     /// @returns the list of function parameters for the new entry point
     virtual Vector<FunctionParam*, 4> FinalizeInputs() = 0;
diff --git a/src/tint/lang/hlsl/hlsl.def b/src/tint/lang/hlsl/hlsl.def
index 877bf52..4d94062 100644
--- a/src/tint/lang/hlsl/hlsl.def
+++ b/src/tint/lang/hlsl/hlsl.def
@@ -87,6 +87,8 @@
 type texture_storage_2d_array<F: texel_format, A: access>
 type texture_storage_3d<F: texel_format, A: access>
 
+type rasterizer_ordered_texture_2d<F: texel_format>
+
 ////////////////////////////////////////////////////////////////////////////////
 // Type matchers                                                              //
 ////////////////////////////////////////////////////////////////////////////////
@@ -195,6 +197,16 @@
 implicit(T: fi32_f16) fn sign(T) -> i32
 implicit(N: num, T: fi32_f16) fn sign(vec<N, T>) -> vec<N, i32>
 
+implicit(C: iu32) fn textureStore(texture: rasterizer_ordered_texture_2d<f32_texel_format>,
+                          coords: vec2<C>,
+                           value: vec4<f32>)
+implicit(C: iu32) fn textureStore(texture: rasterizer_ordered_texture_2d<i32_texel_format>,
+                          coords: vec2<C>,
+                           value: vec4<i32>)
+implicit(C: iu32) fn textureStore(texture: rasterizer_ordered_texture_2d<u32_texel_format>,
+                          coords: vec2<C>,
+                           value: vec4<u32>)
+
 implicit(C: iu32) fn textureStore(texture: texture_storage_1d<f32_texel_format, writable>,
                           coords: C,
                            value: vec4<f32>)
@@ -529,6 +541,10 @@
                                   location: vec2<i32>,
                               sample_index: i32) -> vec4<f32>
 
+@member_function implicit(F: f32_texel_format, C: iu32) fn Load(texture: rasterizer_ordered_texture_2d<F>, location: vec2<C>) -> vec4<f32>
+@member_function implicit(F: u32_texel_format, C: iu32) fn Load(texture: rasterizer_ordered_texture_2d<F>, location: vec2<C>) -> vec4<u32>
+@member_function implicit(F: i32_texel_format, C: iu32) fn Load(texture: rasterizer_ordered_texture_2d<F>, location: vec2<C>) -> vec4<i32>
+
 @member_function implicit(F: f32_texel_format, A: readable) fn Load(texture: texture_storage_1d<F, A>,
                                                           location: vec2<i32>) -> vec4<f32>
 @member_function implicit(F: f32_texel_format, A: readable) fn Load(texture: texture_storage_2d<F, A>,
diff --git a/src/tint/lang/hlsl/intrinsic/data.cc b/src/tint/lang/hlsl/intrinsic/data.cc
index a09c776..751f89a 100644
--- a/src/tint/lang/hlsl/intrinsic/data.cc
+++ b/src/tint/lang/hlsl/intrinsic/data.cc
@@ -871,6 +871,26 @@
 };
 
 
+/// TypeMatcher for 'type rasterizer_ordered_texture_2d'
+constexpr TypeMatcher kRasterizerOrderedTexture2DMatcher {
+/* match */ [](MatchState& state, const Type* ty) -> const Type* {
+  Number F = Number::invalid;
+    if (!MatchRasterizerOrderedTexture2D(state, ty, F)) {
+      return nullptr;
+    }
+    F = state.Num(F);
+    if (!F.IsValid()) {
+      return nullptr;
+    }
+    return BuildRasterizerOrderedTexture2D(state, ty, F);
+  },
+/* print */ []([[maybe_unused]] MatchState* state, StyledText& out) {StyledText F;
+  state->PrintNum(F);
+    out << style::Type("rasterizer_ordered_texture_2d", "<", F, ">");
+  }
+};
+
+
 /// TypeMatcher for 'match iu32'
 constexpr TypeMatcher kIu32Matcher {
 /* match */ [](MatchState& state, const Type* ty) -> const Type* {
@@ -1195,13 +1215,14 @@
   /* [42] */ kTextureStorage2DMatcher,
   /* [43] */ kTextureStorage2DArrayMatcher,
   /* [44] */ kTextureStorage3DMatcher,
-  /* [45] */ kIu32Matcher,
-  /* [46] */ kFiu32Matcher,
-  /* [47] */ kF32U32Matcher,
-  /* [48] */ kF32I32Matcher,
-  /* [49] */ kF32F16Matcher,
-  /* [50] */ kFi32F16Matcher,
-  /* [51] */ kFiu32F16Matcher,
+  /* [45] */ kRasterizerOrderedTexture2DMatcher,
+  /* [46] */ kIu32Matcher,
+  /* [47] */ kFiu32Matcher,
+  /* [48] */ kF32U32Matcher,
+  /* [49] */ kF32I32Matcher,
+  /* [50] */ kF32F16Matcher,
+  /* [51] */ kFi32F16Matcher,
+  /* [52] */ kFiu32F16Matcher,
 };
 
 /// The template numbers, and number matchers
@@ -1240,7 +1261,7 @@
   /* [15] */ MatcherIndex(4),
   /* [16] */ MatcherIndex(8),
   /* [17] */ MatcherIndex(5),
-  /* [18] */ MatcherIndex(45),
+  /* [18] */ MatcherIndex(46),
   /* [19] */ MatcherIndex(7),
   /* [20] */ MatcherIndex(22),
   /* [21] */ MatcherIndex(2),
@@ -1288,121 +1309,128 @@
   /* [63] */ MatcherIndex(41),
   /* [64] */ MatcherIndex(10),
   /* [65] */ MatcherIndex(9),
-  /* [66] */ MatcherIndex(5),
+  /* [66] */ MatcherIndex(1),
   /* [67] */ MatcherIndex(42),
   /* [68] */ MatcherIndex(10),
   /* [69] */ MatcherIndex(9),
-  /* [70] */ MatcherIndex(7),
+  /* [70] */ MatcherIndex(5),
   /* [71] */ MatcherIndex(43),
   /* [72] */ MatcherIndex(10),
   /* [73] */ MatcherIndex(9),
-  /* [74] */ MatcherIndex(6),
+  /* [74] */ MatcherIndex(7),
   /* [75] */ MatcherIndex(44),
   /* [76] */ MatcherIndex(10),
   /* [77] */ MatcherIndex(9),
-  /* [78] */ MatcherIndex(41),
-  /* [79] */ MatcherIndex(12),
-  /* [80] */ MatcherIndex(9),
-  /* [81] */ MatcherIndex(42),
-  /* [82] */ MatcherIndex(12),
-  /* [83] */ MatcherIndex(9),
-  /* [84] */ MatcherIndex(43),
-  /* [85] */ MatcherIndex(12),
-  /* [86] */ MatcherIndex(9),
-  /* [87] */ MatcherIndex(44),
-  /* [88] */ MatcherIndex(12),
-  /* [89] */ MatcherIndex(9),
-  /* [90] */ MatcherIndex(41),
-  /* [91] */ MatcherIndex(11),
-  /* [92] */ MatcherIndex(9),
-  /* [93] */ MatcherIndex(42),
-  /* [94] */ MatcherIndex(11),
-  /* [95] */ MatcherIndex(9),
-  /* [96] */ MatcherIndex(43),
-  /* [97] */ MatcherIndex(11),
-  /* [98] */ MatcherIndex(9),
-  /* [99] */ MatcherIndex(44),
-  /* [100] */ MatcherIndex(11),
-  /* [101] */ MatcherIndex(9),
-  /* [102] */ MatcherIndex(41),
-  /* [103] */ MatcherIndex(0),
-  /* [104] */ MatcherIndex(1),
-  /* [105] */ MatcherIndex(42),
-  /* [106] */ MatcherIndex(0),
-  /* [107] */ MatcherIndex(1),
-  /* [108] */ MatcherIndex(43),
-  /* [109] */ MatcherIndex(0),
-  /* [110] */ MatcherIndex(1),
-  /* [111] */ MatcherIndex(44),
-  /* [112] */ MatcherIndex(0),
-  /* [113] */ MatcherIndex(1),
-  /* [114] */ MatcherIndex(24),
-  /* [115] */ MatcherIndex(7),
-  /* [116] */ MatcherIndex(11),
-  /* [117] */ MatcherIndex(5),
-  /* [118] */ MatcherIndex(11),
-  /* [119] */ MatcherIndex(4),
-  /* [120] */ MatcherIndex(11),
-  /* [121] */ MatcherIndex(6),
+  /* [78] */ MatcherIndex(6),
+  /* [79] */ MatcherIndex(41),
+  /* [80] */ MatcherIndex(12),
+  /* [81] */ MatcherIndex(9),
+  /* [82] */ MatcherIndex(42),
+  /* [83] */ MatcherIndex(12),
+  /* [84] */ MatcherIndex(9),
+  /* [85] */ MatcherIndex(43),
+  /* [86] */ MatcherIndex(12),
+  /* [87] */ MatcherIndex(9),
+  /* [88] */ MatcherIndex(44),
+  /* [89] */ MatcherIndex(12),
+  /* [90] */ MatcherIndex(9),
+  /* [91] */ MatcherIndex(41),
+  /* [92] */ MatcherIndex(11),
+  /* [93] */ MatcherIndex(9),
+  /* [94] */ MatcherIndex(42),
+  /* [95] */ MatcherIndex(11),
+  /* [96] */ MatcherIndex(9),
+  /* [97] */ MatcherIndex(43),
+  /* [98] */ MatcherIndex(11),
+  /* [99] */ MatcherIndex(9),
+  /* [100] */ MatcherIndex(44),
+  /* [101] */ MatcherIndex(11),
+  /* [102] */ MatcherIndex(9),
+  /* [103] */ MatcherIndex(41),
+  /* [104] */ MatcherIndex(0),
+  /* [105] */ MatcherIndex(1),
+  /* [106] */ MatcherIndex(42),
+  /* [107] */ MatcherIndex(0),
+  /* [108] */ MatcherIndex(1),
+  /* [109] */ MatcherIndex(43),
+  /* [110] */ MatcherIndex(0),
+  /* [111] */ MatcherIndex(1),
+  /* [112] */ MatcherIndex(44),
+  /* [113] */ MatcherIndex(0),
+  /* [114] */ MatcherIndex(1),
+  /* [115] */ MatcherIndex(24),
+  /* [116] */ MatcherIndex(7),
+  /* [117] */ MatcherIndex(11),
+  /* [118] */ MatcherIndex(5),
+  /* [119] */ MatcherIndex(11),
+  /* [120] */ MatcherIndex(4),
+  /* [121] */ MatcherIndex(45),
   /* [122] */ MatcherIndex(10),
   /* [123] */ MatcherIndex(0),
   /* [124] */ MatcherIndex(11),
-  /* [125] */ MatcherIndex(0),
-  /* [126] */ MatcherIndex(29),
-  /* [127] */ MatcherIndex(0),
-  /* [128] */ MatcherIndex(30),
-  /* [129] */ MatcherIndex(0),
-  /* [130] */ MatcherIndex(10),
-  /* [131] */ MatcherIndex(4),
-  /* [132] */ MatcherIndex(31),
-  /* [133] */ MatcherIndex(0),
-  /* [134] */ MatcherIndex(40),
-  /* [135] */ MatcherIndex(0),
-  /* [136] */ MatcherIndex(32),
-  /* [137] */ MatcherIndex(0),
-  /* [138] */ MatcherIndex(10),
-  /* [139] */ MatcherIndex(5),
-  /* [140] */ MatcherIndex(10),
-  /* [141] */ MatcherIndex(7),
-  /* [142] */ MatcherIndex(11),
-  /* [143] */ MatcherIndex(7),
-  /* [144] */ MatcherIndex(24),
-  /* [145] */ MatcherIndex(9),
-  /* [146] */ MatcherIndex(10),
-  /* [147] */ MatcherIndex(6),
-  /* [148] */ MatcherIndex(33),
-  /* [149] */ MatcherIndex(0),
-  /* [150] */ MatcherIndex(34),
-  /* [151] */ MatcherIndex(0),
-  /* [152] */ MatcherIndex(24),
-  /* [153] */ MatcherIndex(0),
-  /* [154] */ MatcherIndex(29),
-  /* [155] */ MatcherIndex(6),
-  /* [156] */ MatcherIndex(30),
-  /* [157] */ MatcherIndex(6),
-  /* [158] */ MatcherIndex(31),
-  /* [159] */ MatcherIndex(6),
-  /* [160] */ MatcherIndex(32),
-  /* [161] */ MatcherIndex(6),
-  /* [162] */ MatcherIndex(33),
-  /* [163] */ MatcherIndex(6),
-  /* [164] */ MatcherIndex(34),
-  /* [165] */ MatcherIndex(6),
-  /* [166] */ MatcherIndex(47),
-  /* [167] */ MatcherIndex(48),
-  /* [168] */ MatcherIndex(49),
-  /* [169] */ MatcherIndex(26),
-  /* [170] */ MatcherIndex(25),
-  /* [171] */ MatcherIndex(50),
-  /* [172] */ MatcherIndex(51),
-  /* [173] */ MatcherIndex(46),
-  /* [174] */ MatcherIndex(35),
-  /* [175] */ MatcherIndex(36),
-  /* [176] */ MatcherIndex(39),
-  /* [177] */ MatcherIndex(28),
-  /* [178] */ MatcherIndex(37),
-  /* [179] */ MatcherIndex(38),
-  /* [180] */ MatcherIndex(27),
+  /* [125] */ MatcherIndex(6),
+  /* [126] */ MatcherIndex(45),
+  /* [127] */ MatcherIndex(12),
+  /* [128] */ MatcherIndex(45),
+  /* [129] */ MatcherIndex(11),
+  /* [130] */ MatcherIndex(0),
+  /* [131] */ MatcherIndex(29),
+  /* [132] */ MatcherIndex(0),
+  /* [133] */ MatcherIndex(30),
+  /* [134] */ MatcherIndex(0),
+  /* [135] */ MatcherIndex(10),
+  /* [136] */ MatcherIndex(4),
+  /* [137] */ MatcherIndex(31),
+  /* [138] */ MatcherIndex(0),
+  /* [139] */ MatcherIndex(40),
+  /* [140] */ MatcherIndex(0),
+  /* [141] */ MatcherIndex(32),
+  /* [142] */ MatcherIndex(0),
+  /* [143] */ MatcherIndex(45),
+  /* [144] */ MatcherIndex(0),
+  /* [145] */ MatcherIndex(10),
+  /* [146] */ MatcherIndex(5),
+  /* [147] */ MatcherIndex(10),
+  /* [148] */ MatcherIndex(7),
+  /* [149] */ MatcherIndex(11),
+  /* [150] */ MatcherIndex(7),
+  /* [151] */ MatcherIndex(24),
+  /* [152] */ MatcherIndex(9),
+  /* [153] */ MatcherIndex(10),
+  /* [154] */ MatcherIndex(6),
+  /* [155] */ MatcherIndex(33),
+  /* [156] */ MatcherIndex(0),
+  /* [157] */ MatcherIndex(34),
+  /* [158] */ MatcherIndex(0),
+  /* [159] */ MatcherIndex(24),
+  /* [160] */ MatcherIndex(0),
+  /* [161] */ MatcherIndex(29),
+  /* [162] */ MatcherIndex(6),
+  /* [163] */ MatcherIndex(30),
+  /* [164] */ MatcherIndex(6),
+  /* [165] */ MatcherIndex(31),
+  /* [166] */ MatcherIndex(6),
+  /* [167] */ MatcherIndex(32),
+  /* [168] */ MatcherIndex(6),
+  /* [169] */ MatcherIndex(33),
+  /* [170] */ MatcherIndex(6),
+  /* [171] */ MatcherIndex(34),
+  /* [172] */ MatcherIndex(6),
+  /* [173] */ MatcherIndex(48),
+  /* [174] */ MatcherIndex(49),
+  /* [175] */ MatcherIndex(50),
+  /* [176] */ MatcherIndex(26),
+  /* [177] */ MatcherIndex(25),
+  /* [178] */ MatcherIndex(51),
+  /* [179] */ MatcherIndex(52),
+  /* [180] */ MatcherIndex(47),
+  /* [181] */ MatcherIndex(35),
+  /* [182] */ MatcherIndex(36),
+  /* [183] */ MatcherIndex(39),
+  /* [184] */ MatcherIndex(28),
+  /* [185] */ MatcherIndex(37),
+  /* [186] */ MatcherIndex(38),
+  /* [187] */ MatcherIndex(27),
 };
 
 static_assert(MatcherIndicesIndex::CanIndex(kMatcherIndices),
@@ -1412,7 +1440,7 @@
   {
     /* [0] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(132),
+    /* matcher_indices */ MatcherIndicesIndex(137),
   },
   {
     /* [1] */
@@ -1442,7 +1470,7 @@
   {
     /* [6] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(136),
+    /* matcher_indices */ MatcherIndicesIndex(141),
   },
   {
     /* [7] */
@@ -1472,7 +1500,7 @@
   {
     /* [12] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(150),
+    /* matcher_indices */ MatcherIndicesIndex(157),
   },
   {
     /* [13] */
@@ -1502,7 +1530,7 @@
   {
     /* [18] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(175),
+    /* matcher_indices */ MatcherIndicesIndex(182),
   },
   {
     /* [19] */
@@ -1532,7 +1560,7 @@
   {
     /* [24] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(179),
+    /* matcher_indices */ MatcherIndicesIndex(186),
   },
   {
     /* [25] */
@@ -1562,27 +1590,27 @@
   {
     /* [30] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(156),
+    /* matcher_indices */ MatcherIndicesIndex(163),
   },
   {
     /* [31] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [32] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(73),
+    /* matcher_indices */ MatcherIndicesIndex(77),
   },
   {
     /* [33] */
     /* usage */ core::ParameterUsage::kDdx,
-    /* matcher_indices */ MatcherIndicesIndex(73),
+    /* matcher_indices */ MatcherIndicesIndex(77),
   },
   {
     /* [34] */
     /* usage */ core::ParameterUsage::kDdy,
-    /* matcher_indices */ MatcherIndicesIndex(73),
+    /* matcher_indices */ MatcherIndicesIndex(77),
   },
   {
     /* [35] */
@@ -1592,27 +1620,27 @@
   {
     /* [36] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(158),
+    /* matcher_indices */ MatcherIndicesIndex(165),
   },
   {
     /* [37] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [38] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [39] */
     /* usage */ core::ParameterUsage::kDdx,
-    /* matcher_indices */ MatcherIndicesIndex(73),
+    /* matcher_indices */ MatcherIndicesIndex(77),
   },
   {
     /* [40] */
     /* usage */ core::ParameterUsage::kDdy,
-    /* matcher_indices */ MatcherIndicesIndex(73),
+    /* matcher_indices */ MatcherIndicesIndex(77),
   },
   {
     /* [41] */
@@ -1622,37 +1650,37 @@
   {
     /* [42] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(160),
+    /* matcher_indices */ MatcherIndicesIndex(167),
   },
   {
     /* [43] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [44] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [45] */
     /* usage */ core::ParameterUsage::kDdx,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [46] */
     /* usage */ core::ParameterUsage::kDdy,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [47] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(130),
+    /* matcher_indices */ MatcherIndicesIndex(135),
   },
   {
     /* [48] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(114),
+    /* matcher_indices */ MatcherIndicesIndex(115),
   },
   {
     /* [49] */
@@ -1677,17 +1705,17 @@
   {
     /* [53] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(174),
+    /* matcher_indices */ MatcherIndicesIndex(181),
   },
   {
     /* [54] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(177),
+    /* matcher_indices */ MatcherIndicesIndex(184),
   },
   {
     /* [55] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(73),
+    /* matcher_indices */ MatcherIndicesIndex(77),
   },
   {
     /* [56] */
@@ -1702,17 +1730,17 @@
   {
     /* [58] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(175),
+    /* matcher_indices */ MatcherIndicesIndex(182),
   },
   {
     /* [59] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(177),
+    /* matcher_indices */ MatcherIndicesIndex(184),
   },
   {
     /* [60] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [61] */
@@ -1727,7 +1755,7 @@
   {
     /* [63] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(128),
+    /* matcher_indices */ MatcherIndicesIndex(133),
   },
   {
     /* [64] */
@@ -1752,7 +1780,7 @@
   {
     /* [68] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(148),
+    /* matcher_indices */ MatcherIndicesIndex(155),
   },
   {
     /* [69] */
@@ -1777,7 +1805,7 @@
   {
     /* [73] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(174),
+    /* matcher_indices */ MatcherIndicesIndex(181),
   },
   {
     /* [74] */
@@ -1802,7 +1830,7 @@
   {
     /* [78] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(178),
+    /* matcher_indices */ MatcherIndicesIndex(185),
   },
   {
     /* [79] */
@@ -1827,17 +1855,17 @@
   {
     /* [83] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(156),
+    /* matcher_indices */ MatcherIndicesIndex(163),
   },
   {
     /* [84] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [85] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(73),
+    /* matcher_indices */ MatcherIndicesIndex(77),
   },
   {
     /* [86] */
@@ -1852,17 +1880,17 @@
   {
     /* [88] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(158),
+    /* matcher_indices */ MatcherIndicesIndex(165),
   },
   {
     /* [89] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [90] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [91] */
@@ -1877,17 +1905,17 @@
   {
     /* [93] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(160),
+    /* matcher_indices */ MatcherIndicesIndex(167),
   },
   {
     /* [94] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [95] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [96] */
@@ -1897,22 +1925,22 @@
   {
     /* [97] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(130),
+    /* matcher_indices */ MatcherIndicesIndex(135),
   },
   {
     /* [98] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(174),
+    /* matcher_indices */ MatcherIndicesIndex(181),
   },
   {
     /* [99] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(177),
+    /* matcher_indices */ MatcherIndicesIndex(184),
   },
   {
     /* [100] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(73),
+    /* matcher_indices */ MatcherIndicesIndex(77),
   },
   {
     /* [101] */
@@ -1927,17 +1955,17 @@
   {
     /* [103] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(175),
+    /* matcher_indices */ MatcherIndicesIndex(182),
   },
   {
     /* [104] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(177),
+    /* matcher_indices */ MatcherIndicesIndex(184),
   },
   {
     /* [105] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [106] */
@@ -1952,67 +1980,67 @@
   {
     /* [108] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(162),
+    /* matcher_indices */ MatcherIndicesIndex(169),
   },
   {
     /* [109] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [110] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [111] */
     /* usage */ core::ParameterUsage::kDdx,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [112] */
     /* usage */ core::ParameterUsage::kDdy,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [113] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(164),
+    /* matcher_indices */ MatcherIndicesIndex(171),
   },
   {
     /* [114] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [115] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(120),
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
     /* [116] */
     /* usage */ core::ParameterUsage::kDdx,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [117] */
     /* usage */ core::ParameterUsage::kDdy,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [118] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(156),
+    /* matcher_indices */ MatcherIndicesIndex(163),
   },
   {
     /* [119] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [120] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(73),
+    /* matcher_indices */ MatcherIndicesIndex(77),
   },
   {
     /* [121] */
@@ -2027,17 +2055,17 @@
   {
     /* [123] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(158),
+    /* matcher_indices */ MatcherIndicesIndex(165),
   },
   {
     /* [124] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [125] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [126] */
@@ -2052,17 +2080,17 @@
   {
     /* [128] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(160),
+    /* matcher_indices */ MatcherIndicesIndex(167),
   },
   {
     /* [129] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [130] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [131] */
@@ -2072,22 +2100,22 @@
   {
     /* [132] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(130),
+    /* matcher_indices */ MatcherIndicesIndex(135),
   },
   {
     /* [133] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(174),
+    /* matcher_indices */ MatcherIndicesIndex(181),
   },
   {
     /* [134] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [135] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(73),
+    /* matcher_indices */ MatcherIndicesIndex(77),
   },
   {
     /* [136] */
@@ -2102,17 +2130,17 @@
   {
     /* [138] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(175),
+    /* matcher_indices */ MatcherIndicesIndex(182),
   },
   {
     /* [139] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [140] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [141] */
@@ -2167,17 +2195,17 @@
   {
     /* [151] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(178),
+    /* matcher_indices */ MatcherIndicesIndex(185),
   },
   {
     /* [152] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(177),
+    /* matcher_indices */ MatcherIndicesIndex(184),
   },
   {
     /* [153] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [154] */
@@ -2187,17 +2215,17 @@
   {
     /* [155] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(179),
+    /* matcher_indices */ MatcherIndicesIndex(186),
   },
   {
     /* [156] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(177),
+    /* matcher_indices */ MatcherIndicesIndex(184),
   },
   {
     /* [157] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(120),
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
     /* [158] */
@@ -2207,17 +2235,17 @@
   {
     /* [159] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(174),
+    /* matcher_indices */ MatcherIndicesIndex(181),
   },
   {
     /* [160] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [161] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(73),
+    /* matcher_indices */ MatcherIndicesIndex(77),
   },
   {
     /* [162] */
@@ -2227,17 +2255,17 @@
   {
     /* [163] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(175),
+    /* matcher_indices */ MatcherIndicesIndex(182),
   },
   {
     /* [164] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [165] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [166] */
@@ -2247,17 +2275,17 @@
   {
     /* [167] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(128),
+    /* matcher_indices */ MatcherIndicesIndex(133),
   },
   {
     /* [168] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [169] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(73),
+    /* matcher_indices */ MatcherIndicesIndex(77),
   },
   {
     /* [170] */
@@ -2267,17 +2295,17 @@
   {
     /* [171] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(132),
+    /* matcher_indices */ MatcherIndicesIndex(137),
   },
   {
     /* [172] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [173] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [174] */
@@ -2287,7 +2315,7 @@
   {
     /* [175] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(126),
+    /* matcher_indices */ MatcherIndicesIndex(131),
   },
   {
     /* [176] */
@@ -2307,7 +2335,7 @@
   {
     /* [179] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(132),
+    /* matcher_indices */ MatcherIndicesIndex(137),
   },
   {
     /* [180] */
@@ -2327,7 +2355,7 @@
   {
     /* [183] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(108),
+    /* matcher_indices */ MatcherIndicesIndex(109),
   },
   {
     /* [184] */
@@ -2347,7 +2375,7 @@
   {
     /* [187] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(136),
+    /* matcher_indices */ MatcherIndicesIndex(141),
   },
   {
     /* [188] */
@@ -2367,7 +2395,7 @@
   {
     /* [191] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(111),
+    /* matcher_indices */ MatcherIndicesIndex(112),
   },
   {
     /* [192] */
@@ -2387,7 +2415,7 @@
   {
     /* [195] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(150),
+    /* matcher_indices */ MatcherIndicesIndex(157),
   },
   {
     /* [196] */
@@ -2407,7 +2435,7 @@
   {
     /* [199] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(134),
+    /* matcher_indices */ MatcherIndicesIndex(139),
   },
   {
     /* [200] */
@@ -2427,7 +2455,7 @@
   {
     /* [203] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(175),
+    /* matcher_indices */ MatcherIndicesIndex(182),
   },
   {
     /* [204] */
@@ -2447,7 +2475,7 @@
   {
     /* [207] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(179),
+    /* matcher_indices */ MatcherIndicesIndex(186),
   },
   {
     /* [208] */
@@ -2467,7 +2495,7 @@
   {
     /* [211] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(176),
+    /* matcher_indices */ MatcherIndicesIndex(183),
   },
   {
     /* [212] */
@@ -2487,17 +2515,17 @@
   {
     /* [215] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(156),
+    /* matcher_indices */ MatcherIndicesIndex(163),
   },
   {
     /* [216] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [217] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(73),
+    /* matcher_indices */ MatcherIndicesIndex(77),
   },
   {
     /* [218] */
@@ -2507,17 +2535,17 @@
   {
     /* [219] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(158),
+    /* matcher_indices */ MatcherIndicesIndex(165),
   },
   {
     /* [220] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [221] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [222] */
@@ -2527,37 +2555,37 @@
   {
     /* [223] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(160),
+    /* matcher_indices */ MatcherIndicesIndex(167),
   },
   {
     /* [224] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [225] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [226] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(130),
+    /* matcher_indices */ MatcherIndicesIndex(135),
   },
   {
     /* [227] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(162),
+    /* matcher_indices */ MatcherIndicesIndex(169),
   },
   {
     /* [228] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [229] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [230] */
@@ -2567,17 +2595,17 @@
   {
     /* [231] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(164),
+    /* matcher_indices */ MatcherIndicesIndex(171),
   },
   {
     /* [232] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [233] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(120),
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
     /* [234] */
@@ -2587,17 +2615,17 @@
   {
     /* [235] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(178),
+    /* matcher_indices */ MatcherIndicesIndex(185),
   },
   {
     /* [236] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(177),
+    /* matcher_indices */ MatcherIndicesIndex(184),
   },
   {
     /* [237] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [238] */
@@ -2607,17 +2635,17 @@
   {
     /* [239] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(179),
+    /* matcher_indices */ MatcherIndicesIndex(186),
   },
   {
     /* [240] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(177),
+    /* matcher_indices */ MatcherIndicesIndex(184),
   },
   {
     /* [241] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(120),
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
     /* [242] */
@@ -2627,17 +2655,17 @@
   {
     /* [243] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(162),
+    /* matcher_indices */ MatcherIndicesIndex(169),
   },
   {
     /* [244] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [245] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [246] */
@@ -2647,17 +2675,17 @@
   {
     /* [247] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(164),
+    /* matcher_indices */ MatcherIndicesIndex(171),
   },
   {
     /* [248] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [249] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(120),
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
     /* [250] */
@@ -2667,17 +2695,17 @@
   {
     /* [251] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(178),
+    /* matcher_indices */ MatcherIndicesIndex(185),
   },
   {
     /* [252] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [253] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [254] */
@@ -2687,17 +2715,17 @@
   {
     /* [255] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(179),
+    /* matcher_indices */ MatcherIndicesIndex(186),
   },
   {
     /* [256] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [257] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(120),
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
     /* [258] */
@@ -2752,22 +2780,22 @@
   {
     /* [268] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(63),
+    /* matcher_indices */ MatcherIndicesIndex(121),
   },
   {
     /* [269] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(4),
+    /* matcher_indices */ MatcherIndicesIndex(9),
   },
   {
     /* [270] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(120),
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
     /* [271] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(67),
+    /* matcher_indices */ MatcherIndicesIndex(126),
   },
   {
     /* [272] */
@@ -2777,72 +2805,72 @@
   {
     /* [273] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(120),
+    /* matcher_indices */ MatcherIndicesIndex(119),
   },
   {
     /* [274] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(71),
+    /* matcher_indices */ MatcherIndicesIndex(128),
   },
   {
     /* [275] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(122),
+    /* matcher_indices */ MatcherIndicesIndex(9),
   },
   {
     /* [276] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(120),
+    /* matcher_indices */ MatcherIndicesIndex(117),
   },
   {
     /* [277] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(75),
+    /* matcher_indices */ MatcherIndicesIndex(63),
   },
   {
     /* [278] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(122),
+    /* matcher_indices */ MatcherIndicesIndex(4),
   },
   {
     /* [279] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(120),
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
     /* [280] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(78),
+    /* matcher_indices */ MatcherIndicesIndex(67),
   },
   {
     /* [281] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(4),
+    /* matcher_indices */ MatcherIndicesIndex(9),
   },
   {
     /* [282] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(118),
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
     /* [283] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(81),
+    /* matcher_indices */ MatcherIndicesIndex(71),
   },
   {
     /* [284] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(9),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [285] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(118),
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
     /* [286] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(84),
+    /* matcher_indices */ MatcherIndicesIndex(75),
   },
   {
     /* [287] */
@@ -2852,57 +2880,57 @@
   {
     /* [288] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(118),
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
     /* [289] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(87),
+    /* matcher_indices */ MatcherIndicesIndex(79),
   },
   {
     /* [290] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(122),
+    /* matcher_indices */ MatcherIndicesIndex(4),
   },
   {
     /* [291] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(118),
+    /* matcher_indices */ MatcherIndicesIndex(119),
   },
   {
     /* [292] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(90),
+    /* matcher_indices */ MatcherIndicesIndex(82),
   },
   {
     /* [293] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(4),
+    /* matcher_indices */ MatcherIndicesIndex(9),
   },
   {
     /* [294] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(116),
+    /* matcher_indices */ MatcherIndicesIndex(119),
   },
   {
     /* [295] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(93),
+    /* matcher_indices */ MatcherIndicesIndex(85),
   },
   {
     /* [296] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(9),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [297] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(116),
+    /* matcher_indices */ MatcherIndicesIndex(119),
   },
   {
     /* [298] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(96),
+    /* matcher_indices */ MatcherIndicesIndex(88),
   },
   {
     /* [299] */
@@ -2912,102 +2940,102 @@
   {
     /* [300] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(116),
+    /* matcher_indices */ MatcherIndicesIndex(119),
   },
   {
     /* [301] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(99),
+    /* matcher_indices */ MatcherIndicesIndex(91),
   },
   {
     /* [302] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(122),
+    /* matcher_indices */ MatcherIndicesIndex(4),
   },
   {
     /* [303] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(116),
+    /* matcher_indices */ MatcherIndicesIndex(117),
   },
   {
     /* [304] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(134),
+    /* matcher_indices */ MatcherIndicesIndex(94),
   },
   {
     /* [305] */
-    /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(14),
+    /* usage */ core::ParameterUsage::kCoords,
+    /* matcher_indices */ MatcherIndicesIndex(9),
   },
   {
     /* [306] */
-    /* usage */ core::ParameterUsage::kSampleIndex,
-    /* matcher_indices */ MatcherIndicesIndex(8),
+    /* usage */ core::ParameterUsage::kValue,
+    /* matcher_indices */ MatcherIndicesIndex(117),
   },
   {
     /* [307] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(176),
+    /* matcher_indices */ MatcherIndicesIndex(97),
   },
   {
     /* [308] */
-    /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(14),
+    /* usage */ core::ParameterUsage::kCoords,
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [309] */
-    /* usage */ core::ParameterUsage::kSampleIndex,
-    /* matcher_indices */ MatcherIndicesIndex(8),
+    /* usage */ core::ParameterUsage::kValue,
+    /* matcher_indices */ MatcherIndicesIndex(117),
   },
   {
     /* [310] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(144),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(100),
   },
   {
     /* [311] */
-    /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(7),
+    /* usage */ core::ParameterUsage::kCoords,
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [312] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(7),
+    /* matcher_indices */ MatcherIndicesIndex(117),
   },
   {
     /* [313] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(144),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(139),
   },
   {
     /* [314] */
-    /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(7),
+    /* usage */ core::ParameterUsage::kLocation,
+    /* matcher_indices */ MatcherIndicesIndex(14),
   },
   {
     /* [315] */
-    /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(65),
+    /* usage */ core::ParameterUsage::kSampleIndex,
+    /* matcher_indices */ MatcherIndicesIndex(8),
   },
   {
     /* [316] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(144),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(183),
   },
   {
     /* [317] */
-    /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(7),
+    /* usage */ core::ParameterUsage::kLocation,
+    /* matcher_indices */ MatcherIndicesIndex(14),
   },
   {
     /* [318] */
-    /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(138),
+    /* usage */ core::ParameterUsage::kSampleIndex,
+    /* matcher_indices */ MatcherIndicesIndex(8),
   },
   {
     /* [319] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(144),
+    /* matcher_indices */ MatcherIndicesIndex(151),
   },
   {
     /* [320] */
@@ -3017,12 +3045,12 @@
   {
     /* [321] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(116),
+    /* matcher_indices */ MatcherIndicesIndex(7),
   },
   {
     /* [322] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(144),
+    /* matcher_indices */ MatcherIndicesIndex(151),
   },
   {
     /* [323] */
@@ -3032,12 +3060,12 @@
   {
     /* [324] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(5),
+    /* matcher_indices */ MatcherIndicesIndex(69),
   },
   {
     /* [325] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(144),
+    /* matcher_indices */ MatcherIndicesIndex(151),
   },
   {
     /* [326] */
@@ -3047,12 +3075,12 @@
   {
     /* [327] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(69),
+    /* matcher_indices */ MatcherIndicesIndex(145),
   },
   {
     /* [328] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(144),
+    /* matcher_indices */ MatcherIndicesIndex(151),
   },
   {
     /* [329] */
@@ -3062,12 +3090,12 @@
   {
     /* [330] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(140),
+    /* matcher_indices */ MatcherIndicesIndex(117),
   },
   {
     /* [331] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(144),
+    /* matcher_indices */ MatcherIndicesIndex(151),
   },
   {
     /* [332] */
@@ -3077,87 +3105,87 @@
   {
     /* [333] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(142),
+    /* matcher_indices */ MatcherIndicesIndex(5),
   },
   {
     /* [334] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(148),
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(151),
   },
   {
     /* [335] */
-    /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* usage */ core::ParameterUsage::kOffset,
+    /* matcher_indices */ MatcherIndicesIndex(7),
   },
   {
     /* [336] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(146),
+    /* usage */ core::ParameterUsage::kValue,
+    /* matcher_indices */ MatcherIndicesIndex(73),
   },
   {
     /* [337] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(150),
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(151),
   },
   {
     /* [338] */
-    /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* usage */ core::ParameterUsage::kOffset,
+    /* matcher_indices */ MatcherIndicesIndex(7),
   },
   {
     /* [339] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(120),
+    /* usage */ core::ParameterUsage::kValue,
+    /* matcher_indices */ MatcherIndicesIndex(147),
   },
   {
     /* [340] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(128),
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(151),
   },
   {
     /* [341] */
-    /* usage */ core::ParameterUsage::kWidth,
-    /* matcher_indices */ MatcherIndicesIndex(11),
+    /* usage */ core::ParameterUsage::kOffset,
+    /* matcher_indices */ MatcherIndicesIndex(7),
   },
   {
     /* [342] */
-    /* usage */ core::ParameterUsage::kHeight,
-    /* matcher_indices */ MatcherIndicesIndex(11),
+    /* usage */ core::ParameterUsage::kValue,
+    /* matcher_indices */ MatcherIndicesIndex(149),
   },
   {
     /* [343] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(105),
+    /* matcher_indices */ MatcherIndicesIndex(155),
   },
   {
     /* [344] */
-    /* usage */ core::ParameterUsage::kWidth,
-    /* matcher_indices */ MatcherIndicesIndex(11),
+    /* usage */ core::ParameterUsage::kSampler,
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [345] */
-    /* usage */ core::ParameterUsage::kHeight,
-    /* matcher_indices */ MatcherIndicesIndex(11),
+    /* usage */ core::ParameterUsage::kCoords,
+    /* matcher_indices */ MatcherIndicesIndex(153),
   },
   {
     /* [346] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(148),
+    /* matcher_indices */ MatcherIndicesIndex(157),
   },
   {
     /* [347] */
-    /* usage */ core::ParameterUsage::kWidth,
-    /* matcher_indices */ MatcherIndicesIndex(11),
+    /* usage */ core::ParameterUsage::kSampler,
+    /* matcher_indices */ MatcherIndicesIndex(187),
   },
   {
     /* [348] */
-    /* usage */ core::ParameterUsage::kHeight,
-    /* matcher_indices */ MatcherIndicesIndex(11),
+    /* usage */ core::ParameterUsage::kCoords,
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
     /* [349] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(174),
+    /* matcher_indices */ MatcherIndicesIndex(133),
   },
   {
     /* [350] */
@@ -3172,7 +3200,7 @@
   {
     /* [352] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(178),
+    /* matcher_indices */ MatcherIndicesIndex(106),
   },
   {
     /* [353] */
@@ -3187,262 +3215,317 @@
   {
     /* [355] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(154),
+    /* matcher_indices */ MatcherIndicesIndex(155),
   },
   {
     /* [356] */
-    /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(180),
+    /* usage */ core::ParameterUsage::kWidth,
+    /* matcher_indices */ MatcherIndicesIndex(11),
   },
   {
     /* [357] */
+    /* usage */ core::ParameterUsage::kHeight,
+    /* matcher_indices */ MatcherIndicesIndex(11),
+  },
+  {
+    /* [358] */
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(181),
+  },
+  {
+    /* [359] */
+    /* usage */ core::ParameterUsage::kWidth,
+    /* matcher_indices */ MatcherIndicesIndex(11),
+  },
+  {
+    /* [360] */
+    /* usage */ core::ParameterUsage::kHeight,
+    /* matcher_indices */ MatcherIndicesIndex(11),
+  },
+  {
+    /* [361] */
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(185),
+  },
+  {
+    /* [362] */
+    /* usage */ core::ParameterUsage::kWidth,
+    /* matcher_indices */ MatcherIndicesIndex(11),
+  },
+  {
+    /* [363] */
+    /* usage */ core::ParameterUsage::kHeight,
+    /* matcher_indices */ MatcherIndicesIndex(11),
+  },
+  {
+    /* [364] */
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(161),
+  },
+  {
+    /* [365] */
+    /* usage */ core::ParameterUsage::kSampler,
+    /* matcher_indices */ MatcherIndicesIndex(187),
+  },
+  {
+    /* [366] */
     /* usage */ core::ParameterUsage::kCoords,
     /* matcher_indices */ MatcherIndicesIndex(2),
   },
   {
-    /* [358] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(20),
-  },
-  {
-    /* [359] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(39),
-  },
-  {
-    /* [360] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(54),
-  },
-  {
-    /* [361] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(20),
-  },
-  {
-    /* [362] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(28),
-  },
-  {
-    /* [363] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(32),
-  },
-  {
-    /* [364] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(4),
-  },
-  {
-    /* [365] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(7),
-  },
-  {
-    /* [366] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(60),
-  },
-  {
     /* [367] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(7),
+    /* matcher_indices */ MatcherIndicesIndex(20),
   },
   {
     /* [368] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(4),
+    /* matcher_indices */ MatcherIndicesIndex(39),
   },
   {
     /* [369] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(4),
+    /* matcher_indices */ MatcherIndicesIndex(54),
   },
   {
     /* [370] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(60),
+    /* matcher_indices */ MatcherIndicesIndex(20),
   },
   {
     /* [371] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(60),
+    /* matcher_indices */ MatcherIndicesIndex(28),
   },
   {
     /* [372] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(0),
+    /* matcher_indices */ MatcherIndicesIndex(32),
   },
   {
     /* [373] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(4),
+  },
+  {
+    /* [374] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(7),
+  },
+  {
+    /* [375] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(60),
+  },
+  {
+    /* [376] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(7),
+  },
+  {
+    /* [377] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(4),
+  },
+  {
+    /* [378] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(4),
+  },
+  {
+    /* [379] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(60),
+  },
+  {
+    /* [380] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(60),
+  },
+  {
+    /* [381] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(0),
+  },
+  {
+    /* [382] */
     /* usage */ core::ParameterUsage::kOffset,
     /* matcher_indices */ MatcherIndicesIndex(7),
   },
   {
-    /* [374] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(126),
-  },
-  {
-    /* [375] */
-    /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(14),
-  },
-  {
-    /* [376] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(128),
-  },
-  {
-    /* [377] */
-    /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(130),
-  },
-  {
-    /* [378] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(132),
-  },
-  {
-    /* [379] */
-    /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(118),
-  },
-  {
-    /* [380] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(136),
-  },
-  {
-    /* [381] */
-    /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(118),
-  },
-  {
-    /* [382] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(174),
-  },
-  {
     /* [383] */
-    /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(130),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(131),
   },
   {
     /* [384] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(175),
-  },
-  {
-    /* [385] */
-    /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(118),
-  },
-  {
-    /* [386] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(102),
-  },
-  {
-    /* [387] */
     /* usage */ core::ParameterUsage::kLocation,
     /* matcher_indices */ MatcherIndicesIndex(14),
   },
   {
-    /* [388] */
+    /* [385] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(105),
+    /* matcher_indices */ MatcherIndicesIndex(133),
+  },
+  {
+    /* [386] */
+    /* usage */ core::ParameterUsage::kLocation,
+    /* matcher_indices */ MatcherIndicesIndex(135),
+  },
+  {
+    /* [387] */
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(137),
+  },
+  {
+    /* [388] */
+    /* usage */ core::ParameterUsage::kLocation,
+    /* matcher_indices */ MatcherIndicesIndex(119),
   },
   {
     /* [389] */
-    /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(130),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(141),
   },
   {
     /* [390] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(108),
+    /* usage */ core::ParameterUsage::kLocation,
+    /* matcher_indices */ MatcherIndicesIndex(119),
   },
   {
     /* [391] */
-    /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(118),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(181),
   },
   {
     /* [392] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(111),
+    /* usage */ core::ParameterUsage::kLocation,
+    /* matcher_indices */ MatcherIndicesIndex(135),
   },
   {
     /* [393] */
-    /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(118),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(182),
   },
   {
     /* [394] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(152),
+    /* usage */ core::ParameterUsage::kLocation,
+    /* matcher_indices */ MatcherIndicesIndex(119),
   },
   {
     /* [395] */
-    /* usage */ core::ParameterUsage::kWidth,
-    /* matcher_indices */ MatcherIndicesIndex(11),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(143),
   },
   {
     /* [396] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(126),
+    /* usage */ core::ParameterUsage::kLocation,
+    /* matcher_indices */ MatcherIndicesIndex(65),
   },
   {
     /* [397] */
-    /* usage */ core::ParameterUsage::kWidth,
-    /* matcher_indices */ MatcherIndicesIndex(11),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(103),
   },
   {
     /* [398] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(102),
+    /* usage */ core::ParameterUsage::kLocation,
+    /* matcher_indices */ MatcherIndicesIndex(14),
   },
   {
     /* [399] */
-    /* usage */ core::ParameterUsage::kWidth,
-    /* matcher_indices */ MatcherIndicesIndex(11),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(106),
   },
   {
     /* [400] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(2),
+    /* usage */ core::ParameterUsage::kLocation,
+    /* matcher_indices */ MatcherIndicesIndex(135),
   },
   {
     /* [401] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(51),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(109),
   },
   {
     /* [402] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(48),
+    /* usage */ core::ParameterUsage::kLocation,
+    /* matcher_indices */ MatcherIndicesIndex(119),
   },
   {
     /* [403] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(116),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(112),
   },
   {
     /* [404] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(118),
+    /* usage */ core::ParameterUsage::kLocation,
+    /* matcher_indices */ MatcherIndicesIndex(119),
   },
   {
     /* [405] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(170),
+    /* matcher_indices */ MatcherIndicesIndex(159),
   },
   {
     /* [406] */
+    /* usage */ core::ParameterUsage::kWidth,
+    /* matcher_indices */ MatcherIndicesIndex(11),
+  },
+  {
+    /* [407] */
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(131),
+  },
+  {
+    /* [408] */
+    /* usage */ core::ParameterUsage::kWidth,
+    /* matcher_indices */ MatcherIndicesIndex(11),
+  },
+  {
+    /* [409] */
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(103),
+  },
+  {
+    /* [410] */
+    /* usage */ core::ParameterUsage::kWidth,
+    /* matcher_indices */ MatcherIndicesIndex(11),
+  },
+  {
+    /* [411] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(169),
+    /* matcher_indices */ MatcherIndicesIndex(2),
+  },
+  {
+    /* [412] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(51),
+  },
+  {
+    /* [413] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(48),
+  },
+  {
+    /* [414] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(117),
+  },
+  {
+    /* [415] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(119),
+  },
+  {
+    /* [416] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(177),
+  },
+  {
+    /* [417] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(176),
   },
 };
 
@@ -3453,7 +3536,7 @@
   {
     /* [0] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(166),
+    /* matcher_indices */ MatcherIndicesIndex(173),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
@@ -3465,7 +3548,7 @@
   {
     /* [2] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(168),
+    /* matcher_indices */ MatcherIndicesIndex(175),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
@@ -3489,7 +3572,7 @@
   {
     /* [6] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(168),
+    /* matcher_indices */ MatcherIndicesIndex(175),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
@@ -3507,7 +3590,7 @@
   {
     /* [9] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(167),
+    /* matcher_indices */ MatcherIndicesIndex(174),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
@@ -3519,7 +3602,7 @@
   {
     /* [11] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(171),
+    /* matcher_indices */ MatcherIndicesIndex(178),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
@@ -3537,7 +3620,7 @@
   {
     /* [14] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(172),
+    /* matcher_indices */ MatcherIndicesIndex(179),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
@@ -3548,21 +3631,21 @@
   },
   {
     /* [16] */
-    /* name */ "A",
-    /* matcher_indices */ MatcherIndicesIndex(1),
-    /* kind */ TemplateInfo::Kind::kNumber,
+    /* name */ "C",
+    /* matcher_indices */ MatcherIndicesIndex(18),
+    /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [17] */
     /* name */ "F",
-    /* matcher_indices */ MatcherIndicesIndex(91),
+    /* matcher_indices */ MatcherIndicesIndex(92),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [18] */
-    /* name */ "A",
-    /* matcher_indices */ MatcherIndicesIndex(1),
-    /* kind */ TemplateInfo::Kind::kNumber,
+    /* name */ "C",
+    /* matcher_indices */ MatcherIndicesIndex(18),
+    /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [19] */
@@ -3572,32 +3655,62 @@
   },
   {
     /* [20] */
-    /* name */ "A",
-    /* matcher_indices */ MatcherIndicesIndex(1),
-    /* kind */ TemplateInfo::Kind::kNumber,
-  },
-  {
-    /* [21] */
-    /* name */ "F",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
-    /* kind */ TemplateInfo::Kind::kNumber,
-  },
-  {
-    /* [22] */
-    /* name */ "A",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
-    /* kind */ TemplateInfo::Kind::kNumber,
-  },
-  {
-    /* [23] */
     /* name */ "C",
     /* matcher_indices */ MatcherIndicesIndex(18),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
+    /* [21] */
+    /* name */ "F",
+    /* matcher_indices */ MatcherIndicesIndex(64),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
+    /* [22] */
+    /* name */ "A",
+    /* matcher_indices */ MatcherIndicesIndex(1),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
+    /* [23] */
+    /* name */ "F",
+    /* matcher_indices */ MatcherIndicesIndex(92),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
     /* [24] */
+    /* name */ "A",
+    /* matcher_indices */ MatcherIndicesIndex(1),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
+    /* [25] */
+    /* name */ "F",
+    /* matcher_indices */ MatcherIndicesIndex(36),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
+    /* [26] */
+    /* name */ "A",
+    /* matcher_indices */ MatcherIndicesIndex(1),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
+    /* [27] */
+    /* name */ "F",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
+    /* [28] */
+    /* name */ "A",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
+    /* [29] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(173),
+    /* matcher_indices */ MatcherIndicesIndex(180),
     /* kind */ TemplateInfo::Kind::kType,
   },
 };
@@ -3612,8 +3725,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(22),
-    /* parameters */ ParameterIndex(394),
+    /* templates */ TemplateIndex(28),
+    /* parameters */ ParameterIndex(405),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -3623,8 +3736,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
-    /* parameters */ ParameterIndex(396),
+    /* templates */ TemplateIndex(29),
+    /* parameters */ ParameterIndex(407),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -3634,7 +3747,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
+    /* templates */ TemplateIndex(29),
     /* parameters */ ParameterIndex(175),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -3645,8 +3758,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(21),
-    /* parameters */ ParameterIndex(398),
+    /* templates */ TemplateIndex(27),
+    /* parameters */ ParameterIndex(409),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -3656,8 +3769,8 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
-    /* parameters */ ParameterIndex(340),
+    /* templates */ TemplateIndex(29),
+    /* parameters */ ParameterIndex(349),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -3667,7 +3780,7 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
+    /* templates */ TemplateIndex(29),
     /* parameters */ ParameterIndex(63),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -3678,8 +3791,8 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(21),
-    /* parameters */ ParameterIndex(343),
+    /* templates */ TemplateIndex(27),
+    /* parameters */ ParameterIndex(352),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -3689,7 +3802,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
+    /* templates */ TemplateIndex(29),
     /* parameters */ ParameterIndex(179),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -3700,7 +3813,7 @@
     /* num_parameters */ 6,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
+    /* templates */ TemplateIndex(29),
     /* parameters */ ParameterIndex(0),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -3711,7 +3824,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(21),
+    /* templates */ TemplateIndex(27),
     /* parameters */ ParameterIndex(183),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -3722,7 +3835,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
+    /* templates */ TemplateIndex(29),
     /* parameters */ ParameterIndex(187),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -3733,7 +3846,7 @@
     /* num_parameters */ 6,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
+    /* templates */ TemplateIndex(29),
     /* parameters */ ParameterIndex(6),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -3744,7 +3857,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(21),
+    /* templates */ TemplateIndex(27),
     /* parameters */ ParameterIndex(191),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -3755,8 +3868,8 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
-    /* parameters */ ParameterIndex(346),
+    /* templates */ TemplateIndex(29),
+    /* parameters */ ParameterIndex(355),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -3766,7 +3879,7 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
+    /* templates */ TemplateIndex(29),
     /* parameters */ ParameterIndex(68),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -3777,7 +3890,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
+    /* templates */ TemplateIndex(29),
     /* parameters */ ParameterIndex(195),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -3788,7 +3901,7 @@
     /* num_parameters */ 6,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
+    /* templates */ TemplateIndex(29),
     /* parameters */ ParameterIndex(12),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -3799,7 +3912,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
+    /* templates */ TemplateIndex(29),
     /* parameters */ ParameterIndex(199),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -3811,7 +3924,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(349),
+    /* parameters */ ParameterIndex(358),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -3855,7 +3968,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(352),
+    /* parameters */ ParameterIndex(361),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -3910,7 +4023,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(372),
+    /* parameters */ ParameterIndex(381),
     /* return_matcher_indices */ MatcherIndicesIndex(7),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -3920,9 +4033,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
-    /* parameters */ ParameterIndex(374),
-    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* templates */ TemplateIndex(29),
+    /* parameters */ ParameterIndex(383),
+    /* return_matcher_indices */ MatcherIndicesIndex(129),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -3931,9 +4044,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
-    /* parameters */ ParameterIndex(376),
-    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* templates */ TemplateIndex(29),
+    /* parameters */ ParameterIndex(385),
+    /* return_matcher_indices */ MatcherIndicesIndex(129),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -3942,9 +4055,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
-    /* parameters */ ParameterIndex(378),
-    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* templates */ TemplateIndex(29),
+    /* parameters */ ParameterIndex(387),
+    /* return_matcher_indices */ MatcherIndicesIndex(129),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -3953,9 +4066,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
-    /* parameters */ ParameterIndex(304),
-    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* templates */ TemplateIndex(29),
+    /* parameters */ ParameterIndex(313),
+    /* return_matcher_indices */ MatcherIndicesIndex(129),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -3964,9 +4077,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
-    /* parameters */ ParameterIndex(380),
-    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* templates */ TemplateIndex(29),
+    /* parameters */ ParameterIndex(389),
+    /* return_matcher_indices */ MatcherIndicesIndex(129),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -3976,8 +4089,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(382),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(391),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -3987,8 +4100,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(384),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(393),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -3998,8 +4111,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(307),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(316),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4009,8 +4122,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(15),
-    /* parameters */ ParameterIndex(386),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(395),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4019,9 +4132,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(15),
-    /* parameters */ ParameterIndex(388),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* templates */ TemplateIndex(17),
+    /* parameters */ ParameterIndex(395),
+    /* return_matcher_indices */ MatcherIndicesIndex(117),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4030,9 +4143,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(15),
-    /* parameters */ ParameterIndex(390),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* templates */ TemplateIndex(19),
+    /* parameters */ ParameterIndex(395),
+    /* return_matcher_indices */ MatcherIndicesIndex(119),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4041,9 +4154,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(15),
-    /* parameters */ ParameterIndex(392),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* templates */ TemplateIndex(21),
+    /* parameters */ ParameterIndex(397),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4052,9 +4165,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(17),
-    /* parameters */ ParameterIndex(386),
-    /* return_matcher_indices */ MatcherIndicesIndex(116),
+    /* templates */ TemplateIndex(21),
+    /* parameters */ ParameterIndex(399),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4063,9 +4176,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(17),
-    /* parameters */ ParameterIndex(388),
-    /* return_matcher_indices */ MatcherIndicesIndex(116),
+    /* templates */ TemplateIndex(21),
+    /* parameters */ ParameterIndex(401),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4074,9 +4187,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(17),
-    /* parameters */ ParameterIndex(390),
-    /* return_matcher_indices */ MatcherIndicesIndex(116),
+    /* templates */ TemplateIndex(21),
+    /* parameters */ ParameterIndex(403),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4085,9 +4198,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(17),
-    /* parameters */ ParameterIndex(392),
-    /* return_matcher_indices */ MatcherIndicesIndex(116),
+    /* templates */ TemplateIndex(23),
+    /* parameters */ ParameterIndex(397),
+    /* return_matcher_indices */ MatcherIndicesIndex(117),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4096,9 +4209,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(19),
-    /* parameters */ ParameterIndex(386),
-    /* return_matcher_indices */ MatcherIndicesIndex(118),
+    /* templates */ TemplateIndex(23),
+    /* parameters */ ParameterIndex(399),
+    /* return_matcher_indices */ MatcherIndicesIndex(117),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4107,9 +4220,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(19),
-    /* parameters */ ParameterIndex(388),
-    /* return_matcher_indices */ MatcherIndicesIndex(118),
+    /* templates */ TemplateIndex(23),
+    /* parameters */ ParameterIndex(401),
+    /* return_matcher_indices */ MatcherIndicesIndex(117),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4118,9 +4231,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(19),
-    /* parameters */ ParameterIndex(390),
-    /* return_matcher_indices */ MatcherIndicesIndex(118),
+    /* templates */ TemplateIndex(23),
+    /* parameters */ ParameterIndex(403),
+    /* return_matcher_indices */ MatcherIndicesIndex(117),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4129,251 +4242,251 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(19),
-    /* parameters */ ParameterIndex(392),
-    /* return_matcher_indices */ MatcherIndicesIndex(118),
+    /* templates */ TemplateIndex(25),
+    /* parameters */ ParameterIndex(397),
+    /* return_matcher_indices */ MatcherIndicesIndex(119),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [48] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 3,
+    /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(355),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(25),
+    /* parameters */ ParameterIndex(399),
+    /* return_matcher_indices */ MatcherIndicesIndex(119),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [49] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 2,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(25),
+    /* parameters */ ParameterIndex(401),
+    /* return_matcher_indices */ MatcherIndicesIndex(119),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [50] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 2,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(25),
+    /* parameters */ ParameterIndex(403),
+    /* return_matcher_indices */ MatcherIndicesIndex(119),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [51] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(16),
+    /* parameters */ ParameterIndex(268),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [52] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(16),
+    /* parameters */ ParameterIndex(271),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [53] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(16),
+    /* parameters */ ParameterIndex(274),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [54] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(16),
+    /* parameters */ ParameterIndex(277),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [55] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(16),
+    /* parameters */ ParameterIndex(280),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [56] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(16),
+    /* parameters */ ParameterIndex(283),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [57] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(16),
+    /* parameters */ ParameterIndex(286),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [58] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(16),
+    /* parameters */ ParameterIndex(289),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [59] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(16),
+    /* parameters */ ParameterIndex(292),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [60] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(16),
+    /* parameters */ ParameterIndex(295),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [61] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(16),
+    /* parameters */ ParameterIndex(298),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [62] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(16),
+    /* parameters */ ParameterIndex(301),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [63] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(16),
+    /* parameters */ ParameterIndex(304),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [64] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(16),
+    /* parameters */ ParameterIndex(307),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [65] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(16),
+    /* parameters */ ParameterIndex(310),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [66] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(364),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [67] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(30),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [50] */
+    /* [68] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(215),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [51] */
+    /* [69] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(36),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [52] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(219),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [53] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 3,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(42),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [54] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(223),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [55] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 3,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(108),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [56] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 3,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(113),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [57] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 3,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(133),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [58] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(159),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [59] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 3,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(138),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [60] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(163),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [61] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 3,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(251),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [62] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 3,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(255),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [63] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(118),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [64] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 5,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(118),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [65] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(123),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [66] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 5,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(123),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [67] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(128),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [68] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 5,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(128),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [69] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(243),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4383,63 +4496,63 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(247),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(219),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [71] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
+    /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(133),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(42),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [72] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 5,
+    /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(133),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(223),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [73] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
+    /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(138),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(108),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [74] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 5,
+    /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(138),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(113),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [75] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
+    /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(251),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(133),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4449,140 +4562,140 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(255),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(159),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [77] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(23),
-    /* parameters */ ParameterIndex(268),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(138),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [78] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 3,
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(23),
-    /* parameters */ ParameterIndex(271),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(163),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [79] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(23),
-    /* parameters */ ParameterIndex(274),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(251),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [80] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(23),
-    /* parameters */ ParameterIndex(277),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(255),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [81] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 3,
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(23),
-    /* parameters */ ParameterIndex(280),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(118),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [82] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 3,
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(23),
-    /* parameters */ ParameterIndex(283),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(118),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [83] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 3,
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(23),
-    /* parameters */ ParameterIndex(286),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(123),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [84] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 3,
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(23),
-    /* parameters */ ParameterIndex(289),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(123),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [85] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 3,
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(23),
-    /* parameters */ ParameterIndex(292),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(128),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [86] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 3,
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(23),
-    /* parameters */ ParameterIndex(295),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(128),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [87] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 3,
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(23),
-    /* parameters */ ParameterIndex(298),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(243),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [88] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 3,
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(23),
-    /* parameters */ ParameterIndex(301),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(247),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4592,8 +4705,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(83),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(133),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4603,8 +4716,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(83),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(133),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4614,8 +4727,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(88),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(138),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4625,8 +4738,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(88),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(138),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4636,19 +4749,19 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(93),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(251),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [94] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 5,
+    /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(93),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(255),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4658,85 +4771,85 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(227),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(83),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [96] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 5,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(83),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [97] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 4,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(88),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [98] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 5,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(88),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [99] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 4,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(93),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [100] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 5,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(93),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [101] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 4,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(227),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [102] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(231),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [97] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 5,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(30),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [98] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 6,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(30),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [99] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 5,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(36),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [100] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 6,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(36),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [101] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 5,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(42),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [102] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 6,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(42),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4746,167 +4859,233 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(108),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(30),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [104] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 6,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(30),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [105] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 5,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(36),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [106] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 6,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(36),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [107] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 5,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(42),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [108] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 6,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(42),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [109] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 5,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(108),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [110] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(113),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [105] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(53),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [106] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 5,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(53),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [107] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(58),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [108] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 5,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(58),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [109] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(151),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [110] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(155),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [111] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 3,
+    /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
-    /* parameters */ ParameterIndex(167),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(53),
     /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [112] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
+    /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
-    /* parameters */ ParameterIndex(167),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(53),
     /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [113] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 3,
+    /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
-    /* parameters */ ParameterIndex(171),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(58),
     /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [114] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
+    /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
-    /* parameters */ ParameterIndex(171),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(58),
     /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [115] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 3,
+    /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
-    /* parameters */ ParameterIndex(334),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(151),
     /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [116] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 3,
+    /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(24),
-    /* parameters */ ParameterIndex(337),
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(155),
     /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [117] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 4,
+    /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(98),
-    /* return_matcher_indices */ MatcherIndicesIndex(2),
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(29),
+    /* parameters */ ParameterIndex(167),
+    /* return_matcher_indices */ MatcherIndicesIndex(129),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [118] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 4,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(29),
+    /* parameters */ ParameterIndex(167),
+    /* return_matcher_indices */ MatcherIndicesIndex(129),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [119] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(29),
+    /* parameters */ ParameterIndex(171),
+    /* return_matcher_indices */ MatcherIndicesIndex(129),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [120] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 4,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(29),
+    /* parameters */ ParameterIndex(171),
+    /* return_matcher_indices */ MatcherIndicesIndex(129),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [121] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(29),
+    /* parameters */ ParameterIndex(343),
+    /* return_matcher_indices */ MatcherIndicesIndex(129),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [122] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(29),
+    /* parameters */ ParameterIndex(346),
+    /* return_matcher_indices */ MatcherIndicesIndex(129),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [123] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 4,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(98),
+    /* return_matcher_indices */ MatcherIndicesIndex(2),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [124] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
@@ -4916,7 +5095,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [119] */
+    /* [125] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
@@ -4927,7 +5106,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [120] */
+    /* [126] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
@@ -4938,7 +5117,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [121] */
+    /* [127] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
@@ -4949,7 +5128,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [122] */
+    /* [128] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
@@ -4960,102 +5139,36 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [123] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 3,
-    /* templates */ TemplateIndex(6),
-    /* parameters */ ParameterIndex(358),
-    /* return_matcher_indices */ MatcherIndicesIndex(54),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [124] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 3,
-    /* templates */ TemplateIndex(6),
-    /* parameters */ ParameterIndex(360),
-    /* return_matcher_indices */ MatcherIndicesIndex(39),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [125] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 4,
-    /* templates */ TemplateIndex(2),
-    /* parameters */ ParameterIndex(362),
-    /* return_matcher_indices */ MatcherIndicesIndex(24),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [126] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 1,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(0),
-    /* parameters */ ParameterIndex(364),
-    /* return_matcher_indices */ MatcherIndicesIndex(8),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [127] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 1,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
-    /* templates */ TemplateIndex(0),
-    /* parameters */ ParameterIndex(359),
-    /* return_matcher_indices */ MatcherIndicesIndex(36),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [128] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 1,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(9),
-    /* parameters */ ParameterIndex(364),
-    /* return_matcher_indices */ MatcherIndicesIndex(7),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
     /* [129] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 1,
+    /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
-    /* templates */ TemplateIndex(9),
-    /* parameters */ ParameterIndex(359),
-    /* return_matcher_indices */ MatcherIndicesIndex(42),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(6),
+    /* parameters */ ParameterIndex(367),
+    /* return_matcher_indices */ MatcherIndicesIndex(54),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [130] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 1,
+    /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(12),
-    /* parameters */ ParameterIndex(364),
-    /* return_matcher_indices */ MatcherIndicesIndex(2),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(6),
+    /* parameters */ ParameterIndex(369),
+    /* return_matcher_indices */ MatcherIndicesIndex(39),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [131] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 1,
+    /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
-    /* templates */ TemplateIndex(12),
-    /* parameters */ ParameterIndex(359),
-    /* return_matcher_indices */ MatcherIndicesIndex(45),
+    /* num_templates   */ 4,
+    /* templates */ TemplateIndex(2),
+    /* parameters */ ParameterIndex(371),
+    /* return_matcher_indices */ MatcherIndicesIndex(24),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5063,10 +5176,10 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(400),
-    /* return_matcher_indices */ MatcherIndicesIndex(7),
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(0),
+    /* parameters */ ParameterIndex(373),
+    /* return_matcher_indices */ MatcherIndicesIndex(8),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5074,10 +5187,10 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(1),
-    /* parameters */ ParameterIndex(401),
-    /* return_matcher_indices */ MatcherIndicesIndex(48),
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(0),
+    /* parameters */ ParameterIndex(368),
+    /* return_matcher_indices */ MatcherIndicesIndex(36),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5085,6 +5198,72 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(9),
+    /* parameters */ ParameterIndex(373),
+    /* return_matcher_indices */ MatcherIndicesIndex(7),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [135] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(9),
+    /* parameters */ ParameterIndex(368),
+    /* return_matcher_indices */ MatcherIndicesIndex(42),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [136] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(12),
+    /* parameters */ ParameterIndex(373),
+    /* return_matcher_indices */ MatcherIndicesIndex(2),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [137] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(12),
+    /* parameters */ ParameterIndex(368),
+    /* return_matcher_indices */ MatcherIndicesIndex(45),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [138] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(411),
+    /* return_matcher_indices */ MatcherIndicesIndex(7),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [139] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(1),
+    /* parameters */ ParameterIndex(412),
+    /* return_matcher_indices */ MatcherIndicesIndex(48),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [140] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(259),
@@ -5092,18 +5271,18 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [135] */
+    /* [141] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(1),
-    /* parameters */ ParameterIndex(402),
+    /* parameters */ ParameterIndex(413),
     /* return_matcher_indices */ MatcherIndicesIndex(51),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [136] */
+    /* [142] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
@@ -5114,7 +5293,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [137] */
+    /* [143] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
@@ -5125,7 +5304,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [138] */
+    /* [144] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
@@ -5136,7 +5315,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [139] */
+    /* [145] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
@@ -5147,73 +5326,73 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [140] */
+    /* [146] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(11),
-    /* parameters */ ParameterIndex(364),
+    /* parameters */ ParameterIndex(373),
     /* return_matcher_indices */ MatcherIndicesIndex(8),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [141] */
+    /* [147] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(10),
-    /* parameters */ ParameterIndex(366),
+    /* parameters */ ParameterIndex(375),
     /* return_matcher_indices */ MatcherIndicesIndex(57),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [142] */
+    /* [148] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(14),
-    /* parameters */ ParameterIndex(364),
+    /* parameters */ ParameterIndex(373),
     /* return_matcher_indices */ MatcherIndicesIndex(4),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [143] */
+    /* [149] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(13),
-    /* parameters */ ParameterIndex(366),
+    /* parameters */ ParameterIndex(375),
     /* return_matcher_indices */ MatcherIndicesIndex(60),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [144] */
+    /* [150] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(2),
-    /* parameters */ ParameterIndex(368),
+    /* parameters */ ParameterIndex(377),
     /* return_matcher_indices */ MatcherIndicesIndex(4),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [145] */
+    /* [151] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(1),
-    /* parameters */ ParameterIndex(370),
+    /* parameters */ ParameterIndex(379),
     /* return_matcher_indices */ MatcherIndicesIndex(60),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [146] */
+    /* [152] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
@@ -5224,7 +5403,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [147] */
+    /* [153] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
@@ -5235,51 +5414,51 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [148] */
+    /* [154] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(403),
-    /* return_matcher_indices */ MatcherIndicesIndex(169),
+    /* parameters */ ParameterIndex(414),
+    /* return_matcher_indices */ MatcherIndicesIndex(176),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [149] */
+    /* [155] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(404),
-    /* return_matcher_indices */ MatcherIndicesIndex(170),
+    /* parameters */ ParameterIndex(415),
+    /* return_matcher_indices */ MatcherIndicesIndex(177),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [150] */
+    /* [156] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(405),
-    /* return_matcher_indices */ MatcherIndicesIndex(118),
+    /* parameters */ ParameterIndex(416),
+    /* return_matcher_indices */ MatcherIndicesIndex(119),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [151] */
+    /* [157] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(406),
-    /* return_matcher_indices */ MatcherIndicesIndex(116),
+    /* parameters */ ParameterIndex(417),
+    /* return_matcher_indices */ MatcherIndicesIndex(117),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [152] */
+    /* [158] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 0,
     /* num_explicit_templates */ 0,
@@ -5290,118 +5469,85 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [153] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 2,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(372),
-    /* return_matcher_indices */ MatcherIndicesIndex(65),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [154] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 2,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(372),
-    /* return_matcher_indices */ MatcherIndicesIndex(138),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [155] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 2,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(372),
-    /* return_matcher_indices */ MatcherIndicesIndex(116),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [156] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 2,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(372),
-    /* return_matcher_indices */ MatcherIndicesIndex(5),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [157] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 2,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(372),
-    /* return_matcher_indices */ MatcherIndicesIndex(69),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [158] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 2,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 0,
-    /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(372),
-    /* return_matcher_indices */ MatcherIndicesIndex(140),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
     /* [159] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(372),
-    /* return_matcher_indices */ MatcherIndicesIndex(142),
+    /* parameters */ ParameterIndex(381),
+    /* return_matcher_indices */ MatcherIndicesIndex(69),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [160] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 3,
+    /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(310),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* parameters */ ParameterIndex(381),
+    /* return_matcher_indices */ MatcherIndicesIndex(145),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [161] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 3,
+    /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(313),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* parameters */ ParameterIndex(381),
+    /* return_matcher_indices */ MatcherIndicesIndex(117),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [162] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
-    /* num_parameters */ 3,
+    /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(316),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* parameters */ ParameterIndex(381),
+    /* return_matcher_indices */ MatcherIndicesIndex(5),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [163] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 2,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(381),
+    /* return_matcher_indices */ MatcherIndicesIndex(73),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [164] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 2,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(381),
+    /* return_matcher_indices */ MatcherIndicesIndex(147),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [165] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 2,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(381),
+    /* return_matcher_indices */ MatcherIndicesIndex(149),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [166] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
@@ -5411,7 +5557,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [164] */
+    /* [167] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
@@ -5422,7 +5568,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [165] */
+    /* [168] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
@@ -5433,7 +5579,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [166] */
+    /* [169] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
@@ -5444,7 +5590,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [167] */
+    /* [170] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
@@ -5454,6 +5600,39 @@
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
+  {
+    /* [171] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(334),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [172] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(337),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [173] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMemberFunction),
+    /* num_parameters */ 3,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 0,
+    /* templates */ TemplateIndex(/* invalid */),
+    /* parameters */ ParameterIndex(340),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
 };
 
 static_assert(OverloadIndex::CanIndex(kOverloads),
@@ -5465,103 +5644,103 @@
     /* fn asint[T : f32_u32](T) -> i32 */
     /* fn asint[T : f32_u32, N : num](vec<N, T>) -> vec<N, i32> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(126),
+    /* overloads */ OverloadIndex(132),
   },
   {
     /* [1] */
     /* fn asuint[T : f32_i32](T) -> u32 */
     /* fn asuint[T : f32_i32, N : num](vec<N, T>) -> vec<N, u32> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(128),
+    /* overloads */ OverloadIndex(134),
   },
   {
     /* [2] */
     /* fn asfloat[T : iu32](T) -> f32 */
     /* fn asfloat[T : iu32, N : num](vec<N, T>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(130),
+    /* overloads */ OverloadIndex(136),
   },
   {
     /* [3] */
     /* fn dot4add_i8packed(u32, u32, ptr<function, i32, writable>) -> i32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(146),
+    /* overloads */ OverloadIndex(152),
   },
   {
     /* [4] */
     /* fn dot4add_u8packed(u32, u32, ptr<function, u32, writable>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(147),
+    /* overloads */ OverloadIndex(153),
   },
   {
     /* [5] */
     /* fn f32tof16(f32) -> u32 */
     /* fn f32tof16[N : num](vec<N, f32>) -> vec<N, u32> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(132),
+    /* overloads */ OverloadIndex(138),
   },
   {
     /* [6] */
     /* fn f16tof32(u32) -> f32 */
     /* fn f16tof32[N : num](vec<N, u32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(134),
+    /* overloads */ OverloadIndex(140),
   },
   {
     /* [7] */
     /* fn InterlockedCompareExchange[T : iu32](ptr<workgroup, atomic<T>, read_write>, compare_value: iu32, value: iu32, original_value: ptr<function, iu32, read_write>) */
     /* fn InterlockedCompareExchange(byte_address_buffer<read_write>, offset: iu32, compare_value: iu32, value: iu32, original_value: ptr<function, iu32, read_write>) */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(136),
+    /* overloads */ OverloadIndex(142),
   },
   {
     /* [8] */
     /* fn InterlockedExchange[T : iu32](ptr<workgroup, atomic<T>, read_write>, value: iu32, original_value: ptr<function, iu32, read_write>) */
     /* fn InterlockedExchange(byte_address_buffer<readable>, offset: iu32, value: iu32, original_value: ptr<function, iu32, read_write>) */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(138),
+    /* overloads */ OverloadIndex(144),
   },
   {
     /* [9] */
     /* fn InterlockedAdd[T : iu32](ptr<workgroup, atomic<T>, read_write>, value: iu32, original_value: ptr<function, iu32, read_write>) */
     /* fn InterlockedAdd(byte_address_buffer<readable>, offset: iu32, value: iu32, original_value: ptr<function, iu32, read_write>) */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(138),
+    /* overloads */ OverloadIndex(144),
   },
   {
     /* [10] */
     /* fn InterlockedMax[T : iu32](ptr<workgroup, atomic<T>, read_write>, value: iu32, original_value: ptr<function, iu32, read_write>) */
     /* fn InterlockedMax(byte_address_buffer<readable>, offset: iu32, value: iu32, original_value: ptr<function, iu32, read_write>) */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(138),
+    /* overloads */ OverloadIndex(144),
   },
   {
     /* [11] */
     /* fn InterlockedMin[T : iu32](ptr<workgroup, atomic<T>, read_write>, value: iu32, original_value: ptr<function, iu32, read_write>) */
     /* fn InterlockedMin(byte_address_buffer<readable>, offset: iu32, value: iu32, original_value: ptr<function, iu32, read_write>) */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(138),
+    /* overloads */ OverloadIndex(144),
   },
   {
     /* [12] */
     /* fn InterlockedAnd[T : iu32](ptr<workgroup, atomic<T>, read_write>, value: iu32, original_value: ptr<function, iu32, read_write>) */
     /* fn InterlockedAnd(byte_address_buffer<readable>, offset: iu32, value: iu32, original_value: ptr<function, iu32, read_write>) */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(138),
+    /* overloads */ OverloadIndex(144),
   },
   {
     /* [13] */
     /* fn InterlockedOr[T : iu32](ptr<workgroup, atomic<T>, read_write>, value: iu32, original_value: ptr<function, iu32, read_write>) */
     /* fn InterlockedOr(byte_address_buffer<readable>, offset: iu32, value: iu32, original_value: ptr<function, iu32, read_write>) */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(138),
+    /* overloads */ OverloadIndex(144),
   },
   {
     /* [14] */
     /* fn InterlockedXor[T : iu32](ptr<workgroup, atomic<T>, read_write>, value: iu32, original_value: ptr<function, iu32, read_write>) */
     /* fn InterlockedXor(byte_address_buffer<readable>, offset: iu32, value: iu32, original_value: ptr<function, iu32, read_write>) */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(138),
+    /* overloads */ OverloadIndex(144),
   },
   {
     /* [15] */
@@ -5569,35 +5748,38 @@
     /* fn mul[T : f32_f16, C : num, R : num](vec<R, T>, mat<R, C, T>) -> vec<C, T> */
     /* fn mul[T : f32_f16, K : num, C : num, R : num](mat<R, K, T>, mat<K, C, T>) -> mat<R, C, T> */
     /* num overloads */ 3,
-    /* overloads */ OverloadIndex(123),
+    /* overloads */ OverloadIndex(129),
   },
   {
     /* [16] */
     /* fn pack_u8(vec4<u32>) -> uint8_t4_packed */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(148),
+    /* overloads */ OverloadIndex(154),
   },
   {
     /* [17] */
     /* fn pack_s8(vec4<i32>) -> int8_t4_packed */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(149),
+    /* overloads */ OverloadIndex(155),
   },
   {
     /* [18] */
     /* fn pack_clamp_s8(vec4<i32>) -> int8_t4_packed */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(149),
+    /* overloads */ OverloadIndex(155),
   },
   {
     /* [19] */
     /* fn sign[T : fi32_f16](T) -> i32 */
     /* fn sign[N : num, T : fi32_f16](vec<N, T>) -> vec<N, i32> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(140),
+    /* overloads */ OverloadIndex(146),
   },
   {
     /* [20] */
+    /* fn textureStore[C : iu32](texture: rasterizer_ordered_texture_2d<f32_texel_format>, coords: vec2<C>, value: vec4<f32>) */
+    /* fn textureStore[C : iu32](texture: rasterizer_ordered_texture_2d<i32_texel_format>, coords: vec2<C>, value: vec4<i32>) */
+    /* fn textureStore[C : iu32](texture: rasterizer_ordered_texture_2d<u32_texel_format>, coords: vec2<C>, value: vec4<u32>) */
     /* fn textureStore[C : iu32](texture: texture_storage_1d<f32_texel_format, writable>, coords: C, value: vec4<f32>) */
     /* fn textureStore[C : iu32](texture: texture_storage_2d<f32_texel_format, writable>, coords: vec2<C>, value: vec4<f32>) */
     /* fn textureStore[C : iu32](texture: texture_storage_2d_array<f32_texel_format, writable>, coords: vec3<C>, value: vec4<f32>) */
@@ -5610,53 +5792,53 @@
     /* fn textureStore[C : iu32](texture: texture_storage_2d<u32_texel_format, writable>, coords: vec2<C>, value: vec4<u32>) */
     /* fn textureStore[C : iu32](texture: texture_storage_2d_array<u32_texel_format, writable>, coords: vec3<C>, value: vec4<u32>) */
     /* fn textureStore[C : iu32](texture: texture_storage_3d<u32_texel_format, writable>, coords: vec3<C>, value: vec4<u32>) */
-    /* num overloads */ 12,
-    /* overloads */ OverloadIndex(77),
+    /* num overloads */ 15,
+    /* overloads */ OverloadIndex(51),
   },
   {
     /* [21] */
     /* fn unpack_s8s32(int8_t4_packed) -> vec4<i32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(150),
+    /* overloads */ OverloadIndex(156),
   },
   {
     /* [22] */
     /* fn unpack_u8u32(uint8_t4_packed) -> vec4<u32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(151),
+    /* overloads */ OverloadIndex(157),
   },
   {
     /* [23] */
     /* fn WaveGetLaneIndex() -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(152),
+    /* overloads */ OverloadIndex(158),
   },
   {
     /* [24] */
     /* fn WaveGetLaneCount() -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(152),
+    /* overloads */ OverloadIndex(158),
   },
   {
     /* [25] */
     /* fn WaveReadLaneAt[T : fiu32_f16](T, u32) -> T */
     /* fn WaveReadLaneAt[N : num, T : fiu32_f16](vec<N, T>, u32) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(142),
+    /* overloads */ OverloadIndex(148),
   },
   {
     /* [26] */
     /* fn modf[T : f32_f16](T, T) -> T */
     /* fn modf[N : num, T : f32_f16](vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(144),
+    /* overloads */ OverloadIndex(150),
   },
   {
     /* [27] */
     /* fn frexp[T : f32_f16](T, T) -> T */
     /* fn frexp[N : num, T : f32_f16](vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(144),
+    /* overloads */ OverloadIndex(150),
   },
   {
     /* [28] */
@@ -5669,6 +5851,9 @@
     /* fn Load(texture: texture_depth_2d, location: vec3<i32>) -> vec4<f32> */
     /* fn Load(texture: texture_depth_2d_array, location: vec4<i32>) -> vec4<f32> */
     /* fn Load(texture: texture_depth_multisampled_2d, location: vec2<i32>, sample_index: i32) -> vec4<f32> */
+    /* fn Load[F : f32_texel_format, C : iu32](texture: rasterizer_ordered_texture_2d<F>, location: vec2<C>) -> vec4<f32> */
+    /* fn Load[F : u32_texel_format, C : iu32](texture: rasterizer_ordered_texture_2d<F>, location: vec2<C>) -> vec4<u32> */
+    /* fn Load[F : i32_texel_format, C : iu32](texture: rasterizer_ordered_texture_2d<F>, location: vec2<C>) -> vec4<i32> */
     /* fn Load[F : f32_texel_format, A : readable](texture: texture_storage_1d<F, A>, location: vec2<i32>) -> vec4<f32> */
     /* fn Load[F : f32_texel_format, A : readable](texture: texture_storage_2d<F, A>, location: vec3<i32>) -> vec4<f32> */
     /* fn Load[F : f32_texel_format, A : readable](texture: texture_storage_2d_array<F, A>, location: vec4<i32>) -> vec4<f32> */
@@ -5681,98 +5866,98 @@
     /* fn Load[F : i32_texel_format, A : readable](texture: texture_storage_2d<F, A>, location: vec3<i32>) -> vec4<i32> */
     /* fn Load[F : i32_texel_format, A : readable](texture: texture_storage_2d_array<F, A>, location: vec4<i32>) -> vec4<i32> */
     /* fn Load[F : i32_texel_format, A : readable](texture: texture_storage_3d<F, A>, location: vec4<i32>) -> vec4<i32> */
-    /* num overloads */ 21,
+    /* num overloads */ 24,
     /* overloads */ OverloadIndex(27),
   },
   {
     /* [29] */
     /* fn Load2(byte_address_buffer<readable>, offset: u32) -> vec2<u32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(153),
+    /* overloads */ OverloadIndex(159),
   },
   {
     /* [30] */
     /* fn Load3(byte_address_buffer<readable>, offset: u32) -> vec3<u32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(154),
+    /* overloads */ OverloadIndex(160),
   },
   {
     /* [31] */
     /* fn Load4(byte_address_buffer<readable>, offset: u32) -> vec4<u32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(155),
+    /* overloads */ OverloadIndex(161),
   },
   {
     /* [32] */
     /* fn LoadF16(byte_address_buffer<readable>, offset: u32) -> f16 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(156),
+    /* overloads */ OverloadIndex(162),
   },
   {
     /* [33] */
     /* fn Load2F16(byte_address_buffer<readable>, offset: u32) -> vec2<f16> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(157),
+    /* overloads */ OverloadIndex(163),
   },
   {
     /* [34] */
     /* fn Load3F16(byte_address_buffer<readable>, offset: u32) -> vec3<f16> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(158),
+    /* overloads */ OverloadIndex(164),
   },
   {
     /* [35] */
     /* fn Load4F16(byte_address_buffer<readable>, offset: u32) -> vec4<f16> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(159),
+    /* overloads */ OverloadIndex(165),
   },
   {
     /* [36] */
     /* fn Store(byte_address_buffer<writable>, offset: u32, value: u32) */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(160),
+    /* overloads */ OverloadIndex(166),
   },
   {
     /* [37] */
     /* fn Store2(byte_address_buffer<writable>, offset: u32, value: vec2<u32>) */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(161),
+    /* overloads */ OverloadIndex(167),
   },
   {
     /* [38] */
     /* fn Store3(byte_address_buffer<writable>, offset: u32, value: vec3<u32>) */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(162),
+    /* overloads */ OverloadIndex(168),
   },
   {
     /* [39] */
     /* fn Store4(byte_address_buffer<writable>, offset: u32, value: vec4<u32>) */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(163),
+    /* overloads */ OverloadIndex(169),
   },
   {
     /* [40] */
     /* fn StoreF16(byte_address_buffer<writable>, offset: u32, value: f16) */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(164),
+    /* overloads */ OverloadIndex(170),
   },
   {
     /* [41] */
     /* fn Store2F16(byte_address_buffer<writable>, offset: u32, value: vec2<f16>) */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(165),
+    /* overloads */ OverloadIndex(171),
   },
   {
     /* [42] */
     /* fn Store3F16(byte_address_buffer<writable>, offset: u32, value: vec3<f16>) */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(166),
+    /* overloads */ OverloadIndex(172),
   },
   {
     /* [43] */
     /* fn Store4F16(byte_address_buffer<writable>, offset: u32, value: vec4<f16>) */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(167),
+    /* overloads */ OverloadIndex(173),
   },
   {
     /* [44] */
@@ -5783,7 +5968,7 @@
     /* fn GatherCmp(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> vec4<f32> */
     /* fn GatherCmp(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec4<f32>, depth_ref: f32) -> vec4<f32> */
     /* num overloads */ 6,
-    /* overloads */ OverloadIndex(105),
+    /* overloads */ OverloadIndex(111),
   },
   {
     /* [45] */
@@ -5794,7 +5979,7 @@
     /* fn Gather(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>) -> vec4<f32> */
     /* fn Gather(texture: texture_depth_cube_array, sampler: sampler, coords: vec4<f32>) -> vec4<f32> */
     /* num overloads */ 6,
-    /* overloads */ OverloadIndex(57),
+    /* overloads */ OverloadIndex(75),
   },
   {
     /* [46] */
@@ -5805,7 +5990,7 @@
     /* fn GatherAlpha[T : fiu32](texture: texture_cube<T>, sampler: sampler, coords: vec3<f32>) -> vec4<T> */
     /* fn GatherAlpha[T : fiu32](texture: texture_cube_array<T>, sampler: sampler, coords: vec4<f32>) -> vec4<T> */
     /* num overloads */ 6,
-    /* overloads */ OverloadIndex(111),
+    /* overloads */ OverloadIndex(117),
   },
   {
     /* [47] */
@@ -5816,7 +6001,7 @@
     /* fn GatherBlue[T : fiu32](texture: texture_cube<T>, sampler: sampler, coords: vec3<f32>) -> vec4<T> */
     /* fn GatherBlue[T : fiu32](texture: texture_cube_array<T>, sampler: sampler, coords: vec4<f32>) -> vec4<T> */
     /* num overloads */ 6,
-    /* overloads */ OverloadIndex(111),
+    /* overloads */ OverloadIndex(117),
   },
   {
     /* [48] */
@@ -5827,7 +6012,7 @@
     /* fn GatherGreen[T : fiu32](texture: texture_cube<T>, sampler: sampler, coords: vec3<f32>) -> vec4<T> */
     /* fn GatherGreen[T : fiu32](texture: texture_cube_array<T>, sampler: sampler, coords: vec4<f32>) -> vec4<T> */
     /* num overloads */ 6,
-    /* overloads */ OverloadIndex(111),
+    /* overloads */ OverloadIndex(117),
   },
   {
     /* [49] */
@@ -5838,7 +6023,7 @@
     /* fn GatherRed[T : fiu32](texture: texture_cube<T>, sampler: sampler, coords: vec3<f32>) -> vec4<T> */
     /* fn GatherRed[T : fiu32](texture: texture_cube_array<T>, sampler: sampler, coords: vec4<f32>) -> vec4<T> */
     /* num overloads */ 6,
-    /* overloads */ OverloadIndex(111),
+    /* overloads */ OverloadIndex(117),
   },
   {
     /* [50] */
@@ -5890,7 +6075,7 @@
     /* fn Sample(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>) -> vec4<f32> */
     /* fn Sample(texture: texture_depth_cube_array, sampler: sampler, coords: vec4<f32>) -> vec4<f32> */
     /* num overloads */ 15,
-    /* overloads */ OverloadIndex(48),
+    /* overloads */ OverloadIndex(66),
   },
   {
     /* [52] */
@@ -5903,7 +6088,7 @@
     /* fn SampleBias(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, bias: f32) -> vec4<f32> */
     /* fn SampleBias(texture: texture_cube_array<f32>, sampler: sampler, coords: vec4<f32>, bias: f32) -> vec4<f32> */
     /* num overloads */ 8,
-    /* overloads */ OverloadIndex(89),
+    /* overloads */ OverloadIndex(95),
   },
   {
     /* [53] */
@@ -5914,7 +6099,7 @@
     /* fn SampleCmp(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, value: f32) -> f32 */
     /* fn SampleCmp(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec4<f32>, value: f32) -> f32 */
     /* num overloads */ 6,
-    /* overloads */ OverloadIndex(117),
+    /* overloads */ OverloadIndex(123),
   },
   {
     /* [54] */
@@ -5925,7 +6110,7 @@
     /* fn SampleCmpLevelZero(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, value: f32) -> f32 */
     /* fn SampleCmpLevelZero(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec4<f32>, value: f32) -> f32 */
     /* num overloads */ 6,
-    /* overloads */ OverloadIndex(117),
+    /* overloads */ OverloadIndex(123),
   },
   {
     /* [55] */
@@ -5938,7 +6123,7 @@
     /* fn SampleGrad(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32> */
     /* fn SampleGrad(texture: texture_cube_array<f32>, sampler: sampler, coords: vec4<f32>, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32> */
     /* num overloads */ 8,
-    /* overloads */ OverloadIndex(97),
+    /* overloads */ OverloadIndex(103),
   },
   {
     /* [56] */
@@ -5957,7 +6142,7 @@
     /* fn SampleLevel(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>, level: f32) -> vec4<f32> */
     /* fn SampleLevel(texture: texture_depth_cube_array, sampler: sampler, coords: vec4<f32>, level: f32) -> vec4<f32> */
     /* num overloads */ 14,
-    /* overloads */ OverloadIndex(63),
+    /* overloads */ OverloadIndex(81),
   },
 };
 
diff --git a/src/tint/lang/hlsl/intrinsic/type_matchers.h b/src/tint/lang/hlsl/intrinsic/type_matchers.h
index 250e35c..f60c59d 100644
--- a/src/tint/lang/hlsl/intrinsic/type_matchers.h
+++ b/src/tint/lang/hlsl/intrinsic/type_matchers.h
@@ -32,6 +32,7 @@
 #include "src/tint/lang/core/type/manager.h"
 #include "src/tint/lang/hlsl/type/byte_address_buffer.h"
 #include "src/tint/lang/hlsl/type/int8_t4_packed.h"
+#include "src/tint/lang/hlsl/type/rasterizer_ordered_texture_2d.h"
 #include "src/tint/lang/hlsl/type/uint8_t4_packed.h"
 
 namespace tint::hlsl::intrinsic {
@@ -52,6 +53,25 @@
     return state.types.Get<type::ByteAddressBuffer>(static_cast<core::Access>(A.Value()));
 }
 
+inline bool MatchRasterizerOrderedTexture2D(core::intrinsic::MatchState&,
+                                            const core::type::Type* ty,
+                                            core::intrinsic::Number& F) {
+    if (auto* buf = ty->As<type::RasterizerOrderedTexture2D>()) {
+        F = core::intrinsic::Number(static_cast<uint32_t>(buf->TexelFormat()));
+        return true;
+    }
+    return false;
+}
+
+inline const type::RasterizerOrderedTexture2D* BuildRasterizerOrderedTexture2D(
+    core::intrinsic::MatchState& state,
+    const core::type::Type*,
+    core::intrinsic::Number& F) {
+    auto format = static_cast<core::TexelFormat>(F.Value());
+    auto* subtype = type::RasterizerOrderedTexture2D::SubtypeFor(format, state.types);
+    return state.types.Get<type::RasterizerOrderedTexture2D>(format, subtype);
+}
+
 inline bool MatchInt8T4Packed(core::intrinsic::MatchState&, const core::type::Type* ty) {
     return ty->IsAnyOf<core::intrinsic::Any, type::Int8T4Packed>();
 }
diff --git a/src/tint/lang/hlsl/type/BUILD.bazel b/src/tint/lang/hlsl/type/BUILD.bazel
index eb9a6b5..3274b5d 100644
--- a/src/tint/lang/hlsl/type/BUILD.bazel
+++ b/src/tint/lang/hlsl/type/BUILD.bazel
@@ -41,11 +41,13 @@
   srcs = [
     "byte_address_buffer.cc",
     "int8_t4_packed.cc",
+    "rasterizer_ordered_texture_2d.cc",
     "uint8_t4_packed.cc",
   ],
   hdrs = [
     "byte_address_buffer.h",
     "int8_t4_packed.h",
+    "rasterizer_ordered_texture_2d.h",
     "uint8_t4_packed.h",
   ],
   deps = [
diff --git a/src/tint/lang/hlsl/type/BUILD.cmake b/src/tint/lang/hlsl/type/BUILD.cmake
index a658de4..a13acc8 100644
--- a/src/tint/lang/hlsl/type/BUILD.cmake
+++ b/src/tint/lang/hlsl/type/BUILD.cmake
@@ -43,6 +43,8 @@
   lang/hlsl/type/byte_address_buffer.h
   lang/hlsl/type/int8_t4_packed.cc
   lang/hlsl/type/int8_t4_packed.h
+  lang/hlsl/type/rasterizer_ordered_texture_2d.cc
+  lang/hlsl/type/rasterizer_ordered_texture_2d.h
   lang/hlsl/type/uint8_t4_packed.cc
   lang/hlsl/type/uint8_t4_packed.h
 )
diff --git a/src/tint/lang/hlsl/type/BUILD.gn b/src/tint/lang/hlsl/type/BUILD.gn
index 4ae871f..18cd8d7 100644
--- a/src/tint/lang/hlsl/type/BUILD.gn
+++ b/src/tint/lang/hlsl/type/BUILD.gn
@@ -49,6 +49,8 @@
     "byte_address_buffer.h",
     "int8_t4_packed.cc",
     "int8_t4_packed.h",
+    "rasterizer_ordered_texture_2d.cc",
+    "rasterizer_ordered_texture_2d.h",
     "uint8_t4_packed.cc",
     "uint8_t4_packed.h",
   ]
diff --git a/src/tint/lang/hlsl/type/rasterizer_ordered_texture_2d.cc b/src/tint/lang/hlsl/type/rasterizer_ordered_texture_2d.cc
new file mode 100644
index 0000000..45e1bc7
--- /dev/null
+++ b/src/tint/lang/hlsl/type/rasterizer_ordered_texture_2d.cc
@@ -0,0 +1,86 @@
+// 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/lang/hlsl/type/rasterizer_ordered_texture_2d.h"
+
+#include <cstddef>
+#include <string>
+
+#include "src/tint/lang/core/type/clone_context.h"
+#include "src/tint/lang/core/type/f32.h"
+#include "src/tint/lang/core/type/i32.h"
+#include "src/tint/lang/core/type/manager.h"
+#include "src/tint/lang/core/type/u32.h"
+#include "src/tint/lang/core/type/unique_node.h"
+#include "src/tint/utils/math/hash.h"
+#include "src/tint/utils/rtti/castable.h"
+
+TINT_INSTANTIATE_TYPEINFO(tint::hlsl::type::RasterizerOrderedTexture2D);
+
+namespace tint::hlsl::type {
+
+RasterizerOrderedTexture2D::RasterizerOrderedTexture2D(core::TexelFormat format,
+                                                       const core::type::Type* subtype)
+    : Base(static_cast<size_t>(Hash(tint::TypeCode::Of<RasterizerOrderedTexture2D>().bits)),
+           core::type::TextureDimension::k2d),
+      texel_format_(format),
+      subtype_(subtype) {}
+
+bool RasterizerOrderedTexture2D::Equals(const UniqueNode& other) const {
+    if (auto* o = other.As<RasterizerOrderedTexture2D>()) {
+        return o->TexelFormat() == TexelFormat();
+    }
+    return false;
+}
+
+std::string RasterizerOrderedTexture2D::FriendlyName() const {
+    StringStream out;
+    out << "hlsl.rasterizer_ordered_texture_2d<" << ToString(TexelFormat()) << ">";
+    return out.str();
+}
+
+core::type::Type* RasterizerOrderedTexture2D::SubtypeFor(core::TexelFormat format,
+                                                         core::type::Manager& type_mgr) {
+    switch (format) {
+        case core::TexelFormat::kR32Uint:
+            return type_mgr.Get<core::type::U32>();
+        case core::TexelFormat::kR32Sint:
+            return type_mgr.Get<core::type::I32>();
+        case core::TexelFormat::kR32Float:
+            return type_mgr.Get<core::type::F32>();
+        default:
+            break;
+    }
+    return nullptr;
+}
+
+RasterizerOrderedTexture2D* RasterizerOrderedTexture2D::Clone(core::type::CloneContext& ctx) const {
+    auto* ty = subtype_->Clone(ctx);
+    return ctx.dst.mgr->Get<RasterizerOrderedTexture2D>(texel_format_, ty);
+}
+
+}  // namespace tint::hlsl::type
diff --git a/src/tint/lang/hlsl/type/rasterizer_ordered_texture_2d.h b/src/tint/lang/hlsl/type/rasterizer_ordered_texture_2d.h
new file mode 100644
index 0000000..3c8f8a6
--- /dev/null
+++ b/src/tint/lang/hlsl/type/rasterizer_ordered_texture_2d.h
@@ -0,0 +1,78 @@
+// 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.
+
+#ifndef SRC_TINT_LANG_HLSL_TYPE_RASTERIZER_ORDERED_TEXTURE_2D_H_
+#define SRC_TINT_LANG_HLSL_TYPE_RASTERIZER_ORDERED_TEXTURE_2D_H_
+
+#include <string>
+
+#include "src/tint/lang/core/texel_format.h"
+#include "src/tint/lang/core/type/texture.h"
+
+namespace tint::hlsl::type {
+
+/// RasterizerOrderedTexture2D represents a 2D ROV texture
+// See https://learn.microsoft.com/en-us/windows/win32/direct3d11/rasterizer-order-views
+class RasterizerOrderedTexture2D final
+    : public Castable<RasterizerOrderedTexture2D, core::type::Texture> {
+  public:
+    /// Constructor
+    /// @param format the texel format
+    /// @param subtype the texture subtype
+    explicit RasterizerOrderedTexture2D(core::TexelFormat format, const Type* subtype);
+
+    /// @returns the texel format
+    core::TexelFormat TexelFormat() const { return texel_format_; }
+
+    /// @returns the storage subtype
+    const core::type::Type* Type() const { return subtype_; }
+
+    /// @param other the other node to compare against
+    /// @returns true if the this type is equal to @p other
+    bool Equals(const UniqueNode& other) const override;
+
+    /// @returns the friendly name for this type
+    std::string FriendlyName() const override;
+
+    /// @param format the storage texture image format
+    /// @param type_mgr the Manager used to build the returned type
+    /// @returns the storage texture subtype for the given TexelFormat
+    static core::type::Type* SubtypeFor(core::TexelFormat format, core::type::Manager& type_mgr);
+
+    /// @param ctx the clone context
+    /// @returns a clone of this type
+    RasterizerOrderedTexture2D* Clone(core::type::CloneContext& ctx) const override;
+
+  private:
+    // const core::type::Type* const store_type_;
+    core::TexelFormat const texel_format_;
+    const core::type::Type* const subtype_;
+};
+
+}  // namespace tint::hlsl::type
+
+#endif  // SRC_TINT_LANG_HLSL_TYPE_RASTERIZER_ORDERED_TEXTURE_2D_H_
diff --git a/src/tint/lang/hlsl/writer/printer/printer.cc b/src/tint/lang/hlsl/writer/printer/printer.cc
index 2abb37a..4a42a82 100644
--- a/src/tint/lang/hlsl/writer/printer/printer.cc
+++ b/src/tint/lang/hlsl/writer/printer/printer.cc
@@ -106,6 +106,7 @@
 #include "src/tint/lang/hlsl/ir/ternary.h"
 #include "src/tint/lang/hlsl/type/byte_address_buffer.h"
 #include "src/tint/lang/hlsl/type/int8_t4_packed.h"
+#include "src/tint/lang/hlsl/type/rasterizer_ordered_texture_2d.h"
 #include "src/tint/lang/hlsl/type/uint8_t4_packed.h"
 #include "src/tint/utils/containers/hashmap.h"
 #include "src/tint/utils/containers/map.h"
@@ -566,6 +567,8 @@
             auto* st = ptr->StoreType()->As<core::type::StorageTexture>();
             if (st && st->Access() != core::Access::kRead) {
                 register_space = 'u';
+            } else if (ptr->StoreType()->Is<hlsl::type::RasterizerOrderedTexture2D>()) {
+                register_space = 'u';
             }
         } else if (ptr->StoreType()->Is<core::type::Sampler>()) {
             register_space = 's';
@@ -575,7 +578,6 @@
         auto bp = var->BindingPoint();
         TINT_ASSERT(bp.has_value());
 
-        // TODO(dsinclair): Handle PixelLocal::RasterizerOrderedView attribute
         auto out = Line();
         EmitTypeAndName(out, var->Result(0)->Type(), NameOf(var->Result(0)));
         out << RegisterAndSpace(register_space, bp.value()) << ";";
@@ -1288,6 +1290,10 @@
                 }
                 out << "ByteAddressBuffer";
             },
+            [&](const hlsl::type::RasterizerOrderedTexture2D* rov) {
+                auto* component = ImageFormatToRWtextureType(rov->TexelFormat());
+                out << "RasterizerOrderedTexture2D<" << component << ">";
+            },
             [&](const hlsl::type::Int8T4Packed*) { out << "int8_t4_packed"; },
             [&](const hlsl::type::Uint8T4Packed*) { out << "uint8_t4_packed"; },
 
diff --git a/src/tint/lang/hlsl/writer/raise/BUILD.bazel b/src/tint/lang/hlsl/writer/raise/BUILD.bazel
index 46be924..77966f3 100644
--- a/src/tint/lang/hlsl/writer/raise/BUILD.bazel
+++ b/src/tint/lang/hlsl/writer/raise/BUILD.bazel
@@ -45,6 +45,7 @@
     "decompose_uniform_access.cc",
     "fxc_polyfill.cc",
     "localize_struct_array_assignment.cc",
+    "pixel_local.cc",
     "promote_initializers.cc",
     "raise.cc",
     "replace_non_indexable_mat_vec_stores.cc",
@@ -57,6 +58,7 @@
     "decompose_uniform_access.h",
     "fxc_polyfill.h",
     "localize_struct_array_assignment.h",
+    "pixel_local.h",
     "promote_initializers.h",
     "raise.h",
     "replace_non_indexable_mat_vec_stores.h",
@@ -104,6 +106,7 @@
     "decompose_uniform_access_test.cc",
     "fxc_polyfill_test.cc",
     "localize_struct_array_assignment_test.cc",
+    "pixel_local_test.cc",
     "promote_initializers_test.cc",
     "replace_non_indexable_mat_vec_stores_test.cc",
     "shader_io_test.cc",
@@ -116,6 +119,7 @@
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/ir/transform:test",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/hlsl/writer/common",
     "//src/tint/lang/hlsl/writer/raise",
     "//src/tint/utils/containers",
     "//src/tint/utils/diagnostic",
diff --git a/src/tint/lang/hlsl/writer/raise/BUILD.cmake b/src/tint/lang/hlsl/writer/raise/BUILD.cmake
index 9f2515b..7688276 100644
--- a/src/tint/lang/hlsl/writer/raise/BUILD.cmake
+++ b/src/tint/lang/hlsl/writer/raise/BUILD.cmake
@@ -51,6 +51,8 @@
   lang/hlsl/writer/raise/fxc_polyfill.h
   lang/hlsl/writer/raise/localize_struct_array_assignment.cc
   lang/hlsl/writer/raise/localize_struct_array_assignment.h
+  lang/hlsl/writer/raise/pixel_local.cc
+  lang/hlsl/writer/raise/pixel_local.h
   lang/hlsl/writer/raise/promote_initializers.cc
   lang/hlsl/writer/raise/promote_initializers.h
   lang/hlsl/writer/raise/raise.cc
@@ -105,6 +107,7 @@
   lang/hlsl/writer/raise/decompose_uniform_access_test.cc
   lang/hlsl/writer/raise/fxc_polyfill_test.cc
   lang/hlsl/writer/raise/localize_struct_array_assignment_test.cc
+  lang/hlsl/writer/raise/pixel_local_test.cc
   lang/hlsl/writer/raise/promote_initializers_test.cc
   lang/hlsl/writer/raise/replace_non_indexable_mat_vec_stores_test.cc
   lang/hlsl/writer/raise/shader_io_test.cc
@@ -118,6 +121,7 @@
   tint_lang_core_ir
   tint_lang_core_ir_transform_test
   tint_lang_core_type
+  tint_lang_hlsl_writer_common
   tint_lang_hlsl_writer_raise
   tint_utils_containers
   tint_utils_diagnostic
diff --git a/src/tint/lang/hlsl/writer/raise/BUILD.gn b/src/tint/lang/hlsl/writer/raise/BUILD.gn
index 48efb8d..6eef83a 100644
--- a/src/tint/lang/hlsl/writer/raise/BUILD.gn
+++ b/src/tint/lang/hlsl/writer/raise/BUILD.gn
@@ -57,6 +57,8 @@
     "fxc_polyfill.h",
     "localize_struct_array_assignment.cc",
     "localize_struct_array_assignment.h",
+    "pixel_local.cc",
+    "pixel_local.h",
     "promote_initializers.cc",
     "promote_initializers.h",
     "raise.cc",
@@ -105,6 +107,7 @@
       "decompose_uniform_access_test.cc",
       "fxc_polyfill_test.cc",
       "localize_struct_array_assignment_test.cc",
+      "pixel_local_test.cc",
       "promote_initializers_test.cc",
       "replace_non_indexable_mat_vec_stores_test.cc",
       "shader_io_test.cc",
@@ -119,6 +122,7 @@
       "${tint_src_dir}/lang/core/ir",
       "${tint_src_dir}/lang/core/ir/transform:unittests",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/hlsl/writer/common",
       "${tint_src_dir}/lang/hlsl/writer/raise",
       "${tint_src_dir}/utils/containers",
       "${tint_src_dir}/utils/diagnostic",
diff --git a/src/tint/lang/hlsl/writer/raise/pixel_local.cc b/src/tint/lang/hlsl/writer/raise/pixel_local.cc
new file mode 100644
index 0000000..886f17f
--- /dev/null
+++ b/src/tint/lang/hlsl/writer/raise/pixel_local.cc
@@ -0,0 +1,258 @@
+// 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/lang/hlsl/writer/raise/pixel_local.h"
+
+#include "src/tint/lang/core/ir/block.h"
+#include "src/tint/lang/core/ir/builder.h"
+#include "src/tint/lang/core/ir/exit.h"
+#include "src/tint/lang/core/ir/loop.h"
+#include "src/tint/lang/core/ir/switch.h"
+#include "src/tint/lang/core/ir/validator.h"
+#include "src/tint/lang/core/type/manager.h"
+#include "src/tint/lang/hlsl/builtin_fn.h"
+#include "src/tint/lang/hlsl/ir/builtin_call.h"
+#include "src/tint/lang/hlsl/ir/member_builtin_call.h"
+#include "src/tint/lang/hlsl/type/rasterizer_ordered_texture_2d.h"
+#include "src/tint/utils/containers/vector.h"
+#include "src/tint/utils/ice/ice.h"
+#include "src/tint/utils/result/result.h"
+
+namespace tint::hlsl::writer::raise {
+namespace {
+
+using namespace tint::core::fluent_types;  // NOLINT
+
+/// PIMPL state for the transform.
+struct State {
+    // Config options
+    const PixelLocalOptions& options;
+
+    /// The IR module.
+    core::ir::Module& ir;
+
+    /// The IR builder.
+    core::ir::Builder b{ir};
+
+    /// The type manager.
+    core::type::Manager& ty{ir.Types()};
+
+    // A Rasterizer Order View (ROV)
+    struct ROV {
+        core::ir::Var* var;
+        core::type::Type* subtype;
+    };
+    // Create ROV root variables, one per member of `pixel_local_struct`
+    Vector<ROV, 4> CreateROVs(const core::type::Struct* pixel_local_struct) {
+        Vector<ROV, 4> rovs;
+        // Create ROVs for each member of the struct
+        for (auto* mem : pixel_local_struct->Members()) {
+            auto options_texel_format = options.attachment_formats.find(mem->Index());
+            auto options_binding = options.attachments.find(mem->Index());
+            if (options_texel_format == options.attachment_formats.end() ||
+                options_binding == options.attachments.end()) {
+                TINT_ICE() << "missing options for member at index " << mem->Index();
+            }
+            core::TexelFormat texel_format;
+            switch (options_texel_format->second) {
+                case PixelLocalOptions::TexelFormat::kR32Sint:
+                    texel_format = core::TexelFormat::kR32Sint;
+                    break;
+                case PixelLocalOptions::TexelFormat::kR32Uint:
+                    texel_format = core::TexelFormat::kR32Uint;
+                    break;
+                case PixelLocalOptions::TexelFormat::kR32Float:
+                    texel_format = core::TexelFormat::kR32Float;
+                    break;
+                default:
+                    TINT_ICE() << "missing texel format for pixel local storage attachment";
+            }
+            auto* subtype = hlsl::type::RasterizerOrderedTexture2D::SubtypeFor(texel_format, ty);
+
+            auto* rov_ty = ty.Get<hlsl::type::RasterizerOrderedTexture2D>(texel_format, subtype);
+            auto* rov = b.Var("pixel_local_" + mem->Name().Name(), ty.ptr<handle>(rov_ty));
+            rov->SetBindingPoint(options.group_index, options_binding->second);
+
+            ir.root_block->Append(rov);
+            rovs.Emplace(rov, subtype);
+        }
+        return rovs;
+    }
+
+    void ProcessFragmentEntryPoint(core::ir::Function* entry_point,
+                                   core::ir::Var* pixel_local_var,
+                                   const core::type::Struct* pixel_local_struct,
+                                   const Vector<ROV, 4>& rovs) {
+        TINT_ASSERT(entry_point->Params().Length() == 1);  // Guaranteed by ShaderIO
+        core::ir::FunctionParam* entry_point_param = entry_point->Params()[0];
+
+        auto* param_struct = entry_point_param->Type()->As<core::type::Struct>();
+        TINT_ASSERT(param_struct);  // Guaranteed by ShaderIO
+
+        // Find the position builtin in the struct
+        const core::type::StructMember* position_member = nullptr;
+        for (auto* mem : param_struct->Members()) {
+            if (mem->Attributes().builtin == core::BuiltinValue::kPosition) {
+                position_member = mem;
+                break;
+            }
+        }
+        TINT_ASSERT(position_member);
+
+        // Get the entry point's single return instruction. We expect only one as this transform
+        // should run after ShaderIO.
+        core::ir::Return* entry_point_ret = nullptr;
+        if (entry_point->UsagesUnsorted().Count() == 1) {
+            entry_point_ret =
+                entry_point->UsagesUnsorted().begin()->instruction->As<core::ir::Return>();
+        }
+        if (!entry_point_ret) {
+            TINT_ICE() << "expected entry point with a single return";
+        }
+
+        // Change the address space of the var from 'pixel_local' to 'private'
+        pixel_local_var->Result(0)->SetType(ty.ptr<private_>(pixel_local_struct));
+        // As well as the usages
+        for (auto& usage : pixel_local_var->Result(0)->UsagesUnsorted()) {
+            if (auto* ptr = usage->instruction->Result(0)->Type()->As<core::type::Pointer>()) {
+                usage->instruction->Result(0)->SetType(ty.ptr<private_>(ptr->StoreType()));
+            }
+        }
+
+        // Insert coord decl used to index ROVs at the entry point start
+        core::ir::Instruction* coord = nullptr;
+        b.InsertBefore(entry_point->Block()->Front(), [&] {
+            coord = b.Access(ty.vec4<f32>(), entry_point_param, u32(position_member->Index()));
+            coord = b.Swizzle(ty.vec2<f32>(), coord, {0, 1});
+            coord = b.Convert<vec2<u32>>(coord);  // Input type to .Load
+        });
+
+        // Insert copy from ROVs to the struct right after the coord decl
+        b.InsertAfter(coord, [&] {
+            for (auto* mem : pixel_local_struct->Members()) {
+                auto& rov = rovs[mem->Index()];
+                auto* mem_ty = mem->Type();
+                TINT_ASSERT(mem_ty->Is<core::type::Scalar>());
+                core::ir::Instruction* from = b.Load(rov.var);
+                // Load returns a vec4, so we need to swizzle the first element
+                from = b.MemberCall<hlsl::ir::MemberBuiltinCall>(
+                    ty.vec4(rov.subtype), tint::hlsl::BuiltinFn::kLoad, from, coord);
+                from = b.Swizzle(rov.subtype, from, {0});
+                if (mem_ty != rov.subtype) {
+                    // ROV and struct member types don't match
+                    from = b.Convert(mem_ty, from);
+                }
+                auto* to = b.Access(ty.ptr<private_>(mem_ty), pixel_local_var, u32(mem->Index()));
+                b.Store(to, from);
+            }
+        });
+
+        // Insert a copy from the struct back to ROVs at the return point
+        b.InsertBefore(entry_point_ret, [&] {
+            for (auto* mem : pixel_local_struct->Members()) {
+                auto& rov = rovs[mem->Index()];
+                auto* mem_ty = mem->Type();
+                TINT_ASSERT(mem_ty->Is<core::type::Scalar>());
+                core::ir::Instruction* from =
+                    b.Access(ty.ptr<private_>(mem_ty), pixel_local_var, u32(mem->Index()));
+                if (mem_ty != rov.subtype) {
+                    // ROV and struct member types don't match
+                    from = b.Convert(rov.subtype, from);
+                }
+                // Store requires a vec4
+                from = b.Swizzle(ty.vec4(rov.subtype), from, {0, 0, 0, 0});
+                core::ir::Instruction* to = b.Load(rov.var);
+                b.Call<hlsl::ir::BuiltinCall>(  //
+                    ty.void_(), hlsl::BuiltinFn::kTextureStore, to, coord, from);
+            }
+        });
+    }
+
+    /// Process the module.
+    void Process() {
+        TINT_ASSERT(options.attachments.size() == options.attachment_formats.size());
+        if (options.attachments.size() == 0) {
+            return;
+        }
+
+        // Inline pointers
+        for (auto* inst : ir.Instructions()) {
+            if (auto* l = inst->As<core::ir::Let>()) {
+                if (l->Result(0)->Type()->Is<core::type::Pointer>()) {
+                    l->Result(0)->ReplaceAllUsesWith(l->Value());
+                    l->Destroy();
+                }
+            }
+        }
+
+        // Find the pixel_local module var, if any
+        core::ir::Var* pixel_local_var = nullptr;
+        const core::type::Struct* pixel_local_struct = nullptr;
+        for (auto* inst : *ir.root_block) {
+            if (auto* var = inst->As<core::ir::Var>()) {
+                auto* ptr = var->Result(0)->Type()->As<core::type::Pointer>();
+                if (ptr->AddressSpace() == core::AddressSpace::kPixelLocal) {
+                    pixel_local_var = var;
+                    pixel_local_struct = ptr->StoreType()->As<core::type::Struct>();
+                    break;
+                }
+            }
+        }
+        if (!pixel_local_var || !pixel_local_var->Result(0)->IsUsed()) {
+            return;
+        }
+        if (!pixel_local_struct) {
+            TINT_ICE() << "pixel_local var must be of struct type";
+        }
+        if (pixel_local_struct->Members().Length() != options.attachments.size()) {
+            TINT_ICE() << "missing options for each member of the pixel_local struct";
+        }
+
+        auto rovs = CreateROVs(pixel_local_struct);
+
+        for (auto f : ir.functions) {
+            if (f->Stage() == core::ir::Function::PipelineStage::kFragment) {
+                ProcessFragmentEntryPoint(f, pixel_local_var, pixel_local_struct, rovs);
+            }
+        }
+    }
+};
+
+}  // namespace
+
+Result<SuccessType> PixelLocal(core::ir::Module& ir, const PixelLocalConfig& config) {
+    auto result = ValidateAndDumpIfNeeded(ir, "PixelLocal transform");
+    if (result != Success) {
+        return result.Failure();
+    }
+
+    State{config.options, ir}.Process();
+
+    return Success;
+}
+
+}  // namespace tint::hlsl::writer::raise
diff --git a/src/tint/lang/hlsl/writer/raise/pixel_local.h b/src/tint/lang/hlsl/writer/raise/pixel_local.h
new file mode 100644
index 0000000..c889d5c
--- /dev/null
+++ b/src/tint/lang/hlsl/writer/raise/pixel_local.h
@@ -0,0 +1,53 @@
+// 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.
+
+#ifndef SRC_TINT_LANG_HLSL_WRITER_RAISE_PIXEL_LOCAL_H_
+#define SRC_TINT_LANG_HLSL_WRITER_RAISE_PIXEL_LOCAL_H_
+
+#include "src/tint/lang/hlsl/writer/common/options.h"
+#include "src/tint/utils/result/result.h"
+
+// Forward declarations.
+namespace tint::core::ir {
+class Module;
+}  // namespace tint::core::ir
+
+namespace tint::hlsl::writer::raise {
+
+struct PixelLocalConfig {
+    /// User-facing API options
+    PixelLocalOptions options;
+};
+
+/// PixelLocal is a transform that implements the PixelLocal feature for HLSL.
+/// @param module the module to transform
+/// @returns success or failure
+Result<SuccessType> PixelLocal(core::ir::Module& module, const PixelLocalConfig& config);
+
+}  // namespace tint::hlsl::writer::raise
+
+#endif  // SRC_TINT_LANG_HLSL_WRITER_RAISE_PIXEL_LOCAL_H_
diff --git a/src/tint/lang/hlsl/writer/raise/pixel_local_test.cc b/src/tint/lang/hlsl/writer/raise/pixel_local_test.cc
new file mode 100644
index 0000000..234da63
--- /dev/null
+++ b/src/tint/lang/hlsl/writer/raise/pixel_local_test.cc
@@ -0,0 +1,897 @@
+// 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/lang/hlsl/writer/raise/pixel_local.h"
+
+#include <gtest/gtest.h>
+#include <tuple>
+
+#include "src/tint/lang/core/fluent_types.h"
+#include "src/tint/lang/core/ir/clone_context.h"
+#include "src/tint/lang/core/ir/function.h"
+#include "src/tint/lang/core/ir/transform/helper_test.h"
+#include "src/tint/lang/core/number.h"
+
+using namespace tint::core::fluent_types;     // NOLINT
+using namespace tint::core::number_suffixes;  // NOLINT
+
+namespace tint::hlsl::writer::raise {
+namespace {
+
+constexpr auto pixel_local = core::AddressSpace::kPixelLocal;
+
+struct HlslWriterPixelLocalTest : core::ir::transform::TransformTest {
+    struct Result {
+        core::ir::Function* func;
+        core::ir::Var* pl;
+    };
+    Result OneArgFunc(bool multiple_builtins = false) {
+        auto* pixel_local_struct_ty =
+            ty.Struct(mod.symbols.New("PixelLocal"), {
+                                                         {mod.symbols.New("a"), ty.u32()},
+                                                     });
+        auto* pl = b.Var("pl", ty.ptr<pixel_local>(pixel_local_struct_ty));
+        mod.root_block->Append(pl);
+
+        Vector<core::type::Manager::StructMemberDesc, 3> members;
+        core::IOAttributes attrs;
+        attrs.builtin = core::BuiltinValue::kPosition;
+        members.Emplace(mod.symbols.New("pos"), ty.vec4<f32>(), attrs);
+        if (multiple_builtins) {
+            attrs.builtin = core::BuiltinValue::kFrontFacing;
+            members.Emplace(mod.symbols.New("front_facing"), ty.bool_(), attrs);
+            attrs.builtin = core::BuiltinValue::kFragDepth;
+            members.Emplace(mod.symbols.New("sample_index"), ty.u32(), attrs);
+        }
+        auto* param_struct_ty = ty.Struct(mod.symbols.New("params"), members);
+
+        auto* func =
+            b.Function("main", ty.vec4<f32>(), core::ir::Function::PipelineStage::kFragment);
+        func->SetReturnLocation(0_u);
+        func->SetParams({b.FunctionParam(param_struct_ty)});
+        return {func, pl};
+    }
+    PixelLocalConfig OneArgConfig() {
+        PixelLocalConfig config;
+        config.options.attachment_formats.emplace(0, PixelLocalOptions::TexelFormat::kR32Uint);
+        config.options.attachments.emplace(0, 10);
+        config.options.group_index = 7;
+        return config;
+    }
+
+    Result ThreeArgFunc() {
+        auto* pixel_local_struct_ty =
+            ty.Struct(mod.symbols.New("PixelLocal"), {{mod.symbols.New("a"), ty.u32()},
+                                                      {mod.symbols.New("b"), ty.i32()},
+                                                      {mod.symbols.New("c"), ty.f32()}});
+        auto* pl = b.Var("pl", ty.ptr<pixel_local>(pixel_local_struct_ty));
+        mod.root_block->Append(pl);
+
+        core::IOAttributes attrs;
+        attrs.builtin = core::BuiltinValue::kPosition;
+        auto* param_struct_ty =
+            ty.Struct(mod.symbols.New("params"), {{mod.symbols.New("pos"), ty.vec4<f32>(), attrs}});
+
+        auto* func =
+            b.Function("main", ty.vec4<f32>(), core::ir::Function::PipelineStage::kFragment);
+        func->SetReturnLocation(0_u);
+        func->SetParams({b.FunctionParam(param_struct_ty)});
+        return {func, pl};
+    }
+    PixelLocalConfig ThreeArgConfig() {
+        PixelLocalConfig config;
+        config.options.attachment_formats.emplace(0, PixelLocalOptions::TexelFormat::kR32Uint);
+        config.options.attachment_formats.emplace(1, PixelLocalOptions::TexelFormat::kR32Sint);
+        config.options.attachment_formats.emplace(2, PixelLocalOptions::TexelFormat::kR32Float);
+        config.options.attachments.emplace(0, 10);
+        config.options.attachments.emplace(1, 12);
+        config.options.attachments.emplace(2, 14);
+        config.options.group_index = 7;
+        return config;
+    }
+};
+
+TEST_F(HlslWriterPixelLocalTest, Unused) {
+    auto r = OneArgFunc();
+    b.Append(r.func->Block(), [&] {  //
+        b.Return(r.func, b.Construct<vec4<f32>>(1_f, 0_f, 0_f, 1_f));
+    });
+
+    auto* src = R"(
+PixelLocal = struct @align(4) {
+  a:u32 @offset(0)
+}
+
+params = struct @align(16) {
+  pos:vec4<f32> @offset(0), @builtin(position)
+}
+
+$B1: {  # root
+  %pl:ptr<pixel_local, PixelLocal, read_write> = var
+}
+
+%main = @fragment func(%3:params):vec4<f32> [@location(0)] {
+  $B2: {
+    %4:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    ret %4
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = src;
+
+    auto config = OneArgConfig();
+    Run(PixelLocal, config);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterPixelLocalTest, UsedInEntry) {
+    auto r = OneArgFunc();
+    b.Append(r.func->Block(), [&] {
+        auto* access = b.Access(ty.ptr<pixel_local>(ty.u32()), r.pl, 0_u);
+        auto* add = b.Add<u32>(b.Load(access), 42_u);
+        b.Store(access, add);
+        b.Return(r.func, b.Construct<vec4<f32>>(1_f, 0_f, 0_f, 1_f));
+    });
+
+    auto* src = R"(
+PixelLocal = struct @align(4) {
+  a:u32 @offset(0)
+}
+
+params = struct @align(16) {
+  pos:vec4<f32> @offset(0), @builtin(position)
+}
+
+$B1: {  # root
+  %pl:ptr<pixel_local, PixelLocal, read_write> = var
+}
+
+%main = @fragment func(%3:params):vec4<f32> [@location(0)] {
+  $B2: {
+    %4:ptr<pixel_local, u32, read_write> = access %pl, 0u
+    %5:u32 = load %4
+    %6:u32 = add %5, 42u
+    store %4, %6
+    %7:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    ret %7
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+PixelLocal = struct @align(4) {
+  a:u32 @offset(0)
+}
+
+params = struct @align(16) {
+  pos:vec4<f32> @offset(0), @builtin(position)
+}
+
+$B1: {  # root
+  %pl:ptr<private, PixelLocal, read_write> = var
+  %pixel_local_a:ptr<handle, hlsl.rasterizer_ordered_texture_2d<r32uint>, read> = var @binding_point(7, 10)
+}
+
+%main = @fragment func(%4:params):vec4<f32> [@location(0)] {
+  $B2: {
+    %5:vec4<f32> = access %4, 0u
+    %6:vec2<f32> = swizzle %5, xy
+    %7:vec2<u32> = convert %6
+    %8:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_a
+    %9:vec4<u32> = %8.Load %7
+    %10:u32 = swizzle %9, x
+    %11:ptr<private, u32, read_write> = access %pl, 0u
+    store %11, %10
+    %12:ptr<private, u32, read_write> = access %pl, 0u
+    %13:u32 = load %12
+    %14:u32 = add %13, 42u
+    store %12, %14
+    %15:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    %16:ptr<private, u32, read_write> = access %pl, 0u
+    %17:vec4<u32> = swizzle %16, xxxx
+    %18:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_a
+    %19:void = hlsl.textureStore %18, %7, %17
+    ret %15
+  }
+}
+)";
+
+    auto config = OneArgConfig();
+    Run(PixelLocal, config);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterPixelLocalTest, UsedInNonEntry) {
+    auto r = OneArgFunc();
+    auto* func2 = b.Function("foo", ty.void_());
+    b.Append(func2->Block(), [&] {
+        auto* access = b.Access(ty.ptr<pixel_local>(ty.u32()), r.pl, 0_u);
+        auto* add = b.Add<u32>(b.Load(access), 42_u);
+        b.Store(access, add);
+        b.Return(func2);
+    });
+    b.Append(r.func->Block(), [&] {
+        b.Call(func2);
+        b.Return(r.func, b.Construct<vec4<f32>>(1_f, 0_f, 0_f, 1_f));
+    });
+
+    auto* src = R"(
+PixelLocal = struct @align(4) {
+  a:u32 @offset(0)
+}
+
+params = struct @align(16) {
+  pos:vec4<f32> @offset(0), @builtin(position)
+}
+
+$B1: {  # root
+  %pl:ptr<pixel_local, PixelLocal, read_write> = var
+}
+
+%main = @fragment func(%3:params):vec4<f32> [@location(0)] {
+  $B2: {
+    %4:void = call %foo
+    %6:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    ret %6
+  }
+}
+%foo = func():void {
+  $B3: {
+    %7:ptr<pixel_local, u32, read_write> = access %pl, 0u
+    %8:u32 = load %7
+    %9:u32 = add %8, 42u
+    store %7, %9
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+PixelLocal = struct @align(4) {
+  a:u32 @offset(0)
+}
+
+params = struct @align(16) {
+  pos:vec4<f32> @offset(0), @builtin(position)
+}
+
+$B1: {  # root
+  %pl:ptr<private, PixelLocal, read_write> = var
+  %pixel_local_a:ptr<handle, hlsl.rasterizer_ordered_texture_2d<r32uint>, read> = var @binding_point(7, 10)
+}
+
+%main = @fragment func(%4:params):vec4<f32> [@location(0)] {
+  $B2: {
+    %5:vec4<f32> = access %4, 0u
+    %6:vec2<f32> = swizzle %5, xy
+    %7:vec2<u32> = convert %6
+    %8:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_a
+    %9:vec4<u32> = %8.Load %7
+    %10:u32 = swizzle %9, x
+    %11:ptr<private, u32, read_write> = access %pl, 0u
+    store %11, %10
+    %12:void = call %foo
+    %14:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    %15:ptr<private, u32, read_write> = access %pl, 0u
+    %16:vec4<u32> = swizzle %15, xxxx
+    %17:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_a
+    %18:void = hlsl.textureStore %17, %7, %16
+    ret %14
+  }
+}
+%foo = func():void {
+  $B3: {
+    %19:ptr<private, u32, read_write> = access %pl, 0u
+    %20:u32 = load %19
+    %21:u32 = add %20, 42u
+    store %19, %21
+    ret
+  }
+}
+)";
+
+    auto config = OneArgConfig();
+    Run(PixelLocal, config);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterPixelLocalTest, UsedInNonEntryViaPointer) {
+    auto r = OneArgFunc();
+    auto* func2 = b.Function("foo", ty.void_());
+    b.Append(func2->Block(), [&] {
+        auto* access = b.Access(ty.ptr<pixel_local>(ty.u32()), r.pl, 0_u);
+        auto* p = b.Let("p", access);
+        auto* add = b.Add<u32>(b.Load(p), 42_u);
+        b.Store(access, add);
+        b.Return(func2);
+    });
+    b.Append(r.func->Block(), [&] {
+        b.Call(func2);
+        b.Return(r.func, b.Construct<vec4<f32>>(1_f, 0_f, 0_f, 1_f));
+    });
+
+    auto* src = R"(
+PixelLocal = struct @align(4) {
+  a:u32 @offset(0)
+}
+
+params = struct @align(16) {
+  pos:vec4<f32> @offset(0), @builtin(position)
+}
+
+$B1: {  # root
+  %pl:ptr<pixel_local, PixelLocal, read_write> = var
+}
+
+%main = @fragment func(%3:params):vec4<f32> [@location(0)] {
+  $B2: {
+    %4:void = call %foo
+    %6:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    ret %6
+  }
+}
+%foo = func():void {
+  $B3: {
+    %7:ptr<pixel_local, u32, read_write> = access %pl, 0u
+    %p:ptr<pixel_local, u32, read_write> = let %7
+    %9:u32 = load %p
+    %10:u32 = add %9, 42u
+    store %7, %10
+    ret
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+PixelLocal = struct @align(4) {
+  a:u32 @offset(0)
+}
+
+params = struct @align(16) {
+  pos:vec4<f32> @offset(0), @builtin(position)
+}
+
+$B1: {  # root
+  %pl:ptr<private, PixelLocal, read_write> = var
+  %pixel_local_a:ptr<handle, hlsl.rasterizer_ordered_texture_2d<r32uint>, read> = var @binding_point(7, 10)
+}
+
+%main = @fragment func(%4:params):vec4<f32> [@location(0)] {
+  $B2: {
+    %5:vec4<f32> = access %4, 0u
+    %6:vec2<f32> = swizzle %5, xy
+    %7:vec2<u32> = convert %6
+    %8:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_a
+    %9:vec4<u32> = %8.Load %7
+    %10:u32 = swizzle %9, x
+    %11:ptr<private, u32, read_write> = access %pl, 0u
+    store %11, %10
+    %12:void = call %foo
+    %14:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    %15:ptr<private, u32, read_write> = access %pl, 0u
+    %16:vec4<u32> = swizzle %15, xxxx
+    %17:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_a
+    %18:void = hlsl.textureStore %17, %7, %16
+    ret %14
+  }
+}
+%foo = func():void {
+  $B3: {
+    %19:ptr<private, u32, read_write> = access %pl, 0u
+    %20:u32 = load %19
+    %21:u32 = add %20, 42u
+    store %19, %21
+    ret
+  }
+}
+)";
+
+    auto config = OneArgConfig();
+    Run(PixelLocal, config);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterPixelLocalTest, MultipleInputBuiltins) {
+    auto r = OneArgFunc(/*multiple_builtins*/ true);
+    b.Append(r.func->Block(), [&] {
+        auto* access = b.Access(ty.ptr<pixel_local>(ty.u32()), r.pl, 0_u);
+        auto* add = b.Add<u32>(b.Load(access), 42_u);
+        b.Store(access, add);
+        b.Return(r.func, b.Construct<vec4<f32>>(1_f, 0_f, 0_f, 1_f));
+    });
+
+    auto* src = R"(
+PixelLocal = struct @align(4) {
+  a:u32 @offset(0)
+}
+
+params = struct @align(16) {
+  pos:vec4<f32> @offset(0), @builtin(position)
+  front_facing:bool @offset(16), @builtin(front_facing)
+  sample_index:u32 @offset(20), @builtin(frag_depth)
+}
+
+$B1: {  # root
+  %pl:ptr<pixel_local, PixelLocal, read_write> = var
+}
+
+%main = @fragment func(%3:params):vec4<f32> [@location(0)] {
+  $B2: {
+    %4:ptr<pixel_local, u32, read_write> = access %pl, 0u
+    %5:u32 = load %4
+    %6:u32 = add %5, 42u
+    store %4, %6
+    %7:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    ret %7
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+PixelLocal = struct @align(4) {
+  a:u32 @offset(0)
+}
+
+params = struct @align(16) {
+  pos:vec4<f32> @offset(0), @builtin(position)
+  front_facing:bool @offset(16), @builtin(front_facing)
+  sample_index:u32 @offset(20), @builtin(frag_depth)
+}
+
+$B1: {  # root
+  %pl:ptr<private, PixelLocal, read_write> = var
+  %pixel_local_a:ptr<handle, hlsl.rasterizer_ordered_texture_2d<r32uint>, read> = var @binding_point(7, 10)
+}
+
+%main = @fragment func(%4:params):vec4<f32> [@location(0)] {
+  $B2: {
+    %5:vec4<f32> = access %4, 0u
+    %6:vec2<f32> = swizzle %5, xy
+    %7:vec2<u32> = convert %6
+    %8:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_a
+    %9:vec4<u32> = %8.Load %7
+    %10:u32 = swizzle %9, x
+    %11:ptr<private, u32, read_write> = access %pl, 0u
+    store %11, %10
+    %12:ptr<private, u32, read_write> = access %pl, 0u
+    %13:u32 = load %12
+    %14:u32 = add %13, 42u
+    store %12, %14
+    %15:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    %16:ptr<private, u32, read_write> = access %pl, 0u
+    %17:vec4<u32> = swizzle %16, xxxx
+    %18:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_a
+    %19:void = hlsl.textureStore %18, %7, %17
+    ret %15
+  }
+}
+)";
+
+    auto config = OneArgConfig();
+    Run(PixelLocal, config);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterPixelLocalTest, MultipleEntryPoints) {
+    auto* pixel_local_struct_ty =
+        ty.Struct(mod.symbols.New("PixelLocal"), {
+                                                     {mod.symbols.New("a"), ty.u32()},
+                                                 });
+    auto* pl = b.Var("pl", ty.ptr<pixel_local>(pixel_local_struct_ty));
+    mod.root_block->Append(pl);
+
+    Vector<core::type::Manager::StructMemberDesc, 3> members;
+    core::IOAttributes attrs;
+    attrs.builtin = core::BuiltinValue::kPosition;
+    members.Emplace(mod.symbols.New("pos"), ty.vec4<f32>(), attrs);
+    auto* param_struct_ty = ty.Struct(mod.symbols.New("params"), members);
+
+    for (size_t i = 0; i < 3; ++i) {
+        auto* func = b.Function("main" + std::to_string(i), ty.vec4<f32>(),
+                                core::ir::Function::PipelineStage::kFragment);
+        func->SetReturnLocation(0_u);
+        func->SetParams({b.FunctionParam(param_struct_ty)});
+
+        b.Append(func->Block(), [&] {
+            auto* access = b.Access(ty.ptr<pixel_local>(ty.u32()), pl, 0_u);
+            auto* add = b.Add<u32>(b.Load(access), 42_u);
+            b.Store(access, add);
+            b.Return(func, b.Construct<vec4<f32>>(1_f, 0_f, 0_f, 1_f));
+        });
+    }
+
+    auto* src = R"(
+PixelLocal = struct @align(4) {
+  a:u32 @offset(0)
+}
+
+params = struct @align(16) {
+  pos:vec4<f32> @offset(0), @builtin(position)
+}
+
+$B1: {  # root
+  %pl:ptr<pixel_local, PixelLocal, read_write> = var
+}
+
+%main0 = @fragment func(%3:params):vec4<f32> [@location(0)] {
+  $B2: {
+    %4:ptr<pixel_local, u32, read_write> = access %pl, 0u
+    %5:u32 = load %4
+    %6:u32 = add %5, 42u
+    store %4, %6
+    %7:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    ret %7
+  }
+}
+%main1 = @fragment func(%9:params):vec4<f32> [@location(0)] {
+  $B3: {
+    %10:ptr<pixel_local, u32, read_write> = access %pl, 0u
+    %11:u32 = load %10
+    %12:u32 = add %11, 42u
+    store %10, %12
+    %13:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    ret %13
+  }
+}
+%main2 = @fragment func(%15:params):vec4<f32> [@location(0)] {
+  $B4: {
+    %16:ptr<pixel_local, u32, read_write> = access %pl, 0u
+    %17:u32 = load %16
+    %18:u32 = add %17, 42u
+    store %16, %18
+    %19:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    ret %19
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+PixelLocal = struct @align(4) {
+  a:u32 @offset(0)
+}
+
+params = struct @align(16) {
+  pos:vec4<f32> @offset(0), @builtin(position)
+}
+
+$B1: {  # root
+  %pl:ptr<private, PixelLocal, read_write> = var
+  %pixel_local_a:ptr<handle, hlsl.rasterizer_ordered_texture_2d<r32uint>, read> = var @binding_point(7, 10)
+}
+
+%main0 = @fragment func(%4:params):vec4<f32> [@location(0)] {
+  $B2: {
+    %5:vec4<f32> = access %4, 0u
+    %6:vec2<f32> = swizzle %5, xy
+    %7:vec2<u32> = convert %6
+    %8:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_a
+    %9:vec4<u32> = %8.Load %7
+    %10:u32 = swizzle %9, x
+    %11:ptr<private, u32, read_write> = access %pl, 0u
+    store %11, %10
+    %12:ptr<private, u32, read_write> = access %pl, 0u
+    %13:u32 = load %12
+    %14:u32 = add %13, 42u
+    store %12, %14
+    %15:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    %16:ptr<private, u32, read_write> = access %pl, 0u
+    %17:vec4<u32> = swizzle %16, xxxx
+    %18:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_a
+    %19:void = hlsl.textureStore %18, %7, %17
+    ret %15
+  }
+}
+%main1 = @fragment func(%21:params):vec4<f32> [@location(0)] {
+  $B3: {
+    %22:vec4<f32> = access %21, 0u
+    %23:vec2<f32> = swizzle %22, xy
+    %24:vec2<u32> = convert %23
+    %25:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_a
+    %26:vec4<u32> = %25.Load %24
+    %27:u32 = swizzle %26, x
+    %28:ptr<private, u32, read_write> = access %pl, 0u
+    store %28, %27
+    %29:ptr<private, u32, read_write> = access %pl, 0u
+    %30:u32 = load %29
+    %31:u32 = add %30, 42u
+    store %29, %31
+    %32:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    %33:ptr<private, u32, read_write> = access %pl, 0u
+    %34:vec4<u32> = swizzle %33, xxxx
+    %35:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_a
+    %36:void = hlsl.textureStore %35, %24, %34
+    ret %32
+  }
+}
+%main2 = @fragment func(%38:params):vec4<f32> [@location(0)] {
+  $B4: {
+    %39:vec4<f32> = access %38, 0u
+    %40:vec2<f32> = swizzle %39, xy
+    %41:vec2<u32> = convert %40
+    %42:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_a
+    %43:vec4<u32> = %42.Load %41
+    %44:u32 = swizzle %43, x
+    %45:ptr<private, u32, read_write> = access %pl, 0u
+    store %45, %44
+    %46:ptr<private, u32, read_write> = access %pl, 0u
+    %47:u32 = load %46
+    %48:u32 = add %47, 42u
+    store %46, %48
+    %49:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    %50:ptr<private, u32, read_write> = access %pl, 0u
+    %51:vec4<u32> = swizzle %50, xxxx
+    %52:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_a
+    %53:void = hlsl.textureStore %52, %41, %51
+    ret %49
+  }
+}
+)";
+
+    auto config = OneArgConfig();
+    Run(PixelLocal, config);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterPixelLocalTest, MultipleMembers) {
+    auto r = ThreeArgFunc();
+    b.Append(r.func->Block(), [&] {
+        auto* access = b.Access(ty.ptr<pixel_local>(ty.u32()), r.pl, 0_u);
+        auto* add = b.Add<u32>(b.Load(access), 42_u);
+        b.Store(access, add);
+        b.Return(r.func, b.Construct<vec4<f32>>(1_f, 0_f, 0_f, 1_f));
+    });
+
+    auto* src = R"(
+PixelLocal = struct @align(4) {
+  a:u32 @offset(0)
+  b:i32 @offset(4)
+  c:f32 @offset(8)
+}
+
+params = struct @align(16) {
+  pos:vec4<f32> @offset(0), @builtin(position)
+}
+
+$B1: {  # root
+  %pl:ptr<pixel_local, PixelLocal, read_write> = var
+}
+
+%main = @fragment func(%3:params):vec4<f32> [@location(0)] {
+  $B2: {
+    %4:ptr<pixel_local, u32, read_write> = access %pl, 0u
+    %5:u32 = load %4
+    %6:u32 = add %5, 42u
+    store %4, %6
+    %7:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    ret %7
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+PixelLocal = struct @align(4) {
+  a:u32 @offset(0)
+  b:i32 @offset(4)
+  c:f32 @offset(8)
+}
+
+params = struct @align(16) {
+  pos:vec4<f32> @offset(0), @builtin(position)
+}
+
+$B1: {  # root
+  %pl:ptr<private, PixelLocal, read_write> = var
+  %pixel_local_a:ptr<handle, hlsl.rasterizer_ordered_texture_2d<r32uint>, read> = var @binding_point(7, 10)
+  %pixel_local_b:ptr<handle, hlsl.rasterizer_ordered_texture_2d<r32sint>, read> = var @binding_point(7, 12)
+  %pixel_local_c:ptr<handle, hlsl.rasterizer_ordered_texture_2d<r32float>, read> = var @binding_point(7, 14)
+}
+
+%main = @fragment func(%6:params):vec4<f32> [@location(0)] {
+  $B2: {
+    %7:vec4<f32> = access %6, 0u
+    %8:vec2<f32> = swizzle %7, xy
+    %9:vec2<u32> = convert %8
+    %10:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_a
+    %11:vec4<u32> = %10.Load %9
+    %12:u32 = swizzle %11, x
+    %13:ptr<private, u32, read_write> = access %pl, 0u
+    store %13, %12
+    %14:hlsl.rasterizer_ordered_texture_2d<r32sint> = load %pixel_local_b
+    %15:vec4<i32> = %14.Load %9
+    %16:i32 = swizzle %15, x
+    %17:ptr<private, i32, read_write> = access %pl, 1u
+    store %17, %16
+    %18:hlsl.rasterizer_ordered_texture_2d<r32float> = load %pixel_local_c
+    %19:vec4<f32> = %18.Load %9
+    %20:f32 = swizzle %19, x
+    %21:ptr<private, f32, read_write> = access %pl, 2u
+    store %21, %20
+    %22:ptr<private, u32, read_write> = access %pl, 0u
+    %23:u32 = load %22
+    %24:u32 = add %23, 42u
+    store %22, %24
+    %25:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    %26:ptr<private, u32, read_write> = access %pl, 0u
+    %27:vec4<u32> = swizzle %26, xxxx
+    %28:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_a
+    %29:void = hlsl.textureStore %28, %9, %27
+    %30:ptr<private, i32, read_write> = access %pl, 1u
+    %31:vec4<i32> = swizzle %30, xxxx
+    %32:hlsl.rasterizer_ordered_texture_2d<r32sint> = load %pixel_local_b
+    %33:void = hlsl.textureStore %32, %9, %31
+    %34:ptr<private, f32, read_write> = access %pl, 2u
+    %35:vec4<f32> = swizzle %34, xxxx
+    %36:hlsl.rasterizer_ordered_texture_2d<r32float> = load %pixel_local_c
+    %37:void = hlsl.textureStore %36, %9, %35
+    ret %25
+  }
+}
+)";
+
+    auto config = ThreeArgConfig();
+    Run(PixelLocal, config);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(HlslWriterPixelLocalTest, MultipleMembers_MismatchedTypes) {
+    auto r = ThreeArgFunc();
+    b.Append(r.func->Block(), [&] {
+        auto* access = b.Access(ty.ptr<pixel_local>(ty.u32()), r.pl, 0_u);
+        auto* add = b.Add<u32>(b.Load(access), 42_u);
+        b.Store(access, add);
+        b.Return(r.func, b.Construct<vec4<f32>>(1_f, 0_f, 0_f, 1_f));
+    });
+
+    auto* src = R"(
+PixelLocal = struct @align(4) {
+  a:u32 @offset(0)
+  b:i32 @offset(4)
+  c:f32 @offset(8)
+}
+
+params = struct @align(16) {
+  pos:vec4<f32> @offset(0), @builtin(position)
+}
+
+$B1: {  # root
+  %pl:ptr<pixel_local, PixelLocal, read_write> = var
+}
+
+%main = @fragment func(%3:params):vec4<f32> [@location(0)] {
+  $B2: {
+    %4:ptr<pixel_local, u32, read_write> = access %pl, 0u
+    %5:u32 = load %4
+    %6:u32 = add %5, 42u
+    store %4, %6
+    %7:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    ret %7
+  }
+}
+)";
+
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+PixelLocal = struct @align(4) {
+  a:u32 @offset(0)
+  b:i32 @offset(4)
+  c:f32 @offset(8)
+}
+
+params = struct @align(16) {
+  pos:vec4<f32> @offset(0), @builtin(position)
+}
+
+$B1: {  # root
+  %pl:ptr<private, PixelLocal, read_write> = var
+  %pixel_local_a:ptr<handle, hlsl.rasterizer_ordered_texture_2d<r32float>, read> = var @binding_point(7, 10)
+  %pixel_local_b:ptr<handle, hlsl.rasterizer_ordered_texture_2d<r32uint>, read> = var @binding_point(7, 12)
+  %pixel_local_c:ptr<handle, hlsl.rasterizer_ordered_texture_2d<r32sint>, read> = var @binding_point(7, 14)
+}
+
+%main = @fragment func(%6:params):vec4<f32> [@location(0)] {
+  $B2: {
+    %7:vec4<f32> = access %6, 0u
+    %8:vec2<f32> = swizzle %7, xy
+    %9:vec2<u32> = convert %8
+    %10:hlsl.rasterizer_ordered_texture_2d<r32float> = load %pixel_local_a
+    %11:vec4<f32> = %10.Load %9
+    %12:f32 = swizzle %11, x
+    %13:u32 = convert %12
+    %14:ptr<private, u32, read_write> = access %pl, 0u
+    store %14, %13
+    %15:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_b
+    %16:vec4<u32> = %15.Load %9
+    %17:u32 = swizzle %16, x
+    %18:i32 = convert %17
+    %19:ptr<private, i32, read_write> = access %pl, 1u
+    store %19, %18
+    %20:hlsl.rasterizer_ordered_texture_2d<r32sint> = load %pixel_local_c
+    %21:vec4<i32> = %20.Load %9
+    %22:i32 = swizzle %21, x
+    %23:f32 = convert %22
+    %24:ptr<private, f32, read_write> = access %pl, 2u
+    store %24, %23
+    %25:ptr<private, u32, read_write> = access %pl, 0u
+    %26:u32 = load %25
+    %27:u32 = add %26, 42u
+    store %25, %27
+    %28:vec4<f32> = construct 1.0f, 0.0f, 0.0f, 1.0f
+    %29:ptr<private, u32, read_write> = access %pl, 0u
+    %30:f32 = convert %29
+    %31:vec4<f32> = swizzle %30, xxxx
+    %32:hlsl.rasterizer_ordered_texture_2d<r32float> = load %pixel_local_a
+    %33:void = hlsl.textureStore %32, %9, %31
+    %34:ptr<private, i32, read_write> = access %pl, 1u
+    %35:u32 = convert %34
+    %36:vec4<u32> = swizzle %35, xxxx
+    %37:hlsl.rasterizer_ordered_texture_2d<r32uint> = load %pixel_local_b
+    %38:void = hlsl.textureStore %37, %9, %36
+    %39:ptr<private, f32, read_write> = access %pl, 2u
+    %40:i32 = convert %39
+    %41:vec4<i32> = swizzle %40, xxxx
+    %42:hlsl.rasterizer_ordered_texture_2d<r32sint> = load %pixel_local_c
+    %43:void = hlsl.textureStore %42, %9, %41
+    ret %28
+  }
+}
+)";
+
+    auto config = ThreeArgConfig();
+    // Overwrite the three format types to mismatch the ones in the IR
+    config.options.attachment_formats[0] = PixelLocalOptions::TexelFormat::kR32Float;
+    config.options.attachment_formats[1] = PixelLocalOptions::TexelFormat::kR32Uint;
+    config.options.attachment_formats[2] = PixelLocalOptions::TexelFormat::kR32Sint;
+    Run(PixelLocal, config);
+
+    EXPECT_EQ(expect, str());
+}
+
+}  // namespace
+}  // namespace tint::hlsl::writer::raise
diff --git a/src/tint/lang/hlsl/writer/raise/raise.cc b/src/tint/lang/hlsl/writer/raise/raise.cc
index 228d1e4..53a75b1 100644
--- a/src/tint/lang/hlsl/writer/raise/raise.cc
+++ b/src/tint/lang/hlsl/writer/raise/raise.cc
@@ -53,6 +53,7 @@
 #include "src/tint/lang/hlsl/writer/raise/decompose_uniform_access.h"
 #include "src/tint/lang/hlsl/writer/raise/fxc_polyfill.h"
 #include "src/tint/lang/hlsl/writer/raise/localize_struct_array_assignment.h"
+#include "src/tint/lang/hlsl/writer/raise/pixel_local.h"
 #include "src/tint/lang/hlsl/writer/raise/promote_initializers.h"
 #include "src/tint/lang/hlsl/writer/raise/replace_non_indexable_mat_vec_stores.h"
 #include "src/tint/lang/hlsl/writer/raise/shader_io.h"
@@ -163,11 +164,14 @@
         RUN_TRANSFORM(core::ir::transform::ZeroInitWorkgroupMemory, module);
     }
 
+    const bool pixel_local_enabled = !options.pixel_local.attachment_formats.empty();
+
     // ShaderIO must be run before DecomposeUniformAccess because it might
     // introduce a uniform buffer for kNumWorkgroups.
     {
         raise::ShaderIOConfig config;
         config.num_workgroups_binding = options.root_constant_binding_point;
+        config.add_input_position_member = pixel_local_enabled;
         RUN_TRANSFORM(raise::ShaderIO, module, config);
     }
 
@@ -178,8 +182,13 @@
     // Comes after DecomposeStorageAccess.
     RUN_TRANSFORM(raise::DecomposeUniformAccess, module);
 
-    // TODO(dsinclair): LocalizeStructArrayAssignment
-    // TODO(dsinclair): PixelLocal transform
+    // PixelLocal must run after DirectVariableAccess to avoid chasing pointer parameters.
+    if (pixel_local_enabled) {
+        raise::PixelLocalConfig config;
+        config.options = options.pixel_local;
+        RUN_TRANSFORM(raise::PixelLocal, module, config);
+    }
+
     // TODO(dsinclair): TruncateInterstageVariables
     // TODO(dsinclair): CalculateArrayLength
 
diff --git a/src/tint/lang/hlsl/writer/raise/shader_io.cc b/src/tint/lang/hlsl/writer/raise/shader_io.cc
index 3d3ec0a..dc3e420 100644
--- a/src/tint/lang/hlsl/writer/raise/shader_io.cc
+++ b/src/tint/lang/hlsl/writer/raise/shader_io.cc
@@ -176,7 +176,16 @@
 
     /// @copydoc ShaderIO::BackendState::FinalizeInputs
     Vector<core::ir::FunctionParam*, 4> FinalizeInputs() override {
-        Vector<core::type::Manager::StructMemberDesc, 4> input_struct_members;
+        if (config.add_input_position_member) {
+            const bool has_position_member = inputs.Any([](auto& struct_mem_desc) {
+                return struct_mem_desc.attributes.builtin == core::BuiltinValue::kPosition;
+            });
+            if (!has_position_member) {
+                core::IOAttributes attrs;
+                attrs.builtin = core::BuiltinValue::kPosition;
+                AddInput(ir.symbols.New("pos"), ty.vec4<f32>(), attrs);
+            }
+        }
 
         Vector<MemberInfo, 4> input_data;
         for (uint32_t i = 0; i < inputs.Length(); ++i) {
@@ -203,6 +212,7 @@
         std::sort(input_data.begin(), input_data.end(),
                   [&](auto& x, auto& y) { return StructMemberComparator(x, y); });
 
+        Vector<core::type::Manager::StructMemberDesc, 4> input_struct_members;
         for (auto& input : input_data) {
             input_indices[input.idx] = static_cast<uint32_t>(input_struct_members.Length());
             input_struct_members.Push(input.member);
diff --git a/src/tint/lang/hlsl/writer/raise/shader_io.h b/src/tint/lang/hlsl/writer/raise/shader_io.h
index af0e3e5..96d98e7 100644
--- a/src/tint/lang/hlsl/writer/raise/shader_io.h
+++ b/src/tint/lang/hlsl/writer/raise/shader_io.h
@@ -45,9 +45,15 @@
     /// no value, a free binding point will be used. Specifically, binding 0 of the largest used
     /// group plus 1 is used if at least one resource is bound, otherwise group 0 binding 0 is used.
     std::optional<BindingPoint> num_workgroups_binding;
+
+    /// If one doesn't exist, adds a @position member to the input struct as the last member.
+    /// This is used for PixelLocal, for which Dawn requires such a member in the final HLSL shader.
+    bool add_input_position_member = false;
 };
 
 /// ShaderIO is a transform that prepares entry point inputs and outputs for HLSL codegen.
+/// For HLSL, all entry point input parameters are moved to a struct and passed in as a single
+/// entry point parameter, and all outputs are wrapped in a struct and returned by the entry point.
 /// @param module the module to transform
 /// @returns success or failure
 Result<SuccessType> ShaderIO(core::ir::Module& module, const ShaderIOConfig& config);
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin.wgsl.expected.ir.dxc.hlsl
index 6970257..6dc4598 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,35 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(float4 pos) {
+  uint v = tint_f32_to_u32(pos[0u]);
+  P.a = (P.a + v);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  P.b = pixel_local_b.Load(v_1).x;
+  P.c = pixel_local_c.Load(v_1).x;
+  f_inner(float4(inputs.pos.xyz, (1.0f / inputs.pos[3u])));
+  pixel_local_a[v_1] = P.a.xxxx;
+  pixel_local_b[v_1] = P.b.xxxx;
+  pixel_local_c[v_1] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin.wgsl.expected.ir.fxc.hlsl
index 6970257..6dc4598 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,35 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(float4 pos) {
+  uint v = tint_f32_to_u32(pos[0u]);
+  P.a = (P.a + v);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  P.b = pixel_local_b.Load(v_1).x;
+  P.c = pixel_local_c.Load(v_1).x;
+  f_inner(float4(inputs.pos.xyz, (1.0f / inputs.pos[3u])));
+  pixel_local_a[v_1] = P.a.xxxx;
+  pixel_local_b[v_1] = P.b.xxxx;
+  pixel_local_c[v_1] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_and_location.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_and_location.wgsl.expected.ir.dxc.hlsl
index 6970257..b4693e2 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_and_location.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_and_location.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,37 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  float4 uv : TEXCOORD0;
+  float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(float4 pos, float4 uv) {
+  uint v = tint_f32_to_u32(pos[0u]);
+  uint v_1 = (v + tint_f32_to_u32(uv[0u]));
+  P.a = (P.a + v_1);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_2 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_2).x;
+  P.b = pixel_local_b.Load(v_2).x;
+  P.c = pixel_local_c.Load(v_2).x;
+  f_inner(float4(inputs.pos.xyz, (1.0f / inputs.pos[3u])), inputs.uv);
+  pixel_local_a[v_2] = P.a.xxxx;
+  pixel_local_b[v_2] = P.b.xxxx;
+  pixel_local_c[v_2] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_and_location.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_and_location.wgsl.expected.ir.fxc.hlsl
index 6970257..b4693e2 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_and_location.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_and_location.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,37 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  float4 uv : TEXCOORD0;
+  float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(float4 pos, float4 uv) {
+  uint v = tint_f32_to_u32(pos[0u]);
+  uint v_1 = (v + tint_f32_to_u32(uv[0u]));
+  P.a = (P.a + v_1);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_2 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_2).x;
+  P.b = pixel_local_b.Load(v_2).x;
+  P.c = pixel_local_c.Load(v_2).x;
+  f_inner(float4(inputs.pos.xyz, (1.0f / inputs.pos[3u])), inputs.uv);
+  pixel_local_a[v_2] = P.a.xxxx;
+  pixel_local_b[v_2] = P.b.xxxx;
+  pixel_local_c[v_2] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_and_location_in_struct.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_and_location_in_struct.wgsl.expected.ir.dxc.hlsl
index 6970257..04e3f7d 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_and_location_in_struct.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_and_location_in_struct.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,43 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct In {
+  float4 uv;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 In_uv : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(float4 pos, In tint_symbol) {
+  uint v = tint_f32_to_u32(pos[0u]);
+  uint v_1 = (v + tint_f32_to_u32(tint_symbol.uv[0u]));
+  P.a = (P.a + v_1);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_2 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_2).x;
+  P.b = pixel_local_b.Load(v_2).x;
+  P.c = pixel_local_c.Load(v_2).x;
+  float4 v_3 = float4(inputs.pos.xyz, (1.0f / inputs.pos[3u]));
+  In v_4 = {inputs.In_uv};
+  f_inner(v_3, v_4);
+  pixel_local_a[v_2] = P.a.xxxx;
+  pixel_local_b[v_2] = P.b.xxxx;
+  pixel_local_c[v_2] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_and_location_in_struct.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_and_location_in_struct.wgsl.expected.ir.fxc.hlsl
index 6970257..04e3f7d 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_and_location_in_struct.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_and_location_in_struct.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,43 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct In {
+  float4 uv;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 In_uv : TEXCOORD0;
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(float4 pos, In tint_symbol) {
+  uint v = tint_f32_to_u32(pos[0u]);
+  uint v_1 = (v + tint_f32_to_u32(tint_symbol.uv[0u]));
+  P.a = (P.a + v_1);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_2 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_2).x;
+  P.b = pixel_local_b.Load(v_2).x;
+  P.c = pixel_local_c.Load(v_2).x;
+  float4 v_3 = float4(inputs.pos.xyz, (1.0f / inputs.pos[3u]));
+  In v_4 = {inputs.In_uv};
+  f_inner(v_3, v_4);
+  pixel_local_a[v_2] = P.a.xxxx;
+  pixel_local_b[v_2] = P.b.xxxx;
+  pixel_local_c[v_2] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct.wgsl.expected.ir.dxc.hlsl
index 6970257..86b5a41 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,40 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct In {
+  float4 pos;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 In_pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(In tint_symbol) {
+  uint v = tint_f32_to_u32(tint_symbol.pos[0u]);
+  P.a = (P.a + v);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.In_pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  P.b = pixel_local_b.Load(v_1).x;
+  P.c = pixel_local_c.Load(v_1).x;
+  In v_2 = {float4(inputs.In_pos.xyz, (1.0f / inputs.In_pos[3u]))};
+  f_inner(v_2);
+  pixel_local_a[v_1] = P.a.xxxx;
+  pixel_local_b[v_1] = P.b.xxxx;
+  pixel_local_c[v_1] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct.wgsl.expected.ir.fxc.hlsl
index 6970257..86b5a41 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,40 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct In {
+  float4 pos;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 In_pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(In tint_symbol) {
+  uint v = tint_f32_to_u32(tint_symbol.pos[0u]);
+  P.a = (P.a + v);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.In_pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  P.b = pixel_local_b.Load(v_1).x;
+  P.c = pixel_local_c.Load(v_1).x;
+  In v_2 = {float4(inputs.In_pos.xyz, (1.0f / inputs.In_pos[3u]))};
+  f_inner(v_2);
+  pixel_local_a[v_1] = P.a.xxxx;
+  pixel_local_b[v_1] = P.b.xxxx;
+  pixel_local_c[v_1] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_and_location.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_and_location.wgsl.expected.ir.dxc.hlsl
index 6970257..284d705 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_and_location.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_and_location.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,42 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct In {
+  float4 pos;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 uv : TEXCOORD0;
+  float4 In_pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(In tint_symbol, float4 uv) {
+  uint v = tint_f32_to_u32(tint_symbol.pos[0u]);
+  uint v_1 = (v + tint_f32_to_u32(uv[0u]));
+  P.a = (P.a + v_1);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_2 = uint2(inputs.In_pos.xy);
+  P.a = pixel_local_a.Load(v_2).x;
+  P.b = pixel_local_b.Load(v_2).x;
+  P.c = pixel_local_c.Load(v_2).x;
+  In v_3 = {float4(inputs.In_pos.xyz, (1.0f / inputs.In_pos[3u]))};
+  f_inner(v_3, inputs.uv);
+  pixel_local_a[v_2] = P.a.xxxx;
+  pixel_local_b[v_2] = P.b.xxxx;
+  pixel_local_c[v_2] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_and_location.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_and_location.wgsl.expected.ir.fxc.hlsl
index 6970257..284d705 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_and_location.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_and_location.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,42 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct In {
+  float4 pos;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 uv : TEXCOORD0;
+  float4 In_pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(In tint_symbol, float4 uv) {
+  uint v = tint_f32_to_u32(tint_symbol.pos[0u]);
+  uint v_1 = (v + tint_f32_to_u32(uv[0u]));
+  P.a = (P.a + v_1);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_2 = uint2(inputs.In_pos.xy);
+  P.a = pixel_local_a.Load(v_2).x;
+  P.b = pixel_local_b.Load(v_2).x;
+  P.c = pixel_local_c.Load(v_2).x;
+  In v_3 = {float4(inputs.In_pos.xyz, (1.0f / inputs.In_pos[3u]))};
+  f_inner(v_3, inputs.uv);
+  pixel_local_a[v_2] = P.a.xxxx;
+  pixel_local_b[v_2] = P.b.xxxx;
+  pixel_local_c[v_2] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_and_location_in_struct.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_and_location_in_struct.wgsl.expected.ir.dxc.hlsl
index 6970257..e1b9950 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_and_location_in_struct.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_and_location_in_struct.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,43 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct In {
+  float4 pos;
+  float4 uv;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 In_uv : TEXCOORD0;
+  float4 In_pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(In tint_symbol) {
+  uint v = tint_f32_to_u32(tint_symbol.pos[0u]);
+  uint v_1 = (v + tint_f32_to_u32(tint_symbol.uv[0u]));
+  P.a = (P.a + v_1);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_2 = uint2(inputs.In_pos.xy);
+  P.a = pixel_local_a.Load(v_2).x;
+  P.b = pixel_local_b.Load(v_2).x;
+  P.c = pixel_local_c.Load(v_2).x;
+  In v_3 = {float4(inputs.In_pos.xyz, (1.0f / inputs.In_pos[3u])), inputs.In_uv};
+  f_inner(v_3);
+  pixel_local_a[v_2] = P.a.xxxx;
+  pixel_local_b[v_2] = P.b.xxxx;
+  pixel_local_c[v_2] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_and_location_in_struct.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_and_location_in_struct.wgsl.expected.ir.fxc.hlsl
index 6970257..e1b9950 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_and_location_in_struct.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_and_location_in_struct.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,43 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct In {
+  float4 pos;
+  float4 uv;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 In_uv : TEXCOORD0;
+  float4 In_pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(In tint_symbol) {
+  uint v = tint_f32_to_u32(tint_symbol.pos[0u]);
+  uint v_1 = (v + tint_f32_to_u32(tint_symbol.uv[0u]));
+  P.a = (P.a + v_1);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_2 = uint2(inputs.In_pos.xy);
+  P.a = pixel_local_a.Load(v_2).x;
+  P.b = pixel_local_b.Load(v_2).x;
+  P.c = pixel_local_c.Load(v_2).x;
+  In v_3 = {float4(inputs.In_pos.xyz, (1.0f / inputs.In_pos[3u])), inputs.In_uv};
+  f_inner(v_3);
+  pixel_local_a[v_2] = P.a.xxxx;
+  pixel_local_b[v_2] = P.b.xxxx;
+  pixel_local_c[v_2] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl
new file mode 100644
index 0000000..669bffc
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl
@@ -0,0 +1,20 @@
+// flags: --pixel_local_attachments 0=1,1=6,2=3 --pixel_local_attachment_formats 0=R32Uint,1=R32Sint,2=R32Float
+enable chromium_experimental_pixel_local;
+
+struct PixelLocal {
+  a : u32,
+  b : i32,
+  c : f32,
+}
+
+var<pixel_local> P : PixelLocal;
+
+struct In {
+  @builtin(position) pos : vec4f,
+  @builtin(front_facing) ff : bool,
+  @builtin(sample_index) si : u32,
+}
+
+@fragment fn f(in : In) {
+  P.a += u32(in.pos.x);
+}
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..f802b3f
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.dxc.hlsl
@@ -0,0 +1,57 @@
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
+
+static PixelLocal P = (PixelLocal)0;
+
+void load_from_pixel_local_storage(float4 my_input) {
+  uint2 rov_texcoord = uint2(my_input.xy);
+  P.a = pixel_local_a.Load(rov_texcoord).x;
+  P.b = pixel_local_b.Load(rov_texcoord).x;
+  P.c = pixel_local_c.Load(rov_texcoord).x;
+}
+
+void store_into_pixel_local_storage(float4 my_input) {
+  uint2 rov_texcoord = uint2(my_input.xy);
+  pixel_local_a[rov_texcoord] = uint4((P.a).xxxx);
+  pixel_local_b[rov_texcoord] = int4((P.b).xxxx);
+  pixel_local_c[rov_texcoord] = float4((P.c).xxxx);
+}
+
+struct tint_symbol_2 {
+  float4 pos : SV_Position;
+  bool ff : SV_IsFrontFace;
+  uint si : SV_SampleIndex;
+};
+struct In {
+  float4 pos;
+  bool ff;
+  uint si;
+};
+
+uint tint_ftou(float v) {
+  return ((v <= 4294967040.0f) ? ((v < 0.0f) ? 0u : uint(v)) : 4294967295u);
+}
+
+void f_inner(In tint_symbol) {
+  P.a = (P.a + tint_ftou(tint_symbol.pos.x));
+}
+
+void f_inner_1(In tint_symbol) {
+  float4 hlsl_sv_position = tint_symbol.pos;
+  load_from_pixel_local_storage(hlsl_sv_position);
+  f_inner(tint_symbol);
+  store_into_pixel_local_storage(hlsl_sv_position);
+}
+
+void f(tint_symbol_2 tint_symbol_1) {
+  In tint_symbol_3 = {float4(tint_symbol_1.pos.xyz, (1.0f / tint_symbol_1.pos.w)), tint_symbol_1.ff, tint_symbol_1.si};
+  f_inner_1(tint_symbol_3);
+  return;
+}
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..f802b3f
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.fxc.hlsl
@@ -0,0 +1,57 @@
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
+
+static PixelLocal P = (PixelLocal)0;
+
+void load_from_pixel_local_storage(float4 my_input) {
+  uint2 rov_texcoord = uint2(my_input.xy);
+  P.a = pixel_local_a.Load(rov_texcoord).x;
+  P.b = pixel_local_b.Load(rov_texcoord).x;
+  P.c = pixel_local_c.Load(rov_texcoord).x;
+}
+
+void store_into_pixel_local_storage(float4 my_input) {
+  uint2 rov_texcoord = uint2(my_input.xy);
+  pixel_local_a[rov_texcoord] = uint4((P.a).xxxx);
+  pixel_local_b[rov_texcoord] = int4((P.b).xxxx);
+  pixel_local_c[rov_texcoord] = float4((P.c).xxxx);
+}
+
+struct tint_symbol_2 {
+  float4 pos : SV_Position;
+  bool ff : SV_IsFrontFace;
+  uint si : SV_SampleIndex;
+};
+struct In {
+  float4 pos;
+  bool ff;
+  uint si;
+};
+
+uint tint_ftou(float v) {
+  return ((v <= 4294967040.0f) ? ((v < 0.0f) ? 0u : uint(v)) : 4294967295u);
+}
+
+void f_inner(In tint_symbol) {
+  P.a = (P.a + tint_ftou(tint_symbol.pos.x));
+}
+
+void f_inner_1(In tint_symbol) {
+  float4 hlsl_sv_position = tint_symbol.pos;
+  load_from_pixel_local_storage(hlsl_sv_position);
+  f_inner(tint_symbol);
+  store_into_pixel_local_storage(hlsl_sv_position);
+}
+
+void f(tint_symbol_2 tint_symbol_1) {
+  In tint_symbol_3 = {float4(tint_symbol_1.pos.xyz, (1.0f / tint_symbol_1.pos.w)), tint_symbol_1.ff, tint_symbol_1.si};
+  f_inner_1(tint_symbol_3);
+  return;
+}
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.glsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.glsl
new file mode 100644
index 0000000..cf7f7f0
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.glsl
@@ -0,0 +1,33 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_pixel_local;
+
+struct PixelLocal {
+  a : u32,
+  b : i32,
+  c : f32,
+}
+
+var<pixel_local> P : PixelLocal;
+
+struct In {
+  @builtin(position)
+  pos : vec4f,
+  @builtin(front_facing)
+  ff : bool,
+  @builtin(sample_index)
+  si : u32,
+}
+
+@fragment
+fn f(tint_symbol : In) {
+  P.a += u32(tint_symbol.pos.x);
+}
+
+Failed to generate: C:\src\dawn\test\tint\extensions\pixel_local\entry_point_use\additional_params\builtin_in_struct_multiple.wgsl:2:8 error: GLSL backend does not support extension 'chromium_experimental_pixel_local'
+enable chromium_experimental_pixel_local;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..2baeb4b
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,44 @@
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
+
+struct In {
+  float4 pos;
+  bool ff;
+  uint si;
+};
+
+struct f_inputs {
+  float4 In_pos : SV_Position;
+  bool In_ff : SV_IsFrontFace;
+  uint In_si : SV_SampleIndex;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(In tint_symbol) {
+  uint v = tint_f32_to_u32(tint_symbol.pos[0u]);
+  P.a = (P.a + v);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.In_pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  P.b = pixel_local_b.Load(v_1).x;
+  P.c = pixel_local_c.Load(v_1).x;
+  In v_2 = {float4(inputs.In_pos.xyz, (1.0f / inputs.In_pos[3u])), inputs.In_ff, inputs.In_si};
+  f_inner(v_2);
+  pixel_local_a[v_1] = P.a.xxxx;
+  pixel_local_b[v_1] = P.b.xxxx;
+  pixel_local_c[v_1] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.ir.fxc.hlsl
new file mode 100644
index 0000000..2baeb4b
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.ir.fxc.hlsl
@@ -0,0 +1,44 @@
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
+
+struct In {
+  float4 pos;
+  bool ff;
+  uint si;
+};
+
+struct f_inputs {
+  float4 In_pos : SV_Position;
+  bool In_ff : SV_IsFrontFace;
+  uint In_si : SV_SampleIndex;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(In tint_symbol) {
+  uint v = tint_f32_to_u32(tint_symbol.pos[0u]);
+  P.a = (P.a + v);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.In_pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  P.b = pixel_local_b.Load(v_1).x;
+  P.c = pixel_local_c.Load(v_1).x;
+  In v_2 = {float4(inputs.In_pos.xyz, (1.0f / inputs.In_pos[3u])), inputs.In_ff, inputs.In_si};
+  f_inner(v_2);
+  pixel_local_a[v_1] = P.a.xxxx;
+  pixel_local_b[v_1] = P.b.xxxx;
+  pixel_local_c[v_1] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.ir.glsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.ir.glsl
new file mode 100644
index 0000000..d74629c
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.ir.glsl
@@ -0,0 +1,11 @@
+SKIP: FAILED
+
+..\..\src\tint\lang\glsl\writer\printer\printer.cc:955 internal compiler error: TINT_UNREACHABLE PixelLocal not supported
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
+
+tint executable returned error: exit status 0xc000001d
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.ir.msl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.ir.msl
new file mode 100644
index 0000000..9996c1e
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.ir.msl
@@ -0,0 +1,11 @@
+SKIP: FAILED
+
+..\..\src\tint\lang\msl\writer\raise\module_scope_vars.cc:239 internal compiler error: TINT_UNREACHABLE unhandled address space: pixel_local
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
+
+tint executable returned error: exit status 0xc000001d
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.msl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.msl
new file mode 100644
index 0000000..ddab48d
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.msl
@@ -0,0 +1,64 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
+
+struct tint_private_vars_struct {
+  PixelLocal P;
+};
+
+struct f_res {
+  uint output_0;
+  int output_1;
+  float output_2;
+};
+
+struct tint_symbol_1 {
+  uint a [[color(1)]];
+  float c [[color(3)]];
+  int b [[color(6)]];
+};
+
+struct tint_symbol_2 {
+  uint output_0 [[color(1)]];
+  float output_2 [[color(3)]];
+  int output_1 [[color(6)]];
+};
+
+struct In {
+  float4 pos;
+  bool ff;
+  uint si;
+};
+
+uint tint_ftou(float v) {
+  return select(4294967295u, select(uint(v), 0u, (v < 0.0f)), (v <= 4294967040.0f));
+}
+
+void f_inner(In in, thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).P.a = ((*(tint_private_vars)).P.a + tint_ftou(in.pos[0]));
+}
+
+f_res f_inner_1(In in, PixelLocal pixel_local_1, thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).P = pixel_local_1;
+  f_inner(in, tint_private_vars);
+  f_res const tint_symbol_5 = {.output_0=(*(tint_private_vars)).P.a, .output_1=(*(tint_private_vars)).P.b, .output_2=(*(tint_private_vars)).P.c};
+  return tint_symbol_5;
+}
+
+fragment tint_symbol_2 f(float4 pos [[position]], bool ff [[front_facing]], uint si [[sample_id]], tint_symbol_1 tint_symbol [[stage_in]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  In const tint_symbol_3 = {.pos=pos, .ff=ff, .si=si};
+  PixelLocal const tint_symbol_4 = {.a=tint_symbol.a, .b=tint_symbol.b, .c=tint_symbol.c};
+  f_res const inner_result = f_inner_1(tint_symbol_3, tint_symbol_4, &(tint_private_vars));
+  tint_symbol_2 wrapper_result = {};
+  wrapper_result.output_0 = inner_result.output_0;
+  wrapper_result.output_1 = inner_result.output_1;
+  wrapper_result.output_2 = inner_result.output_2;
+  return wrapper_result;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.spvasm b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.spvasm
new file mode 100644
index 0000000..b33d409
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.spvasm
@@ -0,0 +1,11 @@
+SKIP: FAILED
+
+..\..\src\tint\lang\spirv\writer\printer\printer.cc:2367 internal compiler error: unimplemented variable address space pixel_local
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
+
+tint executable returned error: exit status 0xc000001d
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.wgsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.wgsl
new file mode 100644
index 0000000..b8e425d
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_in_struct_multiple.wgsl.expected.wgsl
@@ -0,0 +1,23 @@
+enable chromium_experimental_pixel_local;
+
+struct PixelLocal {
+  a : u32,
+  b : i32,
+  c : f32,
+}
+
+var<pixel_local> P : PixelLocal;
+
+struct In {
+  @builtin(position)
+  pos : vec4f,
+  @builtin(front_facing)
+  ff : bool,
+  @builtin(sample_index)
+  si : u32,
+}
+
+@fragment
+fn f(in : In) {
+  P.a += u32(in.pos.x);
+}
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl
new file mode 100644
index 0000000..c6fb760
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl
@@ -0,0 +1,14 @@
+// flags: --pixel_local_attachments 0=1,1=6,2=3 --pixel_local_attachment_formats 0=R32Uint,1=R32Sint,2=R32Float
+enable chromium_experimental_pixel_local;
+
+struct PixelLocal {
+  a : u32,
+  b : i32,
+  c : f32,
+}
+
+var<pixel_local> P : PixelLocal;
+
+@fragment fn f(@builtin(position) pos : vec4f, @builtin(front_facing) ff : bool, @builtin(sample_index) si : u32) {
+  P.a += u32(pos.x);
+}
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..d706b08
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.dxc.hlsl
@@ -0,0 +1,51 @@
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
+
+static PixelLocal P = (PixelLocal)0;
+
+void load_from_pixel_local_storage(float4 my_input) {
+  uint2 rov_texcoord = uint2(my_input.xy);
+  P.a = pixel_local_a.Load(rov_texcoord).x;
+  P.b = pixel_local_b.Load(rov_texcoord).x;
+  P.c = pixel_local_c.Load(rov_texcoord).x;
+}
+
+void store_into_pixel_local_storage(float4 my_input) {
+  uint2 rov_texcoord = uint2(my_input.xy);
+  pixel_local_a[rov_texcoord] = uint4((P.a).xxxx);
+  pixel_local_b[rov_texcoord] = int4((P.b).xxxx);
+  pixel_local_c[rov_texcoord] = float4((P.c).xxxx);
+}
+
+struct tint_symbol_1 {
+  float4 pos : SV_Position;
+  bool ff : SV_IsFrontFace;
+  uint si : SV_SampleIndex;
+};
+
+uint tint_ftou(float v) {
+  return ((v <= 4294967040.0f) ? ((v < 0.0f) ? 0u : uint(v)) : 4294967295u);
+}
+
+void f_inner(float4 pos, bool ff, uint si) {
+  P.a = (P.a + tint_ftou(pos.x));
+}
+
+void f_inner_1(float4 pos, bool ff, uint si) {
+  float4 hlsl_sv_position = pos;
+  load_from_pixel_local_storage(hlsl_sv_position);
+  f_inner(pos, ff, si);
+  store_into_pixel_local_storage(hlsl_sv_position);
+}
+
+void f(tint_symbol_1 tint_symbol) {
+  f_inner_1(float4(tint_symbol.pos.xyz, (1.0f / tint_symbol.pos.w)), tint_symbol.ff, tint_symbol.si);
+  return;
+}
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..d706b08
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.fxc.hlsl
@@ -0,0 +1,51 @@
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
+
+static PixelLocal P = (PixelLocal)0;
+
+void load_from_pixel_local_storage(float4 my_input) {
+  uint2 rov_texcoord = uint2(my_input.xy);
+  P.a = pixel_local_a.Load(rov_texcoord).x;
+  P.b = pixel_local_b.Load(rov_texcoord).x;
+  P.c = pixel_local_c.Load(rov_texcoord).x;
+}
+
+void store_into_pixel_local_storage(float4 my_input) {
+  uint2 rov_texcoord = uint2(my_input.xy);
+  pixel_local_a[rov_texcoord] = uint4((P.a).xxxx);
+  pixel_local_b[rov_texcoord] = int4((P.b).xxxx);
+  pixel_local_c[rov_texcoord] = float4((P.c).xxxx);
+}
+
+struct tint_symbol_1 {
+  float4 pos : SV_Position;
+  bool ff : SV_IsFrontFace;
+  uint si : SV_SampleIndex;
+};
+
+uint tint_ftou(float v) {
+  return ((v <= 4294967040.0f) ? ((v < 0.0f) ? 0u : uint(v)) : 4294967295u);
+}
+
+void f_inner(float4 pos, bool ff, uint si) {
+  P.a = (P.a + tint_ftou(pos.x));
+}
+
+void f_inner_1(float4 pos, bool ff, uint si) {
+  float4 hlsl_sv_position = pos;
+  load_from_pixel_local_storage(hlsl_sv_position);
+  f_inner(pos, ff, si);
+  store_into_pixel_local_storage(hlsl_sv_position);
+}
+
+void f(tint_symbol_1 tint_symbol) {
+  f_inner_1(float4(tint_symbol.pos.xyz, (1.0f / tint_symbol.pos.w)), tint_symbol.ff, tint_symbol.si);
+  return;
+}
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.glsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.glsl
new file mode 100644
index 0000000..6451031
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.glsl
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_pixel_local;
+
+struct PixelLocal {
+  a : u32,
+  b : i32,
+  c : f32,
+}
+
+var<pixel_local> P : PixelLocal;
+
+@fragment
+fn f(@builtin(position) pos : vec4f, @builtin(front_facing) ff : bool, @builtin(sample_index) si : u32) {
+  P.a += u32(pos.x);
+}
+
+Failed to generate: C:\src\dawn\test\tint\extensions\pixel_local\entry_point_use\additional_params\builtin_multiple.wgsl:2:8 error: GLSL backend does not support extension 'chromium_experimental_pixel_local'
+enable chromium_experimental_pixel_local;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..13e9667
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,37 @@
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
+
+struct f_inputs {
+  float4 pos : SV_Position;
+  bool ff : SV_IsFrontFace;
+  uint si : SV_SampleIndex;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(float4 pos, bool ff, uint si) {
+  uint v = tint_f32_to_u32(pos[0u]);
+  P.a = (P.a + v);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  P.b = pixel_local_b.Load(v_1).x;
+  P.c = pixel_local_c.Load(v_1).x;
+  f_inner(float4(inputs.pos.xyz, (1.0f / inputs.pos[3u])), inputs.ff, inputs.si);
+  pixel_local_a[v_1] = P.a.xxxx;
+  pixel_local_b[v_1] = P.b.xxxx;
+  pixel_local_c[v_1] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.ir.fxc.hlsl
new file mode 100644
index 0000000..13e9667
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.ir.fxc.hlsl
@@ -0,0 +1,37 @@
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
+
+struct f_inputs {
+  float4 pos : SV_Position;
+  bool ff : SV_IsFrontFace;
+  uint si : SV_SampleIndex;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(float4 pos, bool ff, uint si) {
+  uint v = tint_f32_to_u32(pos[0u]);
+  P.a = (P.a + v);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  P.b = pixel_local_b.Load(v_1).x;
+  P.c = pixel_local_c.Load(v_1).x;
+  f_inner(float4(inputs.pos.xyz, (1.0f / inputs.pos[3u])), inputs.ff, inputs.si);
+  pixel_local_a[v_1] = P.a.xxxx;
+  pixel_local_b[v_1] = P.b.xxxx;
+  pixel_local_c[v_1] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.ir.glsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.ir.glsl
new file mode 100644
index 0000000..d74629c
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.ir.glsl
@@ -0,0 +1,11 @@
+SKIP: FAILED
+
+..\..\src\tint\lang\glsl\writer\printer\printer.cc:955 internal compiler error: TINT_UNREACHABLE PixelLocal not supported
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
+
+tint executable returned error: exit status 0xc000001d
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.ir.msl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.ir.msl
new file mode 100644
index 0000000..9996c1e
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.ir.msl
@@ -0,0 +1,11 @@
+SKIP: FAILED
+
+..\..\src\tint\lang\msl\writer\raise\module_scope_vars.cc:239 internal compiler error: TINT_UNREACHABLE unhandled address space: pixel_local
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
+
+tint executable returned error: exit status 0xc000001d
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.msl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.msl
new file mode 100644
index 0000000..c2f7c39
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.msl
@@ -0,0 +1,57 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
+
+struct tint_private_vars_struct {
+  PixelLocal P;
+};
+
+struct f_res {
+  uint output_0;
+  int output_1;
+  float output_2;
+};
+
+struct tint_symbol_1 {
+  uint a [[color(1)]];
+  float c [[color(3)]];
+  int b [[color(6)]];
+};
+
+struct tint_symbol_2 {
+  uint output_0 [[color(1)]];
+  float output_2 [[color(3)]];
+  int output_1 [[color(6)]];
+};
+
+uint tint_ftou(float v) {
+  return select(4294967295u, select(uint(v), 0u, (v < 0.0f)), (v <= 4294967040.0f));
+}
+
+void f_inner(float4 pos, bool ff, uint si, thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).P.a = ((*(tint_private_vars)).P.a + tint_ftou(pos[0]));
+}
+
+f_res f_inner_1(float4 pos, bool ff, uint si, PixelLocal pixel_local_1, thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).P = pixel_local_1;
+  f_inner(pos, ff, si, tint_private_vars);
+  f_res const tint_symbol_4 = {.output_0=(*(tint_private_vars)).P.a, .output_1=(*(tint_private_vars)).P.b, .output_2=(*(tint_private_vars)).P.c};
+  return tint_symbol_4;
+}
+
+fragment tint_symbol_2 f(float4 pos [[position]], bool ff [[front_facing]], uint si [[sample_id]], tint_symbol_1 tint_symbol [[stage_in]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  PixelLocal const tint_symbol_3 = {.a=tint_symbol.a, .b=tint_symbol.b, .c=tint_symbol.c};
+  f_res const inner_result = f_inner_1(pos, ff, si, tint_symbol_3, &(tint_private_vars));
+  tint_symbol_2 wrapper_result = {};
+  wrapper_result.output_0 = inner_result.output_0;
+  wrapper_result.output_1 = inner_result.output_1;
+  wrapper_result.output_2 = inner_result.output_2;
+  return wrapper_result;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.spvasm b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.spvasm
new file mode 100644
index 0000000..b33d409
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.spvasm
@@ -0,0 +1,11 @@
+SKIP: FAILED
+
+..\..\src\tint\lang\spirv\writer\printer\printer.cc:2367 internal compiler error: unimplemented variable address space pixel_local
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
+
+tint executable returned error: exit status 0xc000001d
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.wgsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.wgsl
new file mode 100644
index 0000000..6cf0f2d
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable chromium_experimental_pixel_local;
+
+struct PixelLocal {
+  a : u32,
+  b : i32,
+  c : f32,
+}
+
+var<pixel_local> P : PixelLocal;
+
+@fragment
+fn f(@builtin(position) pos : vec4f, @builtin(front_facing) ff : bool, @builtin(sample_index) si : u32) {
+  P.a += u32(pos.x);
+}
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl
new file mode 100644
index 0000000..2507ae6
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl
@@ -0,0 +1,22 @@
+// flags: --pixel_local_attachments 0=1,1=6,2=3 --pixel_local_attachment_formats 0=R32Uint,1=R32Sint,2=R32Float
+enable chromium_experimental_pixel_local;
+
+struct PixelLocal {
+  a : u32,
+  b : i32,
+  c : f32,
+}
+
+var<pixel_local> P : PixelLocal;
+
+@fragment fn f(@builtin(position) pos : vec4f) {
+  P.a += u32(pos.x);
+}
+
+@fragment fn f2(@builtin(position) pos : vec4f) {
+  P.b += i32(pos.x);
+}
+
+@fragment fn f3(@builtin(position) pos : vec4f) {
+  P.c += pos.x;
+}
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..7004767
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.dxc.hlsl
@@ -0,0 +1,79 @@
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
+
+static PixelLocal P = (PixelLocal)0;
+
+void load_from_pixel_local_storage(float4 my_input) {
+  uint2 rov_texcoord = uint2(my_input.xy);
+  P.a = pixel_local_a.Load(rov_texcoord).x;
+  P.b = pixel_local_b.Load(rov_texcoord).x;
+  P.c = pixel_local_c.Load(rov_texcoord).x;
+}
+
+void store_into_pixel_local_storage(float4 my_input) {
+  uint2 rov_texcoord = uint2(my_input.xy);
+  pixel_local_a[rov_texcoord] = uint4((P.a).xxxx);
+  pixel_local_b[rov_texcoord] = int4((P.b).xxxx);
+  pixel_local_c[rov_texcoord] = float4((P.c).xxxx);
+}
+
+struct tint_symbol_1 {
+  float4 pos : SV_Position;
+};
+
+uint tint_ftou(float v) {
+  return ((v <= 4294967040.0f) ? ((v < 0.0f) ? 0u : uint(v)) : 4294967295u);
+}
+
+void f_inner(float4 pos) {
+  P.a = (P.a + tint_ftou(pos.x));
+}
+
+void f_inner_1(float4 pos) {
+  float4 hlsl_sv_position = pos;
+  load_from_pixel_local_storage(hlsl_sv_position);
+  f_inner(pos);
+  store_into_pixel_local_storage(hlsl_sv_position);
+}
+
+void f(tint_symbol_1 tint_symbol) {
+  f_inner_1(float4(tint_symbol.pos.xyz, (1.0f / tint_symbol.pos.w)));
+  return;
+}
+
+int tint_ftoi(float v) {
+  return ((v <= 2147483520.0f) ? ((v < -2147483648.0f) ? -2147483648 : int(v)) : 2147483647);
+}
+
+struct tint_symbol_3 {
+  float4 pos : SV_Position;
+};
+
+void f2_inner(float4 pos) {
+  P.b = (P.b + tint_ftoi(pos.x));
+}
+
+void f2(tint_symbol_3 tint_symbol_2) {
+  f2_inner(float4(tint_symbol_2.pos.xyz, (1.0f / tint_symbol_2.pos.w)));
+  return;
+}
+
+struct tint_symbol_5 {
+  float4 pos : SV_Position;
+};
+
+void f3_inner(float4 pos) {
+  P.c = (P.c + pos.x);
+}
+
+void f3(tint_symbol_5 tint_symbol_4) {
+  f3_inner(float4(tint_symbol_4.pos.xyz, (1.0f / tint_symbol_4.pos.w)));
+  return;
+}
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..7004767
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.fxc.hlsl
@@ -0,0 +1,79 @@
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
+
+static PixelLocal P = (PixelLocal)0;
+
+void load_from_pixel_local_storage(float4 my_input) {
+  uint2 rov_texcoord = uint2(my_input.xy);
+  P.a = pixel_local_a.Load(rov_texcoord).x;
+  P.b = pixel_local_b.Load(rov_texcoord).x;
+  P.c = pixel_local_c.Load(rov_texcoord).x;
+}
+
+void store_into_pixel_local_storage(float4 my_input) {
+  uint2 rov_texcoord = uint2(my_input.xy);
+  pixel_local_a[rov_texcoord] = uint4((P.a).xxxx);
+  pixel_local_b[rov_texcoord] = int4((P.b).xxxx);
+  pixel_local_c[rov_texcoord] = float4((P.c).xxxx);
+}
+
+struct tint_symbol_1 {
+  float4 pos : SV_Position;
+};
+
+uint tint_ftou(float v) {
+  return ((v <= 4294967040.0f) ? ((v < 0.0f) ? 0u : uint(v)) : 4294967295u);
+}
+
+void f_inner(float4 pos) {
+  P.a = (P.a + tint_ftou(pos.x));
+}
+
+void f_inner_1(float4 pos) {
+  float4 hlsl_sv_position = pos;
+  load_from_pixel_local_storage(hlsl_sv_position);
+  f_inner(pos);
+  store_into_pixel_local_storage(hlsl_sv_position);
+}
+
+void f(tint_symbol_1 tint_symbol) {
+  f_inner_1(float4(tint_symbol.pos.xyz, (1.0f / tint_symbol.pos.w)));
+  return;
+}
+
+int tint_ftoi(float v) {
+  return ((v <= 2147483520.0f) ? ((v < -2147483648.0f) ? -2147483648 : int(v)) : 2147483647);
+}
+
+struct tint_symbol_3 {
+  float4 pos : SV_Position;
+};
+
+void f2_inner(float4 pos) {
+  P.b = (P.b + tint_ftoi(pos.x));
+}
+
+void f2(tint_symbol_3 tint_symbol_2) {
+  f2_inner(float4(tint_symbol_2.pos.xyz, (1.0f / tint_symbol_2.pos.w)));
+  return;
+}
+
+struct tint_symbol_5 {
+  float4 pos : SV_Position;
+};
+
+void f3_inner(float4 pos) {
+  P.c = (P.c + pos.x);
+}
+
+void f3(tint_symbol_5 tint_symbol_4) {
+  f3_inner(float4(tint_symbol_4.pos.xyz, (1.0f / tint_symbol_4.pos.w)));
+  return;
+}
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.glsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.glsl
new file mode 100644
index 0000000..98600db
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.glsl
@@ -0,0 +1,94 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_pixel_local;
+
+struct PixelLocal {
+  a : u32,
+  b : i32,
+  c : f32,
+}
+
+var<pixel_local> P : PixelLocal;
+
+@fragment
+fn f(@builtin(position) pos : vec4f) {
+  P.a += u32(pos.x);
+}
+
+@fragment
+fn f2(@builtin(position) pos : vec4f) {
+  P.b += i32(pos.x);
+}
+
+@fragment
+fn f3(@builtin(position) pos : vec4f) {
+  P.c += pos.x;
+}
+
+Failed to generate: C:\src\dawn\test\tint\extensions\pixel_local\entry_point_use\additional_params\builtin_multiple_entry_points.wgsl:2:8 error: GLSL backend does not support extension 'chromium_experimental_pixel_local'
+enable chromium_experimental_pixel_local;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+enable chromium_experimental_pixel_local;
+
+struct PixelLocal {
+  a : u32,
+  b : i32,
+  c : f32,
+}
+
+var<pixel_local> P : PixelLocal;
+
+@fragment
+fn f(@builtin(position) pos : vec4f) {
+  P.a += u32(pos.x);
+}
+
+@fragment
+fn f2(@builtin(position) pos : vec4f) {
+  P.b += i32(pos.x);
+}
+
+@fragment
+fn f3(@builtin(position) pos : vec4f) {
+  P.c += pos.x;
+}
+
+Failed to generate: C:\src\dawn\test\tint\extensions\pixel_local\entry_point_use\additional_params\builtin_multiple_entry_points.wgsl:2:8 error: GLSL backend does not support extension 'chromium_experimental_pixel_local'
+enable chromium_experimental_pixel_local;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+enable chromium_experimental_pixel_local;
+
+struct PixelLocal {
+  a : u32,
+  b : i32,
+  c : f32,
+}
+
+var<pixel_local> P : PixelLocal;
+
+@fragment
+fn f(@builtin(position) pos : vec4f) {
+  P.a += u32(pos.x);
+}
+
+@fragment
+fn f2(@builtin(position) pos : vec4f) {
+  P.b += i32(pos.x);
+}
+
+@fragment
+fn f3(@builtin(position) pos : vec4f) {
+  P.c += pos.x;
+}
+
+Failed to generate: C:\src\dawn\test\tint\extensions\pixel_local\entry_point_use\additional_params\builtin_multiple_entry_points.wgsl:2:8 error: GLSL backend does not support extension 'chromium_experimental_pixel_local'
+enable chromium_experimental_pixel_local;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.ir.dxc.hlsl
new file mode 100644
index 0000000..e2dd2e2
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.ir.dxc.hlsl
@@ -0,0 +1,78 @@
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
+
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+struct f2_inputs {
+  float4 pos : SV_Position;
+};
+
+struct f3_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(float4 pos) {
+  uint v = tint_f32_to_u32(pos[0u]);
+  P.a = (P.a + v);
+}
+
+int tint_f32_to_i32(float value) {
+  return (((value <= 2147483520.0f)) ? ((((value >= -2147483648.0f)) ? (int(value)) : (int(-2147483648)))) : (int(2147483647)));
+}
+
+void f2_inner(float4 pos) {
+  int v_1 = tint_f32_to_i32(pos[0u]);
+  P.b = (P.b + v_1);
+}
+
+void f3_inner(float4 pos) {
+  P.c = (P.c + pos[0u]);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_2 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_2).x;
+  P.b = pixel_local_b.Load(v_2).x;
+  P.c = pixel_local_c.Load(v_2).x;
+  f_inner(float4(inputs.pos.xyz, (1.0f / inputs.pos[3u])));
+  pixel_local_a[v_2] = P.a.xxxx;
+  pixel_local_b[v_2] = P.b.xxxx;
+  pixel_local_c[v_2] = P.c.xxxx;
+}
+
+void f2(f2_inputs inputs) {
+  uint2 v_3 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_3).x;
+  P.b = pixel_local_b.Load(v_3).x;
+  P.c = pixel_local_c.Load(v_3).x;
+  f2_inner(float4(inputs.pos.xyz, (1.0f / inputs.pos[3u])));
+  pixel_local_a[v_3] = P.a.xxxx;
+  pixel_local_b[v_3] = P.b.xxxx;
+  pixel_local_c[v_3] = P.c.xxxx;
+}
+
+void f3(f3_inputs inputs) {
+  uint2 v_4 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_4).x;
+  P.b = pixel_local_b.Load(v_4).x;
+  P.c = pixel_local_c.Load(v_4).x;
+  f3_inner(float4(inputs.pos.xyz, (1.0f / inputs.pos[3u])));
+  pixel_local_a[v_4] = P.a.xxxx;
+  pixel_local_b[v_4] = P.b.xxxx;
+  pixel_local_c[v_4] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.ir.fxc.hlsl
new file mode 100644
index 0000000..e2dd2e2
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.ir.fxc.hlsl
@@ -0,0 +1,78 @@
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
+
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+struct f2_inputs {
+  float4 pos : SV_Position;
+};
+
+struct f3_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(float4 pos) {
+  uint v = tint_f32_to_u32(pos[0u]);
+  P.a = (P.a + v);
+}
+
+int tint_f32_to_i32(float value) {
+  return (((value <= 2147483520.0f)) ? ((((value >= -2147483648.0f)) ? (int(value)) : (int(-2147483648)))) : (int(2147483647)));
+}
+
+void f2_inner(float4 pos) {
+  int v_1 = tint_f32_to_i32(pos[0u]);
+  P.b = (P.b + v_1);
+}
+
+void f3_inner(float4 pos) {
+  P.c = (P.c + pos[0u]);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_2 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_2).x;
+  P.b = pixel_local_b.Load(v_2).x;
+  P.c = pixel_local_c.Load(v_2).x;
+  f_inner(float4(inputs.pos.xyz, (1.0f / inputs.pos[3u])));
+  pixel_local_a[v_2] = P.a.xxxx;
+  pixel_local_b[v_2] = P.b.xxxx;
+  pixel_local_c[v_2] = P.c.xxxx;
+}
+
+void f2(f2_inputs inputs) {
+  uint2 v_3 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_3).x;
+  P.b = pixel_local_b.Load(v_3).x;
+  P.c = pixel_local_c.Load(v_3).x;
+  f2_inner(float4(inputs.pos.xyz, (1.0f / inputs.pos[3u])));
+  pixel_local_a[v_3] = P.a.xxxx;
+  pixel_local_b[v_3] = P.b.xxxx;
+  pixel_local_c[v_3] = P.c.xxxx;
+}
+
+void f3(f3_inputs inputs) {
+  uint2 v_4 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_4).x;
+  P.b = pixel_local_b.Load(v_4).x;
+  P.c = pixel_local_c.Load(v_4).x;
+  f3_inner(float4(inputs.pos.xyz, (1.0f / inputs.pos[3u])));
+  pixel_local_a[v_4] = P.a.xxxx;
+  pixel_local_b[v_4] = P.b.xxxx;
+  pixel_local_c[v_4] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.ir.glsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.ir.glsl
new file mode 100644
index 0000000..d74629c
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.ir.glsl
@@ -0,0 +1,11 @@
+SKIP: FAILED
+
+..\..\src\tint\lang\glsl\writer\printer\printer.cc:955 internal compiler error: TINT_UNREACHABLE PixelLocal not supported
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
+
+tint executable returned error: exit status 0xc000001d
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.ir.msl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.ir.msl
new file mode 100644
index 0000000..9996c1e
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.ir.msl
@@ -0,0 +1,11 @@
+SKIP: FAILED
+
+..\..\src\tint\lang\msl\writer\raise\module_scope_vars.cc:239 internal compiler error: TINT_UNREACHABLE unhandled address space: pixel_local
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
+
+tint executable returned error: exit status 0xc000001d
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.msl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.msl
new file mode 100644
index 0000000..20d530f
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.msl
@@ -0,0 +1,141 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
+
+struct tint_private_vars_struct {
+  PixelLocal P;
+};
+
+struct f_res {
+  uint output_0;
+  int output_1;
+  float output_2;
+};
+
+struct tint_symbol_1 {
+  uint a [[color(1)]];
+  float c [[color(3)]];
+  int b [[color(6)]];
+};
+
+struct tint_symbol_2 {
+  uint output_0 [[color(1)]];
+  float output_2 [[color(3)]];
+  int output_1 [[color(6)]];
+};
+
+uint tint_ftou(float v) {
+  return select(4294967295u, select(uint(v), 0u, (v < 0.0f)), (v <= 4294967040.0f));
+}
+
+void f_inner(float4 pos, thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).P.a = ((*(tint_private_vars)).P.a + tint_ftou(pos[0]));
+}
+
+f_res f_inner_1(float4 pos, PixelLocal pixel_local_1, thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).P = pixel_local_1;
+  f_inner(pos, tint_private_vars);
+  f_res const tint_symbol_10 = {.output_0=(*(tint_private_vars)).P.a, .output_1=(*(tint_private_vars)).P.b, .output_2=(*(tint_private_vars)).P.c};
+  return tint_symbol_10;
+}
+
+fragment tint_symbol_2 f(float4 pos [[position]], tint_symbol_1 tint_symbol [[stage_in]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  PixelLocal const tint_symbol_9 = {.a=tint_symbol.a, .b=tint_symbol.b, .c=tint_symbol.c};
+  f_res const inner_result = f_inner_1(pos, tint_symbol_9, &(tint_private_vars));
+  tint_symbol_2 wrapper_result = {};
+  wrapper_result.output_0 = inner_result.output_0;
+  wrapper_result.output_1 = inner_result.output_1;
+  wrapper_result.output_2 = inner_result.output_2;
+  return wrapper_result;
+}
+
+struct f2_res {
+  uint output_0;
+  int output_1;
+  float output_2;
+};
+
+struct tint_symbol_4 {
+  uint a [[color(1)]];
+  float c [[color(3)]];
+  int b [[color(6)]];
+};
+
+struct tint_symbol_5 {
+  uint output_0 [[color(1)]];
+  float output_2 [[color(3)]];
+  int output_1 [[color(6)]];
+};
+
+int tint_ftoi(float v) {
+  return select(2147483647, select(int(v), (-2147483647 - 1), (v < -2147483648.0f)), (v <= 2147483520.0f));
+}
+
+void f2_inner(float4 pos, thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).P.b = as_type<int>((as_type<uint>((*(tint_private_vars)).P.b) + as_type<uint>(tint_ftoi(pos[0]))));
+}
+
+f2_res f2_inner_1(float4 pos, PixelLocal pixel_local_2, thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).P = pixel_local_2;
+  f2_inner(pos, tint_private_vars);
+  f2_res const tint_symbol_12 = {.output_0=(*(tint_private_vars)).P.a, .output_1=(*(tint_private_vars)).P.b, .output_2=(*(tint_private_vars)).P.c};
+  return tint_symbol_12;
+}
+
+fragment tint_symbol_5 f2(float4 pos [[position]], tint_symbol_4 tint_symbol_3 [[stage_in]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  PixelLocal const tint_symbol_11 = {.a=tint_symbol_3.a, .b=tint_symbol_3.b, .c=tint_symbol_3.c};
+  f2_res const inner_result_1 = f2_inner_1(pos, tint_symbol_11, &(tint_private_vars));
+  tint_symbol_5 wrapper_result_1 = {};
+  wrapper_result_1.output_0 = inner_result_1.output_0;
+  wrapper_result_1.output_1 = inner_result_1.output_1;
+  wrapper_result_1.output_2 = inner_result_1.output_2;
+  return wrapper_result_1;
+}
+
+struct f3_res {
+  uint output_0;
+  int output_1;
+  float output_2;
+};
+
+struct tint_symbol_7 {
+  uint a [[color(1)]];
+  float c [[color(3)]];
+  int b [[color(6)]];
+};
+
+struct tint_symbol_8 {
+  uint output_0 [[color(1)]];
+  float output_2 [[color(3)]];
+  int output_1 [[color(6)]];
+};
+
+void f3_inner(float4 pos, thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).P.c = ((*(tint_private_vars)).P.c + pos[0]);
+}
+
+f3_res f3_inner_1(float4 pos, PixelLocal pixel_local_3, thread tint_private_vars_struct* const tint_private_vars) {
+  (*(tint_private_vars)).P = pixel_local_3;
+  f3_inner(pos, tint_private_vars);
+  f3_res const tint_symbol_14 = {.output_0=(*(tint_private_vars)).P.a, .output_1=(*(tint_private_vars)).P.b, .output_2=(*(tint_private_vars)).P.c};
+  return tint_symbol_14;
+}
+
+fragment tint_symbol_8 f3(float4 pos [[position]], tint_symbol_7 tint_symbol_6 [[stage_in]]) {
+  thread tint_private_vars_struct tint_private_vars = {};
+  PixelLocal const tint_symbol_13 = {.a=tint_symbol_6.a, .b=tint_symbol_6.b, .c=tint_symbol_6.c};
+  f3_res const inner_result_2 = f3_inner_1(pos, tint_symbol_13, &(tint_private_vars));
+  tint_symbol_8 wrapper_result_2 = {};
+  wrapper_result_2.output_0 = inner_result_2.output_0;
+  wrapper_result_2.output_1 = inner_result_2.output_1;
+  wrapper_result_2.output_2 = inner_result_2.output_2;
+  return wrapper_result_2;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.spvasm b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.spvasm
new file mode 100644
index 0000000..b33d409
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.spvasm
@@ -0,0 +1,11 @@
+SKIP: FAILED
+
+..\..\src\tint\lang\spirv\writer\printer\printer.cc:2367 internal compiler error: unimplemented variable address space pixel_local
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
+
+tint executable returned error: exit status 0xc000001d
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.wgsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.wgsl
new file mode 100644
index 0000000..b419b4c
--- /dev/null
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/builtin_multiple_entry_points.wgsl.expected.wgsl
@@ -0,0 +1,24 @@
+enable chromium_experimental_pixel_local;
+
+struct PixelLocal {
+  a : u32,
+  b : i32,
+  c : f32,
+}
+
+var<pixel_local> P : PixelLocal;
+
+@fragment
+fn f(@builtin(position) pos : vec4f) {
+  P.a += u32(pos.x);
+}
+
+@fragment
+fn f2(@builtin(position) pos : vec4f) {
+  P.b += i32(pos.x);
+}
+
+@fragment
+fn f3(@builtin(position) pos : vec4f) {
+  P.c += pos.x;
+}
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/invariant_builtin.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/invariant_builtin.wgsl.expected.ir.dxc.hlsl
index 6970257..985615e 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/invariant_builtin.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/invariant_builtin.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,35 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  precise float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(float4 pos) {
+  uint v = tint_f32_to_u32(pos[0u]);
+  P.a = (P.a + v);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  P.b = pixel_local_b.Load(v_1).x;
+  P.c = pixel_local_c.Load(v_1).x;
+  f_inner(float4(inputs.pos.xyz, (1.0f / inputs.pos[3u])));
+  pixel_local_a[v_1] = P.a.xxxx;
+  pixel_local_b[v_1] = P.b.xxxx;
+  pixel_local_c[v_1] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/invariant_builtin.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/invariant_builtin.wgsl.expected.ir.fxc.hlsl
index 6970257..985615e 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/invariant_builtin.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/invariant_builtin.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,35 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  precise float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(float4 pos) {
+  uint v = tint_f32_to_u32(pos[0u]);
+  P.a = (P.a + v);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  P.b = pixel_local_b.Load(v_1).x;
+  P.c = pixel_local_c.Load(v_1).x;
+  f_inner(float4(inputs.pos.xyz, (1.0f / inputs.pos[3u])));
+  pixel_local_a[v_1] = P.a.xxxx;
+  pixel_local_b[v_1] = P.b.xxxx;
+  pixel_local_c[v_1] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/invariant_builtin_in_struct.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/invariant_builtin_in_struct.wgsl.expected.ir.dxc.hlsl
index 6970257..198bd7a 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/invariant_builtin_in_struct.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/invariant_builtin_in_struct.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,40 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct In {
+  float4 pos;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  precise float4 In_pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(In tint_symbol) {
+  uint v = tint_f32_to_u32(tint_symbol.pos[0u]);
+  P.a = (P.a + v);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.In_pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  P.b = pixel_local_b.Load(v_1).x;
+  P.c = pixel_local_c.Load(v_1).x;
+  In v_2 = {float4(inputs.In_pos.xyz, (1.0f / inputs.In_pos[3u]))};
+  f_inner(v_2);
+  pixel_local_a[v_1] = P.a.xxxx;
+  pixel_local_b[v_1] = P.b.xxxx;
+  pixel_local_c[v_1] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/invariant_builtin_in_struct.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/invariant_builtin_in_struct.wgsl.expected.ir.fxc.hlsl
index 6970257..198bd7a 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/invariant_builtin_in_struct.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/invariant_builtin_in_struct.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,40 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct In {
+  float4 pos;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  precise float4 In_pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(In tint_symbol) {
+  uint v = tint_f32_to_u32(tint_symbol.pos[0u]);
+  P.a = (P.a + v);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.In_pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  P.b = pixel_local_b.Load(v_1).x;
+  P.c = pixel_local_c.Load(v_1).x;
+  In v_2 = {float4(inputs.In_pos.xyz, (1.0f / inputs.In_pos[3u]))};
+  f_inner(v_2);
+  pixel_local_a[v_1] = P.a.xxxx;
+  pixel_local_b[v_1] = P.b.xxxx;
+  pixel_local_c[v_1] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/location.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/location.wgsl.expected.ir.dxc.hlsl
index 6970257..3c70bd6 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/location.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/location.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,38 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  float4 a : TEXCOORD0;
+  nointerpolation float4 b : TEXCOORD1;
+  float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(float4 a, float4 b) {
+  uint v = tint_f32_to_u32(a[0u]);
+  uint v_1 = (v + tint_f32_to_u32(b[1u]));
+  P.a = (P.a + v_1);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_2 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_2).x;
+  P.b = pixel_local_b.Load(v_2).x;
+  P.c = pixel_local_c.Load(v_2).x;
+  f_inner(inputs.a, inputs.b);
+  pixel_local_a[v_2] = P.a.xxxx;
+  pixel_local_b[v_2] = P.b.xxxx;
+  pixel_local_c[v_2] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/location.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/location.wgsl.expected.ir.fxc.hlsl
index 6970257..3c70bd6 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/location.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/location.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,38 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  float4 a : TEXCOORD0;
+  nointerpolation float4 b : TEXCOORD1;
+  float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(float4 a, float4 b) {
+  uint v = tint_f32_to_u32(a[0u]);
+  uint v_1 = (v + tint_f32_to_u32(b[1u]));
+  P.a = (P.a + v_1);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_2 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_2).x;
+  P.b = pixel_local_b.Load(v_2).x;
+  P.c = pixel_local_c.Load(v_2).x;
+  f_inner(inputs.a, inputs.b);
+  pixel_local_a[v_2] = P.a.xxxx;
+  pixel_local_b[v_2] = P.b.xxxx;
+  pixel_local_c[v_2] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/location_in_struct.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/location_in_struct.wgsl.expected.ir.dxc.hlsl
index 6970257..f19ea10 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/location_in_struct.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/location_in_struct.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,44 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct In {
+  float4 a;
+  float4 b;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 In_a : TEXCOORD0;
+  nointerpolation float4 In_b : TEXCOORD1;
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(In tint_symbol) {
+  uint v = tint_f32_to_u32(tint_symbol.a[0u]);
+  uint v_1 = (v + tint_f32_to_u32(tint_symbol.b[1u]));
+  P.a = (P.a + v_1);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_2 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_2).x;
+  P.b = pixel_local_b.Load(v_2).x;
+  P.c = pixel_local_c.Load(v_2).x;
+  In v_3 = {inputs.In_a, inputs.In_b};
+  f_inner(v_3);
+  pixel_local_a[v_2] = P.a.xxxx;
+  pixel_local_b[v_2] = P.b.xxxx;
+  pixel_local_c[v_2] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/additional_params/location_in_struct.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/additional_params/location_in_struct.wgsl.expected.ir.fxc.hlsl
index 6970257..f19ea10 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/additional_params/location_in_struct.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/additional_params/location_in_struct.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,44 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct In {
+  float4 a;
+  float4 b;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 In_a : TEXCOORD0;
+  nointerpolation float4 In_b : TEXCOORD1;
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+uint tint_f32_to_u32(float value) {
+  return (((value <= 4294967040.0f)) ? ((((value >= 0.0f)) ? (uint(value)) : (0u))) : (4294967295u));
+}
+
+void f_inner(In tint_symbol) {
+  uint v = tint_f32_to_u32(tint_symbol.a[0u]);
+  uint v_1 = (v + tint_f32_to_u32(tint_symbol.b[1u]));
+  P.a = (P.a + v_1);
+}
+
+void f(f_inputs inputs) {
+  uint2 v_2 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_2).x;
+  P.b = pixel_local_b.Load(v_2).x;
+  P.c = pixel_local_c.Load(v_2).x;
+  In v_3 = {inputs.In_a, inputs.In_b};
+  f_inner(v_3);
+  pixel_local_a[v_2] = P.a.xxxx;
+  pixel_local_b[v_2] = P.b.xxxx;
+  pixel_local_c[v_2] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/multiple_outputs/multiple_attachments.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/multiple_outputs/multiple_attachments.wgsl.expected.ir.dxc.hlsl
index 6970257..217383e 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/multiple_outputs/multiple_attachments.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/multiple_outputs/multiple_attachments.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,50 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct Out {
+  float4 x;
+  float4 y;
+  float4 z;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_outputs {
+  float4 Out_x : SV_Target0;
+  float4 Out_y : SV_Target2;
+  float4 Out_z : SV_Target4;
+};
+
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+Out f_inner() {
+  P.a = (P.a + 42u);
+  Out v = {(10.0f).xxxx, (20.0f).xxxx, (30.0f).xxxx};
+  return v;
+}
+
+f_outputs f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  P.b = pixel_local_b.Load(v_1).x;
+  P.c = pixel_local_c.Load(v_1).x;
+  Out v_2 = f_inner();
+  Out v_3 = v_2;
+  Out v_4 = v_2;
+  Out v_5 = v_2;
+  f_outputs v_6 = {v_3.x, v_4.y, v_5.z};
+  pixel_local_a[v_1] = P.a.xxxx;
+  pixel_local_b[v_1] = P.b.xxxx;
+  pixel_local_c[v_1] = P.c.xxxx;
+  f_outputs v_7 = v_6;
+  return v_7;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/multiple_outputs/multiple_attachments.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/multiple_outputs/multiple_attachments.wgsl.expected.ir.fxc.hlsl
index 6970257..217383e 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/multiple_outputs/multiple_attachments.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/multiple_outputs/multiple_attachments.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,50 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct Out {
+  float4 x;
+  float4 y;
+  float4 z;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_outputs {
+  float4 Out_x : SV_Target0;
+  float4 Out_y : SV_Target2;
+  float4 Out_z : SV_Target4;
+};
+
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+Out f_inner() {
+  P.a = (P.a + 42u);
+  Out v = {(10.0f).xxxx, (20.0f).xxxx, (30.0f).xxxx};
+  return v;
+}
+
+f_outputs f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  P.b = pixel_local_b.Load(v_1).x;
+  P.c = pixel_local_c.Load(v_1).x;
+  Out v_2 = f_inner();
+  Out v_3 = v_2;
+  Out v_4 = v_2;
+  Out v_5 = v_2;
+  f_outputs v_6 = {v_3.x, v_4.y, v_5.z};
+  pixel_local_a[v_1] = P.a.xxxx;
+  pixel_local_b[v_1] = P.b.xxxx;
+  pixel_local_c[v_1] = P.c.xxxx;
+  f_outputs v_7 = v_6;
+  return v_7;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/multiple_outputs/single_attachment.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/multiple_outputs/single_attachment.wgsl.expected.ir.dxc.hlsl
index 6970257..d00e754 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/multiple_outputs/single_attachment.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/multiple_outputs/single_attachment.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,42 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct Out {
+  float4 x;
+  float4 y;
+  float4 z;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_outputs {
+  float4 Out_x : SV_Target0;
+  float4 Out_y : SV_Target2;
+  float4 Out_z : SV_Target3;
+};
+
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+Out f_inner() {
+  P.a = (P.a + 42u);
+  Out v = {(10.0f).xxxx, (20.0f).xxxx, (30.0f).xxxx};
+  return v;
+}
+
+f_outputs f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  Out v_2 = f_inner();
+  Out v_3 = v_2;
+  Out v_4 = v_2;
+  Out v_5 = v_2;
+  f_outputs v_6 = {v_3.x, v_4.y, v_5.z};
+  pixel_local_a[v_1] = P.a.xxxx;
+  f_outputs v_7 = v_6;
+  return v_7;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/multiple_outputs/single_attachment.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/multiple_outputs/single_attachment.wgsl.expected.ir.fxc.hlsl
index 6970257..d00e754 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/multiple_outputs/single_attachment.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/multiple_outputs/single_attachment.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,42 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct Out {
+  float4 x;
+  float4 y;
+  float4 z;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_outputs {
+  float4 Out_x : SV_Target0;
+  float4 Out_y : SV_Target2;
+  float4 Out_z : SV_Target3;
+};
+
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+Out f_inner() {
+  P.a = (P.a + 42u);
+  Out v = {(10.0f).xxxx, (20.0f).xxxx, (30.0f).xxxx};
+  return v;
+}
+
+f_outputs f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  Out v_2 = f_inner();
+  Out v_3 = v_2;
+  Out v_4 = v_2;
+  Out v_5 = v_2;
+  f_outputs v_6 = {v_3.x, v_4.y, v_5.z};
+  pixel_local_a[v_1] = P.a.xxxx;
+  f_outputs v_7 = v_6;
+  return v_7;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/one_output/multiple_attachments.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/one_output/multiple_attachments.wgsl.expected.ir.dxc.hlsl
index 6970257..5439b04 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/one_output/multiple_attachments.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/one_output/multiple_attachments.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,37 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_outputs {
+  float4 tint_symbol : SV_Target0;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+float4 f_inner() {
+  P.a = (P.a + 42u);
+  return (2.0f).xxxx;
+}
+
+f_outputs f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v).x;
+  P.b = pixel_local_b.Load(v).x;
+  P.c = pixel_local_c.Load(v).x;
+  f_outputs v_1 = {f_inner()};
+  pixel_local_a[v] = P.a.xxxx;
+  pixel_local_b[v] = P.b.xxxx;
+  pixel_local_c[v] = P.c.xxxx;
+  f_outputs v_2 = v_1;
+  return v_2;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/one_output/multiple_attachments.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/one_output/multiple_attachments.wgsl.expected.ir.fxc.hlsl
index 6970257..5439b04 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/one_output/multiple_attachments.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/one_output/multiple_attachments.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,37 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_outputs {
+  float4 tint_symbol : SV_Target0;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+float4 f_inner() {
+  P.a = (P.a + 42u);
+  return (2.0f).xxxx;
+}
+
+f_outputs f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v).x;
+  P.b = pixel_local_b.Load(v).x;
+  P.c = pixel_local_c.Load(v).x;
+  f_outputs v_1 = {f_inner()};
+  pixel_local_a[v] = P.a.xxxx;
+  pixel_local_b[v] = P.b.xxxx;
+  pixel_local_c[v] = P.c.xxxx;
+  f_outputs v_2 = v_1;
+  return v_2;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/one_output/single_attachment.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/one_output/single_attachment.wgsl.expected.ir.dxc.hlsl
index 6970257..54aba2e 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/one_output/single_attachment.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/one_output/single_attachment.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,29 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_outputs {
+  float4 tint_symbol : SV_Target0;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+float4 f_inner() {
+  P.a = (P.a + 42u);
+  return (2.0f).xxxx;
+}
+
+f_outputs f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v).x;
+  f_outputs v_1 = {f_inner()};
+  pixel_local_a[v] = P.a.xxxx;
+  f_outputs v_2 = v_1;
+  return v_2;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/one_output/single_attachment.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/one_output/single_attachment.wgsl.expected.ir.fxc.hlsl
index 6970257..54aba2e 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/one_output/single_attachment.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/one_output/single_attachment.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,29 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_outputs {
+  float4 tint_symbol : SV_Target0;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+float4 f_inner() {
+  P.a = (P.a + 42u);
+  return (2.0f).xxxx;
+}
+
+f_outputs f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v).x;
+  f_outputs v_1 = {f_inner()};
+  pixel_local_a[v] = P.a.xxxx;
+  f_outputs v_2 = v_1;
+  return v_2;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/zero_outputs/multiple_attachments.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/zero_outputs/multiple_attachments.wgsl.expected.ir.dxc.hlsl
index 6970257..07451c0 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/zero_outputs/multiple_attachments.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/zero_outputs/multiple_attachments.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,30 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+void f_inner() {
+  P.a = (P.a + 42u);
+}
+
+void f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v).x;
+  P.b = pixel_local_b.Load(v).x;
+  P.c = pixel_local_c.Load(v).x;
+  f_inner();
+  pixel_local_a[v] = P.a.xxxx;
+  pixel_local_b[v] = P.b.xxxx;
+  pixel_local_c[v] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/zero_outputs/multiple_attachments.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/zero_outputs/multiple_attachments.wgsl.expected.ir.fxc.hlsl
index 6970257..07451c0 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/zero_outputs/multiple_attachments.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/zero_outputs/multiple_attachments.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,30 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+void f_inner() {
+  P.a = (P.a + 42u);
+}
+
+void f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v).x;
+  P.b = pixel_local_b.Load(v).x;
+  P.c = pixel_local_c.Load(v).x;
+  f_inner();
+  pixel_local_a[v] = P.a.xxxx;
+  pixel_local_b[v] = P.b.xxxx;
+  pixel_local_c[v] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/zero_outputs/single_attachment.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/zero_outputs/single_attachment.wgsl.expected.ir.dxc.hlsl
index 6970257..cc36ed8 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/zero_outputs/single_attachment.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/zero_outputs/single_attachment.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,22 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+void f_inner() {
+  P.a = (P.a + 42u);
+}
+
+void f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v).x;
+  f_inner();
+  pixel_local_a[v] = P.a.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/entry_point_use/zero_outputs/single_attachment.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/entry_point_use/zero_outputs/single_attachment.wgsl.expected.ir.fxc.hlsl
index 6970257..cc36ed8 100644
--- a/test/tint/extensions/pixel_local/entry_point_use/zero_outputs/single_attachment.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/entry_point_use/zero_outputs/single_attachment.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,22 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+void f_inner() {
+  P.a = (P.a + 42u);
+}
+
+void f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v).x;
+  f_inner();
+  pixel_local_a[v] = P.a.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/indirect_use/multiple_outputs/multiple_attachments.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/indirect_use/multiple_outputs/multiple_attachments.wgsl.expected.ir.dxc.hlsl
index 6970257..cc32902 100644
--- a/test/tint/extensions/pixel_local/indirect_use/multiple_outputs/multiple_attachments.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/indirect_use/multiple_outputs/multiple_attachments.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,64 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct Out {
+  float4 x;
+  float4 y;
+  float4 z;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_outputs {
+  float4 Out_x : SV_Target0;
+  float4 Out_y : SV_Target2;
+  float4 Out_z : SV_Target4;
+};
+
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+void f0() {
+  P.a = (P.a + 9u);
+}
+
+void f1() {
+  f0();
+  P.a = (P.a + 8u);
+}
+
+void f2() {
+  P.a = (P.a + 7u);
+  f1();
+}
+
+Out f_inner() {
+  f2();
+  Out v = {(10.0f).xxxx, (20.0f).xxxx, (30.0f).xxxx};
+  return v;
+}
+
+f_outputs f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  P.b = pixel_local_b.Load(v_1).x;
+  P.c = pixel_local_c.Load(v_1).x;
+  Out v_2 = f_inner();
+  Out v_3 = v_2;
+  Out v_4 = v_2;
+  Out v_5 = v_2;
+  f_outputs v_6 = {v_3.x, v_4.y, v_5.z};
+  pixel_local_a[v_1] = P.a.xxxx;
+  pixel_local_b[v_1] = P.b.xxxx;
+  pixel_local_c[v_1] = P.c.xxxx;
+  f_outputs v_7 = v_6;
+  return v_7;
+}
+
diff --git a/test/tint/extensions/pixel_local/indirect_use/multiple_outputs/multiple_attachments.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/indirect_use/multiple_outputs/multiple_attachments.wgsl.expected.ir.fxc.hlsl
index 6970257..cc32902 100644
--- a/test/tint/extensions/pixel_local/indirect_use/multiple_outputs/multiple_attachments.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/indirect_use/multiple_outputs/multiple_attachments.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,64 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct Out {
+  float4 x;
+  float4 y;
+  float4 z;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_outputs {
+  float4 Out_x : SV_Target0;
+  float4 Out_y : SV_Target2;
+  float4 Out_z : SV_Target4;
+};
+
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+void f0() {
+  P.a = (P.a + 9u);
+}
+
+void f1() {
+  f0();
+  P.a = (P.a + 8u);
+}
+
+void f2() {
+  P.a = (P.a + 7u);
+  f1();
+}
+
+Out f_inner() {
+  f2();
+  Out v = {(10.0f).xxxx, (20.0f).xxxx, (30.0f).xxxx};
+  return v;
+}
+
+f_outputs f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  P.b = pixel_local_b.Load(v_1).x;
+  P.c = pixel_local_c.Load(v_1).x;
+  Out v_2 = f_inner();
+  Out v_3 = v_2;
+  Out v_4 = v_2;
+  Out v_5 = v_2;
+  f_outputs v_6 = {v_3.x, v_4.y, v_5.z};
+  pixel_local_a[v_1] = P.a.xxxx;
+  pixel_local_b[v_1] = P.b.xxxx;
+  pixel_local_c[v_1] = P.c.xxxx;
+  f_outputs v_7 = v_6;
+  return v_7;
+}
+
diff --git a/test/tint/extensions/pixel_local/indirect_use/multiple_outputs/single_attachment.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/indirect_use/multiple_outputs/single_attachment.wgsl.expected.ir.dxc.hlsl
index 6970257..ab33c0c 100644
--- a/test/tint/extensions/pixel_local/indirect_use/multiple_outputs/single_attachment.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/indirect_use/multiple_outputs/single_attachment.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,56 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct Out {
+  float4 x;
+  float4 y;
+  float4 z;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_outputs {
+  float4 Out_x : SV_Target0;
+  float4 Out_y : SV_Target2;
+  float4 Out_z : SV_Target3;
+};
+
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+void f0() {
+  P.a = (P.a + 9u);
+}
+
+void f1() {
+  f0();
+  P.a = (P.a + 8u);
+}
+
+void f2() {
+  P.a = (P.a + 7u);
+  f1();
+}
+
+Out f_inner() {
+  f2();
+  Out v = {(10.0f).xxxx, (20.0f).xxxx, (30.0f).xxxx};
+  return v;
+}
+
+f_outputs f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  Out v_2 = f_inner();
+  Out v_3 = v_2;
+  Out v_4 = v_2;
+  Out v_5 = v_2;
+  f_outputs v_6 = {v_3.x, v_4.y, v_5.z};
+  pixel_local_a[v_1] = P.a.xxxx;
+  f_outputs v_7 = v_6;
+  return v_7;
+}
+
diff --git a/test/tint/extensions/pixel_local/indirect_use/multiple_outputs/single_attachment.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/indirect_use/multiple_outputs/single_attachment.wgsl.expected.ir.fxc.hlsl
index 6970257..ab33c0c 100644
--- a/test/tint/extensions/pixel_local/indirect_use/multiple_outputs/single_attachment.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/indirect_use/multiple_outputs/single_attachment.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,56 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct Out {
+  float4 x;
+  float4 y;
+  float4 z;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_outputs {
+  float4 Out_x : SV_Target0;
+  float4 Out_y : SV_Target2;
+  float4 Out_z : SV_Target3;
+};
+
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+void f0() {
+  P.a = (P.a + 9u);
+}
+
+void f1() {
+  f0();
+  P.a = (P.a + 8u);
+}
+
+void f2() {
+  P.a = (P.a + 7u);
+  f1();
+}
+
+Out f_inner() {
+  f2();
+  Out v = {(10.0f).xxxx, (20.0f).xxxx, (30.0f).xxxx};
+  return v;
+}
+
+f_outputs f(f_inputs inputs) {
+  uint2 v_1 = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v_1).x;
+  Out v_2 = f_inner();
+  Out v_3 = v_2;
+  Out v_4 = v_2;
+  Out v_5 = v_2;
+  f_outputs v_6 = {v_3.x, v_4.y, v_5.z};
+  pixel_local_a[v_1] = P.a.xxxx;
+  f_outputs v_7 = v_6;
+  return v_7;
+}
+
diff --git a/test/tint/extensions/pixel_local/indirect_use/one_output/multiple_attachments.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/indirect_use/one_output/multiple_attachments.wgsl.expected.ir.dxc.hlsl
index 6970257..f095e38 100644
--- a/test/tint/extensions/pixel_local/indirect_use/one_output/multiple_attachments.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/indirect_use/one_output/multiple_attachments.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,51 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_outputs {
+  float4 tint_symbol : SV_Target0;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+void f0() {
+  P.a = (P.a + 9u);
+}
+
+void f1() {
+  f0();
+  P.a = (P.a + 8u);
+}
+
+void f2() {
+  P.a = (P.a + 7u);
+  f1();
+}
+
+float4 f_inner() {
+  f2();
+  return (2.0f).xxxx;
+}
+
+f_outputs f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v).x;
+  P.b = pixel_local_b.Load(v).x;
+  P.c = pixel_local_c.Load(v).x;
+  f_outputs v_1 = {f_inner()};
+  pixel_local_a[v] = P.a.xxxx;
+  pixel_local_b[v] = P.b.xxxx;
+  pixel_local_c[v] = P.c.xxxx;
+  f_outputs v_2 = v_1;
+  return v_2;
+}
+
diff --git a/test/tint/extensions/pixel_local/indirect_use/one_output/multiple_attachments.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/indirect_use/one_output/multiple_attachments.wgsl.expected.ir.fxc.hlsl
index 6970257..f095e38 100644
--- a/test/tint/extensions/pixel_local/indirect_use/one_output/multiple_attachments.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/indirect_use/one_output/multiple_attachments.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,51 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_outputs {
+  float4 tint_symbol : SV_Target0;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+void f0() {
+  P.a = (P.a + 9u);
+}
+
+void f1() {
+  f0();
+  P.a = (P.a + 8u);
+}
+
+void f2() {
+  P.a = (P.a + 7u);
+  f1();
+}
+
+float4 f_inner() {
+  f2();
+  return (2.0f).xxxx;
+}
+
+f_outputs f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v).x;
+  P.b = pixel_local_b.Load(v).x;
+  P.c = pixel_local_c.Load(v).x;
+  f_outputs v_1 = {f_inner()};
+  pixel_local_a[v] = P.a.xxxx;
+  pixel_local_b[v] = P.b.xxxx;
+  pixel_local_c[v] = P.c.xxxx;
+  f_outputs v_2 = v_1;
+  return v_2;
+}
+
diff --git a/test/tint/extensions/pixel_local/indirect_use/one_output/single_attachment.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/indirect_use/one_output/single_attachment.wgsl.expected.ir.dxc.hlsl
index 6970257..7c3791c 100644
--- a/test/tint/extensions/pixel_local/indirect_use/one_output/single_attachment.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/indirect_use/one_output/single_attachment.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,43 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_outputs {
+  float4 tint_symbol : SV_Target0;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+void f0() {
+  P.a = (P.a + 9u);
+}
+
+void f1() {
+  f0();
+  P.a = (P.a + 8u);
+}
+
+void f2() {
+  P.a = (P.a + 7u);
+  f1();
+}
+
+float4 f_inner() {
+  f2();
+  return (2.0f).xxxx;
+}
+
+f_outputs f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v).x;
+  f_outputs v_1 = {f_inner()};
+  pixel_local_a[v] = P.a.xxxx;
+  f_outputs v_2 = v_1;
+  return v_2;
+}
+
diff --git a/test/tint/extensions/pixel_local/indirect_use/one_output/single_attachment.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/indirect_use/one_output/single_attachment.wgsl.expected.ir.fxc.hlsl
index 6970257..7c3791c 100644
--- a/test/tint/extensions/pixel_local/indirect_use/one_output/single_attachment.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/indirect_use/one_output/single_attachment.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,43 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_outputs {
+  float4 tint_symbol : SV_Target0;
+};
 
-tint executable returned error: exit status 0xc000001d
+struct f_inputs {
+  float4 pos : SV_Position;
+};
+
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+void f0() {
+  P.a = (P.a + 9u);
+}
+
+void f1() {
+  f0();
+  P.a = (P.a + 8u);
+}
+
+void f2() {
+  P.a = (P.a + 7u);
+  f1();
+}
+
+float4 f_inner() {
+  f2();
+  return (2.0f).xxxx;
+}
+
+f_outputs f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v).x;
+  f_outputs v_1 = {f_inner()};
+  pixel_local_a[v] = P.a.xxxx;
+  f_outputs v_2 = v_1;
+  return v_2;
+}
+
diff --git a/test/tint/extensions/pixel_local/indirect_use/zero_outputs/multiple_attachments.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/indirect_use/zero_outputs/multiple_attachments.wgsl.expected.ir.dxc.hlsl
index 6970257..603c5e8 100644
--- a/test/tint/extensions/pixel_local/indirect_use/zero_outputs/multiple_attachments.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/indirect_use/zero_outputs/multiple_attachments.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,44 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+void f0() {
+  P.a = (P.a + 9u);
+}
+
+void f1() {
+  f0();
+  P.a = (P.a + 8u);
+}
+
+void f2() {
+  P.a = (P.a + 7u);
+  f1();
+}
+
+void f_inner() {
+  f2();
+}
+
+void f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v).x;
+  P.b = pixel_local_b.Load(v).x;
+  P.c = pixel_local_c.Load(v).x;
+  f_inner();
+  pixel_local_a[v] = P.a.xxxx;
+  pixel_local_b[v] = P.b.xxxx;
+  pixel_local_c[v] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/indirect_use/zero_outputs/multiple_attachments.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/indirect_use/zero_outputs/multiple_attachments.wgsl.expected.ir.fxc.hlsl
index 6970257..603c5e8 100644
--- a/test/tint/extensions/pixel_local/indirect_use/zero_outputs/multiple_attachments.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/indirect_use/zero_outputs/multiple_attachments.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,44 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+  int b;
+  float c;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+RasterizerOrderedTexture2D<int4> pixel_local_b : register(u6);
+RasterizerOrderedTexture2D<float4> pixel_local_c : register(u3);
+void f0() {
+  P.a = (P.a + 9u);
+}
+
+void f1() {
+  f0();
+  P.a = (P.a + 8u);
+}
+
+void f2() {
+  P.a = (P.a + 7u);
+  f1();
+}
+
+void f_inner() {
+  f2();
+}
+
+void f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v).x;
+  P.b = pixel_local_b.Load(v).x;
+  P.c = pixel_local_c.Load(v).x;
+  f_inner();
+  pixel_local_a[v] = P.a.xxxx;
+  pixel_local_b[v] = P.b.xxxx;
+  pixel_local_c[v] = P.c.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/indirect_use/zero_outputs/single_attachment.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/indirect_use/zero_outputs/single_attachment.wgsl.expected.ir.dxc.hlsl
index 6970257..526e65f 100644
--- a/test/tint/extensions/pixel_local/indirect_use/zero_outputs/single_attachment.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/indirect_use/zero_outputs/single_attachment.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,36 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+void f0() {
+  P.a = (P.a + 9u);
+}
+
+void f1() {
+  f0();
+  P.a = (P.a + 8u);
+}
+
+void f2() {
+  P.a = (P.a + 7u);
+  f1();
+}
+
+void f_inner() {
+  f2();
+}
+
+void f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v).x;
+  f_inner();
+  pixel_local_a[v] = P.a.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/indirect_use/zero_outputs/single_attachment.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/indirect_use/zero_outputs/single_attachment.wgsl.expected.ir.fxc.hlsl
index 6970257..526e65f 100644
--- a/test/tint/extensions/pixel_local/indirect_use/zero_outputs/single_attachment.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/indirect_use/zero_outputs/single_attachment.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,36 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal P = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+void f0() {
+  P.a = (P.a + 9u);
+}
+
+void f1() {
+  f0();
+  P.a = (P.a + 8u);
+}
+
+void f2() {
+  P.a = (P.a + 7u);
+  f1();
+}
+
+void f_inner() {
+  f2();
+}
+
+void f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  P.a = pixel_local_a.Load(v).x;
+  f_inner();
+  pixel_local_a[v] = P.a.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/ptr/local.wgsl.expected.ir.dxc.hlsl b/test/tint/extensions/pixel_local/ptr/local.wgsl.expected.ir.dxc.hlsl
index 6970257..b5e74b4 100644
--- a/test/tint/extensions/pixel_local/ptr/local.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/extensions/pixel_local/ptr/local.wgsl.expected.ir.dxc.hlsl
@@ -1,11 +1,22 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal V = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+void f_inner() {
+  V.a = 42u;
+}
+
+void f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  V.a = pixel_local_a.Load(v).x;
+  f_inner();
+  pixel_local_a[v] = V.a.xxxx;
+}
+
diff --git a/test/tint/extensions/pixel_local/ptr/local.wgsl.expected.ir.fxc.hlsl b/test/tint/extensions/pixel_local/ptr/local.wgsl.expected.ir.fxc.hlsl
index 6970257..b5e74b4 100644
--- a/test/tint/extensions/pixel_local/ptr/local.wgsl.expected.ir.fxc.hlsl
+++ b/test/tint/extensions/pixel_local/ptr/local.wgsl.expected.ir.fxc.hlsl
@@ -1,11 +1,22 @@
-SKIP: FAILED
+struct PixelLocal {
+  uint a;
+};
 
-..\..\src\tint\lang\hlsl\writer\printer\printer.cc:522 internal compiler error: unhandled address space pixel_local
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+struct f_inputs {
+  float4 pos : SV_Position;
+};
 
-tint executable returned error: exit status 0xc000001d
+
+static PixelLocal V = (PixelLocal)0;
+RasterizerOrderedTexture2D<uint4> pixel_local_a : register(u1);
+void f_inner() {
+  V.a = 42u;
+}
+
+void f(f_inputs inputs) {
+  uint2 v = uint2(inputs.pos.xy);
+  V.a = pixel_local_a.Load(v).x;
+  f_inner();
+  pixel_local_a[v] = V.a.xxxx;
+}
+