[Mesa-dev] [PATCH v3 12/14] glsl: add support for complie-time constant expressions
Timothy Arceri
t_arceri at yahoo.com.au
Tue Nov 17 12:00:40 PST 2015
On Tue, 2015-11-17 at 19:02 +0000, Emil Velikov wrote:
> On 14 November 2015 at 13:42, Timothy Arceri <t_arceri at yahoo.com.au> wrote:
> > From: Timothy Arceri <timothy.arceri at collabora.com>
> >
> > This patch replaces the old interger constant qualifiers with either
> > the new ast_layout_expression type if the qualifier requires merging
> > or ast_expression if the qualifier can't have mulitple declarations
> > or if all but the newest qualifier is simply ignored.
> >
> > We also update the process_qualifier_constant() helper to be
> > similar to the one in the ast_layout_expression class, but in
> > this case it will be used to process the ast_expression qualifiers.
> >
> > Global shader layout qualifier validation is moved out of the parser
> > in this change as we now need to evaluate any constant expression
> > before doing the validation.
> > ---
> > src/glsl/ast.h | 33 +++++------
> > src/glsl/ast_to_hir.cpp | 126 ++++++++++++++++++++++++++++-------
> > -----
> > src/glsl/ast_type.cpp | 69 ++++++++--------------
> > src/glsl/glsl_parser.yy | 87 +++++++++------------------
> > src/glsl/glsl_parser_extras.cpp | 44 ++++++++++++--
> > 5 files changed, 195 insertions(+), 164 deletions(-)
> >
>
> > --- a/src/glsl/ast_to_hir.cpp
> > +++ b/src/glsl/ast_to_hir.cpp
>
> > @@ -4079,9 +4113,18 @@ ast_declarator_list::hir(exec_list *instructions,
> > */
> > if (decl_type && decl_type->contains_atomic()) {
> > if (type->qualifier.flags.q.explicit_binding &&
> > - type->qualifier.flags.q.explicit_offset)
> > - state->atomic_counter_offsets[type->qualifier.binding] =
> > - type->qualifier.offset;
> > + type->qualifier.flags.q.explicit_offset) {
> > + unsigned qual_binding;
> > + unsigned qual_offset;
> > + if (process_qualifier_constant(state, &loc, "binding",
> > + type->qualifier.binding,
> > + &qual_binding)
> > + && process_qualifier_constant(state, &loc, "offset",
> Nitpick: Please leave the && trailing on the previous line.
>
> > --- a/src/glsl/glsl_parser.yy
> > +++ b/src/glsl/glsl_parser.yy
>
> > /* Layout qualifiers for tessellation control shaders. */
> > if (match_layout_qualifier("vertices", $1, state) == 0) {
> > $$.flags.q.vertices = 1;
> > -
> > - if ($3 <= 0) {
> > - _mesa_glsl_error(& @3, state,
> > - "invalid vertices (%d) specified", $3);
> > - YYERROR;
> > - } else if ($3 > (int)state->Const.MaxPatchVertices) {
> > - _mesa_glsl_error(& @3, state,
> > - "vertices (%d) exceeds "
> > - "GL_MAX_PATCH_VERTICES", $3);
> > - YYERROR;
> > - } else {
> > - $$.vertices = $3;
> > - if (!state->ARB_tessellation_shader_enable &&
> > - !state->is_version(400, 0)) {
> > - _mesa_glsl_error(& @1, state,
> > - "vertices qualifier requires GLSL 4.00 or
> > "
> > - "ARB_tessellation_shader");
> > - }
> > + $$.vertices = new(ctx) ast_layout_expression(@1, $3);
> > + if (!state->ARB_tessellation_shader_enable &&
> > + !state->is_version(400, 0)) {
> > + _mesa_glsl_error(& @1, state,
> > + "vertices qualifier requires GLSL 4.00 or "
> > + "ARB_tessellation_shader");
> > }
> > }
> >
> > diff --git a/src/glsl/glsl_parser_extras.cpp
> > b/src/glsl/glsl_parser_extras.cpp
> > index 1678d89..2f870fc 100644
> > --- a/src/glsl/glsl_parser_extras.cpp
> > +++ b/src/glsl/glsl_parser_extras.cpp
> > @@ -1644,8 +1644,20 @@ set_shader_inout_layout(struct gl_shader *shader,
> > switch (shader->Stage) {
> > case MESA_SHADER_TESS_CTRL:
> > shader->TessCtrl.VerticesOut = 0;
> > - if (state->tcs_output_vertices_specified)
> > - shader->TessCtrl.VerticesOut = state->out_qualifier->vertices;
> > + if (state->tcs_output_vertices_specified) {
> > + unsigned vertices;
> > + if (state->out_qualifier->vertices->
> > + process_qualifier_constant(state, "vertices", &vertices,
> > + true)) {
> The existing code considering 0 an invalid amount, which afaict that
> is incorrect. Splitting that into a separate patch is an overkill,
> although mentioning it in the commit message is a (almost) must have
> imho.
Nope this is my bug thanks for spotting :) I'll fix this locally. I'm sure I
double checked all these before sending out. In this case I'm sure I changed
this value, maybe I changed it to the wrong value.
>
> -Emil
More information about the mesa-dev
mailing list