void TOutputVulkanGLSL::writeQualifier(TQualifier qualifier, const TType &type, const TSymbol *symbol) { if (qualifier != EvqUniform && qualifier != EvqAttribute && qualifier != EvqVertexIn && !sh::IsVarying(qualifier)) { TOutputGLSLBase::writeQualifier(qualifier, type, symbol); return; } if (symbol == nullptr) { return; } ImmutableString name = symbol->name(); // For interface blocks, use the block name instead. When the qualifier is being replaced in // the backend, that would be the name that's available. if (type.isInterfaceBlock()) { name = type.getInterfaceBlock()->name(); } TInfoSinkBase &out = objSink(); out << "@@ QUALIFIER-" << name.data() << " @@ "; }
void TOutputGLSLBase::writeVariableType(const TType &type) { TInfoSinkBase &out = objSink(); if (type.isInvariant()) { out << "invariant "; } if (type.getBasicType() == EbtInterfaceBlock) { TInterfaceBlock *interfaceBlock = type.getInterfaceBlock(); declareInterfaceBlockLayout(interfaceBlock); } 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 (type.getBasicType() == EbtInterfaceBlock) { TInterfaceBlock *interfaceBlock = type.getInterfaceBlock(); declareInterfaceBlock(interfaceBlock); } else { if (writeVariablePrecision(type.getPrecision())) out << " "; out << getTypeName(type); } }