I think you need to set this if *any* geometry shader in the program tries to use a nonzero stream. Currently it looks like the last shader wins.
On Wed, Jun 11, 2014 at 7:49 PM, Iago Toral Quiroga <ito...@igalia.com> wrote: > On Intel hardware when a geometry shader outputs GL_POINTS primitives we > only need to emit vertex control bits if it emits vertices to non-zero > streams, so use a flag to track this. > > This flag will be set to TRUE when a geometry shader calls EmitStreamVertex() > or EndStreamPrimitive() with a non-zero stream parameter in a later patch. > --- > src/glsl/glsl_parser_extras.cpp | 4 ++++ > src/glsl/glsl_parser_extras.h | 5 +++++ > src/glsl/linker.cpp | 4 ++++ > src/mesa/main/mtypes.h | 6 ++++++ > src/mesa/main/shaderapi.c | 1 + > src/mesa/main/shaderobj.c | 1 + > src/mesa/program/program.c | 1 + > 7 files changed, 22 insertions(+) > > diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp > index f3c5bd0..b2515e8 100644 > --- a/src/glsl/glsl_parser_extras.cpp > +++ b/src/glsl/glsl_parser_extras.cpp > @@ -1407,6 +1407,10 @@ set_shader_inout_layout(struct gl_shader *shader, > shader->Geom.Invocations = 0; > if (state->in_qualifier->flags.q.invocations) > shader->Geom.Invocations = state->in_qualifier->invocations; > + > + shader->Geom.UsesStreams = GL_FALSE; > + if (state->gs_uses_streams) > + shader->Geom.UsesStreams = GL_TRUE; > break; > > case MESA_SHADER_COMPUTE: > diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h > index 0416a9c..6610bd7 100644 > --- a/src/glsl/glsl_parser_extras.h > +++ b/src/glsl/glsl_parser_extras.h > @@ -447,6 +447,11 @@ struct _mesa_glsl_parse_state { > */ > unsigned gs_input_size; > > + /** > + * For geometry shaders, whether non-zero streams are used. > + */ > + bool gs_uses_streams; > + > bool early_fragment_tests; > > /** Atomic counter offsets by binding */ > diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp > index a43d230..7ff7694 100644 > --- a/src/glsl/linker.cpp > +++ b/src/glsl/linker.cpp > @@ -1349,6 +1349,8 @@ link_gs_inout_layout_qualifiers(struct > gl_shader_program *prog, > } > linked_shader->Geom.Invocations = shader->Geom.Invocations; > } > + > + linked_shader->Geom.UsesStreams = shader->Geom.UsesStreams; > } > > /* Just do the intrastage -> interstage propagation right now, > @@ -1380,6 +1382,8 @@ link_gs_inout_layout_qualifiers(struct > gl_shader_program *prog, > linked_shader->Geom.Invocations = 1; > > prog->Geom.Invocations = linked_shader->Geom.Invocations; > + > + prog->Geom.UsesStreams = linked_shader->Geom.UsesStreams; > } > > > diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h > index 69eb4fa..2519968 100644 > --- a/src/mesa/main/mtypes.h > +++ b/src/mesa/main/mtypes.h > @@ -2178,6 +2178,7 @@ struct gl_geometry_program > GL_TRIANGLES, or GL_TRIANGLES_ADJACENCY_ARB */ > GLenum OutputType; /**< GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP */ > GLboolean UsesEndPrimitive; > + GLboolean UsesStreams; > }; > > > @@ -2473,6 +2474,10 @@ struct gl_shader > * it's not set in this shader. > */ > GLenum OutputType; > + /** > + * Whether this geometry shader uses non-zero vertex streams > + */ > + GLboolean UsesStreams; > } Geom; > > /** > @@ -2681,6 +2686,7 @@ struct gl_shader_program > GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, > or > 0 if not present. */ > GLboolean UsesEndPrimitive; > + GLboolean UsesStreams; > } Geom; > > /** Vertex shader state */ > diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c > index 2ec2444..2bbef35 100644 > --- a/src/mesa/main/shaderapi.c > +++ b/src/mesa/main/shaderapi.c > @@ -1888,6 +1888,7 @@ _mesa_copy_linked_program_data(gl_shader_stage type, > dst_gp->OutputType = src->Geom.OutputType; > dst->UsesClipDistanceOut = src->Geom.UsesClipDistance; > dst_gp->UsesEndPrimitive = src->Geom.UsesEndPrimitive; > + dst_gp->UsesStreams = src->Geom.UsesStreams; > } > break; > case MESA_SHADER_FRAGMENT: { > diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c > index b0f0bfa..03db862 100644 > --- a/src/mesa/main/shaderobj.c > +++ b/src/mesa/main/shaderobj.c > @@ -248,6 +248,7 @@ _mesa_init_shader_program(struct gl_context *ctx, struct > gl_shader_program *prog > prog->Geom.VerticesOut = 0; > prog->Geom.InputType = GL_TRIANGLES; > prog->Geom.OutputType = GL_TRIANGLE_STRIP; > + prog->Geom.UsesStreams = GL_FALSE; > > prog->TransformFeedback.BufferMode = GL_INTERLEAVED_ATTRIBS; > > diff --git a/src/mesa/program/program.c b/src/mesa/program/program.c > index b7332fc..1263cea 100644 > --- a/src/mesa/program/program.c > +++ b/src/mesa/program/program.c > @@ -552,6 +552,7 @@ _mesa_clone_program(struct gl_context *ctx, const struct > gl_program *prog) > gpc->InputType = gp->InputType; > gpc->Invocations = gp->Invocations; > gpc->OutputType = gp->OutputType; > + gpc->UsesStreams = gp->UsesStreams; > } > break; > default: > -- > 1.9.1 > > _______________________________________________ > 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