@@ -851,6 +851,17 @@ SpirvVariable *SpirvBuilder::addStageBuiltinVar(const SpirvType *type,
851
851
spv::StorageClass storageClass,
852
852
spv::BuiltIn builtin,
853
853
SourceLocation loc) {
854
+ // If the built-in variable has already been added (via a built-in alias),
855
+ // return the existing variable.
856
+ auto found = std::find_if (
857
+ builtinVars.begin (), builtinVars.end (),
858
+ [storageClass, builtin](const BuiltInVarInfo &varInfo) {
859
+ return varInfo.sc == storageClass && varInfo.builtIn == builtin;
860
+ });
861
+ if (found != builtinVars.end ()) {
862
+ return found->variable ;
863
+ }
864
+
854
865
// Note: We store the underlying type in the variable, *not* the pointer type.
855
866
auto *var =
856
867
new (context) SpirvVariable (/* QualType*/ {}, /* id*/ 0 , loc, storageClass);
@@ -862,13 +873,27 @@ SpirvVariable *SpirvBuilder::addStageBuiltinVar(const SpirvType *type,
862
873
loc, var, spv::Decoration::BuiltIn, {static_cast <uint32_t >(builtin)});
863
874
module->addDecoration (decor);
864
875
876
+ // Add variable to cache.
877
+ builtinVars.emplace_back (storageClass, builtin, var);
878
+
865
879
return var;
866
880
}
867
881
868
882
SpirvVariable *SpirvBuilder::addStageBuiltinVar (QualType type,
869
883
spv::StorageClass storageClass,
870
884
spv::BuiltIn builtin,
871
885
SourceLocation loc) {
886
+ // If the built-in variable has already been added (via a built-in alias),
887
+ // return the existing variable.
888
+ auto found = std::find_if (
889
+ builtinVars.begin (), builtinVars.end (),
890
+ [storageClass, builtin](const BuiltInVarInfo &varInfo) {
891
+ return varInfo.sc == storageClass && varInfo.builtIn == builtin;
892
+ });
893
+ if (found != builtinVars.end ()) {
894
+ return found->variable ;
895
+ }
896
+
872
897
// Note: We store the underlying type in the variable, *not* the pointer type.
873
898
auto *var = new (context) SpirvVariable (type, /* id*/ 0 , loc, storageClass);
874
899
module->addVariable (var);
@@ -878,6 +903,9 @@ SpirvVariable *SpirvBuilder::addStageBuiltinVar(QualType type,
878
903
loc, var, spv::Decoration::BuiltIn, {static_cast <uint32_t >(builtin)});
879
904
module->addDecoration (decor);
880
905
906
+ // Add variable to cache.
907
+ builtinVars.emplace_back (storageClass, builtin, var);
908
+
881
909
return var;
882
910
}
883
911
0 commit comments