Front-end: move to rational internal array-of-array interfaces and design. (A-of-A is not yet implemented though.)
This commit is contained in:
parent
dcab977055
commit
e0603a441e
17 changed files with 236 additions and 64 deletions
|
|
@ -3250,7 +3250,7 @@ void IdentifyBuiltIns(int version, EProfile profile, EShLanguage language, TSymb
|
|||
TPrecisionQualifier pq = profile == EEsProfile ? EpqMedium : EpqNone;
|
||||
TType fragData(EbtFloat, EvqFragColor, pq, 4);
|
||||
TArraySizes* arraySizes = new TArraySizes;
|
||||
arraySizes->setSize(resources.maxDrawBuffers);
|
||||
arraySizes->setOuterSize(resources.maxDrawBuffers);
|
||||
fragData.setArraySizes(arraySizes);
|
||||
symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData"), fragData));
|
||||
SpecialQualifier("gl_FragData", EvqFragColor, EbvFragData, symbolTable);
|
||||
|
|
|
|||
|
|
@ -2500,26 +2500,34 @@ void TParseContext::arrayUnsizedCheck(TSourceLoc loc, const TQualifier& qualifie
|
|||
arraySizeRequiredCheck(loc, size);
|
||||
}
|
||||
|
||||
void TParseContext::arrayDimError(TSourceLoc loc)
|
||||
void TParseContext::arrayOfArrayVersionCheck(TSourceLoc loc)
|
||||
{
|
||||
requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, "arrays of arrays");
|
||||
profileRequires(loc, ECoreProfile | ECompatibilityProfile, 430, nullptr, "arrays of arrays");
|
||||
profileRequires(loc, EEsProfile, 310, nullptr, "arrays of arrays");
|
||||
const char* feature = "arrays of arrays";
|
||||
|
||||
requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, feature);
|
||||
profileRequires(loc, EEsProfile, 310, nullptr, feature);
|
||||
profileRequires(loc, ECoreProfile | ECompatibilityProfile, 430, nullptr, feature);
|
||||
|
||||
static int once = false;
|
||||
if (! once) {
|
||||
warn(loc, feature, "Not supported yet.", "");
|
||||
once = true;
|
||||
}
|
||||
}
|
||||
|
||||
void TParseContext::arrayDimCheck(TSourceLoc loc, TArraySizes* sizes1, TArraySizes* sizes2)
|
||||
{
|
||||
if ((sizes1 && sizes2) ||
|
||||
(sizes1 && sizes1->isArrayOfArrays()) ||
|
||||
(sizes2 && sizes2->isArrayOfArrays()))
|
||||
arrayDimError(loc);
|
||||
(sizes1 && sizes1->getNumDims() > 1) ||
|
||||
(sizes2 && sizes2->getNumDims() > 1))
|
||||
arrayOfArrayVersionCheck(loc);
|
||||
}
|
||||
|
||||
void TParseContext::arrayDimCheck(TSourceLoc loc, const TType* type, TArraySizes* sizes2)
|
||||
{
|
||||
if ((type && type->isArray() && sizes2) ||
|
||||
(sizes2 && sizes2->isArrayOfArrays()))
|
||||
arrayDimError(loc);
|
||||
(sizes2 && sizes2->getNumDims() > 1))
|
||||
arrayOfArrayVersionCheck(loc);
|
||||
}
|
||||
|
||||
//
|
||||
|
|
@ -2913,12 +2921,12 @@ void TParseContext::redeclareBuiltinBlock(TSourceLoc loc, TTypeList& newTypeList
|
|||
if (type.isArray() != (arraySizes != 0))
|
||||
error(loc, "cannot change arrayness of redeclared block", blockName.c_str(), "");
|
||||
else if (type.isArray()) {
|
||||
if (type.isExplicitlySizedArray() && arraySizes->getSize() == 0)
|
||||
if (type.isExplicitlySizedArray() && arraySizes->getOuterSize() == 0)
|
||||
error(loc, "block already declared with size, can't redeclare as implicitly-sized", blockName.c_str(), "");
|
||||
else if (type.isExplicitlySizedArray() && type.getArraySize() != arraySizes->getSize())
|
||||
else if (type.isExplicitlySizedArray() && type.getArraySize() != arraySizes->getOuterSize())
|
||||
error(loc, "cannot change array size of redeclared block", blockName.c_str(), "");
|
||||
else if (type.isImplicitlySizedArray() && arraySizes->getSize() > 0)
|
||||
type.changeArraySize(arraySizes->getSize());
|
||||
else if (type.isImplicitlySizedArray() && arraySizes->getOuterSize() > 0)
|
||||
type.changeArraySize(arraySizes->getOuterSize());
|
||||
}
|
||||
|
||||
symbolTable.insert(*block);
|
||||
|
|
@ -4560,7 +4568,7 @@ void TParseContext::declareBlock(TSourceLoc loc, TTypeList& typeList, const TStr
|
|||
{
|
||||
blockStageIoCheck(loc, currentBlockQualifier);
|
||||
if (arraySizes)
|
||||
arrayUnsizedCheck(loc, currentBlockQualifier, arraySizes->getSize(), false);
|
||||
arrayUnsizedCheck(loc, currentBlockQualifier, arraySizes->getOuterSize(), false);
|
||||
arrayDimCheck(loc, arraySizes, 0);
|
||||
|
||||
// fix and check for member storage qualifiers and types that don't belong within a block
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ public:
|
|||
void arraySizeRequiredCheck(TSourceLoc, int size);
|
||||
void structArrayCheck(TSourceLoc, const TType& structure);
|
||||
void arrayUnsizedCheck(TSourceLoc, const TQualifier&, int size, bool initializer);
|
||||
void arrayDimError(TSourceLoc);
|
||||
void arrayOfArrayVersionCheck(TSourceLoc);
|
||||
void arrayDimCheck(TSourceLoc, TArraySizes* sizes1, TArraySizes* sizes2);
|
||||
void arrayDimCheck(TSourceLoc, const TType*, TArraySizes*);
|
||||
bool voidErrorCheck(TSourceLoc, const TString&, TBasicType);
|
||||
|
|
|
|||
|
|
@ -112,8 +112,8 @@ void TType::buildMangledName(TString& mangledName)
|
|||
if (arraySizes) {
|
||||
const int maxSize = 11;
|
||||
char buf[maxSize];
|
||||
for (int i = 0; i < (int)arraySizes->sizes.size(); ++i) {
|
||||
snprintf(buf, maxSize, "%d", arraySizes->sizes[i]);
|
||||
for (int i = 0; i < arraySizes->getNumDims(); ++i) {
|
||||
snprintf(buf, maxSize, "%d", (*arraySizes)[i]);
|
||||
mangledName += '[';
|
||||
mangledName += buf;
|
||||
mangledName += ']';
|
||||
|
|
|
|||
|
|
@ -795,7 +795,7 @@ function_header
|
|||
GetStorageQualifierString($1.qualifier.storage), "");
|
||||
}
|
||||
if ($1.arraySizes)
|
||||
parseContext.arraySizeRequiredCheck($1.loc, $1.arraySizes->getSize());
|
||||
parseContext.arraySizeRequiredCheck($1.loc, $1.arraySizes->getOuterSize());
|
||||
|
||||
// Add the function as a prototype after parsing it (we do not support recursion)
|
||||
TFunction *function;
|
||||
|
|
@ -811,7 +811,7 @@ parameter_declarator
|
|||
if ($1.arraySizes) {
|
||||
parseContext.profileRequires($1.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
|
||||
parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "arrayed type");
|
||||
parseContext.arraySizeRequiredCheck($1.loc, $1.arraySizes->getSize());
|
||||
parseContext.arraySizeRequiredCheck($1.loc, $1.arraySizes->getOuterSize());
|
||||
}
|
||||
if ($1.basicType == EbtVoid) {
|
||||
parseContext.error($2.loc, "illegal use of type 'void'", $2.string->c_str(), "");
|
||||
|
|
@ -826,11 +826,11 @@ parameter_declarator
|
|||
if ($1.arraySizes) {
|
||||
parseContext.profileRequires($1.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
|
||||
parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "arrayed type");
|
||||
parseContext.arraySizeRequiredCheck($1.loc, $1.arraySizes->getSize());
|
||||
parseContext.arraySizeRequiredCheck($1.loc, $1.arraySizes->getOuterSize());
|
||||
}
|
||||
parseContext.arrayDimCheck($2.loc, $1.arraySizes, $3.arraySizes);
|
||||
|
||||
parseContext.arraySizeRequiredCheck($3.loc, $3.arraySizes->getSize());
|
||||
parseContext.arraySizeRequiredCheck($3.loc, $3.arraySizes->getOuterSize());
|
||||
parseContext.reservedErrorCheck($2.loc, *$2.string);
|
||||
|
||||
$1.arraySizes = $3.arraySizes;
|
||||
|
|
@ -890,7 +890,7 @@ parameter_type_specifier
|
|||
TParameter param = { 0, new TType($1) };
|
||||
$$.param = param;
|
||||
if ($1.arraySizes)
|
||||
parseContext.arraySizeRequiredCheck($1.loc, $1.arraySizes->getSize());
|
||||
parseContext.arraySizeRequiredCheck($1.loc, $1.arraySizes->getOuterSize());
|
||||
}
|
||||
;
|
||||
|
||||
|
|
@ -1237,7 +1237,7 @@ array_specifier
|
|||
: LEFT_BRACKET RIGHT_BRACKET {
|
||||
$$.loc = $1.loc;
|
||||
$$.arraySizes = new TArraySizes;
|
||||
$$.arraySizes->setSize(0);
|
||||
$$.arraySizes->setOuterSize(0);
|
||||
}
|
||||
| LEFT_BRACKET constant_expression RIGHT_BRACKET {
|
||||
$$.loc = $1.loc;
|
||||
|
|
@ -1245,18 +1245,18 @@ array_specifier
|
|||
|
||||
int size;
|
||||
parseContext.arraySizeCheck($2->getLoc(), $2, size);
|
||||
$$.arraySizes->setSize(size);
|
||||
$$.arraySizes->setOuterSize(size);
|
||||
}
|
||||
| array_specifier LEFT_BRACKET RIGHT_BRACKET {
|
||||
$$ = $1;
|
||||
$$.arraySizes->setSize(0);
|
||||
$$.arraySizes->setOuterSize(0);
|
||||
}
|
||||
| array_specifier LEFT_BRACKET constant_expression RIGHT_BRACKET {
|
||||
$$ = $1;
|
||||
|
||||
int size;
|
||||
parseContext.arraySizeCheck($3->getLoc(), $3, size);
|
||||
$$.arraySizes->setSize(size);
|
||||
$$.arraySizes->setOuterSize(size);
|
||||
}
|
||||
;
|
||||
|
||||
|
|
@ -1959,7 +1959,7 @@ struct_declaration
|
|||
parseContext.profileRequires($1.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
|
||||
parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "arrayed type");
|
||||
if (parseContext.profile == EEsProfile)
|
||||
parseContext.arraySizeRequiredCheck($1.loc, $1.arraySizes->getSize());
|
||||
parseContext.arraySizeRequiredCheck($1.loc, $1.arraySizes->getOuterSize());
|
||||
}
|
||||
|
||||
$$ = $2;
|
||||
|
|
@ -1978,7 +1978,7 @@ struct_declaration
|
|||
parseContext.profileRequires($2.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
|
||||
parseContext.profileRequires($2.loc, EEsProfile, 300, 0, "arrayed type");
|
||||
if (parseContext.profile == EEsProfile)
|
||||
parseContext.arraySizeRequiredCheck($2.loc, $2.arraySizes->getSize());
|
||||
parseContext.arraySizeRequiredCheck($2.loc, $2.arraySizes->getOuterSize());
|
||||
}
|
||||
|
||||
$$ = $3;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue