[Mesa-dev] [PATCH 09/18] glsl: Store info about geometry shaders that emit vertices to non-zero streams.

Iago Toral Quiroga itoral at igalia.com
Wed Jun 11 00:49:32 PDT 2014


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



More information about the mesa-dev mailing list