@@ -358,10 +358,9 @@ class TGlslangToSpvTraverser : public glslang::TIntermTraverser {
358358 // rather than a pointer
359359 std::unordered_map<std::string, spv::Function*> functionMap;
360360 std::unordered_map<const glslang::TTypeList*, spv::Id> structMap[glslang::ElpCount][glslang::ElmCount];
361- // for mapping glslang block indices to spv indices (e.g., due to hidden members):
362- std::unordered_map<long long, std::vector<int>> memberRemapper;
363- // for mapping glslang symbol struct to symbol Id
364- std::unordered_map<const glslang::TTypeList*, long long> glslangTypeToIdMap;
361+ // for mapping glslang block indices to spv indices (e.g., due to hidden members),
362+ // keyed by the block's member list so distinct block types never share a slot:
363+ std::unordered_map<const glslang::TTypeList*, std::vector<int>> memberRemapper;
365364 std::stack<bool> breakForLoop; // false means break for switch
366365 std::unordered_map<std::string, const glslang::TIntermSymbol*> counterOriginator;
367366 // Map pointee types for EbtReference to their forward pointers
@@ -2337,8 +2336,6 @@ void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol)
23372336 }
23382337
23392338 SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);
2340- if (symbol->getType().isStruct())
2341- glslangTypeToIdMap[symbol->getType().getStruct()] = symbol->getId();
23422339
23432340 if (symbol->getType().getQualifier().isSpecConstant())
23442341 spec_constant_op_mode_setter.turnOnSpecConstantOpMode();
@@ -2544,12 +2541,6 @@ void TGlslangToSpvTraverser::recordDescHeapAccessChainInfo(glslang::TIntermBinar
25442541bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::TIntermBinary* node)
25452542{
25462543 builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename());
2547- if (node->getLeft()->getAsSymbolNode() != nullptr && node->getLeft()->getType().isStruct()) {
2548- glslangTypeToIdMap[node->getLeft()->getType().getStruct()] = node->getLeft()->getAsSymbolNode()->getId();
2549- }
2550- if (node->getRight()->getAsSymbolNode() != nullptr && node->getRight()->getType().isStruct()) {
2551- glslangTypeToIdMap[node->getRight()->getType().getStruct()] = node->getRight()->getAsSymbolNode()->getId();
2552- }
25532544
25542545 SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder);
25552546 if (node->getType().getQualifier().isSpecConstant())
@@ -2663,9 +2654,9 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T
26632654 {
26642655 // This may be, e.g., an anonymous block-member selection, which generally need
26652656 // index remapping due to hidden members in anonymous blocks.
2666- long long glslangId = glslangTypeToIdMap[ node->getLeft()->getType().getStruct()] ;
2667- if (memberRemapper.find(glslangId ) != memberRemapper.end()) {
2668- std::vector<int>& remapper = memberRemapper[glslangId ];
2657+ const glslang::TTypeList* glslangMembers = node->getLeft()->getType().getStruct();
2658+ if (memberRemapper.find(glslangMembers ) != memberRemapper.end()) {
2659+ std::vector<int>& remapper = memberRemapper[glslangMembers ];
26692660 assert(remapper.size() > 0);
26702661 spvIndex = remapper[glslangIndex];
26712662 }
@@ -5939,7 +5930,7 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty
59395930
59405931 // else, we haven't seen it...
59415932 if (type.getBasicType() == glslang::EbtBlock)
5942- memberRemapper[glslangTypeToIdMap[ glslangMembers] ].resize(glslangMembers->size());
5933+ memberRemapper[glslangMembers].resize(glslangMembers->size());
59435934 spvType = convertGlslangStructToSpvType(type, glslangMembers, explicitLayout, qualifier);
59445935 }
59455936 break;
@@ -6353,15 +6344,15 @@ spv::Id TGlslangToSpvTraverser::convertGlslangStructToSpvType(const glslang::TTy
63536344 if (glslangMember.type->hiddenMember()) {
63546345 ++memberDelta;
63556346 if (type.getBasicType() == glslang::EbtBlock)
6356- memberRemapper[glslangTypeToIdMap[ glslangMembers] ][i] = -1;
6347+ memberRemapper[glslangMembers][i] = -1;
63576348 } else {
63586349 if (type.getBasicType() == glslang::EbtBlock) {
63596350 if (filterMember(*glslangMember.type)) {
63606351 memberDelta++;
6361- memberRemapper[glslangTypeToIdMap[ glslangMembers] ][i] = -1;
6352+ memberRemapper[glslangMembers][i] = -1;
63626353 continue;
63636354 }
6364- memberRemapper[glslangTypeToIdMap[ glslangMembers] ][i] = i - memberDelta;
6355+ memberRemapper[glslangMembers][i] = i - memberDelta;
63656356 }
63666357 // modify just this child's view of the qualifier
63676358 glslang::TQualifier memberQualifier = glslangMember.type->getQualifier();
@@ -6892,7 +6883,7 @@ void TGlslangToSpvTraverser::decorateStructType(const glslang::TType& type,
68926883 glslang::TType& glslangMember = *(*glslangMembers)[i].type;
68936884 int member = i;
68946885 if (type.getBasicType() == glslang::EbtBlock) {
6895- member = memberRemapper[glslangTypeToIdMap[ glslangMembers] ][i];
6886+ member = memberRemapper[glslangMembers][i];
68966887 if (filterMember(glslangMember))
68976888 continue;
68986889 }
0 commit comments