[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())); }