void TOutputGLSLBase::writeVariableType(const TType &type) { TInfoSinkBase &out = objSink(); TQualifier qualifier = type.getQualifier(); if (qualifier != EvqTemporary && qualifier != EvqGlobal) { out << type.getQualifierString() << " "; } // Declare the struct if we have not done so already. if (type.getBasicType() == EbtStruct && !structDeclared(type.getStruct())) { TStructure *structure = type.getStruct(); declareStruct(structure); if (!structure->name().empty()) { mDeclaredStructs.insert(structure->uniqueId()); } } else { if (writeVariablePrecision(type.getPrecision())) out << " "; out << getTypeName(type); } }
TString StructNameString(const TStructure &structure) { if (structure.name().empty()) { return ""; } return "ss" + str(structure.uniqueId()) + "_" + structure.name(); }
void TOutputGLSLBase::writeVariableType(const TType &type) { TInfoSinkBase &out = objSink(); if (type.isInvariant()) { out << "invariant "; } TQualifier qualifier = type.getQualifier(); if (qualifier != EvqTemporary && qualifier != EvqGlobal) { if (IsGLSL130OrNewer(mOutput)) { switch (qualifier) { case EvqAttribute: out << "in "; break; case EvqVaryingIn: out << "in "; break; case EvqVaryingOut: out << "out "; break; default: out << type.getQualifierString() << " "; break; } } else { out << type.getQualifierString() << " "; } } // Declare the struct if we have not done so already. if (type.getBasicType() == EbtStruct && !structDeclared(type.getStruct())) { TStructure *structure = type.getStruct(); declareStruct(structure); if (!structure->name().empty()) { mDeclaredStructs.insert(structure->uniqueId()); } } else { if (writeVariablePrecision(type.getPrecision())) out << " "; out << getTypeName(type); } }
void RegenerateStructNames::visitSymbol(TIntermSymbol *symbol) { ASSERT(symbol); TType *type = symbol->getTypePointer(); ASSERT(type); TStructure *userType = type->getStruct(); if (!userType) return; if (mSymbolTable.findBuiltIn(userType->name(), mShaderVersion)) { // Built-in struct, do not touch it. return; } int uniqueId = userType->uniqueId(); ASSERT(mScopeDepth > 0); if (mScopeDepth == 1) { // If a struct is defined at global scope, we don't map its name. // This is because at global level, the struct might be used to // declare a uniform, so the same name needs to stay the same for // vertex/fragment shaders. However, our mapping uses internal ID, // which will be different for the same struct in vertex/fragment // shaders. // This is OK because names for any structs defined in other scopes // will begin with "_webgl", which is reserved. So there will be // no conflicts among unmapped struct names from global scope and // mapped struct names from other scopes. // However, we need to keep track of these global structs, so if a // variable is used in a local scope, we don't try to modify the // struct name through that variable. mDeclaredGlobalStructs.insert(uniqueId); return; } if (mDeclaredGlobalStructs.count(uniqueId) > 0) return; // Map {name} to _webgl_struct_{uniqueId}_{name}. const char kPrefix[] = "_webgl_struct_"; if (userType->name().find(kPrefix) == 0) { // The name has already been regenerated. return; } std::string id = Str(uniqueId); TString tmp = kPrefix + TString(id.c_str()); tmp += "_" + userType->name(); userType->setName(tmp); }
TString StructNameString(const TStructure &structure) { if (structure.symbolType() == SymbolType::Empty) { return ""; } // For structures at global scope we use a consistent // translation so that we can link between shader stages. if (structure.atGlobalScope()) { return Decorate(structure.name()); } return "ss" + str(structure.uniqueId().get()) + "_" + TString(structure.name().data()); }
bool TStructure::equals(const TStructure &other) const { return (uniqueId() == other.uniqueId()); }