On Thu, Feb 6, 2014 at 6:28 PM, Jordan Justen <jordan.l.jus...@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.jus...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev