Simplify obtaining SPIR-V decorations
Bug: b/222218659
Change-Id: I144793cb27e7ce502cf6ddbb81cb9eca73d6510f
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/63609
Reviewed-by: Sean Risser <srisser@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index d3fb589..a4212c9 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -1177,8 +1177,7 @@
void SpirvShader::VisitInterface(Object::ID id, const InterfaceVisitor &f) const
{
// Walk a variable definition and call f for each component in it.
- Decorations d{};
- ApplyDecorationsForId(&d, id);
+ Decorations d = GetDecorationsForId(id);
auto def = getObject(id).definition;
ASSERT(def.opcode() == spv::OpVariable);
@@ -1232,8 +1231,7 @@
auto &baseObject = getObject(baseId);
Type::ID typeId = getType(baseObject).element;
- Decorations d = {};
- ApplyDecorationsForId(&d, baseObject.typeId());
+ Decorations d = GetDecorationsForId(baseObject.typeId());
Int arrayIndex = 0;
if(baseObject.kind == Object::Kind::DescriptorSet)
@@ -1595,11 +1593,21 @@
}
}
+SpirvShader::Decorations SpirvShader::GetDecorationsForId(TypeOrObjectID id) const
+{
+ Decorations d;
+ ApplyDecorationsForId(&d, id);
+
+ return d;
+}
+
void SpirvShader::ApplyDecorationsForId(Decorations *d, TypeOrObjectID id) const
{
auto it = decorations.find(id);
if(it != decorations.end())
+ {
d->Apply(it->second);
+ }
}
void SpirvShader::ApplyDecorationsForIdMember(Decorations *d, Type::ID id, uint32_t member) const
@@ -2533,8 +2541,7 @@
auto arrayBase = structBase + structDecorations.Offset;
auto arraySizeInBytes = SIMD::Int(arrayBase.limit()) - arrayBase.offsets();
- Decorations arrayDecorations = {};
- ApplyDecorationsForId(&arrayDecorations, arrayId);
+ Decorations arrayDecorations = GetDecorationsForId(arrayId);
ASSERT(arrayDecorations.HasArrayStride);
auto arrayLength = arraySizeInBytes / SIMD::Int(arrayDecorations.ArrayStride);
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index 1641d83..c3a9815 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -925,6 +925,7 @@
void ProcessExecutionMode(InsnIterator it);
uint32_t ComputeTypeSize(InsnIterator insn);
+ Decorations GetDecorationsForId(TypeOrObjectID id) const;
void ApplyDecorationsForId(Decorations *d, TypeOrObjectID id) const;
void ApplyDecorationsForIdMember(Decorations *d, Type::ID id, uint32_t member) const;
void ApplyDecorationsForAccessChain(Decorations *d, DescriptorDecorations *dd, Object::ID baseId, uint32_t numIndexes, uint32_t const *indexIds) const;
diff --git a/src/Pipeline/SpirvShaderGLSLstd450.cpp b/src/Pipeline/SpirvShaderGLSLstd450.cpp
index 77f67e3..44c144b 100644
--- a/src/Pipeline/SpirvShaderGLSLstd450.cpp
+++ b/src/Pipeline/SpirvShaderGLSLstd450.cpp
@@ -620,8 +620,7 @@
case GLSLstd450Asin:
{
auto val = Operand(this, state, insn.word(5));
- Decorations d;
- ApplyDecorationsForId(&d, insn.word(5));
+ Decorations d = GetDecorationsForId(insn.word(5));
for(auto i = 0u; i < type.componentCount; i++)
{
dst.move(i, sw::Asin(val.Float(i), d.RelaxedPrecision));
@@ -631,8 +630,7 @@
case GLSLstd450Acos:
{
auto val = Operand(this, state, insn.word(5));
- Decorations d;
- ApplyDecorationsForId(&d, insn.word(5));
+ Decorations d = GetDecorationsForId(insn.word(5));
for(auto i = 0u; i < type.componentCount; i++)
{
dst.move(i, sw::Acos(val.Float(i), d.RelaxedPrecision));
@@ -770,8 +768,7 @@
case GLSLstd450InverseSqrt:
{
auto val = Operand(this, state, insn.word(5));
- Decorations d;
- ApplyDecorationsForId(&d, insn.word(5));
+ Decorations d = GetDecorationsForId(insn.word(5));
for(auto i = 0u; i < type.componentCount; i++)
{
@@ -901,8 +898,7 @@
break;
case GLSLstd450InterpolateAtCentroid:
{
- Decorations d;
- ApplyDecorationsForId(&d, insn.word(5));
+ Decorations d = GetDecorationsForId(insn.word(5));
auto ptr = state->getPointer(insn.word(5));
for(auto i = 0u; i < type.componentCount; i++)
{
@@ -912,8 +908,7 @@
break;
case GLSLstd450InterpolateAtSample:
{
- Decorations d;
- ApplyDecorationsForId(&d, insn.word(5));
+ Decorations d = GetDecorationsForId(insn.word(5));
auto ptr = state->getPointer(insn.word(5));
for(auto i = 0u; i < type.componentCount; i++)
{
@@ -923,8 +918,7 @@
break;
case GLSLstd450InterpolateAtOffset:
{
- Decorations d;
- ApplyDecorationsForId(&d, insn.word(5));
+ Decorations d = GetDecorationsForId(insn.word(5));
auto ptr = state->getPointer(insn.word(5));
for(auto i = 0u; i < type.componentCount; i++)
{
diff --git a/src/Pipeline/SpirvShaderMemory.cpp b/src/Pipeline/SpirvShaderMemory.cpp
index 05cb42a..a08f12e 100644
--- a/src/Pipeline/SpirvShaderMemory.cpp
+++ b/src/Pipeline/SpirvShaderMemory.cpp
@@ -362,8 +362,7 @@
if(IsExplicitLayout(type.storageClass))
{
- Decorations d{};
- ApplyDecorationsForId(&d, id);
+ Decorations d = GetDecorationsForId(id);
uint32_t index = 0;
VisitMemoryObjectInner(typeId, d, index, 0, f);
}