X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fglsl%2Fglsl_parser.ypp;h=be763ed9f03eb551139ec873b9a19f80cd9e517d;hb=5ff4cfb788291ef7c8d6412d65aee708b41bac86;hp=6d99c52503e66cdd2ce299b2ce8e5591d003daa5;hpb=bea3963f59fb8da0687c3e3fbc6f15de8be7fddb;p=mesa.git diff --git a/src/glsl/glsl_parser.ypp b/src/glsl/glsl_parser.ypp index 6d99c52503e..be763ed9f03 100644 --- a/src/glsl/glsl_parser.ypp +++ b/src/glsl/glsl_parser.ypp @@ -75,6 +75,11 @@ ast_node *cond; ast_expression *rest; } for_rest_statement; + + struct { + ast_node *then_statement; + ast_node *else_statement; + } selection_rest_statement; } %token ATTRIBUTE CONST_TOK BOOL_TOK FLOAT_TOK INT_TOK UINT_TOK @@ -130,13 +135,11 @@ %type statement %type statement_list %type simple_statement -%type statement_matched -%type statement_unmatched %type precision_qualifier %type type_qualifier %type storage_qualifier %type interpolation_qualifier -%type opt_layout_qualifier layout_qualifier +%type layout_qualifier %type layout_qualifier_id_list layout_qualifier_id %type type_specifier %type type_specifier_no_prec @@ -197,8 +200,8 @@ %type struct_declaration %type struct_declarator %type struct_declarator_list -%type selection_statement_matched -%type selection_statement_unmatched +%type selection_statement +%type selection_rest_statement %type iteration_statement %type condition %type conditionopt @@ -215,20 +218,17 @@ translation_unit: ; version_statement: - /* blank - no #version specified */ - { - state->language_version = 110; - state->symbols->language_version = 110; - } + /* blank - no #version specified: defaults are already set */ | VERSION INTCONSTANT EOL { switch ($2) { + case 100: + state->es_shader = true; case 110: case 120: case 130: /* FINISHME: Check against implementation support versions. */ state->language_version = $2; - state->symbols->language_version = $2; break; default: _mesa_glsl_error(& @2, state, "Shading language version" @@ -793,10 +793,25 @@ parameter_declaration: ; parameter_qualifier: - /* empty */ { $$.i = 0; } - | IN_TOK { $$.i = 0; $$.q.in = 1; } - | OUT_TOK { $$.i = 0; $$.q.out = 1; } - | INOUT_TOK { $$.i = 0; $$.q.in = 1; $$.q.out = 1; } + /* empty */ + { + memset(& $$, 0, sizeof($$)); + } + | IN_TOK + { + memset(& $$, 0, sizeof($$)); + $$.q.in = 1; + } + | OUT_TOK + { + memset(& $$, 0, sizeof($$)); + $$.q.out = 1; + } + | INOUT_TOK + { + memset(& $$, 0, sizeof($$)); + $$.q.in = 1; $$.q.out = 1; + } ; parameter_type_specifier: @@ -959,11 +974,6 @@ fully_specified_type: } ; -opt_layout_qualifier: - { $$.i = 0; } - | layout_qualifier - ; - layout_qualifier: LAYOUT_TOK '(' layout_qualifier_id_list ')' { @@ -982,11 +992,11 @@ layout_qualifier_id_list: layout_qualifier_id: IDENTIFIER { - $$.i = 0; + bool got_one = false; - if (state->ARB_fragment_coord_conventions_enable) { - bool got_one = false; + memset(& $$, 0, sizeof($$)); + if (state->ARB_fragment_coord_conventions_enable) { if (strcmp($1, "origin_upper_left") == 0) { got_one = true; $$.q.origin_upper_left = 1; @@ -994,58 +1004,124 @@ layout_qualifier_id: got_one = true; $$.q.pixel_center_integer = 1; } - - if (state->ARB_fragment_coord_conventions_warn && got_one) { - _mesa_glsl_warning(& @1, state, - "GL_ARB_fragment_coord_conventions layout " - "identifier `%s' used\n", $1); - } } /* If the identifier didn't match any known layout identifiers, * emit an error. */ - if ($$.i == 0) { + if (!got_one) { _mesa_glsl_error(& @1, state, "unrecognized layout identifier " "`%s'\n", $1); YYERROR; + } else if (state->ARB_fragment_coord_conventions_warn) { + _mesa_glsl_warning(& @1, state, + "GL_ARB_fragment_coord_conventions layout " + "identifier `%s' used\n", $1); } } ; interpolation_qualifier: - SMOOTH { $$.i = 0; $$.q.smooth = 1; } - | FLAT { $$.i = 0; $$.q.flat = 1; } - | NOPERSPECTIVE { $$.i = 0; $$.q.noperspective = 1; } + SMOOTH + { + memset(& $$, 0, sizeof($$)); + $$.q.smooth = 1; + } + | FLAT + { + memset(& $$, 0, sizeof($$)); + $$.q.flat = 1; + } + | NOPERSPECTIVE + { + memset(& $$, 0, sizeof($$)); + $$.q.noperspective = 1; + } ; parameter_type_qualifier: - CONST_TOK { $$.i = 0; $$.q.constant = 1; } + CONST_TOK + { + memset(& $$, 0, sizeof($$)); + $$.q.constant = 1; + } ; type_qualifier: storage_qualifier - | interpolation_qualifier type_qualifier + | layout_qualifier + | layout_qualifier storage_qualifier + { + $$.i = $1.i | $2.i; + } + | interpolation_qualifier + | interpolation_qualifier storage_qualifier { $$.i = $1.i | $2.i; } - | INVARIANT type_qualifier + | INVARIANT storage_qualifier { $$ = $2; $$.q.invariant = 1; } + | INVARIANT interpolation_qualifier storage_qualifier + { + $$.i = $2.i | $3.i; + $$.q.invariant = 1; + } + | INVARIANT + { + memset(& $$, 0, sizeof($$)); + $$.q.invariant = 1; + } ; storage_qualifier: - CONST_TOK { $$.i = 0; $$.q.constant = 1; } - | ATTRIBUTE { $$.i = 0; $$.q.attribute = 1; } - | opt_layout_qualifier VARYING { $$.i = $1.i; $$.q.varying = 1; } - | CENTROID VARYING { $$.i = 0; $$.q.centroid = 1; $$.q.varying = 1; } - | opt_layout_qualifier IN_TOK { $$.i = 0; $$.q.in = 1; } - | OUT_TOK { $$.i = 0; $$.q.out = 1; } - | CENTROID IN_TOK { $$.i = 0; $$.q.centroid = 1; $$.q.in = 1; } - | CENTROID OUT_TOK { $$.i = 0; $$.q.centroid = 1; $$.q.out = 1; } - | UNIFORM { $$.i = 0; $$.q.uniform = 1; } + CONST_TOK + { + memset(& $$, 0, sizeof($$)); + $$.q.constant = 1; + } + | ATTRIBUTE + { + memset(& $$, 0, sizeof($$)); + $$.q.attribute = 1; + } + | VARYING + { + memset(& $$, 0, sizeof($$)); + $$.q.varying = 1; + } + | CENTROID VARYING + { + memset(& $$, 0, sizeof($$)); + $$.q.centroid = 1; $$.q.varying = 1; + } + | IN_TOK + { + memset(& $$, 0, sizeof($$)); + $$.q.in = 1; + } + | OUT_TOK + { + memset(& $$, 0, sizeof($$)); + $$.q.out = 1; + } + | CENTROID IN_TOK + { + memset(& $$, 0, sizeof($$)); + $$.q.centroid = 1; $$.q.in = 1; + } + | CENTROID OUT_TOK + { + memset(& $$, 0, sizeof($$)); + $$.q.centroid = 1; $$.q.out = 1; + } + | UNIFORM + { + memset(& $$, 0, sizeof($$)); + $$.q.uniform = 1; + } ; type_specifier: @@ -1149,39 +1225,39 @@ basic_type_specifier_nonarray: ; precision_qualifier: - HIGHP { - if (state->language_version < 130) - _mesa_glsl_error(& @1, state, - "precision qualifier forbidden " - "in GLSL %d.%d (1.30 or later " - "required)\n", - state->language_version / 100, - state->language_version % 100); - - $$ = ast_precision_high; - } - | MEDIUMP { - if (state->language_version < 130) - _mesa_glsl_error(& @1, state, - "precision qualifier forbidden " - "in GLSL %d.%d (1.30 or later " - "required)\n", - state->language_version / 100, - state->language_version % 100); - - $$ = ast_precision_medium; - } - | LOWP { - if (state->language_version < 130) - _mesa_glsl_error(& @1, state, - "precision qualifier forbidden " - "in GLSL %d.%d (1.30 or later " - "required)\n", - state->language_version / 100, - state->language_version % 100); - - $$ = ast_precision_low; - } + HIGHP { + if (!state->es_shader && state->language_version < 130) + _mesa_glsl_error(& @1, state, + "precision qualifier forbidden " + "in GLSL %d.%d (1.30 or later " + "required)\n", + state->language_version / 100, + state->language_version % 100); + + $$ = ast_precision_high; + } + | MEDIUMP { + if (!state->es_shader && state->language_version < 130) + _mesa_glsl_error(& @1, state, + "precision qualifier forbidden " + "in GLSL %d.%d (1.30 or later " + "required)\n", + state->language_version / 100, + state->language_version % 100); + + $$ = ast_precision_medium; + } + | LOWP { + if (!state->es_shader && state->language_version < 130) + _mesa_glsl_error(& @1, state, + "precision qualifier forbidden " + "in GLSL %d.%d (1.30 or later " + "required)\n", + state->language_version / 100, + state->language_version % 100); + + $$ = ast_precision_low; + } ; struct_specifier: @@ -1266,23 +1342,14 @@ declaration_statement: // Grammar Note: labeled statements for SWITCH only; 'goto' is not // supported. statement: - statement_matched - | statement_unmatched - ; - -statement_matched: compound_statement { $$ = (ast_node *) $1; } | simple_statement ; -statement_unmatched: - selection_statement_unmatched - ; - simple_statement: declaration_statement | expression_statement - | selection_statement_matched + | selection_statement | switch_statement { $$ = NULL; } | case_label { $$ = NULL; } | iteration_statement @@ -1361,33 +1428,25 @@ expression_statement: } ; -selection_statement_matched: - IF '(' expression ')' statement_matched ELSE statement_matched +selection_statement: + IF '(' expression ')' selection_rest_statement { - void *ctx = state; - $$ = new(ctx) ast_selection_statement($3, $5, $7); + $$ = new(state) ast_selection_statement($3, $5.then_statement, + $5.else_statement); $$->set_location(yylloc); } ; -selection_statement_unmatched: - IF '(' expression ')' statement_matched +selection_rest_statement: + statement ELSE statement { - void *ctx = state; - $$ = new(ctx) ast_selection_statement($3, $5, NULL); - $$->set_location(yylloc); - } - | IF '(' expression ')' statement_unmatched - { - void *ctx = state; - $$ = new(ctx) ast_selection_statement($3, $5, NULL); - $$->set_location(yylloc); + $$.then_statement = $1; + $$.else_statement = $3; } - | IF '(' expression ')' statement_matched ELSE statement_unmatched + | statement { - void *ctx = state; - $$ = new(ctx) ast_selection_statement($3, $5, $7); - $$->set_location(yylloc); + $$.then_statement = $1; + $$.else_statement = NULL; } ;