Fix OpImageSampleProjDref
Divide Dref by the projection coordinate.
The SPIR-V spec states that
"Dref /q is the depth-comparison reference value."
Bug b/129523279
Tests: dEQP-VK.glsl.texture_functions.textureproj.*
Change-Id: Ib1c4ad09f829b84b6b1065ff604fe88f8b1c1426
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/31693
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index db17770..6db7463 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -4768,7 +4768,16 @@
if(instruction.isDref())
{
auto drefValue = GenericValue(this, state->routine, insn.word(5));
- in[i] = drefValue.Float(0);
+
+ if(instruction.isProj())
+ {
+ in[i] = drefValue.Float(0) / coordinate.Float(coordinates); // TODO(b/129523279): Optimize using reciprocal.
+ }
+ else
+ {
+ in[i] = drefValue.Float(0);
+ }
+
i++;
}