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

2014-06-11 Thread Iago Toral Quiroga
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.

2014-06-11 Thread Chris Forbes
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