Commit 822a84b1 by Olli Etuaho Committed by Commit Bot

Get builtin symbol info from the node in CollectVariables

Since we now have a TVariable pointer in TIntermSymbol, we don't need to look up variables from the symbol table. BUG=angleproject:2267 TEST=angle_unittests Change-Id: Id09610ccec5898eb56dcc5e9112e173edcf7ac97 Reviewed-on: https://chromium-review.googlesource.com/977828Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
parent 26ed93d7
...@@ -116,7 +116,6 @@ class CollectVariablesTraverser : public TIntermTraverser ...@@ -116,7 +116,6 @@ class CollectVariablesTraverser : public TIntermTraverser
std::vector<InterfaceBlock> *inBlocks, std::vector<InterfaceBlock> *inBlocks,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
TSymbolTable *symbolTable, TSymbolTable *symbolTable,
int shaderVersion,
GLenum shaderType, GLenum shaderType,
const TExtensionBehavior &extensionBehavior); const TExtensionBehavior &extensionBehavior);
...@@ -143,13 +142,13 @@ class CollectVariablesTraverser : public TIntermTraverser ...@@ -143,13 +142,13 @@ class CollectVariablesTraverser : public TIntermTraverser
InterfaceBlock *interfaceBlock) const; InterfaceBlock *interfaceBlock) const;
Uniform recordUniform(const TIntermSymbol &variable) const; Uniform recordUniform(const TIntermSymbol &variable) const;
void setBuiltInInfoFromSymbolTable(const ImmutableString &name, ShaderVariable *info); void setBuiltInInfoFromSymbol(const TVariable &variable, ShaderVariable *info);
void recordBuiltInVaryingUsed(const ImmutableString &name, void recordBuiltInVaryingUsed(const TVariable &variable,
bool *addedFlag, bool *addedFlag,
std::vector<Varying> *varyings); std::vector<Varying> *varyings);
void recordBuiltInFragmentOutputUsed(const ImmutableString &name, bool *addedFlag); void recordBuiltInFragmentOutputUsed(const TVariable &variable, bool *addedFlag);
void recordBuiltInAttributeUsed(const ImmutableString &name, bool *addedFlag); void recordBuiltInAttributeUsed(const TVariable &variable, bool *addedFlag);
InterfaceBlock *recordGLInUsed(const TType &glInType); InterfaceBlock *recordGLInUsed(const TType &glInType);
InterfaceBlock *findNamedInterfaceBlock(const ImmutableString &name) const; InterfaceBlock *findNamedInterfaceBlock(const ImmutableString &name) const;
...@@ -198,7 +197,6 @@ class CollectVariablesTraverser : public TIntermTraverser ...@@ -198,7 +197,6 @@ class CollectVariablesTraverser : public TIntermTraverser
ShHashFunction64 mHashFunction; ShHashFunction64 mHashFunction;
int mShaderVersion;
GLenum mShaderType; GLenum mShaderType;
const TExtensionBehavior &mExtensionBehavior; const TExtensionBehavior &mExtensionBehavior;
}; };
...@@ -214,7 +212,6 @@ CollectVariablesTraverser::CollectVariablesTraverser( ...@@ -214,7 +212,6 @@ CollectVariablesTraverser::CollectVariablesTraverser(
std::vector<sh::InterfaceBlock> *inBlocks, std::vector<sh::InterfaceBlock> *inBlocks,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
TSymbolTable *symbolTable, TSymbolTable *symbolTable,
int shaderVersion,
GLenum shaderType, GLenum shaderType,
const TExtensionBehavior &extensionBehavior) const TExtensionBehavior &extensionBehavior)
: TIntermTraverser(true, false, false, symbolTable), : TIntermTraverser(true, false, false, symbolTable),
...@@ -247,7 +244,6 @@ CollectVariablesTraverser::CollectVariablesTraverser( ...@@ -247,7 +244,6 @@ CollectVariablesTraverser::CollectVariablesTraverser(
mPrimitiveIDAdded(false), mPrimitiveIDAdded(false),
mLayerAdded(false), mLayerAdded(false),
mHashFunction(hashFunction), mHashFunction(hashFunction),
mShaderVersion(shaderVersion),
mShaderType(shaderType), mShaderType(shaderType),
mExtensionBehavior(extensionBehavior) mExtensionBehavior(extensionBehavior)
{ {
...@@ -258,16 +254,13 @@ std::string CollectVariablesTraverser::getMappedName(const TSymbol *symbol) cons ...@@ -258,16 +254,13 @@ std::string CollectVariablesTraverser::getMappedName(const TSymbol *symbol) cons
return HashName(symbol, mHashFunction, nullptr).data(); return HashName(symbol, mHashFunction, nullptr).data();
} }
void CollectVariablesTraverser::setBuiltInInfoFromSymbolTable(const ImmutableString &name, void CollectVariablesTraverser::setBuiltInInfoFromSymbol(const TVariable &variable,
ShaderVariable *info) ShaderVariable *info)
{ {
const TVariable *symbolTableVar = const TType &type = variable.getType();
reinterpret_cast<const TVariable *>(mSymbolTable->findBuiltIn(name, mShaderVersion));
ASSERT(symbolTableVar);
const TType &type = symbolTableVar->getType();
info->name = name.data(); info->name = variable.name().data();
info->mappedName = name.data(); info->mappedName = variable.name().data();
info->type = GLVariableType(type); info->type = GLVariableType(type);
info->precision = GLVariablePrecision(type); info->precision = GLVariablePrecision(type);
if (auto *arraySizes = type.getArraySizes()) if (auto *arraySizes = type.getArraySizes())
...@@ -276,7 +269,7 @@ void CollectVariablesTraverser::setBuiltInInfoFromSymbolTable(const ImmutableStr ...@@ -276,7 +269,7 @@ void CollectVariablesTraverser::setBuiltInInfoFromSymbolTable(const ImmutableStr
} }
} }
void CollectVariablesTraverser::recordBuiltInVaryingUsed(const ImmutableString &name, void CollectVariablesTraverser::recordBuiltInVaryingUsed(const TVariable &variable,
bool *addedFlag, bool *addedFlag,
std::vector<Varying> *varyings) std::vector<Varying> *varyings)
{ {
...@@ -284,22 +277,22 @@ void CollectVariablesTraverser::recordBuiltInVaryingUsed(const ImmutableString & ...@@ -284,22 +277,22 @@ void CollectVariablesTraverser::recordBuiltInVaryingUsed(const ImmutableString &
if (!(*addedFlag)) if (!(*addedFlag))
{ {
Varying info; Varying info;
setBuiltInInfoFromSymbolTable(name, &info); setBuiltInInfoFromSymbol(variable, &info);
info.staticUse = true; info.staticUse = true;
info.active = true; info.active = true;
info.isInvariant = mSymbolTable->isVaryingInvariant(name); info.isInvariant = mSymbolTable->isVaryingInvariant(variable.name());
varyings->push_back(info); varyings->push_back(info);
(*addedFlag) = true; (*addedFlag) = true;
} }
} }
void CollectVariablesTraverser::recordBuiltInFragmentOutputUsed(const ImmutableString &name, void CollectVariablesTraverser::recordBuiltInFragmentOutputUsed(const TVariable &variable,
bool *addedFlag) bool *addedFlag)
{ {
if (!(*addedFlag)) if (!(*addedFlag))
{ {
OutputVariable info; OutputVariable info;
setBuiltInInfoFromSymbolTable(name, &info); setBuiltInInfoFromSymbol(variable, &info);
info.staticUse = true; info.staticUse = true;
info.active = true; info.active = true;
mOutputVariables->push_back(info); mOutputVariables->push_back(info);
...@@ -307,13 +300,13 @@ void CollectVariablesTraverser::recordBuiltInFragmentOutputUsed(const ImmutableS ...@@ -307,13 +300,13 @@ void CollectVariablesTraverser::recordBuiltInFragmentOutputUsed(const ImmutableS
} }
} }
void CollectVariablesTraverser::recordBuiltInAttributeUsed(const ImmutableString &name, void CollectVariablesTraverser::recordBuiltInAttributeUsed(const TVariable &variable,
bool *addedFlag) bool *addedFlag)
{ {
if (!(*addedFlag)) if (!(*addedFlag))
{ {
Attribute info; Attribute info;
setBuiltInInfoFromSymbolTable(name, &info); setBuiltInInfoFromSymbol(variable, &info);
info.staticUse = true; info.staticUse = true;
info.active = true; info.active = true;
info.location = -1; info.location = -1;
...@@ -460,61 +453,41 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol) ...@@ -460,61 +453,41 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol)
} }
break; break;
case EvqFragCoord: case EvqFragCoord:
recordBuiltInVaryingUsed(ImmutableString("gl_FragCoord"), &mFragCoordAdded, recordBuiltInVaryingUsed(symbol->variable(), &mFragCoordAdded, mInputVaryings);
mInputVaryings);
return; return;
case EvqFrontFacing: case EvqFrontFacing:
recordBuiltInVaryingUsed(ImmutableString("gl_FrontFacing"), &mFrontFacingAdded, recordBuiltInVaryingUsed(symbol->variable(), &mFrontFacingAdded, mInputVaryings);
mInputVaryings);
return; return;
case EvqPointCoord: case EvqPointCoord:
recordBuiltInVaryingUsed(ImmutableString("gl_PointCoord"), &mPointCoordAdded, recordBuiltInVaryingUsed(symbol->variable(), &mPointCoordAdded, mInputVaryings);
mInputVaryings);
return; return;
case EvqInstanceID: case EvqInstanceID:
// Whenever the SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW option is set, // Whenever the SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW option is set,
// gl_InstanceID is added inside expressions to initialize ViewID_OVR and // gl_InstanceID is added inside expressions to initialize ViewID_OVR and
// InstanceID. gl_InstanceID is not added to the symbol table for ESSL1 shaders // InstanceID. Note that gl_InstanceID is not added to the symbol table for ESSL1
// which makes it necessary to populate the type information explicitly instead of // shaders.
// extracting it from the symbol table. recordBuiltInAttributeUsed(symbol->variable(), &mInstanceIDAdded);
if (!mInstanceIDAdded)
{
Attribute info;
const char kName[] = "gl_InstanceID";
info.name = kName;
info.mappedName = kName;
info.type = GL_INT;
info.precision = GL_HIGH_INT; // Defined by spec.
info.staticUse = true;
info.active = true;
info.location = -1;
mAttribs->push_back(info);
mInstanceIDAdded = true;
}
return; return;
case EvqVertexID: case EvqVertexID:
recordBuiltInAttributeUsed(ImmutableString("gl_VertexID"), &mVertexIDAdded); recordBuiltInAttributeUsed(symbol->variable(), &mVertexIDAdded);
return; return;
case EvqPosition: case EvqPosition:
recordBuiltInVaryingUsed(ImmutableString("gl_Position"), &mPositionAdded, recordBuiltInVaryingUsed(symbol->variable(), &mPositionAdded, mOutputVaryings);
mOutputVaryings);
return; return;
case EvqPointSize: case EvqPointSize:
recordBuiltInVaryingUsed(ImmutableString("gl_PointSize"), &mPointSizeAdded, recordBuiltInVaryingUsed(symbol->variable(), &mPointSizeAdded, mOutputVaryings);
mOutputVaryings);
return; return;
case EvqLastFragData: case EvqLastFragData:
recordBuiltInVaryingUsed(ImmutableString("gl_LastFragData"), &mLastFragDataAdded, recordBuiltInVaryingUsed(symbol->variable(), &mLastFragDataAdded, mInputVaryings);
mInputVaryings);
return; return;
case EvqFragColor: case EvqFragColor:
recordBuiltInFragmentOutputUsed(ImmutableString("gl_FragColor"), &mFragColorAdded); recordBuiltInFragmentOutputUsed(symbol->variable(), &mFragColorAdded);
return; return;
case EvqFragData: case EvqFragData:
if (!mFragDataAdded) if (!mFragDataAdded)
{ {
OutputVariable info; OutputVariable info;
setBuiltInInfoFromSymbolTable(ImmutableString("gl_FragData"), &info); setBuiltInInfoFromSymbol(symbol->variable(), &info);
if (!IsExtensionEnabled(mExtensionBehavior, TExtension::EXT_draw_buffers)) if (!IsExtensionEnabled(mExtensionBehavior, TExtension::EXT_draw_buffers))
{ {
ASSERT(info.arraySizes.size() == 1u); ASSERT(info.arraySizes.size() == 1u);
...@@ -527,51 +500,44 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol) ...@@ -527,51 +500,44 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol)
} }
return; return;
case EvqFragDepthEXT: case EvqFragDepthEXT:
recordBuiltInFragmentOutputUsed(ImmutableString("gl_FragDepthEXT"), recordBuiltInFragmentOutputUsed(symbol->variable(), &mFragDepthEXTAdded);
&mFragDepthEXTAdded);
return; return;
case EvqFragDepth: case EvqFragDepth:
recordBuiltInFragmentOutputUsed(ImmutableString("gl_FragDepth"), &mFragDepthAdded); recordBuiltInFragmentOutputUsed(symbol->variable(), &mFragDepthAdded);
return; return;
case EvqSecondaryFragColorEXT: case EvqSecondaryFragColorEXT:
recordBuiltInFragmentOutputUsed(ImmutableString("gl_SecondaryFragColorEXT"), recordBuiltInFragmentOutputUsed(symbol->variable(), &mSecondaryFragColorEXTAdded);
&mSecondaryFragColorEXTAdded);
return; return;
case EvqSecondaryFragDataEXT: case EvqSecondaryFragDataEXT:
recordBuiltInFragmentOutputUsed(ImmutableString("gl_SecondaryFragDataEXT"), recordBuiltInFragmentOutputUsed(symbol->variable(), &mSecondaryFragDataEXTAdded);
&mSecondaryFragDataEXTAdded);
return; return;
case EvqInvocationID: case EvqInvocationID:
recordBuiltInVaryingUsed(ImmutableString("gl_InvocationID"), &mInvocationIDAdded, recordBuiltInVaryingUsed(symbol->variable(), &mInvocationIDAdded, mInputVaryings);
mInputVaryings);
break; break;
case EvqPrimitiveIDIn: case EvqPrimitiveIDIn:
recordBuiltInVaryingUsed(ImmutableString("gl_PrimitiveIDIn"), &mPrimitiveIDInAdded, recordBuiltInVaryingUsed(symbol->variable(), &mPrimitiveIDInAdded, mInputVaryings);
mInputVaryings);
break; break;
case EvqPrimitiveID: case EvqPrimitiveID:
if (mShaderType == GL_GEOMETRY_SHADER_EXT) if (mShaderType == GL_GEOMETRY_SHADER_EXT)
{ {
recordBuiltInVaryingUsed(ImmutableString("gl_PrimitiveID"), &mPrimitiveIDAdded, recordBuiltInVaryingUsed(symbol->variable(), &mPrimitiveIDAdded,
mOutputVaryings); mOutputVaryings);
} }
else else
{ {
ASSERT(mShaderType == GL_FRAGMENT_SHADER); ASSERT(mShaderType == GL_FRAGMENT_SHADER);
recordBuiltInVaryingUsed(ImmutableString("gl_PrimitiveID"), &mPrimitiveIDAdded, recordBuiltInVaryingUsed(symbol->variable(), &mPrimitiveIDAdded,
mInputVaryings); mInputVaryings);
} }
break; break;
case EvqLayer: case EvqLayer:
if (mShaderType == GL_GEOMETRY_SHADER_EXT) if (mShaderType == GL_GEOMETRY_SHADER_EXT)
{ {
recordBuiltInVaryingUsed(ImmutableString("gl_Layer"), &mLayerAdded, recordBuiltInVaryingUsed(symbol->variable(), &mLayerAdded, mOutputVaryings);
mOutputVaryings);
} }
else if (mShaderType == GL_FRAGMENT_SHADER) else if (mShaderType == GL_FRAGMENT_SHADER)
{ {
recordBuiltInVaryingUsed(ImmutableString("gl_Layer"), &mLayerAdded, recordBuiltInVaryingUsed(symbol->variable(), &mLayerAdded, mInputVaryings);
mInputVaryings);
} }
else else
{ {
...@@ -925,14 +891,12 @@ void CollectVariables(TIntermBlock *root, ...@@ -925,14 +891,12 @@ void CollectVariables(TIntermBlock *root,
std::vector<InterfaceBlock> *inBlocks, std::vector<InterfaceBlock> *inBlocks,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
TSymbolTable *symbolTable, TSymbolTable *symbolTable,
int shaderVersion,
GLenum shaderType, GLenum shaderType,
const TExtensionBehavior &extensionBehavior) const TExtensionBehavior &extensionBehavior)
{ {
CollectVariablesTraverser collect(attributes, outputVariables, uniforms, inputVaryings, CollectVariablesTraverser collect(attributes, outputVariables, uniforms, inputVaryings,
outputVaryings, uniformBlocks, shaderStorageBlocks, inBlocks, outputVaryings, uniformBlocks, shaderStorageBlocks, inBlocks,
hashFunction, symbolTable, shaderVersion, shaderType, hashFunction, symbolTable, shaderType, extensionBehavior);
extensionBehavior);
root->traverse(&collect); root->traverse(&collect);
} }
......
...@@ -29,7 +29,6 @@ void CollectVariables(TIntermBlock *root, ...@@ -29,7 +29,6 @@ void CollectVariables(TIntermBlock *root,
std::vector<InterfaceBlock> *inBlocks, std::vector<InterfaceBlock> *inBlocks,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
TSymbolTable *symbolTable, TSymbolTable *symbolTable,
int shaderVersion,
GLenum shaderType, GLenum shaderType,
const TExtensionBehavior &extensionBehavior); const TExtensionBehavior &extensionBehavior);
} }
......
...@@ -602,7 +602,7 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root, ...@@ -602,7 +602,7 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root,
ASSERT(!variablesCollected); ASSERT(!variablesCollected);
CollectVariables(root, &attributes, &outputVariables, &uniforms, &inputVaryings, CollectVariables(root, &attributes, &outputVariables, &uniforms, &inputVaryings,
&outputVaryings, &uniformBlocks, &shaderStorageBlocks, &inBlocks, &outputVaryings, &uniformBlocks, &shaderStorageBlocks, &inBlocks,
hashFunction, &symbolTable, shaderVersion, shaderType, extensionBehavior); hashFunction, &symbolTable, shaderType, extensionBehavior);
collectInterfaceBlocks(); collectInterfaceBlocks();
variablesCollected = true; variablesCollected = true;
if (compileOptions & SH_USE_UNUSED_STANDARD_SHARED_BLOCKS) if (compileOptions & SH_USE_UNUSED_STANDARD_SHARED_BLOCKS)
......
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