Fix #2227, which was coded incorrectly, to be simpler/safer.
diff --git a/glslang/MachineIndependent/iomapper.cpp b/glslang/MachineIndependent/iomapper.cpp
index 921a5eb..4e409e0 100644
--- a/glslang/MachineIndependent/iomapper.cpp
+++ b/glslang/MachineIndependent/iomapper.cpp
@@ -579,7 +579,7 @@
int TDefaultGlslIoResolver::resolveInOutLocation(EShLanguage stage, TVarEntryInfo& ent) {
const TType& type = ent.symbol->getType();
- TString& name = getAccessName(ent.symbol);
+ const TString& name = getAccessName(ent.symbol);
if (currentStage != stage) {
preStage = currentStage;
currentStage = stage;
@@ -627,7 +627,7 @@
TVarSlotMap::iterator iter = storageSlotMap[resourceKey].find(name);
if (iter != storageSlotMap[resourceKey].end()) {
// If interface resource be found, set it has location and this symbol's new location
- // equal the symbol's explicit location declarated in pre or next stage.
+ // equal the symbol's explicit location declaration in pre or next stage.
//
// vs: out vec4 a;
// fs: layout(..., location = 3,...) in vec4 a;
@@ -663,7 +663,7 @@
int TDefaultGlslIoResolver::resolveUniformLocation(EShLanguage /*stage*/, TVarEntryInfo& ent) {
const TType& type = ent.symbol->getType();
- TString& name = getAccessName(ent.symbol);
+ const TString& name = getAccessName(ent.symbol);
// kick out of not doing this
if (! doAutoLocationMapping()) {
return ent.newLocation = -1;
@@ -706,7 +706,7 @@
TVarSlotMap::iterator iter = slotMap.find(name);
if (iter != slotMap.end()) {
// If uniform resource be found, set it has location and this symbol's new location
- // equal the uniform's explicit location declarated in other stage.
+ // equal the uniform's explicit location declaration in other stage.
//
// vs: uniform vec4 a;
// fs: layout(..., location = 3,...) uniform vec4 a;
@@ -714,7 +714,7 @@
location = iter->second;
}
if (! hasLocation) {
- // No explicit location declaraten in other stage.
+ // No explicit location declaration in other stage.
// So we should find a new slot for this uniform.
//
// vs: uniform vec4 a;
@@ -723,7 +723,7 @@
storageSlotMap[resourceKey][name] = location;
}
} else {
- // the first uniform declarated in a program.
+ // the first uniform declaration in a program.
TVarSlotMap varSlotMap;
location = getFreeSlot(resourceKey, 0, size);
varSlotMap[name] = location;
@@ -734,8 +734,8 @@
int TDefaultGlslIoResolver::resolveBinding(EShLanguage /*stage*/, TVarEntryInfo& ent) {
const TType& type = ent.symbol->getType();
- TString& name = getAccessName(ent.symbol);
- // On OpenGL arrays of opaque types take a seperate binding for each element
+ const TString& name = getAccessName(ent.symbol);
+ // On OpenGL arrays of opaque types take a separate binding for each element
int numBindings = intermediate.getSpv().openGl != 0 && type.isSizedArray() ? type.getCumulativeArraySize() : 1;
TResourceType resource = getResourceType(type);
// don't need to handle uniform symbol, it will be handled in resolveUniformLocation
@@ -809,7 +809,7 @@
void TDefaultGlslIoResolver::reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) {
const TType& type = ent.symbol->getType();
- TString& name = getAccessName(ent.symbol);
+ const TString& name = getAccessName(ent.symbol);
TStorageQualifier storage = type.getQualifier().storage;
EShLanguage stage(EShLangCount);
switch (storage) {
@@ -869,7 +869,7 @@
void TDefaultGlslIoResolver::reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) {
const TType& type = ent.symbol->getType();
- TString& name = getAccessName(ent.symbol);
+ const TString& name = getAccessName(ent.symbol);
int resource = getResourceType(type);
if (type.getQualifier().hasBinding()) {
TVarSlotMap& varSlotMap = resourceSlotMap[resource];
@@ -892,15 +892,11 @@
}
}
-TString& TDefaultGlslIoResolver::getAccessName(const TIntermSymbol* symbol)
+const TString& TDefaultGlslIoResolver::getAccessName(const TIntermSymbol* symbol)
{
- TString name;
- if (symbol->getBasicType() == EbtBlock) {
- name = symbol->getType().getTypeName();
- } else {
- name = symbol->getName();
- }
- return name;
+ return symbol->getBasicType() == EbtBlock ?
+ symbol->getType().getTypeName() :
+ symbol->getName();
}
//TDefaultGlslIoResolver end
diff --git a/glslang/MachineIndependent/iomapper.h b/glslang/MachineIndependent/iomapper.h
index d8aeddb..7ca18b8 100644
--- a/glslang/MachineIndependent/iomapper.h
+++ b/glslang/MachineIndependent/iomapper.h
@@ -203,7 +203,7 @@
void endCollect(EShLanguage) override;
void reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
void reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
- TString& getAccessName(const TIntermSymbol*);
+ const TString& getAccessName(const TIntermSymbol*);
// in/out symbol and uniform symbol are stored in the same resourceSlotMap, the storage key is used to identify each type of symbol.
// We use stage and storage qualifier to construct a storage key. it can help us identify the same storage resource used in different stage.
// if a resource is a program resource and we don't need know it usage stage, we can use same stage to build storage key.