diff options
Diffstat (limited to 'src/3rdparty/angle/src/compiler/translator/VariableInfo.cpp')
-rw-r--r-- | src/3rdparty/angle/src/compiler/translator/VariableInfo.cpp | 673 |
1 files changed, 0 insertions, 673 deletions
diff --git a/src/3rdparty/angle/src/compiler/translator/VariableInfo.cpp b/src/3rdparty/angle/src/compiler/translator/VariableInfo.cpp deleted file mode 100644 index 3b6aa6a68e..0000000000 --- a/src/3rdparty/angle/src/compiler/translator/VariableInfo.cpp +++ /dev/null @@ -1,673 +0,0 @@ -// -// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// - -#include "angle_gl.h" -#include "compiler/translator/SymbolTable.h" -#include "compiler/translator/VariableInfo.h" -#include "compiler/translator/util.h" -#include "common/utilities.h" - -namespace sh -{ - -namespace -{ - -BlockLayoutType GetBlockLayoutType(TLayoutBlockStorage blockStorage) -{ - switch (blockStorage) - { - case EbsPacked: return BLOCKLAYOUT_PACKED; - case EbsShared: return BLOCKLAYOUT_SHARED; - case EbsStd140: return BLOCKLAYOUT_STANDARD; - default: UNREACHABLE(); return BLOCKLAYOUT_SHARED; - } -} - -void ExpandUserDefinedVariable(const ShaderVariable &variable, - const std::string &name, - const std::string &mappedName, - bool markStaticUse, - std::vector<ShaderVariable> *expanded); - -void ExpandVariable(const ShaderVariable &variable, - const std::string &name, - const std::string &mappedName, - bool markStaticUse, - std::vector<ShaderVariable> *expanded) -{ - if (variable.isStruct()) - { - if (variable.isArray()) - { - for (unsigned int elementIndex = 0; elementIndex < variable.elementCount(); - elementIndex++) - { - std::string lname = name + ::ArrayString(elementIndex); - std::string lmappedName = mappedName + ::ArrayString(elementIndex); - ExpandUserDefinedVariable(variable, lname, lmappedName, markStaticUse, expanded); - } - } - else - { - ExpandUserDefinedVariable(variable, name, mappedName, markStaticUse, expanded); - } - } - else - { - ShaderVariable expandedVar = variable; - - expandedVar.name = name; - expandedVar.mappedName = mappedName; - - // Mark all expanded fields as used if the parent is used - if (markStaticUse) - { - expandedVar.staticUse = true; - } - - if (expandedVar.isArray()) - { - expandedVar.name += "[0]"; - expandedVar.mappedName += "[0]"; - } - - expanded->push_back(expandedVar); - } -} - -void ExpandUserDefinedVariable(const ShaderVariable &variable, - const std::string &name, - const std::string &mappedName, - bool markStaticUse, - std::vector<ShaderVariable> *expanded) -{ - ASSERT(variable.isStruct()); - - const std::vector<ShaderVariable> &fields = variable.fields; - - for (size_t fieldIndex = 0; fieldIndex < fields.size(); fieldIndex++) - { - const ShaderVariable &field = fields[fieldIndex]; - ExpandVariable(field, - name + "." + field.name, - mappedName + "." + field.mappedName, - markStaticUse, - expanded); - } -} - -template <class VarT> -VarT *FindVariable(const TString &name, - std::vector<VarT> *infoList) -{ - // TODO(zmo): optimize this function. - for (size_t ii = 0; ii < infoList->size(); ++ii) - { - if ((*infoList)[ii].name.c_str() == name) - return &((*infoList)[ii]); - } - - return NULL; -} - -} - -CollectVariables::CollectVariables(std::vector<sh::Attribute> *attribs, - std::vector<sh::OutputVariable> *outputVariables, - std::vector<sh::Uniform> *uniforms, - std::vector<sh::Varying> *varyings, - std::vector<sh::InterfaceBlock> *interfaceBlocks, - ShHashFunction64 hashFunction, - const TSymbolTable &symbolTable) - : TIntermTraverser(true, false, false), - mAttribs(attribs), - mOutputVariables(outputVariables), - mUniforms(uniforms), - mVaryings(varyings), - mInterfaceBlocks(interfaceBlocks), - mDepthRangeAdded(false), - mPointCoordAdded(false), - mFrontFacingAdded(false), - mFragCoordAdded(false), - mInstanceIDAdded(false), - mPositionAdded(false), - mPointSizeAdded(false), - mLastFragDataAdded(false), - mFragColorAdded(false), - mFragDataAdded(false), - mFragDepthEXTAdded(false), - mFragDepthAdded(false), - mSecondaryFragColorEXTAdded(false), - mSecondaryFragDataEXTAdded(false), - mHashFunction(hashFunction), - mSymbolTable(symbolTable) -{ -} - -// We want to check whether a uniform/varying is statically used -// because we only count the used ones in packing computing. -// Also, gl_FragCoord, gl_PointCoord, and gl_FrontFacing count -// toward varying counting if they are statically used in a fragment -// shader. -void CollectVariables::visitSymbol(TIntermSymbol *symbol) -{ - ASSERT(symbol != NULL); - ShaderVariable *var = NULL; - const TString &symbolName = symbol->getSymbol(); - - if (IsVarying(symbol->getQualifier())) - { - var = FindVariable(symbolName, mVaryings); - } - else if (symbol->getType().getBasicType() == EbtInterfaceBlock) - { - UNREACHABLE(); - } - else if (symbolName == "gl_DepthRange") - { - ASSERT(symbol->getQualifier() == EvqUniform); - - if (!mDepthRangeAdded) - { - Uniform info; - const char kName[] = "gl_DepthRange"; - info.name = kName; - info.mappedName = kName; - info.type = GL_STRUCT_ANGLEX; - info.arraySize = 0; - info.precision = GL_NONE; - info.staticUse = true; - - ShaderVariable nearInfo; - const char kNearName[] = "near"; - nearInfo.name = kNearName; - nearInfo.mappedName = kNearName; - nearInfo.type = GL_FLOAT; - nearInfo.arraySize = 0; - nearInfo.precision = GL_HIGH_FLOAT; - nearInfo.staticUse = true; - - ShaderVariable farInfo; - const char kFarName[] = "far"; - farInfo.name = kFarName; - farInfo.mappedName = kFarName; - farInfo.type = GL_FLOAT; - farInfo.arraySize = 0; - farInfo.precision = GL_HIGH_FLOAT; - farInfo.staticUse = true; - - ShaderVariable diffInfo; - const char kDiffName[] = "diff"; - diffInfo.name = kDiffName; - diffInfo.mappedName = kDiffName; - diffInfo.type = GL_FLOAT; - diffInfo.arraySize = 0; - diffInfo.precision = GL_HIGH_FLOAT; - diffInfo.staticUse = true; - - info.fields.push_back(nearInfo); - info.fields.push_back(farInfo); - info.fields.push_back(diffInfo); - - mUniforms->push_back(info); - mDepthRangeAdded = true; - } - } - else - { - switch (symbol->getQualifier()) - { - case EvqAttribute: - case EvqVertexIn: - var = FindVariable(symbolName, mAttribs); - break; - case EvqFragmentOut: - var = FindVariable(symbolName, mOutputVariables); - break; - case EvqUniform: - { - const TInterfaceBlock *interfaceBlock = symbol->getType().getInterfaceBlock(); - if (interfaceBlock) - { - InterfaceBlock *namedBlock = FindVariable(interfaceBlock->name(), mInterfaceBlocks); - ASSERT(namedBlock); - var = FindVariable(symbolName, &namedBlock->fields); - - // Set static use on the parent interface block here - namedBlock->staticUse = true; - } - else - { - var = FindVariable(symbolName, mUniforms); - } - - // It's an internal error to reference an undefined user uniform - ASSERT(symbolName.compare(0, 3, "gl_") != 0 || var); - } - break; - case EvqFragCoord: - if (!mFragCoordAdded) - { - Varying info; - const char kName[] = "gl_FragCoord"; - info.name = kName; - info.mappedName = kName; - info.type = GL_FLOAT_VEC4; - info.arraySize = 0; - info.precision = GL_MEDIUM_FLOAT; // Defined by spec. - info.staticUse = true; - info.isInvariant = mSymbolTable.isVaryingInvariant(kName); - mVaryings->push_back(info); - mFragCoordAdded = true; - } - return; - case EvqFrontFacing: - if (!mFrontFacingAdded) - { - Varying info; - const char kName[] = "gl_FrontFacing"; - info.name = kName; - info.mappedName = kName; - info.type = GL_BOOL; - info.arraySize = 0; - info.precision = GL_NONE; - info.staticUse = true; - info.isInvariant = mSymbolTable.isVaryingInvariant(kName); - mVaryings->push_back(info); - mFrontFacingAdded = true; - } - return; - case EvqPointCoord: - if (!mPointCoordAdded) - { - Varying info; - const char kName[] = "gl_PointCoord"; - info.name = kName; - info.mappedName = kName; - info.type = GL_FLOAT_VEC2; - info.arraySize = 0; - info.precision = GL_MEDIUM_FLOAT; // Defined by spec. - info.staticUse = true; - info.isInvariant = mSymbolTable.isVaryingInvariant(kName); - mVaryings->push_back(info); - mPointCoordAdded = true; - } - return; - case EvqInstanceID: - if (!mInstanceIDAdded) - { - Attribute info; - const char kName[] = "gl_InstanceID"; - info.name = kName; - info.mappedName = kName; - info.type = GL_INT; - info.arraySize = 0; - info.precision = GL_HIGH_INT; // Defined by spec. - info.staticUse = true; - info.location = -1; - mAttribs->push_back(info); - mInstanceIDAdded = true; - } - return; - case EvqPosition: - if (!mPositionAdded) - { - Varying info; - const char kName[] = "gl_Position"; - info.name = kName; - info.mappedName = kName; - info.type = GL_FLOAT_VEC4; - info.arraySize = 0; - info.precision = GL_HIGH_FLOAT; // Defined by spec. - info.staticUse = true; - info.isInvariant = mSymbolTable.isVaryingInvariant(kName); - mVaryings->push_back(info); - mPositionAdded = true; - } - return; - case EvqPointSize: - if (!mPointSizeAdded) - { - Varying info; - const char kName[] = "gl_PointSize"; - info.name = kName; - info.mappedName = kName; - info.type = GL_FLOAT; - info.arraySize = 0; - info.precision = GL_MEDIUM_FLOAT; // Defined by spec. - info.staticUse = true; - info.isInvariant = mSymbolTable.isVaryingInvariant(kName); - mVaryings->push_back(info); - mPointSizeAdded = true; - } - return; - case EvqLastFragData: - if (!mLastFragDataAdded) - { - Varying info; - const char kName[] = "gl_LastFragData"; - info.name = kName; - info.mappedName = kName; - info.type = GL_FLOAT_VEC4; - info.arraySize = static_cast<const TVariable*>(mSymbolTable.findBuiltIn("gl_MaxDrawBuffers", 100))->getConstPointer()->getIConst(); - info.precision = GL_MEDIUM_FLOAT; // Defined by spec. - info.staticUse = true; - info.isInvariant = mSymbolTable.isVaryingInvariant(kName); - mVaryings->push_back(info); - mLastFragDataAdded = true; - } - return; - case EvqFragColor: - if (!mFragColorAdded) - { - OutputVariable info; - const char kName[] = "gl_FragColor"; - info.name = kName; - info.mappedName = kName; - info.type = GL_FLOAT_VEC4; - info.arraySize = 0; - info.precision = GL_MEDIUM_FLOAT; // Defined by spec. - info.staticUse = true; - mOutputVariables->push_back(info); - mFragColorAdded = true; - } - return; - case EvqFragData: - if (!mFragDataAdded) - { - OutputVariable info; - const char kName[] = "gl_FragData"; - info.name = kName; - info.mappedName = kName; - info.type = GL_FLOAT_VEC4; - info.arraySize = static_cast<const TVariable *>( - mSymbolTable.findBuiltIn("gl_MaxDrawBuffers", 100)) - ->getConstPointer() - ->getIConst(); - info.precision = GL_MEDIUM_FLOAT; // Defined by spec. - info.staticUse = true; - mOutputVariables->push_back(info); - mFragDataAdded = true; - } - return; - case EvqFragDepthEXT: - if (!mFragDepthEXTAdded) - { - OutputVariable info; - const char kName[] = "gl_FragDepthEXT"; - info.name = kName; - info.mappedName = kName; - info.type = GL_FLOAT; - info.arraySize = 0; - info.precision = - GLVariablePrecision(static_cast<const TVariable *>( - mSymbolTable.findBuiltIn("gl_FragDepthEXT", 100)) - ->getType()); - info.staticUse = true; - mOutputVariables->push_back(info); - mFragDepthEXTAdded = true; - } - return; - case EvqFragDepth: - if (!mFragDepthAdded) - { - OutputVariable info; - const char kName[] = "gl_FragDepth"; - info.name = kName; - info.mappedName = kName; - info.type = GL_FLOAT; - info.arraySize = 0; - info.precision = GL_HIGH_FLOAT; - info.staticUse = true; - mOutputVariables->push_back(info); - mFragDepthAdded = true; - } - return; - case EvqSecondaryFragColorEXT: - if (!mSecondaryFragColorEXTAdded) - { - OutputVariable info; - const char kName[] = "gl_SecondaryFragColorEXT"; - info.name = kName; - info.mappedName = kName; - info.type = GL_FLOAT_VEC4; - info.arraySize = 0; - info.precision = GL_MEDIUM_FLOAT; // Defined by spec. - info.staticUse = true; - mOutputVariables->push_back(info); - mSecondaryFragColorEXTAdded = true; - } - return; - case EvqSecondaryFragDataEXT: - if (!mSecondaryFragDataEXTAdded) - { - OutputVariable info; - const char kName[] = "gl_SecondaryFragDataEXT"; - info.name = kName; - info.mappedName = kName; - info.type = GL_FLOAT_VEC4; - - const TVariable *maxDualSourceDrawBuffersVar = static_cast<const TVariable *>( - mSymbolTable.findBuiltIn("gl_MaxDualSourceDrawBuffersEXT", 100)); - info.arraySize = maxDualSourceDrawBuffersVar->getConstPointer()->getIConst(); - info.precision = GL_MEDIUM_FLOAT; // Defined by spec. - info.staticUse = true; - mOutputVariables->push_back(info); - mSecondaryFragDataEXTAdded = true; - } - return; - default: - break; - } - } - if (var) - { - var->staticUse = true; - } -} - -class NameHashingTraverser : public GetVariableTraverser -{ - public: - NameHashingTraverser(ShHashFunction64 hashFunction, - const TSymbolTable &symbolTable) - : GetVariableTraverser(symbolTable), - mHashFunction(hashFunction) - {} - - private: - void visitVariable(ShaderVariable *variable) override - { - TString stringName = TString(variable->name.c_str()); - variable->mappedName = TIntermTraverser::hash(stringName, mHashFunction).c_str(); - } - - ShHashFunction64 mHashFunction; -}; - -// Attributes, which cannot have struct fields, are a special case -template <> -void CollectVariables::visitVariable(const TIntermSymbol *variable, - std::vector<Attribute> *infoList) const -{ - ASSERT(variable); - const TType &type = variable->getType(); - ASSERT(!type.getStruct()); - - Attribute attribute; - - attribute.type = GLVariableType(type); - attribute.precision = GLVariablePrecision(type); - attribute.name = variable->getSymbol().c_str(); - attribute.arraySize = static_cast<unsigned int>(type.getArraySize()); - attribute.mappedName = TIntermTraverser::hash(variable->getSymbol(), mHashFunction).c_str(); - attribute.location = variable->getType().getLayoutQualifier().location; - - infoList->push_back(attribute); -} - -template <> -void CollectVariables::visitVariable(const TIntermSymbol *variable, - std::vector<OutputVariable> *infoList) const -{ - ASSERT(variable); - const TType &type = variable->getType(); - ASSERT(!type.getStruct()); - - OutputVariable attribute; - - attribute.type = GLVariableType(type); - attribute.precision = GLVariablePrecision(type); - attribute.name = variable->getSymbol().c_str(); - attribute.arraySize = static_cast<unsigned int>(type.getArraySize()); - attribute.mappedName = TIntermTraverser::hash(variable->getSymbol(), mHashFunction).c_str(); - attribute.location = variable->getType().getLayoutQualifier().location; - - infoList->push_back(attribute); -} - -template <> -void CollectVariables::visitVariable(const TIntermSymbol *variable, - std::vector<InterfaceBlock> *infoList) const -{ - InterfaceBlock interfaceBlock; - const TInterfaceBlock *blockType = variable->getType().getInterfaceBlock(); - ASSERT(blockType); - - interfaceBlock.name = blockType->name().c_str(); - interfaceBlock.mappedName = - TIntermTraverser::hash(blockType->name().c_str(), mHashFunction).c_str(); - interfaceBlock.instanceName = (blockType->hasInstanceName() ? blockType->instanceName().c_str() : ""); - interfaceBlock.arraySize = variable->getArraySize(); - interfaceBlock.isRowMajorLayout = (blockType->matrixPacking() == EmpRowMajor); - interfaceBlock.layout = GetBlockLayoutType(blockType->blockStorage()); - - // Gather field information - for (const TField *field : blockType->fields()) - { - const TType &fieldType = *field->type(); - - NameHashingTraverser traverser(mHashFunction, mSymbolTable); - traverser.traverse(fieldType, field->name(), &interfaceBlock.fields); - - interfaceBlock.fields.back().isRowMajorLayout = (fieldType.getLayoutQualifier().matrixPacking == EmpRowMajor); - } - - infoList->push_back(interfaceBlock); -} - -template <typename VarT> -void CollectVariables::visitVariable(const TIntermSymbol *variable, - std::vector<VarT> *infoList) const -{ - NameHashingTraverser traverser(mHashFunction, mSymbolTable); - traverser.traverse(variable->getType(), variable->getSymbol(), infoList); -} - -template <typename VarT> -void CollectVariables::visitInfoList(const TIntermSequence &sequence, - std::vector<VarT> *infoList) const -{ - for (size_t seqIndex = 0; seqIndex < sequence.size(); seqIndex++) - { - const TIntermSymbol *variable = sequence[seqIndex]->getAsSymbolNode(); - // The only case in which the sequence will not contain a - // TIntermSymbol node is initialization. It will contain a - // TInterBinary node in that case. Since attributes, uniforms, - // and varyings cannot be initialized in a shader, we must have - // only TIntermSymbol nodes in the sequence. - ASSERT(variable != NULL); - visitVariable(variable, infoList); - } -} - -bool CollectVariables::visitAggregate(Visit, TIntermAggregate *node) -{ - bool visitChildren = true; - - switch (node->getOp()) - { - case EOpDeclaration: - { - const TIntermSequence &sequence = *(node->getSequence()); - ASSERT(!sequence.empty()); - - const TIntermTyped &typedNode = *(sequence.front()->getAsTyped()); - TQualifier qualifier = typedNode.getQualifier(); - - if (typedNode.getBasicType() == EbtInterfaceBlock) - { - visitInfoList(sequence, mInterfaceBlocks); - visitChildren = false; - } - else if (qualifier == EvqAttribute || qualifier == EvqVertexIn || - qualifier == EvqFragmentOut || qualifier == EvqUniform || - IsVarying(qualifier)) - { - switch (qualifier) - { - case EvqAttribute: - case EvqVertexIn: - visitInfoList(sequence, mAttribs); - break; - case EvqFragmentOut: - visitInfoList(sequence, mOutputVariables); - break; - case EvqUniform: - visitInfoList(sequence, mUniforms); - break; - default: - visitInfoList(sequence, mVaryings); - break; - } - - visitChildren = false; - } - break; - } - default: break; - } - - return visitChildren; -} - -bool CollectVariables::visitBinary(Visit, TIntermBinary *binaryNode) -{ - if (binaryNode->getOp() == EOpIndexDirectInterfaceBlock) - { - // NOTE: we do not determine static use for individual blocks of an array - TIntermTyped *blockNode = binaryNode->getLeft()->getAsTyped(); - ASSERT(blockNode); - - TIntermConstantUnion *constantUnion = binaryNode->getRight()->getAsConstantUnion(); - ASSERT(constantUnion); - - const TInterfaceBlock *interfaceBlock = blockNode->getType().getInterfaceBlock(); - InterfaceBlock *namedBlock = FindVariable(interfaceBlock->name(), mInterfaceBlocks); - ASSERT(namedBlock); - namedBlock->staticUse = true; - - unsigned int fieldIndex = constantUnion->getUConst(0); - ASSERT(fieldIndex < namedBlock->fields.size()); - namedBlock->fields[fieldIndex].staticUse = true; - return false; - } - - return true; -} - -void ExpandUniforms(const std::vector<Uniform> &compact, - std::vector<ShaderVariable> *expanded) -{ - for (size_t variableIndex = 0; variableIndex < compact.size(); variableIndex++) - { - const ShaderVariable &variable = compact[variableIndex]; - ExpandVariable(variable, variable.name, variable.mappedName, variable.staticUse, expanded); - } -} - -} |