On 10/04/2018 07:08 AM, asimiklit.w...@gmail.com wrote:
> From: Andrii Simiklit <andrii.simik...@globallogic.com>
> 
> GLSL 3.7 (Identifiers):
> "However, as noted in the specification, there are some cases where
> previously declared variables can be redeclared to change or add some
> property, and predeclared "gl_" names are allowed to be redeclared in a
> shader only for these specific purposes.  More generally, it is an error to
> redeclare a variable, including those starting "gl_"."
> 
> This patch should fix piglit tests:
> 'clip-distance-redeclare-without-inout.frag'
> 'clip-distance-redeclare-without-inout.vert'
> and leads to regression in clip-distance-out-values.shader_test
> but probably a fix should be made in the test.

I believe clip-distance-out-values.shader_test is incorrect.  The redeclaration 
of gl_ClipDistance should have "out".  glslang rejects it with:

ERROR: 0:5: 'redeclaration' : cannot change qualification of gl_ClipDistance
ERROR: 1 compilation errors.  No code generated.

I think Mark and Clayton would prefer it if the fix to the test landed first.  
That way the test never shows up as "fail" to them.

I'll send the fix for this with the new test cases that I mention below.

> As far as I understood following mailing thread:
> https://lists.freedesktop.org/archives/piglit/2013-October/007935.html
> looks like we have accepted to remove an ability to change qualifiers
> but have not done it yet. Unless I missed something)
> 
> Fixes: 8e6cb9fe51a2 "glsl: Refactor AST-to-HIR code handling variable
>                                        redeclarations"

While this is technically correct, I don't think we want to add a new compile 
error to the stable branches.  On the outside chance this breaks some 
application, I'd rather have it sit on master for a bit first.

> Signed-off-by: Andrii Simiklit <andrii.simik...@globallogic.com>
> ---
>  src/compiler/glsl/ast_to_hir.cpp | 13 +++++++++----
>  1 file changed, 9 insertions(+), 4 deletions(-)
> 
> diff --git a/src/compiler/glsl/ast_to_hir.cpp 
> b/src/compiler/glsl/ast_to_hir.cpp
> index 93e7c8ec33..e26ae6b92a 100644
> --- a/src/compiler/glsl/ast_to_hir.cpp
> +++ b/src/compiler/glsl/ast_to_hir.cpp
> @@ -4240,10 +4240,15 @@ get_variable_being_redeclared(ir_variable **var_ptr, 
> YYLTYPE loc,
>      */
>     if (earlier->type->is_unsized_array() && var->type->is_array()
>         && (var->type->fields.array == earlier->type->fields.array)) {
> -      /* FINISHME: This doesn't match the qualifiers on the two
> -       * FINISHME: declarations.  It's not 100% clear whether this is
> -       * FINISHME: required or not.
> -       */
> +
> +      if ((strcmp("gl_ClipDistance", var->name) == 0) &&

Hmm... this fixes the specific case mentioned in the old e-mail thread, but 
this could occur with any variable.  For example, I don't think this shader 
should compile, but it does:

    #version 110
    varying float x[];
    uniform float x[3];
    uniform int i;

    void main()
    {
        gl_Position = vec4(x[i]);
    }

Much to my surprise, glslang does not reject this shader.  It looks like 
glslang rejects anything that tries to change the storage qualifier on any 
built-in variable, but it seems to allow such changes on user-defined 
variables.  I think that's a bug in glslang.

Let's do this for now.

1. Change Mesa to reject any storage qualifier change on a built-in variable.  
This will match glslang.  We can do this by bringing the code by the comment 
"Allow verbatim redeclarations of built-in variables. Not explicitly valid, but 
some applications do it." up before the big if-then-else tree.  Around line 
4235 add something like:

   if (earlier->data.how_declared == ir_var_declared_implicitly) {
      /* Allow verbatim redeclarations of built-in variables. Not explicitly
       * valid, but some applications do it.
       */
      if (earlier->data.mode != var->data.mode &&
          !(earlier->data.mode == ir_var_system_value &&
            var->data.mode == ir_var_shader_in)) {
         _mesa_glsl_error(&loc, state,
                          "redeclaration cannot change qualification of `%s'",
                          var->name);
      }
   }

I changed the error message to be more similar to glslang.  I like that 
wording, but I'm flexible.

We'll also want to remove the other tests for this (which will be redundant 
after the above change).

2. Add a bunch of piglit tests to make sure we match glslang.  I've got a start 
on this, and I'll CC you on the patches when I send them.

3. I'll submit a GLSL spec bug to make sure cases like my example above are 
intended to be illegal.

4. Depending on the outcome of #3, update Mesa to match.

> +          earlier->data.mode != var->data.mode) {
> +         _mesa_glsl_error(&loc, state,
> +                          "redeclaration of '%s %s' with incorrect 
> qualifiers '%s'.",
> +                          mode_string(earlier),
> +                          var->name,
> +                          mode_string(var));
> +      }
>  
>        const int size = var->type->array_size();
>        check_builtin_array_max_size(var->name, size, loc, state);
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to