Non-functional. Rationalizations enabling future generalizations:
- Use much simpler method to update implicit array sizes. The previous overly complicated method was error prone. - Rationalize all use of unsized arrays. - Combine decorations when generating SPIR-V, to simplify adding extensions.
This commit is contained in:
parent
2316924b09
commit
ead8622484
25 changed files with 563 additions and 583 deletions
|
|
@ -470,7 +470,7 @@ public:
|
|||
// Drop just the storage qualification, which perhaps should
|
||||
// never be done, as it is fundamentally inconsistent, but need to
|
||||
// explore what downstream consumers need.
|
||||
// E.g., in a deference, it is an inconsistency between:
|
||||
// E.g., in a dereference, it is an inconsistency between:
|
||||
// A) partially dereferenced resource is still in the storage class it started in
|
||||
// B) partially dereferenced resource is a new temporary object
|
||||
// If A, then nothing should change, if B, then everything should change, but this is half way.
|
||||
|
|
@ -1354,9 +1354,11 @@ public:
|
|||
virtual bool isVector() const { return vectorSize > 1 || vector1; }
|
||||
virtual bool isMatrix() const { return matrixCols ? true : false; }
|
||||
virtual bool isArray() const { return arraySizes != nullptr; }
|
||||
virtual bool isExplicitlySizedArray() const { return isArray() && getOuterArraySize() != UnsizedArraySize; }
|
||||
virtual bool isImplicitlySizedArray() const { return isArray() && getOuterArraySize() == UnsizedArraySize && qualifier.storage != EvqBuffer; }
|
||||
virtual bool isRuntimeSizedArray() const { return isArray() && getOuterArraySize() == UnsizedArraySize && qualifier.storage == EvqBuffer; }
|
||||
virtual bool isSizedArray() const { return isArray() && arraySizes->isSized(); }
|
||||
virtual bool isUnsizedArray() const { return isArray() && !arraySizes->isSized(); }
|
||||
virtual bool isArrayVariablyIndexed() const { assert(isArray()); return arraySizes->isVariablyIndexed(); }
|
||||
virtual void setArrayVariablyIndexed() { assert(isArray()); arraySizes->setVariablyIndexed(); }
|
||||
virtual void updateImplicitArraySize(int size) { assert(isArray()); arraySizes->updateImplicitSize(size); }
|
||||
virtual bool isStruct() const { return structure != nullptr; }
|
||||
virtual bool isFloatingDomain() const { return basicType == EbtFloat || basicType == EbtDouble || basicType == EbtFloat16; }
|
||||
virtual bool isIntegerDomain() const
|
||||
|
|
@ -1414,10 +1416,10 @@ public:
|
|||
return contains([this](const TType* t) { return t != this && t->isStruct(); } );
|
||||
}
|
||||
|
||||
// Recursively check the structure for any implicitly-sized arrays, needed for triggering a copyUp().
|
||||
virtual bool containsImplicitlySizedArray() const
|
||||
// Recursively check the structure for any unsized arrays, needed for triggering a copyUp().
|
||||
virtual bool containsUnsizedArray() const
|
||||
{
|
||||
return contains([](const TType* t) { return t->isImplicitlySizedArray(); } );
|
||||
return contains([](const TType* t) { return t->isUnsizedArray(); } );
|
||||
}
|
||||
|
||||
virtual bool containsOpaque() const
|
||||
|
|
@ -1510,16 +1512,22 @@ public:
|
|||
}
|
||||
}
|
||||
void changeOuterArraySize(int s) { arraySizes->changeOuterSize(s); }
|
||||
void setImplicitArraySize(int s) { arraySizes->setImplicitSize(s); }
|
||||
|
||||
// Recursively make the implicit array size the explicit array size, through the type tree.
|
||||
void adoptImplicitArraySizes()
|
||||
// Recursively make the implicit array size the explicit array size.
|
||||
// Expicit arrays are compile-time or link-time sized, never run-time sized.
|
||||
// Sometimes, policy calls for an array to be run-time sized even if it was
|
||||
// never variably indexed: Don't turn a 'skipNonvariablyIndexed' array into
|
||||
// an explicit array.
|
||||
void adoptImplicitArraySizes(bool skipNonvariablyIndexed)
|
||||
{
|
||||
if (isImplicitlySizedArray())
|
||||
if (isUnsizedArray() && !(skipNonvariablyIndexed || isArrayVariablyIndexed()))
|
||||
changeOuterArraySize(getImplicitArraySize());
|
||||
if (isStruct()) {
|
||||
for (int i = 0; i < (int)structure->size(); ++i)
|
||||
(*structure)[i].type->adoptImplicitArraySizes();
|
||||
if (isStruct() && structure->size() > 0) {
|
||||
int lastMember = (int)structure->size() - 1;
|
||||
for (int i = 0; i < lastMember; ++i)
|
||||
(*structure)[i].type->adoptImplicitArraySizes(false);
|
||||
// implement the "last member of an SSBO" policy
|
||||
(*structure)[lastMember].type->adoptImplicitArraySizes(getQualifier().storage == EvqBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1686,17 +1694,21 @@ public:
|
|||
if (isArray()) {
|
||||
for(int i = 0; i < (int)arraySizes->getNumDims(); ++i) {
|
||||
int size = arraySizes->getDimSize(i);
|
||||
if (size == UnsizedArraySize) {
|
||||
appendStr(" unsized");
|
||||
if (i == 0) {
|
||||
if (size == UnsizedArraySize && i == 0 && arraySizes->isVariablyIndexed())
|
||||
appendStr(" runtime-sized array of");
|
||||
else {
|
||||
if (size == UnsizedArraySize) {
|
||||
appendStr(" unsized");
|
||||
if (i == 0) {
|
||||
appendStr(" ");
|
||||
appendInt(arraySizes->getImplicitSize());
|
||||
}
|
||||
} else {
|
||||
appendStr(" ");
|
||||
appendInt(arraySizes->getImplicitSize());
|
||||
appendInt(arraySizes->getDimSize(i));
|
||||
}
|
||||
} else {
|
||||
appendStr(" ");
|
||||
appendInt(arraySizes->getDimSize(i));
|
||||
appendStr("-element array of");
|
||||
}
|
||||
appendStr("-element array of");
|
||||
}
|
||||
}
|
||||
if (qualifier.precision != EpqNone) {
|
||||
|
|
|
|||
|
|
@ -41,6 +41,8 @@
|
|||
#ifndef _ARRAYS_INCLUDED
|
||||
#define _ARRAYS_INCLUDED
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
namespace glslang {
|
||||
|
||||
// This is used to mean there is no size yet (unsized), it is waiting to get a size from somewhere else.
|
||||
|
|
@ -220,12 +222,13 @@ protected:
|
|||
struct TArraySizes {
|
||||
POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
|
||||
|
||||
TArraySizes() : implicitArraySize(1) { }
|
||||
TArraySizes() : implicitArraySize(1), variablyIndexed(false) { }
|
||||
|
||||
// For breaking into two non-shared copies, independently modifiable.
|
||||
TArraySizes& operator=(const TArraySizes& from)
|
||||
{
|
||||
implicitArraySize = from.implicitArraySize;
|
||||
variablyIndexed = from.variablyIndexed;
|
||||
sizes = from.sizes;
|
||||
|
||||
return *this;
|
||||
|
|
@ -254,9 +257,9 @@ struct TArraySizes {
|
|||
void addInnerSize(TArraySize pair) { sizes.push_back(pair.size, pair.node); }
|
||||
void addInnerSizes(const TArraySizes& s) { sizes.push_back(s.sizes); }
|
||||
void changeOuterSize(int s) { sizes.changeFront((unsigned)s); }
|
||||
int getImplicitSize() const { return (int)implicitArraySize; }
|
||||
void setImplicitSize(int s) { implicitArraySize = s; }
|
||||
bool isInnerImplicit() const
|
||||
int getImplicitSize() const { return implicitArraySize; }
|
||||
void updateImplicitSize(int s) { implicitArraySize = std::max(implicitArraySize, s); }
|
||||
bool isInnerUnsized() const
|
||||
{
|
||||
for (int d = 1; d < sizes.size(); ++d) {
|
||||
if (sizes.getDimSize(d) == (unsigned)UnsizedArraySize)
|
||||
|
|
@ -265,7 +268,7 @@ struct TArraySizes {
|
|||
|
||||
return false;
|
||||
}
|
||||
bool clearInnerImplicit()
|
||||
bool clearInnerUnsized()
|
||||
{
|
||||
for (int d = 1; d < sizes.size(); ++d) {
|
||||
if (sizes.getDimSize(d) == (unsigned)UnsizedArraySize)
|
||||
|
|
@ -288,7 +291,8 @@ struct TArraySizes {
|
|||
return sizes.getDimNode(0) != nullptr;
|
||||
}
|
||||
|
||||
bool isImplicit() const { return getOuterSize() == UnsizedArraySize || isInnerImplicit(); }
|
||||
bool hasUnsized() const { return getOuterSize() == UnsizedArraySize || isInnerUnsized(); }
|
||||
bool isSized() const { return getOuterSize() != UnsizedArraySize; }
|
||||
void dereference() { sizes.pop_front(); }
|
||||
void copyDereferenced(const TArraySizes& rhs)
|
||||
{
|
||||
|
|
@ -311,6 +315,9 @@ struct TArraySizes {
|
|||
return true;
|
||||
}
|
||||
|
||||
void setVariablyIndexed() { variablyIndexed = true; }
|
||||
bool isVariablyIndexed() const { return variablyIndexed; }
|
||||
|
||||
bool operator==(const TArraySizes& rhs) { return sizes == rhs.sizes; }
|
||||
bool operator!=(const TArraySizes& rhs) { return sizes != rhs.sizes; }
|
||||
|
||||
|
|
@ -319,9 +326,12 @@ protected:
|
|||
|
||||
TArraySizes(const TArraySizes&);
|
||||
|
||||
// for tracking maximum referenced index, before an explicit size is given
|
||||
// applies only to the outer-most dimension
|
||||
// For tracking maximum referenced compile-time constant index.
|
||||
// Applies only to the outer-most dimension. Potentially becomes
|
||||
// the implicit size of the array, if not variably indexed and
|
||||
// otherwise legal.
|
||||
int implicitArraySize;
|
||||
bool variablyIndexed; // true if array is indexed with a non compile-time constant
|
||||
};
|
||||
|
||||
} // end namespace glslang
|
||||
|
|
|
|||
|
|
@ -729,7 +729,11 @@ enum TOperator {
|
|||
// Array operators
|
||||
//
|
||||
|
||||
EOpArrayLength, // "Array" distinguishes from length(v) built-in function, but it applies to vectors and matrices as well.
|
||||
// Can apply to arrays, vectors, or matrices.
|
||||
// Can be decomposed to a constant at compile time, but this does not always happen,
|
||||
// due to link-time effects. So, consumer can expect either a link-time sized or
|
||||
// run-time sized array.
|
||||
EOpArrayLength,
|
||||
|
||||
//
|
||||
// Image operations
|
||||
|
|
|
|||
|
|
@ -243,7 +243,7 @@ void TParseContextBase::checkIndex(const TSourceLoc& loc, const TType& type, int
|
|||
error(loc, "", "[", "index out of range '%d'", index);
|
||||
index = 0;
|
||||
} else if (type.isArray()) {
|
||||
if (type.isExplicitlySizedArray() && index >= type.getOuterArraySize()) {
|
||||
if (type.isSizedArray() && index >= type.getOuterArraySize()) {
|
||||
error(loc, "", "[", "array index out of range '%d'", index);
|
||||
index = type.getOuterArraySize() - 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -284,17 +284,17 @@ TIntermTyped* TParseContext::handleVariable(const TSourceLoc& loc, TSymbol* symb
|
|||
requireExtensions(loc, symbol->getNumExtensions(), symbol->getExtensions(), symbol->getName().c_str());
|
||||
|
||||
if (symbol && symbol->isReadOnly()) {
|
||||
// All shared things containing an implicitly sized array must be copied up
|
||||
// All shared things containing an unsized array must be copied up
|
||||
// on first use, so that all future references will share its array structure,
|
||||
// so that editing the implicit size will effect all nodes consuming it,
|
||||
// and so that editing the implicit size won't change the shared one.
|
||||
//
|
||||
// If this is a variable or a block, check it and all it contains, but if this
|
||||
// is a member of an anonymous block, check the whole block, as the whole block
|
||||
// will need to be copied up if it contains an implicitly-sized array.
|
||||
if (symbol->getType().containsImplicitlySizedArray() ||
|
||||
// will need to be copied up if it contains an unsized array.
|
||||
if (symbol->getType().containsUnsizedArray() ||
|
||||
(symbol->getAsAnonMember() &&
|
||||
symbol->getAsAnonMember()->getAnonContainer().getType().containsImplicitlySizedArray()))
|
||||
symbol->getAsAnonMember()->getAnonContainer().getType().containsUnsizedArray()))
|
||||
makeEditable(symbol);
|
||||
}
|
||||
|
||||
|
|
@ -372,21 +372,28 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn
|
|||
} else {
|
||||
// at least one of base and index is not a front-end constant variable...
|
||||
|
||||
if (index->getQualifier().isFrontEndConstant())
|
||||
checkIndex(loc, base->getType(), indexValue);
|
||||
|
||||
if (base->getAsSymbolNode() && isIoResizeArray(base->getType()))
|
||||
handleIoResizeArrayAccess(loc, base);
|
||||
|
||||
if (index->getQualifier().isFrontEndConstant()) {
|
||||
if (base->getType().isImplicitlySizedArray())
|
||||
updateImplicitArraySize(loc, base, indexValue);
|
||||
else
|
||||
checkIndex(loc, base->getType(), indexValue);
|
||||
if (base->getType().isUnsizedArray())
|
||||
base->getWritableType().updateImplicitArraySize(indexValue + 1);
|
||||
result = intermediate.addIndex(EOpIndexDirect, base, index, loc);
|
||||
} else {
|
||||
if (base->getType().isImplicitlySizedArray()) {
|
||||
if (base->getType().isUnsizedArray()) {
|
||||
// we have a variable index into an unsized array, which is okay,
|
||||
// depending on the situation
|
||||
if (base->getAsSymbolNode() && isIoResizeArray(base->getType()))
|
||||
error(loc, "", "[", "array must be sized by a redeclaration or layout qualifier before being indexed with a variable");
|
||||
else
|
||||
error(loc, "", "[", "array must be redeclared with a size before being indexed with a variable");
|
||||
else {
|
||||
// it is okay for a run-time sized array
|
||||
if (base->getType().getQualifier().storage != EvqBuffer)
|
||||
error(loc, "", "[", "array must be redeclared with a size before being indexed with a variable");
|
||||
}
|
||||
base->getWritableType().setArrayVariablyIndexed();
|
||||
}
|
||||
if (base->getBasicType() == EbtBlock) {
|
||||
if (base->getQualifier().storage == EvqBuffer)
|
||||
|
|
@ -485,7 +492,7 @@ void TParseContext::fixIoArraySize(const TSourceLoc& loc, TType& type)
|
|||
|
||||
if (language == EShLangTessControl || language == EShLangTessEvaluation) {
|
||||
if (type.getOuterArraySize() != resources.maxPatchVertices) {
|
||||
if (type.isExplicitlySizedArray())
|
||||
if (type.isSizedArray())
|
||||
error(loc, "tessellation input array size must be gl_MaxPatchVertices or implicitly sized", "[]", "");
|
||||
type.changeOuterArraySize(resources.maxPatchVertices);
|
||||
}
|
||||
|
|
@ -518,7 +525,7 @@ void TParseContext::handleIoResizeArrayAccess(const TSourceLoc& /*loc*/, TInterm
|
|||
return;
|
||||
|
||||
// fix array size, if it can be fixed and needs to be fixed (will allow variable indexing)
|
||||
if (symbolNode->getType().isImplicitlySizedArray()) {
|
||||
if (symbolNode->getType().isUnsizedArray()) {
|
||||
int newSize = getIoArrayImplicitSize();
|
||||
if (newSize > 0)
|
||||
symbolNode->getWritableType().changeOuterArraySize(newSize);
|
||||
|
|
@ -568,7 +575,7 @@ int TParseContext::getIoArrayImplicitSize() const
|
|||
|
||||
void TParseContext::checkIoArrayConsistency(const TSourceLoc& loc, int requiredSize, const char* feature, TType& type, const TString& name)
|
||||
{
|
||||
if (type.isImplicitlySizedArray())
|
||||
if (type.isUnsizedArray())
|
||||
type.changeOuterArraySize(requiredSize);
|
||||
else if (type.getOuterArraySize() != requiredSize) {
|
||||
if (language == EShLangGeometry)
|
||||
|
|
@ -1215,10 +1222,7 @@ TIntermTyped* TParseContext::handleLengthMethod(const TSourceLoc& loc, TFunction
|
|||
else {
|
||||
const TType& type = intermNode->getAsTyped()->getType();
|
||||
if (type.isArray()) {
|
||||
if (type.isRuntimeSizedArray()) {
|
||||
// Create a unary op and let the back end handle it
|
||||
return intermediate.addBuiltInFunctionCall(loc, EOpArrayLength, true, intermNode, TType(EbtInt));
|
||||
} else if (type.isImplicitlySizedArray()) {
|
||||
if (type.isUnsizedArray()) {
|
||||
if (intermNode->getAsSymbolNode() && isIoResizeArray(type)) {
|
||||
// We could be between a layout declaration that gives a built-in io array implicit size and
|
||||
// a user redeclaration of that array, meaning we have to substitute its implicit size here
|
||||
|
|
@ -1231,7 +1235,10 @@ TIntermTyped* TParseContext::handleLengthMethod(const TSourceLoc& loc, TFunction
|
|||
if (length == 0) {
|
||||
if (intermNode->getAsSymbolNode() && isIoResizeArray(type))
|
||||
error(loc, "", function->getName().c_str(), "array must first be sized by a redeclaration or layout qualifier");
|
||||
else
|
||||
else if (type.getQualifier().isUniformOrBuffer()) {
|
||||
// Create a unary op and let the back end handle it
|
||||
return intermediate.addBuiltInFunctionCall(loc, EOpArrayLength, true, intermNode, TType(EbtInt));
|
||||
} else
|
||||
error(loc, "", function->getName().c_str(), "array must be declared with a size before using this method");
|
||||
}
|
||||
} else if (type.getOuterArrayNode()) {
|
||||
|
|
@ -2283,7 +2290,7 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T
|
|||
bool floatArgument = false;
|
||||
for (int arg = 0; arg < function.getParamCount(); ++arg) {
|
||||
if (function[arg].type->isArray()) {
|
||||
if (! function[arg].type->isExplicitlySizedArray()) {
|
||||
if (function[arg].type->isUnsizedArray()) {
|
||||
// Can't construct from an unsized array.
|
||||
error(loc, "array argument must be sized", "constructor", "");
|
||||
return true;
|
||||
|
|
@ -2381,7 +2388,7 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T
|
|||
return true;
|
||||
}
|
||||
|
||||
if (type.isImplicitlySizedArray()) {
|
||||
if (type.isUnsizedArray()) {
|
||||
// auto adapt the constructor type to the number of arguments
|
||||
type.changeOuterArraySize(function.getParamCount());
|
||||
} else if (type.getOuterArraySize() != function.getParamCount()) {
|
||||
|
|
@ -2402,7 +2409,7 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T
|
|||
return true;
|
||||
}
|
||||
|
||||
if (arraySizes.isInnerImplicit()) {
|
||||
if (arraySizes.isInnerUnsized()) {
|
||||
// "Arrays of arrays ..., and the size for any dimension is optional"
|
||||
// That means we need to adopt (from the first argument) the other array sizes into the type.
|
||||
for (int d = 1; d < arraySizes.getNumDims(); ++d) {
|
||||
|
|
@ -2608,6 +2615,15 @@ void TParseContext::transparentOpaqueCheck(const TSourceLoc& loc, const TType& t
|
|||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Qualifier checks knowing the qualifier and that it is a member of a struct/block.
|
||||
//
|
||||
void TParseContext::memberQualifierCheck(glslang::TPublicType& publicType)
|
||||
{
|
||||
globalQualifierFixCheck(publicType.loc, publicType.qualifier);
|
||||
checkNoShaderLayouts(publicType.loc, publicType.shaderQualifiers);
|
||||
}
|
||||
|
||||
//
|
||||
// Check/fix just a full qualifier (no variables or types yet, but qualifier is complete) at global level.
|
||||
//
|
||||
|
|
@ -3081,7 +3097,7 @@ bool TParseContext::arrayError(const TSourceLoc& loc, const TType& type)
|
|||
//
|
||||
void TParseContext::arraySizeRequiredCheck(const TSourceLoc& loc, const TArraySizes& arraySizes)
|
||||
{
|
||||
if (arraySizes.isImplicit())
|
||||
if (arraySizes.hasUnsized())
|
||||
error(loc, "array size required", "", "");
|
||||
}
|
||||
|
||||
|
|
@ -3108,9 +3124,9 @@ void TParseContext::arraySizesCheck(const TSourceLoc& loc, const TQualifier& qua
|
|||
return;
|
||||
|
||||
// No environment allows any non-outer-dimension to be implicitly sized
|
||||
if (arraySizes->isInnerImplicit()) {
|
||||
if (arraySizes->isInnerUnsized()) {
|
||||
error(loc, "only outermost dimension of an array of arrays can be implicitly sized", "[]", "");
|
||||
arraySizes->clearInnerImplicit();
|
||||
arraySizes->clearInnerUnsized();
|
||||
}
|
||||
|
||||
if (arraySizes->isInnerSpecialization())
|
||||
|
|
@ -3237,7 +3253,7 @@ void TParseContext::declareArray(const TSourceLoc& loc, const TString& identifie
|
|||
return;
|
||||
}
|
||||
|
||||
if (existingType.isExplicitlySizedArray()) {
|
||||
if (existingType.isSizedArray()) {
|
||||
// be more leniant for input arrays to geometry shaders and tessellation control outputs, where the redeclaration is the same size
|
||||
if (! (isIoResizeArray(type) && existingType.getOuterArraySize() == type.getOuterArraySize()))
|
||||
error(loc, "redeclaration of array with size", identifier.c_str(), "");
|
||||
|
|
@ -3252,66 +3268,6 @@ void TParseContext::declareArray(const TSourceLoc& loc, const TString& identifie
|
|||
checkIoArraysConsistency(loc);
|
||||
}
|
||||
|
||||
void TParseContext::updateImplicitArraySize(const TSourceLoc& loc, TIntermNode *node, int index)
|
||||
{
|
||||
// maybe there is nothing to do...
|
||||
TIntermTyped* typedNode = node->getAsTyped();
|
||||
if (typedNode->getType().getImplicitArraySize() > index)
|
||||
return;
|
||||
|
||||
// something to do...
|
||||
|
||||
// Figure out what symbol to lookup, as we will use its type to edit for the size change,
|
||||
// as that type will be shared through shallow copies for future references.
|
||||
TSymbol* symbol = nullptr;
|
||||
int blockIndex = -1;
|
||||
const TString* lookupName = nullptr;
|
||||
if (node->getAsSymbolNode())
|
||||
lookupName = &node->getAsSymbolNode()->getName();
|
||||
else if (node->getAsBinaryNode()) {
|
||||
const TIntermBinary* deref = node->getAsBinaryNode();
|
||||
// This has to be the result of a block dereference, unless it's bad shader code
|
||||
// If it's a uniform block, then an error will be issued elsewhere, but
|
||||
// return early now to avoid crashing later in this function.
|
||||
if (deref->getLeft()->getBasicType() != EbtBlock ||
|
||||
deref->getLeft()->getType().getQualifier().storage == EvqUniform ||
|
||||
deref->getRight()->getAsConstantUnion() == nullptr)
|
||||
return;
|
||||
|
||||
const TIntermTyped* left = deref->getLeft();
|
||||
const TIntermTyped* right = deref->getRight();
|
||||
|
||||
if (left->getAsBinaryNode()) {
|
||||
left = left->getAsBinaryNode()->getLeft(); // Block array access
|
||||
assert(left->isArray());
|
||||
}
|
||||
|
||||
if (! left->getAsSymbolNode())
|
||||
return;
|
||||
|
||||
blockIndex = right->getAsConstantUnion()->getConstArray()[0].getIConst();
|
||||
|
||||
lookupName = &left->getAsSymbolNode()->getName();
|
||||
if (IsAnonymous(*lookupName))
|
||||
lookupName = &(*left->getType().getStruct())[blockIndex].type->getFieldName();
|
||||
}
|
||||
|
||||
// Lookup the symbol, should only fail if shader code is incorrect
|
||||
symbol = symbolTable.find(*lookupName);
|
||||
if (symbol == nullptr)
|
||||
return;
|
||||
|
||||
if (symbol->getAsFunction()) {
|
||||
error(loc, "array variable name expected", symbol->getName().c_str(), "");
|
||||
return;
|
||||
}
|
||||
|
||||
if (symbol->getType().isStruct() && blockIndex != -1)
|
||||
(*symbol->getWritableType().getStruct())[blockIndex].type->setImplicitArraySize(index + 1);
|
||||
else
|
||||
symbol->getWritableType().setImplicitArraySize(index + 1);
|
||||
}
|
||||
|
||||
// Returns true if the first argument to the #line directive is the line number for the next line.
|
||||
//
|
||||
// Desktop, pre-version 3.30: "After processing this directive
|
||||
|
|
@ -3597,7 +3553,7 @@ void TParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newT
|
|||
error(memberLoc, "cannot redeclare block member with a different type", member->type->getFieldName().c_str(), "");
|
||||
if (oldType.isArray() != newType.isArray())
|
||||
error(memberLoc, "cannot change arrayness of redeclared block member", member->type->getFieldName().c_str(), "");
|
||||
else if (! oldType.sameArrayness(newType) && oldType.isExplicitlySizedArray())
|
||||
else if (! oldType.sameArrayness(newType) && oldType.isSizedArray())
|
||||
error(memberLoc, "cannot change array size of redeclared block member", member->type->getFieldName().c_str(), "");
|
||||
else if (newType.isArray())
|
||||
arrayLimitCheck(loc, member->type->getFieldName(), newType.getOuterArraySize());
|
||||
|
|
@ -3626,7 +3582,7 @@ void TParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newT
|
|||
type.getQualifier().layoutXfbBuffer = currentBlockQualifier.layoutXfbBuffer;
|
||||
oldType.getQualifier().layoutXfbBuffer = currentBlockQualifier.layoutXfbBuffer;
|
||||
}
|
||||
if (oldType.isImplicitlySizedArray() && newType.isExplicitlySizedArray())
|
||||
if (oldType.isUnsizedArray() && newType.isSizedArray())
|
||||
oldType.changeOuterArraySize(newType.getOuterArraySize());
|
||||
|
||||
// check and process the member's type, which will include managing xfb information
|
||||
|
|
@ -3652,11 +3608,11 @@ void TParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newT
|
|||
if (type.isArray() != (arraySizes != nullptr))
|
||||
error(loc, "cannot change arrayness of redeclared block", blockName.c_str(), "");
|
||||
else if (type.isArray()) {
|
||||
if (type.isExplicitlySizedArray() && arraySizes->getOuterSize() == UnsizedArraySize)
|
||||
error(loc, "block already declared with size, can't redeclare as implicitly-sized", blockName.c_str(), "");
|
||||
else if (type.isExplicitlySizedArray() && *type.getArraySizes() != *arraySizes)
|
||||
if (type.isSizedArray() && !arraySizes->isSized())
|
||||
error(loc, "block already declared with size, can't redeclare as unsized", blockName.c_str(), "");
|
||||
else if (type.isSizedArray() && *type.getArraySizes() != *arraySizes)
|
||||
error(loc, "cannot change array size of redeclared block", blockName.c_str(), "");
|
||||
else if (type.isImplicitlySizedArray() && arraySizes->getOuterSize() != UnsizedArraySize)
|
||||
else if (!type.isSizedArray() && arraySizes->isSized())
|
||||
type.changeOuterArraySize(arraySizes->getOuterSize());
|
||||
}
|
||||
|
||||
|
|
@ -3676,7 +3632,7 @@ void TParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newT
|
|||
trackLinkage(*block);
|
||||
}
|
||||
|
||||
void TParseContext::paramCheckFix(const TSourceLoc& loc, const TStorageQualifier& qualifier, TType& type)
|
||||
void TParseContext::paramCheckFixStorage(const TSourceLoc& loc, const TStorageQualifier& qualifier, TType& type)
|
||||
{
|
||||
switch (qualifier) {
|
||||
case EvqConst:
|
||||
|
|
@ -3723,7 +3679,7 @@ void TParseContext::paramCheckFix(const TSourceLoc& loc, const TQualifier& quali
|
|||
warn(loc, "qualifier has no effect on non-output parameters", "precise", "");
|
||||
}
|
||||
|
||||
paramCheckFix(loc, qualifier.storage, type);
|
||||
paramCheckFixStorage(loc, qualifier.storage, type);
|
||||
}
|
||||
|
||||
void TParseContext::nestedBlockCheck(const TSourceLoc& loc)
|
||||
|
|
@ -4699,11 +4655,12 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type)
|
|||
if (type.getBasicType() == EbtSampler) {
|
||||
int lastBinding = qualifier.layoutBinding;
|
||||
if (type.isArray()) {
|
||||
if (type.isImplicitlySizedArray()) {
|
||||
lastBinding += 1;
|
||||
warn(loc, "assuming array size of one for compile-time checking of binding numbers for implicitly-sized array", "[]", "");
|
||||
} else
|
||||
if (type.isSizedArray())
|
||||
lastBinding += type.getCumulativeArraySize();
|
||||
else {
|
||||
lastBinding += 1;
|
||||
warn(loc, "assuming array size of one for compile-time checking of binding numbers for unsized array", "[]", "");
|
||||
}
|
||||
}
|
||||
if (spvVersion.vulkan == 0 && lastBinding >= resources.maxCombinedTextureImageUnits)
|
||||
error(loc, "sampler binding not less than gl_MaxCombinedTextureImageUnits", "binding", type.isArray() ? "(using array)" : "");
|
||||
|
|
@ -4963,7 +4920,7 @@ void TParseContext::fixOffset(const TSourceLoc& loc, TSymbol& symbol)
|
|||
// Check for overlap
|
||||
int numOffsets = 4;
|
||||
if (symbol.getType().isArray()) {
|
||||
if (symbol.getType().isExplicitlySizedArray() && ! symbol.getType().getArraySizes()->isInnerImplicit())
|
||||
if (symbol.getType().isSizedArray() && !symbol.getType().getArraySizes()->isInnerUnsized())
|
||||
numOffsets *= symbol.getType().getCumulativeArraySize();
|
||||
else {
|
||||
// "It is a compile-time error to declare an unsized array of atomic_uint."
|
||||
|
|
@ -5468,8 +5425,7 @@ TIntermNode* TParseContext::executeInitializer(const TSourceLoc& loc, TIntermTyp
|
|||
}
|
||||
|
||||
// Fix outer arrayness if variable is unsized, getting size from the initializer
|
||||
if (initializer->getType().isExplicitlySizedArray() &&
|
||||
variable->getType().isImplicitlySizedArray())
|
||||
if (initializer->getType().isSizedArray() && variable->getType().isUnsizedArray())
|
||||
variable->getWritableType().changeOuterArraySize(initializer->getType().getOuterArraySize());
|
||||
|
||||
// Inner arrayness can also get set by an initializer
|
||||
|
|
|
|||
|
|
@ -348,6 +348,7 @@ public:
|
|||
void samplerCheck(const TSourceLoc&, const TType&, const TString& identifier, TIntermTyped* initializer);
|
||||
void atomicUintCheck(const TSourceLoc&, const TType&, const TString& identifier);
|
||||
void transparentOpaqueCheck(const TSourceLoc&, const TType&, const TString& identifier);
|
||||
void memberQualifierCheck(glslang::TPublicType&);
|
||||
void globalQualifierFixCheck(const TSourceLoc&, TQualifier&);
|
||||
void globalQualifierTypeCheck(const TSourceLoc&, const TQualifier&, const TPublicType&);
|
||||
bool structQualifierErrorCheck(const TSourceLoc&, const TPublicType& pType);
|
||||
|
|
@ -360,7 +361,7 @@ public:
|
|||
bool containsFieldWithBasicType(const TType& type ,TBasicType basicType);
|
||||
TSymbol* redeclareBuiltinVariable(const TSourceLoc&, const TString&, const TQualifier&, const TShaderQualifiers&);
|
||||
void redeclareBuiltinBlock(const TSourceLoc&, TTypeList& typeList, const TString& blockName, const TString* instanceName, TArraySizes* arraySizes);
|
||||
void paramCheckFix(const TSourceLoc&, const TStorageQualifier&, TType& type);
|
||||
void paramCheckFixStorage(const TSourceLoc&, const TStorageQualifier&, TType& type);
|
||||
void paramCheckFix(const TSourceLoc&, const TQualifier&, TType& type);
|
||||
void nestedBlockCheck(const TSourceLoc&);
|
||||
void nestedStructCheck(const TSourceLoc&);
|
||||
|
|
@ -408,7 +409,6 @@ public:
|
|||
void wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode);
|
||||
TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body);
|
||||
|
||||
void updateImplicitArraySize(const TSourceLoc&, TIntermNode*, int index);
|
||||
TAttributeType attributeFromName(const TString& name) const;
|
||||
TAttributes* makeAttributes(const TString& identifier) const;
|
||||
TAttributes* makeAttributes(const TString& identifier, TIntermNode* node) const;
|
||||
|
|
|
|||
|
|
@ -968,7 +968,7 @@ parameter_declaration
|
|||
$$ = $1;
|
||||
|
||||
parseContext.parameterTypeCheck($1.loc, EvqIn, *$1.param.type);
|
||||
parseContext.paramCheckFix($1.loc, EvqTemporary, *$$.param.type);
|
||||
parseContext.paramCheckFixStorage($1.loc, EvqTemporary, *$$.param.type);
|
||||
parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier());
|
||||
}
|
||||
//
|
||||
|
|
@ -988,7 +988,7 @@ parameter_declaration
|
|||
$$ = $1;
|
||||
|
||||
parseContext.parameterTypeCheck($1.loc, EvqIn, *$1.param.type);
|
||||
parseContext.paramCheckFix($1.loc, EvqTemporary, *$$.param.type);
|
||||
parseContext.paramCheckFixStorage($1.loc, EvqTemporary, *$$.param.type);
|
||||
parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier());
|
||||
}
|
||||
;
|
||||
|
|
@ -3121,7 +3121,6 @@ struct_declaration
|
|||
}
|
||||
}
|
||||
| type_qualifier type_specifier struct_declarator_list SEMICOLON {
|
||||
parseContext.globalQualifierFixCheck($1.loc, $1.qualifier);
|
||||
if ($2.arraySizes) {
|
||||
parseContext.profileRequires($2.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
|
||||
parseContext.profileRequires($2.loc, EEsProfile, 300, 0, "arrayed type");
|
||||
|
|
@ -3131,7 +3130,7 @@ struct_declaration
|
|||
|
||||
$$ = $3;
|
||||
|
||||
parseContext.checkNoShaderLayouts($1.loc, $1.shaderQualifiers);
|
||||
parseContext.memberQualifierCheck($1);
|
||||
parseContext.voidErrorCheck($2.loc, (*$3)[0].type->getFieldName(), $2.basicType);
|
||||
parseContext.mergeQualifiers($2.loc, $2.qualifier, $1.qualifier, true);
|
||||
parseContext.precisionQualifierCheck($2.loc, $2.basicType, $2.qualifier);
|
||||
|
|
|
|||
|
|
@ -946,15 +946,15 @@ static const yytype_uint16 yyrline[] =
|
|||
2901, 2909, 2914, 2919, 2924, 2932, 2937, 2942, 2947, 2955,
|
||||
2960, 2965, 2971, 2977, 2983, 2992, 3001, 3007, 3013, 3019,
|
||||
3025, 3030, 3046, 3051, 3056, 3064, 3064, 3075, 3075, 3085,
|
||||
3088, 3101, 3123, 3151, 3155, 3161, 3166, 3177, 3180, 3186,
|
||||
3195, 3198, 3204, 3208, 3209, 3215, 3216, 3217, 3218, 3219,
|
||||
3220, 3221, 3225, 3226, 3230, 3226, 3242, 3243, 3247, 3247,
|
||||
3254, 3254, 3268, 3271, 3279, 3287, 3298, 3299, 3303, 3306,
|
||||
3312, 3319, 3323, 3331, 3335, 3348, 3351, 3357, 3357, 3377,
|
||||
3380, 3386, 3398, 3410, 3413, 3419, 3419, 3434, 3434, 3450,
|
||||
3450, 3471, 3474, 3480, 3483, 3489, 3493, 3500, 3505, 3510,
|
||||
3517, 3520, 3529, 3533, 3542, 3545, 3548, 3556, 3556, 3578,
|
||||
3584, 3587, 3592, 3595
|
||||
3088, 3101, 3123, 3150, 3154, 3160, 3165, 3176, 3179, 3185,
|
||||
3194, 3197, 3203, 3207, 3208, 3214, 3215, 3216, 3217, 3218,
|
||||
3219, 3220, 3224, 3225, 3229, 3225, 3241, 3242, 3246, 3246,
|
||||
3253, 3253, 3267, 3270, 3278, 3286, 3297, 3298, 3302, 3305,
|
||||
3311, 3318, 3322, 3330, 3334, 3347, 3350, 3356, 3356, 3376,
|
||||
3379, 3385, 3397, 3409, 3412, 3418, 3418, 3433, 3433, 3449,
|
||||
3449, 3470, 3473, 3479, 3482, 3488, 3492, 3499, 3504, 3509,
|
||||
3516, 3519, 3528, 3532, 3541, 3544, 3547, 3555, 3555, 3577,
|
||||
3583, 3586, 3591, 3594
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -5101,7 +5101,7 @@ yyreduce:
|
|||
(yyval.interm) = (yyvsp[0].interm);
|
||||
|
||||
parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type);
|
||||
parseContext.paramCheckFix((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type);
|
||||
parseContext.paramCheckFixStorage((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type);
|
||||
parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier());
|
||||
}
|
||||
#line 5108 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
|
|
@ -5128,7 +5128,7 @@ yyreduce:
|
|||
(yyval.interm) = (yyvsp[0].interm);
|
||||
|
||||
parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type);
|
||||
parseContext.paramCheckFix((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type);
|
||||
parseContext.paramCheckFixStorage((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type);
|
||||
parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier());
|
||||
}
|
||||
#line 5135 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
|
|
@ -8980,7 +8980,6 @@ yyreduce:
|
|||
case 472:
|
||||
#line 3123 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
parseContext.globalQualifierFixCheck((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).qualifier);
|
||||
if ((yyvsp[-2].interm.type).arraySizes) {
|
||||
parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
|
||||
parseContext.profileRequires((yyvsp[-2].interm.type).loc, EEsProfile, 300, 0, "arrayed type");
|
||||
|
|
@ -8990,7 +8989,7 @@ yyreduce:
|
|||
|
||||
(yyval.interm.typeList) = (yyvsp[-1].interm.typeList);
|
||||
|
||||
parseContext.checkNoShaderLayouts((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).shaderQualifiers);
|
||||
parseContext.memberQualifierCheck((yyvsp[-3].interm.type));
|
||||
parseContext.voidErrorCheck((yyvsp[-2].interm.type).loc, (*(yyvsp[-1].interm.typeList))[0].type->getFieldName(), (yyvsp[-2].interm.type).basicType);
|
||||
parseContext.mergeQualifiers((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).qualifier, (yyvsp[-3].interm.type).qualifier, true);
|
||||
parseContext.precisionQualifierCheck((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).basicType, (yyvsp[-2].interm.type).qualifier);
|
||||
|
|
@ -9004,38 +9003,38 @@ yyreduce:
|
|||
(*(yyval.interm.typeList))[i].type->shallowCopy(type);
|
||||
}
|
||||
}
|
||||
#line 9008 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9007 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 473:
|
||||
#line 3151 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3150 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.typeList) = new TTypeList;
|
||||
(yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine));
|
||||
}
|
||||
#line 9017 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9016 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 474:
|
||||
#line 3155 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3154 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine));
|
||||
}
|
||||
#line 9025 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9024 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 475:
|
||||
#line 3161 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3160 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.typeLine).type = new TType(EbtVoid);
|
||||
(yyval.interm.typeLine).loc = (yyvsp[0].lex).loc;
|
||||
(yyval.interm.typeLine).type->setFieldName(*(yyvsp[0].lex).string);
|
||||
}
|
||||
#line 9035 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9034 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 476:
|
||||
#line 3166 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3165 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
parseContext.arrayOfArrayVersionCheck((yyvsp[-1].lex).loc, (yyvsp[0].interm).arraySizes);
|
||||
|
||||
|
|
@ -9044,219 +9043,219 @@ yyreduce:
|
|||
(yyval.interm.typeLine).type->setFieldName(*(yyvsp[-1].lex).string);
|
||||
(yyval.interm.typeLine).type->transferArraySizes((yyvsp[0].interm).arraySizes);
|
||||
}
|
||||
#line 9048 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9047 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 477:
|
||||
#line 3177 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3176 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
|
||||
}
|
||||
#line 9056 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9055 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 478:
|
||||
#line 3180 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3179 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
const char* initFeature = "{ } style initializers";
|
||||
parseContext.requireProfile((yyvsp[-2].lex).loc, ~EEsProfile, initFeature);
|
||||
parseContext.profileRequires((yyvsp[-2].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);
|
||||
(yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode);
|
||||
}
|
||||
#line 9067 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9066 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 479:
|
||||
#line 3186 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3185 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
const char* initFeature = "{ } style initializers";
|
||||
parseContext.requireProfile((yyvsp[-3].lex).loc, ~EEsProfile, initFeature);
|
||||
parseContext.profileRequires((yyvsp[-3].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);
|
||||
(yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
|
||||
}
|
||||
#line 9078 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9077 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 480:
|
||||
#line 3195 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3194 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate(0, (yyvsp[0].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)->getLoc());
|
||||
}
|
||||
#line 9086 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9085 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 481:
|
||||
#line 3198 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3197 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
|
||||
}
|
||||
#line 9094 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9093 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 482:
|
||||
#line 3204 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3203 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{ (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
|
||||
#line 9100 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9099 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 483:
|
||||
#line 3208 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3207 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{ (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
|
||||
#line 9106 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9105 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 484:
|
||||
#line 3209 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3208 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{ (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
|
||||
#line 9112 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9111 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 485:
|
||||
#line 3215 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3214 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{ (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
|
||||
#line 9118 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9117 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 486:
|
||||
#line 3216 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3215 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{ (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
|
||||
#line 9124 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9123 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 487:
|
||||
#line 3217 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3216 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{ (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
|
||||
#line 9130 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9129 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 488:
|
||||
#line 3218 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3217 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{ (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
|
||||
#line 9136 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9135 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 489:
|
||||
#line 3219 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3218 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{ (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
|
||||
#line 9142 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9141 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 490:
|
||||
#line 3220 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3219 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{ (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
|
||||
#line 9148 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9147 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 491:
|
||||
#line 3221 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3220 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{ (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
|
||||
#line 9154 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9153 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 492:
|
||||
#line 3225 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3224 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{ (yyval.interm.intermNode) = 0; }
|
||||
#line 9160 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9159 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 493:
|
||||
#line 3226 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3225 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
parseContext.symbolTable.push();
|
||||
++parseContext.statementNestingLevel;
|
||||
}
|
||||
#line 9169 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9168 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 494:
|
||||
#line 3230 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3229 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
|
||||
--parseContext.statementNestingLevel;
|
||||
}
|
||||
#line 9178 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9177 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 495:
|
||||
#line 3234 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3233 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
if ((yyvsp[-2].interm.intermNode) && (yyvsp[-2].interm.intermNode)->getAsAggregate())
|
||||
(yyvsp[-2].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence);
|
||||
(yyval.interm.intermNode) = (yyvsp[-2].interm.intermNode);
|
||||
}
|
||||
#line 9188 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9187 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 496:
|
||||
#line 3242 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3241 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{ (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
|
||||
#line 9194 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9193 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 497:
|
||||
#line 3243 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3242 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{ (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
|
||||
#line 9200 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9199 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 498:
|
||||
#line 3247 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3246 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
++parseContext.controlFlowNestingLevel;
|
||||
}
|
||||
#line 9208 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9207 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 499:
|
||||
#line 3250 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3249 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
--parseContext.controlFlowNestingLevel;
|
||||
(yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
|
||||
}
|
||||
#line 9217 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9216 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 500:
|
||||
#line 3254 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3253 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
parseContext.symbolTable.push();
|
||||
++parseContext.statementNestingLevel;
|
||||
++parseContext.controlFlowNestingLevel;
|
||||
}
|
||||
#line 9227 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9226 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 501:
|
||||
#line 3259 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3258 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
|
||||
--parseContext.statementNestingLevel;
|
||||
--parseContext.controlFlowNestingLevel;
|
||||
(yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
|
||||
}
|
||||
#line 9238 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9237 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 502:
|
||||
#line 3268 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3267 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = 0;
|
||||
}
|
||||
#line 9246 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9245 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 503:
|
||||
#line 3271 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3270 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
if ((yyvsp[-1].interm.intermNode) && (yyvsp[-1].interm.intermNode)->getAsAggregate())
|
||||
(yyvsp[-1].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence);
|
||||
(yyval.interm.intermNode) = (yyvsp[-1].interm.intermNode);
|
||||
}
|
||||
#line 9256 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9255 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 504:
|
||||
#line 3279 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3278 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode));
|
||||
if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase ||
|
||||
|
|
@ -9265,11 +9264,11 @@ yyreduce:
|
|||
(yyval.interm.intermNode) = 0; // start a fresh subsequence for what's after this case
|
||||
}
|
||||
}
|
||||
#line 9269 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9268 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 505:
|
||||
#line 3287 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3286 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase ||
|
||||
(yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpDefault)) {
|
||||
|
|
@ -9278,76 +9277,76 @@ yyreduce:
|
|||
} else
|
||||
(yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode));
|
||||
}
|
||||
#line 9282 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9281 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 506:
|
||||
#line 3298 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3297 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{ (yyval.interm.intermNode) = 0; }
|
||||
#line 9288 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9287 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 507:
|
||||
#line 3299 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3298 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{ (yyval.interm.intermNode) = static_cast<TIntermNode*>((yyvsp[-1].interm.intermTypedNode)); }
|
||||
#line 9294 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9293 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 508:
|
||||
#line 3303 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3302 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
|
||||
}
|
||||
#line 9302 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9301 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 509:
|
||||
#line 3306 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3305 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
parseContext.handleSelectionAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));
|
||||
(yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
|
||||
}
|
||||
#line 9311 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9310 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 510:
|
||||
#line 3312 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3311 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-2].interm.intermTypedNode));
|
||||
(yyval.interm.intermNode) = parseContext.intermediate.addSelection((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.nodePair), (yyvsp[-4].lex).loc);
|
||||
}
|
||||
#line 9320 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9319 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 511:
|
||||
#line 3319 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3318 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode);
|
||||
(yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermNode);
|
||||
}
|
||||
#line 9329 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9328 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 512:
|
||||
#line 3323 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3322 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode);
|
||||
(yyval.interm.nodePair).node2 = 0;
|
||||
}
|
||||
#line 9338 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9337 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 513:
|
||||
#line 3331 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3330 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
|
||||
parseContext.boolCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode));
|
||||
}
|
||||
#line 9347 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9346 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 514:
|
||||
#line 3335 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3334 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
parseContext.boolCheck((yyvsp[-2].lex).loc, (yyvsp[-3].interm.type));
|
||||
|
||||
|
|
@ -9358,28 +9357,28 @@ yyreduce:
|
|||
else
|
||||
(yyval.interm.intermTypedNode) = 0;
|
||||
}
|
||||
#line 9362 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9361 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 515:
|
||||
#line 3348 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3347 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
|
||||
}
|
||||
#line 9370 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9369 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 516:
|
||||
#line 3351 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3350 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
parseContext.handleSwitchAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));
|
||||
(yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
|
||||
}
|
||||
#line 9379 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9378 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 517:
|
||||
#line 3357 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3356 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
// start new switch sequence on the switch stack
|
||||
++parseContext.controlFlowNestingLevel;
|
||||
|
|
@ -9388,11 +9387,11 @@ yyreduce:
|
|||
parseContext.switchLevel.push_back(parseContext.statementNestingLevel);
|
||||
parseContext.symbolTable.push();
|
||||
}
|
||||
#line 9392 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9391 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 518:
|
||||
#line 3365 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3364 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = parseContext.addSwitch((yyvsp[-7].lex).loc, (yyvsp[-5].interm.intermTypedNode), (yyvsp[-1].interm.intermNode) ? (yyvsp[-1].interm.intermNode)->getAsAggregate() : 0);
|
||||
delete parseContext.switchSequenceStack.back();
|
||||
|
|
@ -9402,27 +9401,27 @@ yyreduce:
|
|||
--parseContext.statementNestingLevel;
|
||||
--parseContext.controlFlowNestingLevel;
|
||||
}
|
||||
#line 9406 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9405 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 519:
|
||||
#line 3377 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3376 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = 0;
|
||||
}
|
||||
#line 9414 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9413 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 520:
|
||||
#line 3380 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3379 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
|
||||
}
|
||||
#line 9422 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9421 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 521:
|
||||
#line 3386 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3385 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = 0;
|
||||
if (parseContext.switchLevel.size() == 0)
|
||||
|
|
@ -9435,11 +9434,11 @@ yyreduce:
|
|||
(yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpCase, (yyvsp[-1].interm.intermTypedNode), (yyvsp[-2].lex).loc);
|
||||
}
|
||||
}
|
||||
#line 9439 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9438 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 522:
|
||||
#line 3398 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3397 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = 0;
|
||||
if (parseContext.switchLevel.size() == 0)
|
||||
|
|
@ -9449,28 +9448,28 @@ yyreduce:
|
|||
else
|
||||
(yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpDefault, (yyvsp[-1].lex).loc);
|
||||
}
|
||||
#line 9453 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9452 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 523:
|
||||
#line 3410 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3409 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
|
||||
}
|
||||
#line 9461 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9460 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 524:
|
||||
#line 3413 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3412 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
parseContext.handleLoopAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));
|
||||
(yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
|
||||
}
|
||||
#line 9470 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9469 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 525:
|
||||
#line 3419 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3418 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
if (! parseContext.limits.whileLoops)
|
||||
parseContext.error((yyvsp[-1].lex).loc, "while loops not available", "limitation", "");
|
||||
|
|
@ -9479,11 +9478,11 @@ yyreduce:
|
|||
++parseContext.statementNestingLevel;
|
||||
++parseContext.controlFlowNestingLevel;
|
||||
}
|
||||
#line 9483 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9482 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 526:
|
||||
#line 3427 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3426 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
|
||||
(yyval.interm.intermNode) = parseContext.intermediate.addLoop((yyvsp[0].interm.intermNode), (yyvsp[-2].interm.intermTypedNode), 0, true, (yyvsp[-5].lex).loc);
|
||||
|
|
@ -9491,21 +9490,21 @@ yyreduce:
|
|||
--parseContext.statementNestingLevel;
|
||||
--parseContext.controlFlowNestingLevel;
|
||||
}
|
||||
#line 9495 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9494 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 527:
|
||||
#line 3434 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3433 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
++parseContext.loopNestingLevel;
|
||||
++parseContext.statementNestingLevel;
|
||||
++parseContext.controlFlowNestingLevel;
|
||||
}
|
||||
#line 9505 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9504 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 528:
|
||||
#line 3439 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3438 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
if (! parseContext.limits.whileLoops)
|
||||
parseContext.error((yyvsp[-7].lex).loc, "do-while loops not available", "limitation", "");
|
||||
|
|
@ -9517,22 +9516,22 @@ yyreduce:
|
|||
--parseContext.statementNestingLevel;
|
||||
--parseContext.controlFlowNestingLevel;
|
||||
}
|
||||
#line 9521 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9520 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 529:
|
||||
#line 3450 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3449 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
parseContext.symbolTable.push();
|
||||
++parseContext.loopNestingLevel;
|
||||
++parseContext.statementNestingLevel;
|
||||
++parseContext.controlFlowNestingLevel;
|
||||
}
|
||||
#line 9532 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9531 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 530:
|
||||
#line 3456 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3455 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
|
||||
(yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[-3].interm.intermNode), (yyvsp[-5].lex).loc);
|
||||
|
|
@ -9545,81 +9544,81 @@ yyreduce:
|
|||
--parseContext.statementNestingLevel;
|
||||
--parseContext.controlFlowNestingLevel;
|
||||
}
|
||||
#line 9549 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9548 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 531:
|
||||
#line 3471 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3470 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
|
||||
}
|
||||
#line 9557 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9556 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 532:
|
||||
#line 3474 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3473 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
|
||||
}
|
||||
#line 9565 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9564 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 533:
|
||||
#line 3480 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3479 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
|
||||
}
|
||||
#line 9573 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9572 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 534:
|
||||
#line 3483 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3482 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermTypedNode) = 0;
|
||||
}
|
||||
#line 9581 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9580 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 535:
|
||||
#line 3489 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3488 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode);
|
||||
(yyval.interm.nodePair).node2 = 0;
|
||||
}
|
||||
#line 9590 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9589 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 536:
|
||||
#line 3493 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3492 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode);
|
||||
(yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermTypedNode);
|
||||
}
|
||||
#line 9599 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9598 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 537:
|
||||
#line 3500 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3499 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
if (parseContext.loopNestingLevel <= 0)
|
||||
parseContext.error((yyvsp[-1].lex).loc, "continue statement only allowed in loops", "", "");
|
||||
(yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpContinue, (yyvsp[-1].lex).loc);
|
||||
}
|
||||
#line 9609 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9608 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 538:
|
||||
#line 3505 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3504 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
if (parseContext.loopNestingLevel + parseContext.switchSequenceStack.size() <= 0)
|
||||
parseContext.error((yyvsp[-1].lex).loc, "break statement only allowed in switch and loops", "", "");
|
||||
(yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpBreak, (yyvsp[-1].lex).loc);
|
||||
}
|
||||
#line 9619 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9618 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 539:
|
||||
#line 3510 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3509 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpReturn, (yyvsp[-1].lex).loc);
|
||||
if (parseContext.currentFunctionType->getBasicType() != EbtVoid)
|
||||
|
|
@ -9627,83 +9626,83 @@ yyreduce:
|
|||
if (parseContext.inMain)
|
||||
parseContext.postEntryPointReturn = true;
|
||||
}
|
||||
#line 9631 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9630 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 540:
|
||||
#line 3517 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3516 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = parseContext.handleReturnValue((yyvsp[-2].lex).loc, (yyvsp[-1].interm.intermTypedNode));
|
||||
}
|
||||
#line 9639 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9638 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 541:
|
||||
#line 3520 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3519 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "discard");
|
||||
(yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpKill, (yyvsp[-1].lex).loc);
|
||||
}
|
||||
#line 9648 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9647 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 542:
|
||||
#line 3529 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3528 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
|
||||
parseContext.intermediate.setTreeRoot((yyval.interm.intermNode));
|
||||
}
|
||||
#line 9657 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9656 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 543:
|
||||
#line 3533 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3532 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
if ((yyvsp[0].interm.intermNode) != nullptr) {
|
||||
(yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode));
|
||||
parseContext.intermediate.setTreeRoot((yyval.interm.intermNode));
|
||||
}
|
||||
}
|
||||
#line 9668 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9667 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 544:
|
||||
#line 3542 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3541 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
|
||||
}
|
||||
#line 9676 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9675 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 545:
|
||||
#line 3545 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3544 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
|
||||
}
|
||||
#line 9684 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9683 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 546:
|
||||
#line 3548 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3547 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
parseContext.requireProfile((yyvsp[0].lex).loc, ~EEsProfile, "extraneous semicolon");
|
||||
parseContext.profileRequires((yyvsp[0].lex).loc, ~EEsProfile, 460, nullptr, "extraneous semicolon");
|
||||
(yyval.interm.intermNode) = nullptr;
|
||||
}
|
||||
#line 9694 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9693 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 547:
|
||||
#line 3556 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3555 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyvsp[0].interm).function = parseContext.handleFunctionDeclarator((yyvsp[0].interm).loc, *(yyvsp[0].interm).function, false /* not prototype */);
|
||||
(yyvsp[0].interm).intermNode = parseContext.handleFunctionDefinition((yyvsp[0].interm).loc, *(yyvsp[0].interm).function);
|
||||
}
|
||||
#line 9703 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9702 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 548:
|
||||
#line 3560 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3559 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
// May be best done as post process phase on intermediate code
|
||||
if (parseContext.currentFunctionType->getBasicType() != EbtVoid && ! parseContext.functionReturnsValue)
|
||||
|
|
@ -9719,52 +9718,52 @@ yyreduce:
|
|||
(yyval.interm.intermNode)->getAsAggregate()->setDebug(parseContext.contextPragma.debug);
|
||||
(yyval.interm.intermNode)->getAsAggregate()->setPragmaTable(parseContext.contextPragma.pragmaTable);
|
||||
}
|
||||
#line 9723 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9722 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 549:
|
||||
#line 3578 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3577 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.attributes) = (yyvsp[-2].interm.attributes);
|
||||
parseContext.requireExtensions((yyvsp[-4].lex).loc, 1, &E_GL_EXT_control_flow_attributes, "attribute");
|
||||
}
|
||||
#line 9732 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9731 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 550:
|
||||
#line 3584 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3583 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.attributes) = (yyvsp[0].interm.attributes);
|
||||
}
|
||||
#line 9740 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9739 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 551:
|
||||
#line 3587 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3586 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.attributes) = parseContext.mergeAttributes((yyvsp[-2].interm.attributes), (yyvsp[0].interm.attributes));
|
||||
}
|
||||
#line 9748 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9747 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 552:
|
||||
#line 3592 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3591 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[0].lex).string);
|
||||
}
|
||||
#line 9756 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9755 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
case 553:
|
||||
#line 3595 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
#line 3594 "MachineIndependent/glslang.y" /* yacc.c:1646 */
|
||||
{
|
||||
(yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[-3].lex).string, (yyvsp[-1].interm.intermTypedNode));
|
||||
}
|
||||
#line 9764 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9763 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
break;
|
||||
|
||||
|
||||
#line 9768 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
#line 9767 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646 */
|
||||
default: break;
|
||||
}
|
||||
/* User semantic actions sometimes alter yychar, and that requires
|
||||
|
|
@ -9992,5 +9991,5 @@ yyreturn:
|
|||
#endif
|
||||
return yyresult;
|
||||
}
|
||||
#line 3599 "MachineIndependent/glslang.y" /* yacc.c:1906 */
|
||||
#line 3598 "MachineIndependent/glslang.y" /* yacc.c:1906 */
|
||||
|
||||
|
|
|
|||
|
|
@ -268,10 +268,12 @@ void TIntermediate::mergeLinkerObjects(TInfoSink& infoSink, TIntermSequence& lin
|
|||
// Recursively merge the implicit array sizes through the objects' respective type trees.
|
||||
void TIntermediate::mergeImplicitArraySizes(TType& type, const TType& unitType)
|
||||
{
|
||||
if (type.isImplicitlySizedArray() && unitType.isArray()) {
|
||||
int newImplicitArraySize = unitType.isImplicitlySizedArray() ? unitType.getImplicitArraySize() : unitType.getOuterArraySize();
|
||||
if (newImplicitArraySize > type.getImplicitArraySize ())
|
||||
type.setImplicitArraySize(newImplicitArraySize);
|
||||
if (type.isUnsizedArray() && unitType.isArray()) {
|
||||
int newImplicitArraySize = unitType.isSizedArray() ? unitType.getOuterArraySize() :
|
||||
unitType.getImplicitArraySize();
|
||||
type.updateImplicitArraySize(type.getImplicitArraySize());
|
||||
if (unitType.isArrayVariablyIndexed())
|
||||
type.setArrayVariablyIndexed();
|
||||
}
|
||||
|
||||
// Type mismatches are caught and reported after this, just be careful for now.
|
||||
|
|
@ -511,7 +513,9 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled)
|
|||
virtual void visitSymbol(TIntermSymbol* symbol)
|
||||
{
|
||||
// Implicitly size arrays.
|
||||
symbol->getWritableType().adoptImplicitArraySizes();
|
||||
// If an unsized array is left as unsized, it effectively
|
||||
// becomes run-time sized.
|
||||
symbol->getWritableType().adoptImplicitArraySizes(false);
|
||||
}
|
||||
} finalLinkTraverser;
|
||||
|
||||
|
|
@ -766,7 +770,7 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ
|
|||
|
||||
int size;
|
||||
if (qualifier.isUniformOrBuffer()) {
|
||||
if (type.isExplicitlySizedArray())
|
||||
if (type.isSizedArray())
|
||||
size = type.getCumulativeArraySize();
|
||||
else
|
||||
size = 1;
|
||||
|
|
@ -914,12 +918,12 @@ int TIntermediate::computeTypeLocationSize(const TType& type, EShLanguage stage)
|
|||
// consecutive locations..."
|
||||
if (type.isArray()) {
|
||||
// TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness
|
||||
// TODO: are there valid cases of having an unsized array with a location? If so, running this code too early.
|
||||
TType elementType(type, 0);
|
||||
if (type.isImplicitlySizedArray()) {
|
||||
// TODO: are there valid cases of having an implicitly-sized array with a location? If so, running this code too early.
|
||||
return computeTypeLocationSize(elementType, stage);
|
||||
} else
|
||||
if (type.isSizedArray())
|
||||
return type.getOuterArraySize() * computeTypeLocationSize(elementType, stage);
|
||||
else
|
||||
return computeTypeLocationSize(elementType, stage);
|
||||
}
|
||||
|
||||
// "The locations consumed by block and structure members are determined by applying the rules above
|
||||
|
|
@ -971,11 +975,12 @@ int TIntermediate::computeTypeUniformLocationSize(const TType& type)
|
|||
if (type.isArray()) {
|
||||
// TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness
|
||||
TType elementType(type, 0);
|
||||
if (type.isImplicitlySizedArray()) {
|
||||
if (type.isSizedArray()) {
|
||||
return type.getOuterArraySize() * computeTypeUniformLocationSize(elementType);
|
||||
} else {
|
||||
// TODO: are there valid cases of having an implicitly-sized array with a location? If so, running this code too early.
|
||||
return computeTypeUniformLocationSize(elementType);
|
||||
} else
|
||||
return type.getOuterArraySize() * computeTypeUniformLocationSize(elementType);
|
||||
}
|
||||
}
|
||||
|
||||
// "Each subsequent inner-most member or element gets incremental
|
||||
|
|
@ -1036,7 +1041,7 @@ unsigned int TIntermediate::computeTypeXfbSize(const TType& type, bool& contains
|
|||
|
||||
if (type.isArray()) {
|
||||
// TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness
|
||||
assert(type.isExplicitlySizedArray());
|
||||
assert(type.isSizedArray());
|
||||
TType elementType(type, 0);
|
||||
return type.getOuterArraySize() * computeTypeXfbSize(elementType, containsDouble);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue