소스 검색

glsl: Handle centroid qualifier ordering in C code, not the parser.

The GL_ARB_shading_language_420pack extension/GLSL 4.20 split centroid
off into a new category, "auxiliary storage qualifiers," and allow these
to be placed anywhere in the series.  So we have to stop recognizing
"centroid in"/"centroid out"/"centroid varying" in the grammar and get
more creative.

The same approach used before works here, too.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
tags/mesa-9.2-rc1
Kenneth Graunke 12 년 전
부모
커밋
b5d6c51e2b
1개의 변경된 파일30개의 추가작업 그리고 20개의 파일을 삭제
  1. 30
    20
      src/glsl/glsl_parser.yy

+ 30
- 20
src/glsl/glsl_parser.yy 파일 보기

@@ -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($$));

Loading…
취소
저장