Add support for Trunc,Ceil,Fract,Round,RoundEven
Mostly trivial; exception is RoundEven, for which I borrowed the
implementation from the GLES side.
Test: dEQP-VK.glsl.operator.common_functions.*
Bug: b/127804400
Change-Id: I889c3750ebdbc078723890488cf44d89ea77103b
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/26628
Tested-by: Chris Forbes <chrisforbes@google.com>
Presubmit-Ready: Chris Forbes <chrisforbes@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index 6333106..ab3c17d 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -1723,6 +1723,54 @@
}
break;
}
+ case GLSLstd450Trunc:
+ {
+ auto src = GenericValue(this, routine, insn.word(5));
+ for (auto i = 0u; i < type.sizeInComponents; i++)
+ {
+ dst.emplace(i, Trunc(src[i]));
+ }
+ break;
+ }
+ case GLSLstd450Ceil:
+ {
+ auto src = GenericValue(this, routine, insn.word(5));
+ for (auto i = 0u; i < type.sizeInComponents; i++)
+ {
+ dst.emplace(i, Ceil(src[i]));
+ }
+ break;
+ }
+ case GLSLstd450Fract:
+ {
+ auto src = GenericValue(this, routine, insn.word(5));
+ for (auto i = 0u; i < type.sizeInComponents; i++)
+ {
+ dst.emplace(i, Frac(src[i]));
+ }
+ break;
+ }
+ case GLSLstd450Round:
+ {
+ auto src = GenericValue(this, routine, insn.word(5));
+ for (auto i = 0u; i < type.sizeInComponents; i++)
+ {
+ dst.emplace(i, Round(src[i]));
+ }
+ break;
+ }
+ case GLSLstd450RoundEven:
+ {
+ auto src = GenericValue(this, routine, insn.word(5));
+ for (auto i = 0u; i < type.sizeInComponents; i++)
+ {
+ auto x = Round(src[i]);
+ // dst = round(src) + ((round(src) < src) * 2 - 1) * (fract(src) == 0.5) * isOdd(round(src));
+ dst.emplace(i, x + ((SIMD::Float(CmpLT(x, src[i]) & SIMD::Int(1)) * SIMD::Float(2.0f)) - SIMD::Float(1.0f)) *
+ SIMD::Float(CmpEQ(Frac(src[i]), SIMD::Float(0.5f)) & SIMD::Int(1)) * SIMD::Float(Int4(x) & SIMD::Int(1)));
+ }
+ break;
+ }
default:
UNIMPLEMENTED("Unhandled ExtInst %d", extInstIndex);
}