Commit 7d626796 by Nicolas Capens

Implement support for layout qualifier locations.

Bug 19331817 Change-Id: I98c650311c6226bf769bc9f3c2eed8dac788a396 Reviewed-on: https://swiftshader-review.googlesource.com/2320Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent 2c1239f5
......@@ -119,6 +119,25 @@ enum TQualifier
EvqLast
};
struct TLayoutQualifier
{
static TLayoutQualifier create()
{
TLayoutQualifier layoutQualifier;
layoutQualifier.location = -1;
return layoutQualifier;
}
bool isEmpty() const
{
return location == -1;
}
int location;
};
//
// This is just for debug print out, carried along with the definitions above.
//
......
......@@ -1321,6 +1321,66 @@ TIntermTyped* TParseContext::addConstStruct(TString& identifier, TIntermTyped* n
return typedNode;
}
TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &qualifierType, const TSourceLoc& qualifierTypeLine)
{
TLayoutQualifier qualifier;
qualifier.location = -1;
if (qualifierType == "location")
{
error(qualifierTypeLine, "invalid layout qualifier", qualifierType.c_str(), "location requires an argument");
recover();
}
else
{
error(qualifierTypeLine, "invalid layout qualifier", qualifierType.c_str());
recover();
}
return qualifier;
}
TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &qualifierType, const TSourceLoc& qualifierTypeLine, const TString &intValueString, int intValue, const TSourceLoc& intValueLine)
{
TLayoutQualifier qualifier;
qualifier.location = -1;
if (qualifierType != "location")
{
error(qualifierTypeLine, "invalid layout qualifier", qualifierType.c_str(), "only location may have arguments");
recover();
}
else
{
// must check that location is non-negative
if (intValue < 0)
{
error(intValueLine, "out of range:", intValueString.c_str(), "location must be non-negative");
recover();
}
else
{
qualifier.location = intValue;
}
}
return qualifier;
}
TLayoutQualifier TParseContext::joinLayoutQualifiers(TLayoutQualifier leftQualifier, TLayoutQualifier rightQualifier)
{
TLayoutQualifier joinedQualifier = leftQualifier;
if (rightQualifier.location != -1)
{
joinedQualifier.location = rightQualifier.location;
}
return joinedQualifier;
}
bool TParseContext::enterStructDeclaration(int line, const TString& identifier)
{
++structNestingLevel;
......
......@@ -40,7 +40,7 @@ struct TParseContext {
functionReturnsValue(false),
checksPrecisionErrors(checksPrecErrors),
diagnostics(is),
shaderVersion(100),
shaderVersion(100),
directiveHandler(ext, diagnostics, shaderVersion),
preprocessor(&diagnostics, &directiveHandler),
scanner(NULL) { }
......@@ -124,6 +124,10 @@ struct TParseContext {
TIntermTyped* addConstArrayNode(int index, TIntermTyped* node, TSourceLoc line);
TIntermTyped* addConstStruct(TString& , TIntermTyped*, TSourceLoc);
TLayoutQualifier parseLayoutQualifier(const TString &qualifierType, const TSourceLoc& qualifierTypeLine);
TLayoutQualifier parseLayoutQualifier(const TString &qualifierType, const TSourceLoc& qualifierTypeLine, const TString &intValueString, int intValue, const TSourceLoc& intValueLine);
TLayoutQualifier joinLayoutQualifiers(TLayoutQualifier leftQualifier, TLayoutQualifier rightQualifier);
// Performs an error check for embedded struct declarations.
// Returns true if an error was raised due to the declaration of
// this struct.
......
......@@ -267,6 +267,7 @@ protected:
struct TPublicType
{
TBasicType type;
TLayoutQualifier layoutQualifier;
TQualifier qualifier;
TPrecision precision;
int size; // size of vector or matrix, not size of array
......@@ -279,6 +280,7 @@ struct TPublicType
void setBasic(TBasicType bt, TQualifier q, int ln = 0)
{
type = bt;
layoutQualifier = TLayoutQualifier::create();
qualifier = q;
precision = EbpUndefined;
size = 1;
......
......@@ -155,6 +155,8 @@ O [0-7]
"struct" { context->lexAfterType = true; return(STRUCT); }
"layout" { return ES2_identifier_ES3_keyword(context, LAYOUT); }
/* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */
"coherent" |
"restrict" |
......@@ -221,6 +223,17 @@ O [0-7]
return reserved_word(yyscanner);
}
/* Reserved keywords in GLSL ES 1.00 that are not reserved in GLSL ES 3.00 */
"packed" {
if (context->shaderVersion >= 300)
{
yylval->lex.string = NewPoolTString(yytext);
return check_type(yyscanner);
}
return reserved_word(yyscanner);
}
/* Reserved keywords */
"asm" |
......@@ -230,7 +243,6 @@ O [0-7]
"typedef" |
"template" |
"this" |
"packed" |
"goto" |
......
......@@ -71,6 +71,7 @@ WHICH GENERATES THE GLSL ES PARSER (glslang_tab.cpp AND glslang_tab.h).
union {
TPublicType type;
TPrecision precision;
TLayoutQualifier layoutQualifier;
TQualifier qualifier;
TFunction* function;
TParameter param;
......@@ -130,6 +131,7 @@ extern void yyerror(TParseContext* context, const char* reason);
%token <lex> STRUCT VOID_TYPE WHILE
%token <lex> SAMPLER2D SAMPLERCUBE SAMPLER_EXTERNAL_OES SAMPLER2DRECT
%token <lex> SAMPLER3D SAMPLER3DRECT SAMPLER2DSHADOW
%token <lex> LAYOUT
%token <lex> IDENTIFIER TYPE_NAME FLOATCONSTANT INTCONSTANT UINTCONSTANT BOOLCONSTANT
%token <lex> FIELD_SELECTION
......@@ -165,6 +167,7 @@ extern void yyerror(TParseContext* context, const char* reason);
%type <interm> parameter_declaration parameter_declarator parameter_type_specifier
%type <interm.qualifier> parameter_qualifier parameter_type_qualifier
%type <interm.layoutQualifier> layout_qualifier layout_qualifier_id_list layout_qualifier_id
%type <interm.precision> precision_qualifier
%type <interm.type> type_qualifier fully_specified_type type_specifier storage_qualifier
......@@ -1529,6 +1532,14 @@ type_qualifier
| storage_qualifier {
$$.setBasic(EbtVoid, $1.qualifier, $1.line);
}
| layout_qualifier {
$$.qualifier = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
$$.layoutQualifier = $1;
}
| layout_qualifier storage_qualifier {
$$.setBasic(EbtVoid, $2.qualifier, $2.line);
$$.layoutQualifier = $1;
}
;
storage_qualifier
......@@ -1595,6 +1606,34 @@ precision_qualifier
}
;
layout_qualifier
: LAYOUT LEFT_PAREN layout_qualifier_id_list RIGHT_PAREN {
ES3_ONLY("layout", $1.line);
$$ = $3;
}
;
layout_qualifier_id_list
: layout_qualifier_id {
$$ = $1;
}
| layout_qualifier_id_list COMMA layout_qualifier_id {
$$ = context->joinLayoutQualifiers($1, $3);
}
;
layout_qualifier_id
: IDENTIFIER {
$$ = context->parseLayoutQualifier(*$1.string, $1.line);
}
| IDENTIFIER EQUAL INTCONSTANT {
$$ = context->parseLayoutQualifier(*$1.string, $1.line, *$3.string, $3.i, $3.line);
}
| IDENTIFIER EQUAL UINTCONSTANT {
$$ = context->parseLayoutQualifier(*$1.string, $1.line, *$3.string, $3.i, $3.line);
}
;
type_specifier_no_prec
: type_specifier_nonarray {
$$ = $1;
......
......@@ -94,58 +94,59 @@
SAMPLER3D = 310,
SAMPLER3DRECT = 311,
SAMPLER2DSHADOW = 312,
IDENTIFIER = 313,
TYPE_NAME = 314,
FLOATCONSTANT = 315,
INTCONSTANT = 316,
UINTCONSTANT = 317,
BOOLCONSTANT = 318,
FIELD_SELECTION = 319,
LEFT_OP = 320,
RIGHT_OP = 321,
INC_OP = 322,
DEC_OP = 323,
LE_OP = 324,
GE_OP = 325,
EQ_OP = 326,
NE_OP = 327,
AND_OP = 328,
OR_OP = 329,
XOR_OP = 330,
MUL_ASSIGN = 331,
DIV_ASSIGN = 332,
ADD_ASSIGN = 333,
MOD_ASSIGN = 334,
LEFT_ASSIGN = 335,
RIGHT_ASSIGN = 336,
AND_ASSIGN = 337,
XOR_ASSIGN = 338,
OR_ASSIGN = 339,
SUB_ASSIGN = 340,
LEFT_PAREN = 341,
RIGHT_PAREN = 342,
LEFT_BRACKET = 343,
RIGHT_BRACKET = 344,
LEFT_BRACE = 345,
RIGHT_BRACE = 346,
DOT = 347,
COMMA = 348,
COLON = 349,
EQUAL = 350,
SEMICOLON = 351,
BANG = 352,
DASH = 353,
TILDE = 354,
PLUS = 355,
STAR = 356,
SLASH = 357,
PERCENT = 358,
LEFT_ANGLE = 359,
RIGHT_ANGLE = 360,
VERTICAL_BAR = 361,
CARET = 362,
AMPERSAND = 363,
QUESTION = 364
LAYOUT = 313,
IDENTIFIER = 314,
TYPE_NAME = 315,
FLOATCONSTANT = 316,
INTCONSTANT = 317,
UINTCONSTANT = 318,
BOOLCONSTANT = 319,
FIELD_SELECTION = 320,
LEFT_OP = 321,
RIGHT_OP = 322,
INC_OP = 323,
DEC_OP = 324,
LE_OP = 325,
GE_OP = 326,
EQ_OP = 327,
NE_OP = 328,
AND_OP = 329,
OR_OP = 330,
XOR_OP = 331,
MUL_ASSIGN = 332,
DIV_ASSIGN = 333,
ADD_ASSIGN = 334,
MOD_ASSIGN = 335,
LEFT_ASSIGN = 336,
RIGHT_ASSIGN = 337,
AND_ASSIGN = 338,
XOR_ASSIGN = 339,
OR_ASSIGN = 340,
SUB_ASSIGN = 341,
LEFT_PAREN = 342,
RIGHT_PAREN = 343,
LEFT_BRACKET = 344,
RIGHT_BRACKET = 345,
LEFT_BRACE = 346,
RIGHT_BRACE = 347,
DOT = 348,
COMMA = 349,
COLON = 350,
EQUAL = 351,
SEMICOLON = 352,
BANG = 353,
DASH = 354,
TILDE = 355,
PLUS = 356,
STAR = 357,
SLASH = 358,
PERCENT = 359,
LEFT_ANGLE = 360,
RIGHT_ANGLE = 361,
VERTICAL_BAR = 362,
CARET = 363,
AMPERSAND = 364,
QUESTION = 365
};
#endif
......@@ -179,6 +180,7 @@ typedef union YYSTYPE
union {
TPublicType type;
TPrecision precision;
TLayoutQualifier layoutQualifier;
TQualifier qualifier;
TFunction* function;
TParameter param;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment