[spirv-reader][ir] Error on non-0.0 LOD.

If a DREF LOD value is not 0.0, emit an ICE with an appropriate error
message.

Fixed: 427966373
Change-Id: I2c7ab90a2b4c4b917b1b219696759fee3751f5b4
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/253194
Reviewed-by: David Neto <dneto@google.com>
Auto-Submit: dan sinclair <dsinclair@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/spirv/reader/parser/parser.cc b/src/tint/lang/spirv/reader/parser/parser.cc
index 0558d8c..9f7606e 100644
--- a/src/tint/lang/spirv/reader/parser/parser.cc
+++ b/src/tint/lang/spirv/reader/parser/parser.cc
@@ -3041,6 +3041,10 @@
         Emit(b_.Call<spirv::ir::BuiltinCall>(Type(inst.type_id()), fn, args), inst.result_id());
     }
 
+    bool HasLod(uint32_t mask) {
+        return (mask & static_cast<uint32_t>(spv::ImageOperandsMask::Lod)) != 0;
+    }
+
     void EmitImageSampleDepth(const spvtools::opt::Instruction& inst, spirv::BuiltinFn fn) {
         auto sampled_image = Value(inst.GetSingleWordInOperand(0));
         auto* coord = Value(inst.GetSingleWordInOperand(1));
@@ -3059,6 +3063,17 @@
             for (uint32_t i = 4; i < inst.NumInOperands(); ++i) {
                 args.Push(Value(inst.GetSingleWordInOperand(i)));
             }
+
+            if (HasLod(literal_mask)) {
+                core::ir::Value* lod = args[4];
+                TINT_ASSERT(lod->Is<core::ir::Constant>());
+                TINT_ASSERT(lod->Type()->As<core::type::F32>());
+
+                auto v = lod->As<core::ir::Constant>()->Value()->ValueAs<float>();
+                if (v != 0.0f) {
+                    TINT_ICE() << "Dref LOD values must be 0.0";
+                }
+            }
         } else {
             args.Push(b_.Zero(ty_.u32()));
         }