On 14 November 2015 at 13:42, Timothy Arceri <t_arc...@yahoo.com.au> wrote: > From: Timothy Arceri <timothy.arc...@collabora.com> > > We are moving this out of the parser in preparation for compile > time constant support. > > The reason a validation function is used rather than an apply > function like what is used with bindings is because glsl allows > streams to be defined on members of blocks even though they must > match the stream thats associated with the current block, this > means we need access to the value after validation to do this > comparision. > --- > src/glsl/ast_to_hir.cpp | 44 +++++++++++++++++++++++++++++++++----------- > src/glsl/glsl_parser.yy | 11 ++--------- > 2 files changed, 35 insertions(+), 20 deletions(-) > > diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp > index 8705f6e..53faacf 100644 > --- a/src/glsl/ast_to_hir.cpp > +++ b/src/glsl/ast_to_hir.cpp > @@ -3034,7 +3034,11 @@ apply_layout_qualifier_to_variable(const struct > ast_type_qualifier *qual, > > if (state->stage == MESA_SHADER_GEOMETRY && > qual->flags.q.out && qual->flags.q.stream) { > - var->data.stream = qual->stream; > + unsigned qual_stream; > + if (process_qualifier_constant(state, loc, "stream", qual->stream, > + &qual_stream)) { > + var->data.stream = qual_stream; > + } > } > > if (var->type->contains_atomic()) { > @@ -6080,7 +6084,8 @@ ast_process_struct_or_iface_block_members(exec_list > *instructions, > enum glsl_matrix_layout > matrix_layout, > bool allow_reserved_names, > ir_variable_mode var_mode, > - ast_type_qualifier *layout) > + ast_type_qualifier *layout, > + unsigned block_stream) > { > unsigned decl_count = 0; > > @@ -6188,11 +6193,16 @@ ast_process_struct_or_iface_block_members(exec_list > *instructions, > * the specified stream must match the stream associated with the > * containing block." > */ > - if (qual->flags.q.explicit_stream && > - qual->stream != layout->stream) { > - _mesa_glsl_error(&loc, state, "stream layout qualifier on interface > " > - "block member does not match the interface block " > - "(%d vs %d)", qual->stream, layout->stream); > + if (qual->flags.q.explicit_stream) { > + unsigned qual_stream; > + if (process_qualifier_constant(state, &loc, "stream", > + qual->stream, &qual_stream) && > + qual_stream != block_stream) { > + _mesa_glsl_error(&loc, state, "stream layout qualifier on " > + "interface block member does not match " > + "the interface block (%d vs %d)", qual->stream, > + block_stream); > + } > } > > if (qual->flags.q.uniform && qual->has_interpolation()) { > @@ -6350,7 +6360,8 @@ ast_struct_specifier::hir(exec_list *instructions, > GLSL_MATRIX_LAYOUT_INHERITED, > false /* > allow_reserved_names */, > ir_var_auto, > - NULL); > + NULL, > + 0 /* for interface only */); > > validate_identifier(this->name, loc, state); > > @@ -6504,6 +6515,16 @@ ast_interface_block::hir(exec_list *instructions, > "Interface block sets both readonly and writeonly"); > } > > + unsigned qual_stream; > + if (!process_qualifier_constant(state, &loc, "stream", > this->layout.stream, > + &qual_stream)) { > + /* If the stream qualifier is invalid it doesn't make sense to continue > + * on and try to compare stream layouts on member variables agaist it > so typo "against".
-Emil _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev