Skip texel address sample offset if zero
The SPIR-V spec states that the Sample operand of OpImageTexelPointer
"must be a valid <id> for the value 0 if the OpTypeImage has MS of 0."
This change optimizes for this common case by no performing texel
address sample offset and bounds check calculations.
Bug: b/163142358
Change-Id: I75932c264d45df1012fa8451fc4c57671191b59b
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/47808
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index e308e42..37c7bd5 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -2481,11 +2481,11 @@
{}
SpirvShader::Operand::Operand(const EmitState *state, const Object &object)
- : constant(object.constantValue.data())
+ : constant(object.kind == SpirvShader::Object::Kind::Constant ? object.constantValue.data() : nullptr)
, intermediate(object.kind == SpirvShader::Object::Kind::Intermediate ? &state->getIntermediate(object.id()) : nullptr)
, componentCount(intermediate ? intermediate->componentCount : object.constantValue.size())
{
- ASSERT(intermediate || (object.kind == SpirvShader::Object::Kind::Constant));
+ ASSERT(intermediate || constant);
}
SpirvShader::Operand::Operand(const Intermediate &value)
@@ -2495,6 +2495,24 @@
{
}
+bool SpirvShader::Operand::isConstantZero() const
+{
+ if(!constant)
+ {
+ return false;
+ }
+
+ for(uint32_t i = 0; i < componentCount; i++)
+ {
+ if(constant[i] != 0)
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
SpirvRoutine::SpirvRoutine(vk::PipelineLayout const *pipelineLayout)
: pipelineLayout(pipelineLayout)
{