[Mesa-dev] [PATCH 09/18] glsl: Store info about geometry shaders that emit vertices to non-zero streams.
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
Re: [Mesa-dev] [PATCH 09/18] glsl: Store info about geometry shaders that emit vertices to non-zero streams.
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