[Mesa-dev] [PATCH] glsl/linker: validate attribute aliasing before optimizations

Timothy Arceri tarceri at itsqueeze.com
Fri Oct 26 22:32:26 UTC 2018


On Fri, Oct 12, 2018, at 5:04 AM, Tapani Pälli wrote:
> Patch does a 'dry run' of assign_attribute_or_color_locations before
> optimizations to catch cases where we have aliasing of unused attributes
> which is forbidden by the GLSL ES 3.x specifications.
> 
> We need to run this pass before unused attributes may be removed and with
> attribute binding information from program, therefore we re-use existing
> pass in linker rather than attempt to write another one.
> 
> This fixes WebGL2 test 'gl-bindAttribLocation-aliasing-inactive' and
> Piglit test 'gles-3.0-attribute-aliasing'.
> 
> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106833
> ---
>  src/compiler/glsl/linker.cpp | 31 ++++++++++++++++++++++++++++---
>  1 file changed, 28 insertions(+), 3 deletions(-)
> 
> diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
> index 2f4c8860547..905d4b3cbed 100644
> --- a/src/compiler/glsl/linker.cpp
> +++ b/src/compiler/glsl/linker.cpp
> @@ -2709,7 +2709,8 @@ static bool
>  assign_attribute_or_color_locations(void *mem_ctx,
>                                      gl_shader_program *prog,
>                                      struct gl_constants *constants,
> -                                    unsigned target_index)
> +                                    unsigned target_index,
> +                                    bool do_assignment)
>  {
>     /* Maximum number of generic locations.  This corresponds to either the
>      * maximum number of draw buffers or the maximum number of generic
> @@ -3072,6 +3073,9 @@ assign_attribute_or_color_locations(void *mem_ctx,
>        num_attr++;
>     }
>  
> +   if (!do_assignment)
> +      return true;
> +
>     if (target_index == MESA_SHADER_VERTEX) {
>        unsigned total_attribs_size =
>           util_bitcount(used_locations & 
> SAFE_MASK_FROM_INDEX(max_index)) +
> @@ -4780,12 +4784,12 @@ link_varyings_and_uniforms(unsigned first, 
> unsigned last,
>     }
>  
>     if (!assign_attribute_or_color_locations(mem_ctx, prog, &ctx->Const,
> -                                            MESA_SHADER_VERTEX)) {
> +                                            MESA_SHADER_VERTEX, true)) {
>        return false;
>     }
>  
>     if (!assign_attribute_or_color_locations(mem_ctx, prog, &ctx->Const,
> -                                            MESA_SHADER_FRAGMENT)) {
> +                                            MESA_SHADER_FRAGMENT, true)) {
>        return false;
>     }
>  
> @@ -5162,6 +5166,27 @@ link_shaders(struct gl_context *ctx, struct 
> gl_shader_program *prog)
>           lower_tess_level(prog->_LinkedShaders[i]);
>        }
>  
> +      /* Section 13.46 (Vertex Attribute Aliasing) of the OpenGL ES 3.2
> +       * specification says:
> +       *
> +       *    "In general, the behavior of GLSL ES should not depend on 
> compiler
> +       *    optimizations which might be implementation-dependent. Name 
> matching
> +       *    rules in most languages, including C++ from which GLSL ES 
> is derived,
> +       *    are based on declarations rather than use.
> +       *
> +       *    RESOLUTION: The existence of aliasing is determined by 
> declarations
> +       *    present after preprocessing."
> +       *
> +       * Because of this rule, we do a 'dry-run' of attribute 
> assignment for
> +       * vertex shader inputs here.
> +       */
> +      if (i == MESA_SHADER_VERTEX) {

Can we please add a GLES check to the if above so we can skip this for desktop GL. 

Its a little unfortunate we need this patch but splitting assign_attribute_or_color_locations() in two would get messy so with the above change.

Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>


> +         if (!assign_attribute_or_color_locations(mem_ctx, prog, &ctx-
> >Const,
> +                                                  MESA_SHADER_VERTEX, 
> false)) {
> +            goto done;
> +         }
> +      }
> +
>        /* Call opts before lowering const arrays to uniforms so we can 
> const
>         * propagate any elements accessed directly.
>         */
> -- 
> 2.17.1
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list