On Thu, 2014-06-12 at 08:32 +0200, Samuel Iglesias Gonsálvez wrote: > On Wed, 2014-06-11 at 15:29 -0700, Ian Romanick wrote: > > On 06/11/2014 12:49 AM, Iago Toral Quiroga wrote: > > > From: Samuel Iglesias Gonsalvez <sigles...@igalia.com> > > > > > > This implements parsing requirements for multi-stream support in > > > geometry shaders as defined in ARB_gpu_shader5. > > > > > > Signed-off-by: Samuel Iglesias Gonsalvez <sigles...@igalia.com> > > > --- > > > src/glsl/ast.h | 5 +++++ > > > src/glsl/ast_to_hir.cpp | 6 ++++++ > > > src/glsl/ast_type.cpp | 19 ++++++++++++++++++- > > > src/glsl/glsl_parser.yy | 45 > > > +++++++++++++++++++++++++++++++++++++++++++++ > > > src/glsl/ir.h | 5 +++++ > > > 5 files changed, 79 insertions(+), 1 deletion(-) > > > > > > diff --git a/src/glsl/ast.h b/src/glsl/ast.h > > > index 56e7bd8..823b1d2 100644 > > > --- a/src/glsl/ast.h > > > +++ b/src/glsl/ast.h > > > @@ -509,6 +509,8 @@ struct ast_type_qualifier { > > > /** \name Layout qualifiers for GL_ARB_gpu_shader5 */ > > > /** \{ */ > > > unsigned invocations:1; > > > + unsigned streamId:1; /* Has streamId value assigned */ > > > + unsigned explicit_streamId:1; /* streamId value assigned > > > explicitely by shader code */ > > > /** \} */ > > > } > > > /** \brief Set of flags, accessed by name. */ > > > @@ -542,6 +544,9 @@ struct ast_type_qualifier { > > > /** Maximum output vertices in GLSL 1.50 geometry shaders. */ > > > int max_vertices; > > > > > > + /** Stream ID in GLSL 1.50 geometry shaders. */ > > > + unsigned streamId; > > > + > > > /** Input or output primitive type in GLSL 1.50 geometry shaders */ > > > GLenum prim_type; > > > > > > diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp > > > index 140bb74..ab0f50f 100644 > > > --- a/src/glsl/ast_to_hir.cpp > > > +++ b/src/glsl/ast_to_hir.cpp > > > @@ -2426,6 +2426,11 @@ apply_type_qualifier_to_variable(const struct > > > ast_type_qualifier *qual, > > > if (qual->flags.q.sample) > > > var->data.sample = 1; > > > > > > + if (state->stage == MESA_SHADER_GEOMETRY && > > > + qual->flags.q.out && qual->flags.q.streamId) { > > > + var->data.streamId = qual->streamId; > > > + } > > > + > > > if (qual->flags.q.attribute && state->stage != MESA_SHADER_VERTEX) { > > > var->type = glsl_type::error_type; > > > _mesa_glsl_error(loc, state, > > > @@ -5455,6 +5460,7 @@ ast_interface_block::hir(exec_list *instructions, > > > var->data.centroid = fields[i].centroid; > > > var->data.sample = fields[i].sample; > > > var->init_interface_type(block_type); > > > + var->data.streamId = this->layout.streamId; > > > > > > if (redeclaring_per_vertex) { > > > ir_variable *earlier = > > > diff --git a/src/glsl/ast_type.cpp b/src/glsl/ast_type.cpp > > > index 0ee2c49..749f161 100644 > > > --- a/src/glsl/ast_type.cpp > > > +++ b/src/glsl/ast_type.cpp > > > @@ -125,9 +125,13 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc, > > > /* Uniform block layout qualifiers get to overwrite each > > > * other (rightmost having priority), while all other > > > * qualifiers currently don't allow duplicates. > > > + * > > > + * Geometry shaders can have several layout qualifiers > > > + * assigning different stream ID values. > > > */ > > > > > > - if ((this->flags.i & q.flags.i & ~(ubo_mat_mask.flags.i | > > > + if ((state->stage != MESA_SHADER_GEOMETRY) && > > > + (this->flags.i & q.flags.i & ~(ubo_mat_mask.flags.i | > > > ubo_layout_mask.flags.i | > > > ubo_binding_mask.flags.i)) != 0) { > > > > I think this will allow multiply layout(location=) qualifiers on > > geometry shader inputs / outputs. So... > > > > #version 150 > > #extension GL_ARB_separate_shader_objects: require > > > > layout(location=1) layout(location=2) in vec4 v; > > > > should generate an error, but I think this change will disable that error. > > > > OK, we will test it and modify the patch accordingly.
The tests show that there is still an error, but a previous one. With the original code the error messages are: * Compiling shader 2: shaders/shader.geom Error: 0:8(1): error: duplicate layout(...) qualifiers 0:8(1): error: duplicate layout qualifiers used While with the patch applied, the error message is: * Compiling shader 2: shaders/shader.geom Error: 0:8(1): error: duplicate layout(...) qualifiers If you prefer to have the "error: duplicate layout qualifiers used" error message enabled, please say that, so I can write a patch for it :-) I made more tests just in case: if "v" is defined two times with different location values, the error message is: * Compiling shader 2: shaders/shader.geom Error: 0:10(1): error: geometry shader inputs must be arrays 0:11(1): error: geometry shader inputs must be arrays 0:11(28): error: `v' redeclared Which reports the redeclaration of "v" input. Thanks, Sam
signature.asc
Description: This is a digitally signed message part
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev