|
|
@@ -162,6 +162,7 @@ static void yyerror(YYLTYPE *loc, _mesa_glsl_parse_state *st, const char *msg) |
|
|
|
%type <node> simple_statement |
|
|
|
%type <n> precision_qualifier |
|
|
|
%type <type_qualifier> type_qualifier |
|
|
|
%type <type_qualifier> auxiliary_storage_qualifier |
|
|
|
%type <type_qualifier> storage_qualifier |
|
|
|
%type <type_qualifier> interpolation_qualifier |
|
|
|
%type <type_qualifier> layout_qualifier |
|
|
@@ -1325,6 +1326,7 @@ type_qualifier: |
|
|
|
memset(& $$, 0, sizeof($$)); |
|
|
|
$$.flags.q.invariant = 1; |
|
|
|
} |
|
|
|
| auxiliary_storage_qualifier |
|
|
|
| storage_qualifier |
|
|
|
| interpolation_qualifier |
|
|
|
| layout_qualifier |
|
|
@@ -1338,13 +1340,13 @@ type_qualifier: |
|
|
|
* In GLSL 4.20, these can be specified in any order. In earlier versions, |
|
|
|
* they appear in this order (see GLSL 1.50 section 4.7 & comments below): |
|
|
|
* |
|
|
|
* invariant interpolation storage precision ...or... |
|
|
|
* invariant interpolation auxiliary storage precision ...or... |
|
|
|
* layout storage precision |
|
|
|
* |
|
|
|
* Each qualifier's rule ensures that the accumulated qualifiers on the right |
|
|
|
* side don't contain any that must appear on the left hand side. |
|
|
|
* For example, when processing a storage qualifier, we check that there are |
|
|
|
* no interpolation, layout, or invariant qualifiers to the right. |
|
|
|
* no auxiliary, interpolation, layout, or invariant qualifiers to the right. |
|
|
|
*/ |
|
|
|
| INVARIANT type_qualifier |
|
|
|
{ |
|
|
@@ -1410,6 +1412,20 @@ type_qualifier: |
|
|
|
$$ = $1; |
|
|
|
$$.merge_qualifier(&@1, state, $2); |
|
|
|
} |
|
|
|
| auxiliary_storage_qualifier type_qualifier |
|
|
|
{ |
|
|
|
if ($2.has_auxiliary_storage()) { |
|
|
|
_mesa_glsl_error(&@1, state, |
|
|
|
"Duplicate auxiliary storage qualifier (centroid).\n"); |
|
|
|
} |
|
|
|
|
|
|
|
if ($2.flags.q.invariant || $2.has_interpolation() || $2.has_layout()) { |
|
|
|
_mesa_glsl_error(&@1, state, "Auxiliary storage qualifiers must come " |
|
|
|
"just before storage qualifiers.\n"); |
|
|
|
} |
|
|
|
$$ = $1; |
|
|
|
$$.flags.i |= $2.flags.i; |
|
|
|
} |
|
|
|
| storage_qualifier type_qualifier |
|
|
|
{ |
|
|
|
/* Section 4.3 of the GLSL 1.20 specification states: |
|
|
@@ -1420,9 +1436,11 @@ type_qualifier: |
|
|
|
_mesa_glsl_error(&@1, state, "Duplicate storage qualifier.\n"); |
|
|
|
|
|
|
|
if (!state->ARB_shading_language_420pack_enable && |
|
|
|
($2.flags.q.invariant || $2.has_interpolation() || $2.has_layout())) { |
|
|
|
($2.flags.q.invariant || $2.has_interpolation() || $2.has_layout() || |
|
|
|
$2.has_auxiliary_storage())) { |
|
|
|
_mesa_glsl_error(&@1, state, "Storage qualifiers must come after " |
|
|
|
"invariant, interpolation, and layout qualifiers.\n"); |
|
|
|
"invariant, interpolation, layout and auxiliary " |
|
|
|
"storage qualifiers.\n"); |
|
|
|
} |
|
|
|
|
|
|
|
$$ = $1; |
|
|
@@ -1441,6 +1459,14 @@ type_qualifier: |
|
|
|
} |
|
|
|
; |
|
|
|
|
|
|
|
auxiliary_storage_qualifier: |
|
|
|
CENTROID |
|
|
|
{ |
|
|
|
memset(& $$, 0, sizeof($$)); |
|
|
|
$$.flags.q.centroid = 1; |
|
|
|
} |
|
|
|
/* TODO: "sample" and "patch" also go here someday. */ |
|
|
|
|
|
|
|
storage_qualifier: |
|
|
|
CONST_TOK |
|
|
|
{ |
|
|
@@ -1457,12 +1483,6 @@ storage_qualifier: |
|
|
|
memset(& $$, 0, sizeof($$)); |
|
|
|
$$.flags.q.varying = 1; |
|
|
|
} |
|
|
|
| CENTROID VARYING |
|
|
|
{ |
|
|
|
memset(& $$, 0, sizeof($$)); |
|
|
|
$$.flags.q.centroid = 1; |
|
|
|
$$.flags.q.varying = 1; |
|
|
|
} |
|
|
|
| IN_TOK |
|
|
|
{ |
|
|
|
memset(& $$, 0, sizeof($$)); |
|
|
@@ -1473,16 +1493,6 @@ storage_qualifier: |
|
|
|
memset(& $$, 0, sizeof($$)); |
|
|
|
$$.flags.q.out = 1; |
|
|
|
} |
|
|
|
| CENTROID IN_TOK |
|
|
|
{ |
|
|
|
memset(& $$, 0, sizeof($$)); |
|
|
|
$$.flags.q.centroid = 1; $$.flags.q.in = 1; |
|
|
|
} |
|
|
|
| CENTROID OUT_TOK |
|
|
|
{ |
|
|
|
memset(& $$, 0, sizeof($$)); |
|
|
|
$$.flags.q.centroid = 1; $$.flags.q.out = 1; |
|
|
|
} |
|
|
|
| UNIFORM |
|
|
|
{ |
|
|
|
memset(& $$, 0, sizeof($$)); |