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