spirv-reader: Fix texture[Load|Store] with lod

Don't suffix texture intrinsics with `Load` unless it's a `textureSample`.

Discussion:
https://github.com/gpuweb/gpuweb/pull/1261/files/d46b4fa3ca20c4b6e82859391cea8c71009cd220#diff-709b5c343d59ae10cbabe69f9df1eee9e2dbb6e9d848632fa94357083d6e0a34

Bug: tint:109
Bug: dawn:399
Change-Id: Ic42ef9f8681dd04bd8f4c901c6d4cdc5f4166d26
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/35423
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/reader/spirv/function.cc b/src/reader/spirv/function.cc
index c699115..c8303d5 100644
--- a/src/reader/spirv/function.cc
+++ b/src/reader/spirv/function.cc
@@ -3948,6 +3948,7 @@
   const auto num_args = inst.NumInOperands();
 
   std::string builtin_name;
+  bool use_load_suffix = true;
   switch (inst.opcode()) {
     case SpvOpImageSampleImplicitLod:
     case SpvOpImageSampleExplicitLod:
@@ -3973,13 +3974,16 @@
     case SpvOpImageFetch:
       // Read a single texel from a sampled image.
       builtin_name = "textureLoad";
+      use_load_suffix = false;
       break;
     case SpvOpImageRead:
       // Read a single texel from a storage image.
       builtin_name = "textureLoad";
+      use_load_suffix = false;
       break;
     case SpvOpImageWrite:
       builtin_name = "textureStore";
+      use_load_suffix = false;
       if (arg_index < num_args) {
         auto texel = MakeOperand(inst, arg_index);
         auto* converted_texel =
@@ -4014,7 +4018,9 @@
     arg_index++;
   }
   if (arg_index < num_args && (image_operands_mask & SpvImageOperandsLodMask)) {
-    builtin_name += "Level";
+    if (use_load_suffix) {
+      builtin_name += "Level";
+    }
     TypedExpression lod = MakeOperand(inst, arg_index);
     // When sampling from a depth texture, the Lod operand must be an I32.
     if (texture_type->Is<ast::type::DepthTexture>()) {
diff --git a/src/reader/spirv/parser_impl_handle_test.cc b/src/reader/spirv/parser_impl_handle_test.cc
index 83055a6..4731bed 100644
--- a/src/reader/spirv/parser_impl_handle_test.cc
+++ b/src/reader/spirv/parser_impl_handle_test.cc
@@ -3134,6 +3134,35 @@
           }
         }
       }
+    })"},
+        // OpImageFetch with explicit level
+        {"%float 2D 0 0 0 1 Unknown",
+         "%99 = OpImageFetch %v4float %im %vi12 Lod %int_3",
+         R"(Variable{
+    Decorations{
+      SetDecoration{2}
+      BindingDecoration{1}
+    }
+    x_20
+    uniform_constant
+    __sampled_texture_2d__f32
+  })",
+         R"(VariableDeclStatement{
+      VariableConst{
+        x_99
+        none
+        __vec_4__f32
+        {
+          Call[not set]{
+            Identifier[not set]{textureLoad}
+            (
+              Identifier[not set]{x_20}
+              Identifier[not set]{vi12}
+              ScalarConstructor[not set]{3}
+            )
+          }
+        }
+      }
     })"}}));
 
 INSTANTIATE_TEST_SUITE_P(