[Mesa-dev] [PATCH] glsl: Fix merging of layout(invocations) with other qualifiers

Ilia Mirkin imirkin at alum.mit.edu
Fri Jun 27 16:18:32 PDT 2014


On Fri, Jun 27, 2014 at 5:21 AM, Chris Forbes <chrisf at ijw.co.nz> wrote:
> If another layout qualifier appeared to the left of `invocations` in the
> GS input layout declaration, the invocation count would be dropped on
> the floor.
>
> Fixes the piglit test:
>
> spec/ARB_transform_feedback3/arb_transform_feedback3-ext_interleaved_two_bufs_gs_max
>
> Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
> Cc: Ilia Mirkin <imirkin at alum.mit.edu>

Tested-by: Ilia Mirkin <imirkin at alum.mit.edu>

Also fixes arb_gpu_shader5-invocation-id

> ---
>
> Note that the handling of the special rules for layout declarations in general is a bit of a disaster -- merge_in_qualifier tries to do the right thing, but merge_qualifier still ends up coming into play in various cases. It's probably better to dispose of the distinction within the parser, and disallow qualifiers appearing in the wrong contexts later. (This is what is already done to disallow layout-declaration-only qualifiers on variables)
>
>  src/glsl/ast_type.cpp | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>
> diff --git a/src/glsl/ast_type.cpp b/src/glsl/ast_type.cpp
> index 77053d5..ddd1f4e 100644
> --- a/src/glsl/ast_type.cpp
> +++ b/src/glsl/ast_type.cpp
> @@ -154,6 +154,16 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc,
>        this->max_vertices = q.max_vertices;
>     }
>
> +   if (q.flags.q.invocations) {
> +      if (this->flags.q.invocations && this->invocations != q.invocations) {
> +         _mesa_glsl_error(loc, state,
> +                          "geometry shader set conflicting invocations "
> +                          "(%d and %d)", this->invocations, q.invocations);
> +         return false;
> +      }
> +      this->invocations = q.invocations;
> +   }
> +
>     if ((q.flags.i & ubo_mat_mask.flags.i) != 0)
>        this->flags.i &= ~ubo_mat_mask.flags.i;
>     if ((q.flags.i & ubo_layout_mask.flags.i) != 0)
> --
> 2.0.0
>


More information about the mesa-dev mailing list