writer/msl: Output constant 0 lod for 1d texture builtins

The MSL headers have annotations that requires that the lod for 1D
textures is a constexpr with value 0. This affects .get_width() and
.read().

Bug: dawn:814

Change-Id: Ic21d32067061afe67a16fbbeee222ab695b53066
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/79301
Reviewed-by: Ben Clayton <bclayton@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Auto-Submit: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index 129e969..5c2ce6d 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -885,6 +885,10 @@
     return true;
   };
 
+  // MSL requires that `lod` is a constant 0 for 1D textures.
+  bool level_is_constant_zero =
+      texture_type->dim() == ast::TextureDimension::k1d;
+
   switch (builtin->Type()) {
     case sem::BuiltinType::kTextureDimensions: {
       std::vector<const char*> dims;
@@ -912,9 +916,13 @@
           return false;
         }
         out << ".get_" << name << "(";
-        if (auto* level = arg(Usage::kLevel)) {
-          if (!EmitExpression(out, level->Declaration())) {
-            return false;
+        if (level_is_constant_zero) {
+          out << "0";
+        } else {
+          if (auto* level = arg(Usage::kLevel)) {
+            if (!EmitExpression(out, level->Declaration())) {
+              return false;
+            }
           }
         }
         out << ")";
@@ -1061,8 +1069,12 @@
     if (lod_param_is_named) {
       out << "level(";
     }
-    if (!EmitExpression(out, level->Declaration())) {
-      return false;
+    if (level_is_constant_zero) {
+      out << "0";
+    } else {
+      if (!EmitExpression(out, level->Declaration())) {
+        return false;
+      }
     }
     if (lod_param_is_named) {
       out << ")";
diff --git a/src/writer/msl/generator_impl_builtin_texture_test.cc b/src/writer/msl/generator_impl_builtin_texture_test.cc
index f5887ff..46fe89f 100644
--- a/src/writer/msl/generator_impl_builtin_texture_test.cc
+++ b/src/writer/msl/generator_impl_builtin_texture_test.cc
@@ -27,7 +27,7 @@
   switch (overload) {
     case ValidTextureOverload::kDimensions1d:
     case ValidTextureOverload::kDimensionsStorageWO1d:
-      return R"(int(texture.get_width()))";
+      return R"(int(texture.get_width(0)))";
     case ValidTextureOverload::kDimensions2d:
     case ValidTextureOverload::kDimensions2dArray:
     case ValidTextureOverload::kDimensionsCube:
@@ -225,11 +225,11 @@
     case ValidTextureOverload::kSampleCompareLevelDepthCubeArrayF32:
       return R"(texture.sample_compare(sampler, float3(1.0f, 2.0f, 3.0f), 4, 5.0f))";
     case ValidTextureOverload::kLoad1dLevelF32:
-      return R"(texture.read(uint(1), 3))";
+      return R"(texture.read(uint(1), 0))";
     case ValidTextureOverload::kLoad1dLevelU32:
-      return R"(texture.read(uint(1), 3))";
+      return R"(texture.read(uint(1), 0))";
     case ValidTextureOverload::kLoad1dLevelI32:
-      return R"(texture.read(uint(1), 3))";
+      return R"(texture.read(uint(1), 0))";
     case ValidTextureOverload::kLoad2dLevelF32:
       return R"(texture.read(uint2(int2(1, 2)), 3))";
     case ValidTextureOverload::kLoad2dLevelU32:
diff --git a/test/builtins/gen/textureDimensions/002b2a.wgsl.expected.msl b/test/builtins/gen/textureDimensions/002b2a.wgsl.expected.msl
index 73f998f..97cec1c 100644
--- a/test/builtins/gen/textureDimensions/002b2a.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/002b2a.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_002b2a(texture1d<float, access::sample> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<float, access::sample> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/08753d.wgsl.expected.msl b/test/builtins/gen/textureDimensions/08753d.wgsl.expected.msl
index 881c7e2..92557a7 100644
--- a/test/builtins/gen/textureDimensions/08753d.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/08753d.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_08753d(texture1d<int, access::write> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<int, access::write> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/0cce40.wgsl.expected.msl b/test/builtins/gen/textureDimensions/0cce40.wgsl.expected.msl
index 58d7d3e..6718be0 100644
--- a/test/builtins/gen/textureDimensions/0cce40.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/0cce40.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_0cce40(texture1d<int, access::write> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<int, access::write> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/1e9e39.wgsl.expected.msl b/test/builtins/gen/textureDimensions/1e9e39.wgsl.expected.msl
index f7ea514..37bf3f3 100644
--- a/test/builtins/gen/textureDimensions/1e9e39.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/1e9e39.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_1e9e39(texture1d<float, access::write> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<float, access::write> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/318ecc.wgsl.expected.msl b/test/builtins/gen/textureDimensions/318ecc.wgsl.expected.msl
index c373afd..577e060 100644
--- a/test/builtins/gen/textureDimensions/318ecc.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/318ecc.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_318ecc(texture1d<uint, access::write> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<uint, access::write> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/3aca08.wgsl.expected.msl b/test/builtins/gen/textureDimensions/3aca08.wgsl.expected.msl
index d8bf7b4..186865c 100644
--- a/test/builtins/gen/textureDimensions/3aca08.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/3aca08.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_3aca08(texture1d<float, access::write> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<float, access::write> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/423f99.wgsl.expected.msl b/test/builtins/gen/textureDimensions/423f99.wgsl.expected.msl
index 168004b..dc27cae 100644
--- a/test/builtins/gen/textureDimensions/423f99.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/423f99.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_423f99(texture1d<int, access::sample> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<int, access::sample> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/42d4e6.wgsl.expected.msl b/test/builtins/gen/textureDimensions/42d4e6.wgsl.expected.msl
index e377d8d..3156bbb 100644
--- a/test/builtins/gen/textureDimensions/42d4e6.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/42d4e6.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_42d4e6(texture1d<float, access::write> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<float, access::write> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/4df9a8.wgsl.expected.msl b/test/builtins/gen/textureDimensions/4df9a8.wgsl.expected.msl
index 00beb11..2f350d5 100644
--- a/test/builtins/gen/textureDimensions/4df9a8.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/4df9a8.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_4df9a8(texture1d<uint, access::write> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<uint, access::write> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/55b23e.wgsl.expected.msl b/test/builtins/gen/textureDimensions/55b23e.wgsl.expected.msl
index c3532a3..24fb6e8 100644
--- a/test/builtins/gen/textureDimensions/55b23e.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/55b23e.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_55b23e(texture1d<float, access::write> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<float, access::write> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/57da0b.wgsl.expected.msl b/test/builtins/gen/textureDimensions/57da0b.wgsl.expected.msl
index 010a701..44429f3 100644
--- a/test/builtins/gen/textureDimensions/57da0b.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/57da0b.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_57da0b(texture1d<uint, access::write> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<uint, access::write> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/5caa5e.wgsl.expected.msl b/test/builtins/gen/textureDimensions/5caa5e.wgsl.expected.msl
index 1d7db80..9816f22 100644
--- a/test/builtins/gen/textureDimensions/5caa5e.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/5caa5e.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_5caa5e(texture1d<uint, access::write> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<uint, access::write> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/6adac6.wgsl.expected.msl b/test/builtins/gen/textureDimensions/6adac6.wgsl.expected.msl
index 03a4f5b..375da25 100644
--- a/test/builtins/gen/textureDimensions/6adac6.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/6adac6.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_6adac6(texture1d<int, access::write> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<int, access::write> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/9da9e2.wgsl.expected.msl b/test/builtins/gen/textureDimensions/9da9e2.wgsl.expected.msl
index f94dbe0..e114675 100644
--- a/test/builtins/gen/textureDimensions/9da9e2.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/9da9e2.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_9da9e2(texture1d<int, access::write> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<int, access::write> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/a7d565.wgsl.expected.msl b/test/builtins/gen/textureDimensions/a7d565.wgsl.expected.msl
index d317de8..e06c9c9 100644
--- a/test/builtins/gen/textureDimensions/a7d565.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/a7d565.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_a7d565(texture1d<uint, access::sample> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<uint, access::sample> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/a863f2.wgsl.expected.msl b/test/builtins/gen/textureDimensions/a863f2.wgsl.expected.msl
index 989df4d..152cdc5 100644
--- a/test/builtins/gen/textureDimensions/a863f2.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/a863f2.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_a863f2(texture1d<float, access::write> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<float, access::write> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/cc968c.wgsl.expected.msl b/test/builtins/gen/textureDimensions/cc968c.wgsl.expected.msl
index 849aa30..a585ee8 100644
--- a/test/builtins/gen/textureDimensions/cc968c.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/cc968c.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_cc968c(texture1d<int, access::write> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<int, access::write> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/cccc8f.wgsl.expected.msl b/test/builtins/gen/textureDimensions/cccc8f.wgsl.expected.msl
index e4d0218..d02c7e5 100644
--- a/test/builtins/gen/textureDimensions/cccc8f.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/cccc8f.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_cccc8f(texture1d<float, access::write> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<float, access::write> tint_symbol_2) {
diff --git a/test/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.msl b/test/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.msl
index f8e141a..f33ba03 100644
--- a/test/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.msl
+++ b/test/builtins/gen/textureDimensions/dc2dd0.wgsl.expected.msl
@@ -6,7 +6,7 @@
 };
 
 void textureDimensions_dc2dd0(texture1d<uint, access::write> tint_symbol_1) {
-  int res = int(tint_symbol_1.get_width());
+  int res = int(tint_symbol_1.get_width(0));
 }
 
 float4 vertex_main_inner(texture1d<uint, access::write> tint_symbol_2) {