[msl] Move BuiltinPolyfill transform

This CL moves the BuiltinPolyfill transform to come after the
MultiplanarExternalTexture transform. This brings the MSL AST printer in
line with all of the other printers on the ordering.

Change-Id: I11e84315a41969322e38bc3efad527ce234dd294
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/188621
Commit-Queue: James Price <jrprice@google.com>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Auto-Submit: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
index 292ed74..7a514a6 100644
--- a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
@@ -168,6 +168,23 @@
         manager.Add<ast::transform::Robustness>();
     }
 
+    ExternalTextureOptions external_texture_options{};
+    RemapperData remapper_data{};
+    ArrayLengthFromUniformOptions array_length_from_uniform_options{};
+    PopulateBindingRelatedOptions(options, remapper_data, external_texture_options,
+                                  array_length_from_uniform_options);
+
+    manager.Add<ast::transform::BindingRemapper>();
+    data.Add<ast::transform::BindingRemapper::Remappings>(
+        remapper_data, std::unordered_map<BindingPoint, core::Access>{},
+        /* allow_collisions */ true);
+
+    // Note: it is more efficient for MultiplanarExternalTexture to come after Robustness
+    // MultiplanarExternalTexture must come after BindingRemapper
+    data.Add<ast::transform::MultiplanarExternalTexture::NewBindingPoints>(
+        external_texture_options.bindings_map, /* allow_collisions */ true);
+    manager.Add<ast::transform::MultiplanarExternalTexture>();
+
     {  // Builtin polyfills
         ast::transform::BuiltinPolyfill::Builtins polyfills;
         polyfills.acosh = ast::transform::BuiltinPolyfill::Level::kRangeCheck;
@@ -190,23 +207,6 @@
         manager.Add<ast::transform::BuiltinPolyfill>();
     }
 
-    ExternalTextureOptions external_texture_options{};
-    RemapperData remapper_data{};
-    ArrayLengthFromUniformOptions array_length_from_uniform_options{};
-    PopulateBindingRelatedOptions(options, remapper_data, external_texture_options,
-                                  array_length_from_uniform_options);
-
-    manager.Add<ast::transform::BindingRemapper>();
-    data.Add<ast::transform::BindingRemapper::Remappings>(
-        remapper_data, std::unordered_map<BindingPoint, core::Access>{},
-        /* allow_collisions */ true);
-
-    // Note: it is more efficient for MultiplanarExternalTexture to come after Robustness
-    // MultiplanarExternalTexture must come after BindingRemapper
-    data.Add<ast::transform::MultiplanarExternalTexture::NewBindingPoints>(
-        external_texture_options.bindings_map, /* allow_collisions */ true);
-    manager.Add<ast::transform::MultiplanarExternalTexture>();
-
     if (!options.disable_workgroup_init) {
         // ZeroInitWorkgroupMemory must come before CanonicalizeEntryPointIO as
         // ZeroInitWorkgroupMemory may inject new builtin parameters.
diff --git a/test/tint/bug/tint/1739.wgsl.expected.msl b/test/tint/bug/tint/1739.wgsl.expected.msl
index 02cc476..1be982b 100644
--- a/test/tint/bug/tint/1739.wgsl.expected.msl
+++ b/test/tint/bug/tint/1739.wgsl.expected.msl
@@ -89,6 +89,10 @@
   return result;
 }
 
+uint2 tint_ftou(float2 v) {
+  return select(uint2(4294967295u), select(uint2(v), uint2(0u), (v < float2(0.0f))), (v < float2(4294967040.0f)));
+}
+
 int2 tint_clamp(int2 e, int2 low, int2 high) {
   return min(max(e, low), high);
 }
@@ -102,12 +106,12 @@
 
 float4 textureLoadExternal(texture2d<float, access::sample> plane0, texture2d<float, access::sample> plane1, int2 coord, ExternalTextureParams params) {
   uint2 const clampedCoords = min(uint2(coord), params.displayVisibleRectMax);
-  uint2 const plane0_clamped = uint2(rint((params.loadTransformationMatrix * float3(float2(clampedCoords), 1.0f))));
+  uint2 const plane0_clamped = tint_ftou(rint((params.loadTransformationMatrix * float3(float2(clampedCoords), 1.0f))));
   float4 color = 0.0f;
   if ((params.numPlanes == 1u)) {
     color = plane0.read(uint2(plane0_clamped), 0).rgba;
   } else {
-    uint2 const plane1_clamped = uint2((float2(plane0_clamped) * params.plane1CoordFactor));
+    uint2 const plane1_clamped = tint_ftou((float2(plane0_clamped) * params.plane1CoordFactor));
     color = float4((float4(plane0.read(uint2(plane0_clamped), 0)[0], plane1.read(uint2(plane1_clamped), 0).rg, 1.0f) * params.yuvToRgbConversionMatrix), 1.0f);
   }
   if ((params.doYuvToRgbConversionOnly == 0u)) {
diff --git a/test/tint/builtins/gen/literal/textureLoad/1bfdfb.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/1bfdfb.wgsl.expected.msl
index 47fa30e..f3cd398 100644
--- a/test/tint/builtins/gen/literal/textureLoad/1bfdfb.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureLoad/1bfdfb.wgsl.expected.msl
@@ -89,6 +89,10 @@
   return result;
 }
 
+uint2 tint_ftou(float2 v) {
+  return select(uint2(4294967295u), select(uint2(v), uint2(0u), (v < float2(0.0f))), (v < float2(4294967040.0f)));
+}
+
 float3 gammaCorrection(float3 v, GammaTransferParams params) {
   bool3 const cond = (fabs(v) < float3(params.D));
   float3 const t = (sign(v) * ((params.C * fabs(v)) + params.F));
@@ -98,12 +102,12 @@
 
 float4 textureLoadExternal(texture2d<float, access::sample> plane0, texture2d<float, access::sample> plane1, uint2 coord, ExternalTextureParams params) {
   uint2 const clampedCoords = min(uint2(coord), params.displayVisibleRectMax);
-  uint2 const plane0_clamped = uint2(rint((params.loadTransformationMatrix * float3(float2(clampedCoords), 1.0f))));
+  uint2 const plane0_clamped = tint_ftou(rint((params.loadTransformationMatrix * float3(float2(clampedCoords), 1.0f))));
   float4 color = 0.0f;
   if ((params.numPlanes == 1u)) {
     color = plane0.read(uint2(plane0_clamped), 0).rgba;
   } else {
-    uint2 const plane1_clamped = uint2((float2(plane0_clamped) * params.plane1CoordFactor));
+    uint2 const plane1_clamped = tint_ftou((float2(plane0_clamped) * params.plane1CoordFactor));
     color = float4((float4(plane0.read(uint2(plane0_clamped), 0)[0], plane1.read(uint2(plane1_clamped), 0).rg, 1.0f) * params.yuvToRgbConversionMatrix), 1.0f);
   }
   if ((params.doYuvToRgbConversionOnly == 0u)) {
diff --git a/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.msl b/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.msl
index 47f69c9..9ced0bb 100644
--- a/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/textureLoad/8acf41.wgsl.expected.msl
@@ -89,6 +89,10 @@
   return result;
 }
 
+uint2 tint_ftou(float2 v) {
+  return select(uint2(4294967295u), select(uint2(v), uint2(0u), (v < float2(0.0f))), (v < float2(4294967040.0f)));
+}
+
 float3 gammaCorrection(float3 v, GammaTransferParams params) {
   bool3 const cond = (fabs(v) < float3(params.D));
   float3 const t = (sign(v) * ((params.C * fabs(v)) + params.F));
@@ -98,12 +102,12 @@
 
 float4 textureLoadExternal(texture2d<float, access::sample> plane0, texture2d<float, access::sample> plane1, int2 coord, ExternalTextureParams params) {
   uint2 const clampedCoords = min(uint2(coord), params.displayVisibleRectMax);
-  uint2 const plane0_clamped = uint2(rint((params.loadTransformationMatrix * float3(float2(clampedCoords), 1.0f))));
+  uint2 const plane0_clamped = tint_ftou(rint((params.loadTransformationMatrix * float3(float2(clampedCoords), 1.0f))));
   float4 color = 0.0f;
   if ((params.numPlanes == 1u)) {
     color = plane0.read(uint2(plane0_clamped), 0).rgba;
   } else {
-    uint2 const plane1_clamped = uint2((float2(plane0_clamped) * params.plane1CoordFactor));
+    uint2 const plane1_clamped = tint_ftou((float2(plane0_clamped) * params.plane1CoordFactor));
     color = float4((float4(plane0.read(uint2(plane0_clamped), 0)[0], plane1.read(uint2(plane1_clamped), 0).rg, 1.0f) * params.yuvToRgbConversionMatrix), 1.0f);
   }
   if ((params.doYuvToRgbConversionOnly == 0u)) {
diff --git a/test/tint/builtins/gen/var/textureLoad/1bfdfb.wgsl.expected.msl b/test/tint/builtins/gen/var/textureLoad/1bfdfb.wgsl.expected.msl
index 2b2dc26..c332ca8 100644
--- a/test/tint/builtins/gen/var/textureLoad/1bfdfb.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureLoad/1bfdfb.wgsl.expected.msl
@@ -89,6 +89,10 @@
   return result;
 }
 
+uint2 tint_ftou(float2 v) {
+  return select(uint2(4294967295u), select(uint2(v), uint2(0u), (v < float2(0.0f))), (v < float2(4294967040.0f)));
+}
+
 float3 gammaCorrection(float3 v, GammaTransferParams params) {
   bool3 const cond = (fabs(v) < float3(params.D));
   float3 const t = (sign(v) * ((params.C * fabs(v)) + params.F));
@@ -98,12 +102,12 @@
 
 float4 textureLoadExternal(texture2d<float, access::sample> plane0, texture2d<float, access::sample> plane1, uint2 coord, ExternalTextureParams params) {
   uint2 const clampedCoords = min(uint2(coord), params.displayVisibleRectMax);
-  uint2 const plane0_clamped = uint2(rint((params.loadTransformationMatrix * float3(float2(clampedCoords), 1.0f))));
+  uint2 const plane0_clamped = tint_ftou(rint((params.loadTransformationMatrix * float3(float2(clampedCoords), 1.0f))));
   float4 color = 0.0f;
   if ((params.numPlanes == 1u)) {
     color = plane0.read(uint2(plane0_clamped), 0).rgba;
   } else {
-    uint2 const plane1_clamped = uint2((float2(plane0_clamped) * params.plane1CoordFactor));
+    uint2 const plane1_clamped = tint_ftou((float2(plane0_clamped) * params.plane1CoordFactor));
     color = float4((float4(plane0.read(uint2(plane0_clamped), 0)[0], plane1.read(uint2(plane1_clamped), 0).rg, 1.0f) * params.yuvToRgbConversionMatrix), 1.0f);
   }
   if ((params.doYuvToRgbConversionOnly == 0u)) {
diff --git a/test/tint/builtins/gen/var/textureLoad/8acf41.wgsl.expected.msl b/test/tint/builtins/gen/var/textureLoad/8acf41.wgsl.expected.msl
index ee613a2..ceba81b 100644
--- a/test/tint/builtins/gen/var/textureLoad/8acf41.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/textureLoad/8acf41.wgsl.expected.msl
@@ -89,6 +89,10 @@
   return result;
 }
 
+uint2 tint_ftou(float2 v) {
+  return select(uint2(4294967295u), select(uint2(v), uint2(0u), (v < float2(0.0f))), (v < float2(4294967040.0f)));
+}
+
 float3 gammaCorrection(float3 v, GammaTransferParams params) {
   bool3 const cond = (fabs(v) < float3(params.D));
   float3 const t = (sign(v) * ((params.C * fabs(v)) + params.F));
@@ -98,12 +102,12 @@
 
 float4 textureLoadExternal(texture2d<float, access::sample> plane0, texture2d<float, access::sample> plane1, int2 coord, ExternalTextureParams params) {
   uint2 const clampedCoords = min(uint2(coord), params.displayVisibleRectMax);
-  uint2 const plane0_clamped = uint2(rint((params.loadTransformationMatrix * float3(float2(clampedCoords), 1.0f))));
+  uint2 const plane0_clamped = tint_ftou(rint((params.loadTransformationMatrix * float3(float2(clampedCoords), 1.0f))));
   float4 color = 0.0f;
   if ((params.numPlanes == 1u)) {
     color = plane0.read(uint2(plane0_clamped), 0).rgba;
   } else {
-    uint2 const plane1_clamped = uint2((float2(plane0_clamped) * params.plane1CoordFactor));
+    uint2 const plane1_clamped = tint_ftou((float2(plane0_clamped) * params.plane1CoordFactor));
     color = float4((float4(plane0.read(uint2(plane0_clamped), 0)[0], plane1.read(uint2(plane1_clamped), 0).rg, 1.0f) * params.yuvToRgbConversionMatrix), 1.0f);
   }
   if ((params.doYuvToRgbConversionOnly == 0u)) {
diff --git a/test/tint/builtins/textureLoad/texture_external_param.wgsl.expected.msl b/test/tint/builtins/textureLoad/texture_external_param.wgsl.expected.msl
index e7922eb..58e53df 100644
--- a/test/tint/builtins/textureLoad/texture_external_param.wgsl.expected.msl
+++ b/test/tint/builtins/textureLoad/texture_external_param.wgsl.expected.msl
@@ -89,6 +89,10 @@
   return result;
 }
 
+uint2 tint_ftou(float2 v) {
+  return select(uint2(4294967295u), select(uint2(v), uint2(0u), (v < float2(0.0f))), (v < float2(4294967040.0f)));
+}
+
 float3 gammaCorrection(float3 v, GammaTransferParams params) {
   bool3 const cond = (fabs(v) < float3(params.D));
   float3 const t = (sign(v) * ((params.C * fabs(v)) + params.F));
@@ -98,12 +102,12 @@
 
 float4 textureLoadExternal(texture2d<float, access::sample> plane0, texture2d<float, access::sample> plane1, int2 coord, ExternalTextureParams params) {
   uint2 const clampedCoords = min(uint2(coord), params.displayVisibleRectMax);
-  uint2 const plane0_clamped = uint2(rint((params.loadTransformationMatrix * float3(float2(clampedCoords), 1.0f))));
+  uint2 const plane0_clamped = tint_ftou(rint((params.loadTransformationMatrix * float3(float2(clampedCoords), 1.0f))));
   float4 color = 0.0f;
   if ((params.numPlanes == 1u)) {
     color = plane0.read(uint2(plane0_clamped), 0).rgba;
   } else {
-    uint2 const plane1_clamped = uint2((float2(plane0_clamped) * params.plane1CoordFactor));
+    uint2 const plane1_clamped = tint_ftou((float2(plane0_clamped) * params.plane1CoordFactor));
     color = float4((float4(plane0.read(uint2(plane0_clamped), 0)[0], plane1.read(uint2(plane1_clamped), 0).rg, 1.0f) * params.yuvToRgbConversionMatrix), 1.0f);
   }
   if ((params.doYuvToRgbConversionOnly == 0u)) {