[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