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);
 	}