diff options
author | Ian Romanick <ian.d.romanick@intel.com> | 2010-06-07 18:55:41 -0700 |
---|---|---|
committer | Ian Romanick <ian.d.romanick@intel.com> | 2010-06-07 18:56:16 -0700 |
commit | 9bcb67bdc4d3f6aee9ef577266aebca85fcfb44f (patch) | |
tree | c0bc855f7a4f6c276550d05178c047d16a887f2d | |
parent | 15d162d7b1ebe09b0bdaf43194529f9ef995c623 (diff) |
Fix parsing of precision qualifiers
This causes the following tests to pass:
glslparsertest/glsl2/precision-02.vert
glslparsertest/glsl2/precision-04.vert
glslparsertest/glsl2/precision-06.vert
This causes the following test to fail. This shader was previously
failing to compile, but it was failing for the wrong reasons.
glslparsertest/glsl2/precision-03.vert
-rw-r--r-- | glsl_parser.ypp | 52 |
1 files changed, 45 insertions, 7 deletions
diff --git a/glsl_parser.ypp b/glsl_parser.ypp index a2ce2af877..4de1ec9591 100644 --- a/glsl_parser.ypp +++ b/glsl_parser.ypp @@ -94,7 +94,7 @@ %token MOD_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN XOR_ASSIGN OR_ASSIGN %token SUB_ASSIGN %token INVARIANT -%token HIGH_PRECISION MEDIUM_PRECISION LOW_PRECISION PRECISION +%token LOWP MEDIUMP HIGHP PRECISION %token VERSION EXTENSION LINE PRAGMA COLON EOL INTERFACE OUTPUT @@ -105,7 +105,7 @@ %token LONG SHORT DOUBLE HALF FIXED UNSIGNED INPUT OUPTUT %token HVEC2 HVEC3 HVEC4 DVEC2 DVEC3 DVEC4 FVEC2 FVEC3 FVEC4 %token SAMPLER2DRECT SAMPLER3DRECT SAMPLER2DRECTSHADOW -%token SIZEOF CAST NAMESPACE USING LOWP MEDIUMP HIGHP +%token SIZEOF CAST NAMESPACE USING %type <identifier> variable_identifier %type <node> statement @@ -234,11 +234,19 @@ extension_statement: external_declaration_list: external_declaration { - state->translation_unit.push_tail(& $1->link); + /* FINISHME: The NULL test is only required because 'precision' + * FINISHME: statements are not yet supported. + */ + if ($1 != NULL) + state->translation_unit.push_tail(& $1->link); } | external_declaration_list external_declaration { - state->translation_unit.push_tail(& $2->link); + /* FINISHME: The NULL test is only required because 'precision' + * FINISHME: statements are not yet supported. + */ + if ($2 != NULL) + state->translation_unit.push_tail(& $2->link); } ; @@ -999,9 +1007,39 @@ basic_type_specifier_nonarray: ; precision_qualifier: - HIGH_PRECISION { $$ = ast_precision_high; } - | MEDIUM_PRECISION { $$ = ast_precision_medium; } - | LOW_PRECISION { $$ = ast_precision_low; } + HIGHP { + if (state->language_version < 130) + _mesa_glsl_error(& @1, state, + "precission 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, + "precission 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, + "precission 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: |