Split out decoration application helpers to avoid some iterator noise
Bug: b/124388146
Change-Id: I17531e47fc6fc4b296f893f94beb75f471847fd3
Reviewed-on: https://swiftshader-review.googlesource.com/c/24789
Reviewed-by: Ben Clayton <bclayton@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Chris Forbes <chrisforbes@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index f4cad7d..ba86f30 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -416,11 +416,7 @@
// This covers the rules in Vulkan 1.1 spec, 14.1.4 Location Assignment.
- auto const it = decorations.find(id);
- if (it != decorations.end())
- {
- d.Apply(it->second);
- }
+ ApplyDecorationsForId(&d, id);
auto const &obj = getType(id);
switch (obj.definition.opcode())
@@ -452,15 +448,10 @@
return d.Location + 1;
case spv::OpTypeStruct:
{
- auto const memberDecorationsIt = memberDecorations.find(id);
// iterate over members, which may themselves have Location/Component decorations
for (auto i = 0u; i < obj.definition.wordCount() - 2; i++)
{
- // Apply any member decorations for this member to the carried state.
- if (memberDecorationsIt != memberDecorations.end() && i < memberDecorationsIt->second.size())
- {
- d.Apply(memberDecorationsIt->second[i]);
- }
+ ApplyDecorationsForIdMember(&d, id, i);
d.Location = PopulateInterfaceInner(iface, obj.definition.word(i + 2), d);
d.Component = 0; // Implicit locations always have component=0
}
@@ -485,12 +476,7 @@
{
// Walk a variable definition and populate the interface from it.
Decorations d{};
-
- auto const it = decorations.find(id);
- if (it != decorations.end())
- {
- d.Apply(it->second);
- }
+ ApplyDecorationsForId(&d, id);
auto def = getObject(id).definition;
assert(def.opcode() == spv::OpVariable);
@@ -562,6 +548,22 @@
BufferBlock |= src.BufferBlock;
}
+ void SpirvShader::ApplyDecorationsForId(Decorations *d, uint32_t id) const
+ {
+ auto it = decorations.find(id);
+ if (it != decorations.end())
+ d->Apply(it->second);
+ }
+
+ void SpirvShader::ApplyDecorationsForIdMember(Decorations *d, uint32_t id, uint32_t member) const
+ {
+ auto it = memberDecorations.find(id);
+ if (it != memberDecorations.end() && member < it->second.size())
+ {
+ d->Apply(it->second[member]);
+ }
+ }
+
uint32_t SpirvShader::GetConstantInt(uint32_t id)
{
// Slightly hackish access to constants very early in translation.
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index 7c3f4f8..e3b9dc2 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -257,6 +257,8 @@
void ProcessExecutionMode(InsnIterator it);
uint32_t ComputeTypeSize(InsnIterator insn);
+ void ApplyDecorationsForId(Decorations *d, uint32_t id) const;
+ void ApplyDecorationsForIdMember(Decorations *d, uint32_t id, uint32_t member) const;
void PopulateInterfaceSlot(std::vector<InterfaceComponent> *iface, Decorations const &d, AttribType type);