SpirvShader: Handle DecorationRelaxedPrecision decorations While not strictly necessary (we could always calculate with the highest precision), it is a tiny amount of work to dramatically increase performance of instructions like InverseSqrt for relaxed precision types. Bug: b/126873455 Change-Id: I42d5871a8e0886001e85fd4e16f8e6cb309236cf Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/28696 Tested-by: Ben Clayton <bclayton@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 6180687..d1d416d 100644 --- a/src/Pipeline/SpirvShader.cpp +++ b/src/Pipeline/SpirvShader.cpp
@@ -1133,6 +1133,9 @@ HasMatrixStride = true; MatrixStride = static_cast<int32_t>(arg); break; + case spv::DecorationRelaxedPrecision: + RelaxedPrecision = true; + break; default: // Intentionally partial, there are many decorations we just don't care about. break; @@ -1195,6 +1198,7 @@ Centroid |= src.Centroid; Block |= src.Block; BufferBlock |= src.BufferBlock; + RelaxedPrecision |= src.RelaxedPrecision; } void SpirvShader::ApplyDecorationsForId(Decorations *d, TypeOrObjectID id) const
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp index 6254af6..f3e3919 100644 --- a/src/Pipeline/SpirvShader.hpp +++ b/src/Pipeline/SpirvShader.hpp
@@ -422,6 +422,7 @@ bool HasOffset : 1; bool HasArrayStride : 1; bool HasMatrixStride : 1; + bool RelaxedPrecision : 1; Decorations() : Location{-1}, Component{0}, DescriptorSet{-1}, Binding{-1}, @@ -431,7 +432,8 @@ HasDescriptorSet{false}, HasBinding{false}, HasBuiltIn{false}, Flat{false}, Centroid{false}, NoPerspective{false}, Block{false}, BufferBlock{false}, - HasOffset{false}, HasArrayStride{false}, HasMatrixStride{false} + HasOffset{false}, HasArrayStride{false}, HasMatrixStride{false}, + RelaxedPrecision{false} { }