[Mesa-dev] [PATCH/RFC] glsl: allow redeclaring variables as 'precise invariant'
Erik Faye-Lund
erik.faye-lund at collabora.com
Wed Aug 29 11:59:50 UTC 2018
Ping?
On on., aug. 22, 2018 at 7:34 PM, Erik Faye-Lund
<erik.faye-lund at collabora.com> wrote:
> There's seems to be nothing in the GLSL (ES) specifications that
> diallow
> redeclaring a variable as both 'precise' and 'invariant' in the same
> statement. But the way the parse-rules are structured this fails to
> parse, because this is handled in single_declaration, which has an
> exhaustive list of qualifiers here, and it does not include an option
> with both.
>
> So let's factor out the precise/invariant handling from the
> type_qualifier rule so we can reuse it, as there's some intricate
> subtleties here.
>
> For reference: glslangValidator already allows this.
>
> Signed-off-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
> ---
>
> My yacc/bison skills aren't all that, so I wouldn't be too surprised
> if
> this the wrong approach. This is why I'm posting this as an RFC. I'm
> hoping someone can tell me if this is the right kind of approach or
> not.
>
> This fixes a failure to compile a shader that appears in virgl after
> an invariant output has been lowered to precise TGSI-opcodes, and
> re-emitted GLSL for it (in virglrenderer). The problematic shader
> comes from
> dEQP-GLES2.functional.shaders.invariance.highp.subexpression_precision_lowp.
>
> src/compiler/glsl/glsl_parser.yy | 77
> +++++++++++++++-----------------
> 1 file changed, 36 insertions(+), 41 deletions(-)
>
> diff --git a/src/compiler/glsl/glsl_parser.yy
> b/src/compiler/glsl/glsl_parser.yy
> index cb7376995d..042e654a26 100644
> --- a/src/compiler/glsl/glsl_parser.yy
> +++ b/src/compiler/glsl/glsl_parser.yy
> @@ -187,6 +187,7 @@ static bool match_layout_qualifier(const char
> *s1, const char *s2,
> %type <node> statement_list
> %type <node> simple_statement
> %type <n> precision_qualifier
> +%type <type_qualifier> invariant_or_precise_qualifier
> %type <type_qualifier> type_qualifier
> %type <type_qualifier> auxiliary_storage_qualifier
> %type <type_qualifier> storage_qualifier
> @@ -1106,7 +1107,7 @@ single_declaration:
> $$->declarations.push_tail(&decl->link);
> state->symbols->add_variable(new(state) ir_variable(NULL, $2,
> ir_var_auto));
> }
> - | INVARIANT variable_identifier
> + | invariant_or_precise_qualifier variable_identifier
> {
> void *ctx = state->linalloc;
> ast_declaration *decl = new(ctx) ast_declaration($2, NULL,
> NULL);
> @@ -1114,19 +1115,8 @@ single_declaration:
>
> $$ = new(ctx) ast_declarator_list(NULL);
> $$->set_location_range(@1, @2);
> - $$->invariant = true;
> -
> - $$->declarations.push_tail(&decl->link);
> - }
> - | PRECISE variable_identifier
> - {
> - void *ctx = state->linalloc;
> - ast_declaration *decl = new(ctx) ast_declaration($2, NULL,
> NULL);
> - decl->set_location(@2);
> -
> - $$ = new(ctx) ast_declarator_list(NULL);
> - $$->set_location_range(@1, @2);
> - $$->precise = true;
> + $$->invariant = $1.flags.q.invariant;
> + $$->precise = $1.flags.q.precise;
>
> $$->declarations.push_tail(&decl->link);
> }
> @@ -1889,7 +1879,7 @@ interpolation_qualifier:
> }
> ;
>
> -type_qualifier:
> +invariant_or_precise_qualifier:
> /* Single qualifiers */
> INVARIANT
> {
> @@ -1901,31 +1891,7 @@ type_qualifier:
> memset(& $$, 0, sizeof($$));
> $$.flags.q.precise = 1;
> }
> - | auxiliary_storage_qualifier
> - | storage_qualifier
> - | interpolation_qualifier
> - | layout_qualifier
> - | memory_qualifier
> - | subroutine_qualifier
> - | precision_qualifier
> - {
> - memset(&$$, 0, sizeof($$));
> - $$.precision = $1;
> - }
> -
> - /* Multiple qualifiers:
> - * 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 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 auxiliary, interpolation, layout, invariant, or precise
> qualifiers to the right.
> - */
> - | PRECISE type_qualifier
> + | PRECISE invariant_or_precise_qualifier
> {
> if ($2.flags.q.precise)
> _mesa_glsl_error(&@1, state, "duplicate \"precise\"
> qualifier");
> @@ -1933,7 +1899,7 @@ type_qualifier:
> $$ = $2;
> $$.flags.q.precise = 1;
> }
> - | INVARIANT type_qualifier
> + | INVARIANT invariant_or_precise_qualifier
> {
> if ($2.flags.q.invariant)
> _mesa_glsl_error(&@1, state, "duplicate \"invariant\"
> qualifier");
> @@ -1958,6 +1924,35 @@ type_qualifier:
> if (state->is_version(430, 300) && $$.flags.q.in)
> _mesa_glsl_error(&@1, state, "invariant qualifiers cannot
> be used with shader inputs");
> }
> +
> +type_qualifier:
> + /* Single qualifiers */
> + invariant_or_precise_qualifier
> + | auxiliary_storage_qualifier
> + | storage_qualifier
> + | interpolation_qualifier
> + | layout_qualifier
> + | memory_qualifier
> + | subroutine_qualifier
> + | precision_qualifier
> + {
> + memset(&$$, 0, sizeof($$));
> + $$.precision = $1;
> + }
> +
> + /* Multiple qualifiers:
> + * 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 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 auxiliary, interpolation, layout, invariant, or precise
> qualifiers to the right.
> + */
> +
> | interpolation_qualifier type_qualifier
> {
> /* Section 4.3 of the GLSL 1.40 specification states:
> --
> 2.17.1
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180829/69bba023/attachment.html>
More information about the mesa-dev
mailing list