[Mesa-dev] [PATCH v4 3/9] glsl: parse invocations layout qualifier for ARB_gpu_shader5

Anuj Phogat anuj.phogat at gmail.com
Wed Feb 12 17:21:57 PST 2014


On Thu, Feb 6, 2014 at 6:28 PM, Jordan Justen <jordan.l.justen at intel.com> wrote:
> _mesa_glsl_parse_state in_qualifier->invocations will store the
> invocations count.
>
> v3:
>  * Use in_qualifier to allow the primitive to be specied
>    separately from the invocations count (merge_qualifiers)
>
> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
> ---
>  src/glsl/ast.h          | 10 +++++++++-
>  src/glsl/ast_type.cpp   | 23 +++++++++++++++++++++++
>  src/glsl/glsl_parser.yy | 23 +++++++++++++++++++++++
>  3 files changed, 55 insertions(+), 1 deletion(-)
>
> diff --git a/src/glsl/ast.h b/src/glsl/ast.h
> index 7f371c4..5e33b68 100644
> --- a/src/glsl/ast.h
> +++ b/src/glsl/ast.h
> @@ -466,17 +466,25 @@ struct ast_type_qualifier {
>            * local_size_x, and so on.
>            */
>           unsigned local_size:3;
> +
> +         /** \name Layout qualifiers for GL_ARB_gpu_shader5 */
> +         /** \{ */
> +         unsigned invocations:1;
> +         /** \} */
>        }
>        /** \brief Set of flags, accessed by name. */
>        q;
>
>        /** \brief Set of flags, accessed as a bitmask. */
> -      unsigned i;
> +      uint64_t i;
>     } flags;
>
>     /** Precision of the type (highp/medium/lowp). */
>     unsigned precision:2;
>
> +   /** Geometry shader invocations for GL_ARB_gpu_shader5. */
> +   int invocations;
> +
>     /**
>      * Location specified via GL_ARB_explicit_attrib_location layout
>      *
> diff --git a/src/glsl/ast_type.cpp b/src/glsl/ast_type.cpp
> index 72de2bf..3f1c6ca 100644
> --- a/src/glsl/ast_type.cpp
> +++ b/src/glsl/ast_type.cpp
> @@ -154,6 +154,17 @@ 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;
> +      this->flags.q.invocations = 1;
> +   }
> +
This error will never hit because another check above this code disallows
duplicate layout qualifiers.


>     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)
> @@ -228,6 +239,7 @@ ast_type_qualifier::merge_in_qualifier(YYLTYPE *loc,
>           !state->in_qualifier->flags.q.prim_type;
>
>        valid_in_mask.flags.q.prim_type = 1;
> +      valid_in_mask.flags.q.invocations = 1;
>        break;
>     case MESA_SHADER_COMPUTE:
>        create_cs_ast |=
> @@ -264,6 +276,17 @@ ast_type_qualifier::merge_in_qualifier(YYLTYPE *loc,
>        state->in_qualifier->prim_type = q.prim_type;
>     }
>
> +   if (this->flags.q.invocations &&
> +       q.flags.q.invocations &&
> +       this->invocations != q.invocations) {
> +      _mesa_glsl_error(loc, state,
> +                       "conflicting invocations counts specified");
> +      return false;
> +   } else if (q.flags.q.invocations) {
> +      this->flags.q.invocations = 1;
> +      this->invocations = q.invocations;
> +   }
> +
>     if (create_gs_ast) {
>        node = new(mem_ctx) ast_gs_input_layout(*loc, q.prim_type);
>     } else if (create_cs_ast) {
> diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
> index 621ea72..b55d12e 100644
> --- a/src/glsl/glsl_parser.yy
> +++ b/src/glsl/glsl_parser.yy
> @@ -1319,6 +1319,29 @@ layout_qualifier_id:
>           }
>        }
>
> +      if (match_layout_qualifier("invocations", $1, state) == 0) {
> +         $$.flags.q.invocations = 1;
> +
> +         if ($3 <= 0) {
> +            _mesa_glsl_error(& @3, state,
> +                             "invalid invocations %d specified", $3);
> +            YYERROR;
> +         } else if ($3 > MAX_GEOMETRY_SHADER_INVOCATIONS) {
> +            _mesa_glsl_error(& @3, state,
> +                             "invocations (%d) exceeds "
> +                             "GL_MAX_GEOMETRY_SHADER_INVOCATIONS", $3);
> +            YYERROR;
> +         } else {
> +            $$.invocations = $3;
> +            if (!state->is_version(400, 0) &&
> +                !state->ARB_gpu_shader5_enable) {
> +               _mesa_glsl_error(& @3, state,
> +                                "GL_ARB_gpu_shader5 invocations "
> +                                "qualifier specified", $3);
> +            }
> +         }
> +      }
> +
>        /* If the identifier didn't match any known layout identifiers,
>         * emit an error.
>         */
> --
> 1.9.rc1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list