Commit aed1b56a by Jamie Madill Committed by Commit Bot

Prerequisite code for simpler GlslangWrapper.

This makes two changes for the linking step: * allows symbol names in TOutputGLSLBase::writeVariableType * stores a list of inactive varying names in VaryingPacking Bug: angleproject:2456 Change-Id: Id651721a008c049508303d18c45c6b96c76114d9 Reviewed-on: https://chromium-review.googlesource.com/1014707Reviewed-by: 's avatarLuc Ferron <lucferron@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 1d882aaa
......@@ -214,7 +214,7 @@ void TOutputGLSLBase::writeLayoutQualifier(TIntermTyped *variable)
out << ") ";
}
const char *TOutputGLSLBase::mapQualifierToString(TQualifier qualifier)
const char *TOutputGLSLBase::mapQualifierToString(TQualifier qualifier, const TSymbol *symbol)
{
if (sh::IsGLSL410OrOlder(mOutput) && mShaderVersion >= 300 &&
(mCompileOptions & SH_REMOVE_INVARIANT_AND_CENTROID_FOR_ESSL3) != 0)
......@@ -250,7 +250,7 @@ const char *TOutputGLSLBase::mapQualifierToString(TQualifier qualifier)
return sh::getQualifierString(qualifier);
}
void TOutputGLSLBase::writeVariableType(const TType &type)
void TOutputGLSLBase::writeVariableType(const TType &type, const TSymbol *symbol)
{
TQualifier qualifier = type.getQualifier();
TInfoSinkBase &out = objSink();
......@@ -265,7 +265,7 @@ void TOutputGLSLBase::writeVariableType(const TType &type)
}
if (qualifier != EvqTemporary && qualifier != EvqGlobal)
{
const char *qualifierString = mapQualifierToString(qualifier);
const char *qualifierString = mapQualifierToString(qualifier, symbol);
if (qualifierString && qualifierString[0] != '\0')
{
out << qualifierString << " ";
......@@ -336,7 +336,7 @@ void TOutputGLSLBase::writeFunctionParameters(const TFunction *func)
{
const TVariable *param = func->getParam(i);
const TType &type = param->getType();
writeVariableType(type);
writeVariableType(type, param);
if (param->symbolType() != SymbolType::Empty)
out << " " << hashName(param);
......@@ -894,7 +894,7 @@ void TOutputGLSLBase::visitFunctionPrototype(TIntermFunctionPrototype *node)
TInfoSinkBase &out = objSink();
const TType &type = node->getType();
writeVariableType(type);
writeVariableType(type, node->getFunction());
if (type.isArray())
out << ArrayString(type);
......@@ -995,7 +995,7 @@ bool TOutputGLSLBase::visitDeclaration(Visit visit, TIntermDeclaration *node)
const TIntermSequence &sequence = *(node->getSequence());
TIntermTyped *variable = sequence.front()->getAsTyped();
writeLayoutQualifier(variable);
writeVariableType(variable->getType());
writeVariableType(variable->getType(), &variable->getAsSymbolNode()->variable());
if (variable->getAsSymbolNode() == nullptr ||
variable->getAsSymbolNode()->variable().symbolType() != SymbolType::Empty)
{
......
......@@ -42,7 +42,7 @@ class TOutputGLSLBase : public TIntermTraverser
void writeTriplet(Visit visit, const char *preStr, const char *inStr, const char *postStr);
virtual void writeLayoutQualifier(TIntermTyped *variable);
void writeInvariantQualifier(const TType &type);
void writeVariableType(const TType &type);
void writeVariableType(const TType &type, const TSymbol *symbol);
virtual bool writeVariablePrecision(TPrecision precision) = 0;
void writeFunctionParameters(const TFunction *func);
const TConstantUnion *writeConstantUnion(const TType &type, const TConstantUnion *pConstUnion);
......@@ -86,7 +86,7 @@ class TOutputGLSLBase : public TIntermTraverser
void writeBuiltInFunctionTriplet(Visit visit, TOperator op, bool useEmulatedFunction);
const char *mapQualifierToString(TQualifier qialifier);
const char *mapQualifierToString(TQualifier qualifier, const TSymbol *symbol);
TInfoSinkBase &mObjSink;
bool mDeclaringVariable;
......
......@@ -332,12 +332,14 @@ bool VaryingPacking::collectAndPackUserVaryings(gl::InfoLog &infoLog,
}
}
// Keep Transform FB varyings in the merged list always.
// If the varying is not used in the VS, we know it is inactive.
if (!input)
{
mInactiveVaryingNames.push_back(ref.first);
continue;
}
// Keep Transform FB varyings in the merged list always.
for (const std::string &tfVarying : tfVaryings)
{
std::vector<unsigned int> subscripts;
......@@ -384,6 +386,11 @@ bool VaryingPacking::collectAndPackUserVaryings(gl::InfoLog &infoLog,
}
}
}
if (uniqueFullNames.count(ref.first) == 0)
{
mInactiveVaryingNames.push_back(ref.first);
}
}
std::sort(mPackedVaryings.begin(), mPackedVaryings.end(), ComparePackedVarying);
......@@ -429,4 +436,8 @@ bool VaryingPacking::packUserVaryings(gl::InfoLog &infoLog,
return true;
}
const std::vector<std::string> &VaryingPacking::getInactiveVaryingNames() const
{
return mInactiveVaryingNames;
}
} // namespace rx
......@@ -179,6 +179,8 @@ class VaryingPacking final : angle::NonCopyable
return static_cast<unsigned int>(mRegisterList.size());
}
const std::vector<std::string> &getInactiveVaryingNames() const;
private:
bool packVarying(const PackedVarying &packedVarying);
bool isFree(unsigned int registerRow,
......@@ -192,6 +194,7 @@ class VaryingPacking final : angle::NonCopyable
std::vector<Register> mRegisterMap;
std::vector<PackedVaryingRegister> mRegisterList;
std::vector<PackedVarying> mPackedVaryings;
std::vector<std::string> mInactiveVaryingNames;
PackMode mPackMode;
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment