[Mesa-dev] [PATCH 3/9] glsl: During linking, record whether a GS uses EndPrimitive().

Kenneth Graunke kenneth at whitecape.org
Mon Sep 9 16:35:11 PDT 2013


On 09/09/2013 08:20 AM, Paul Berry wrote:
> This information will be useful in the i965 back end, since we can
> save some compilation effort if we know from the outset that the
> shader never calls EndPrimitive().
> ---
>  src/glsl/linker.cpp       | 31 +++++++++++++++++++++++++++++++
>  src/mesa/main/mtypes.h    |  2 ++
>  src/mesa/main/shaderapi.c |  1 +
>  3 files changed, 34 insertions(+)
> 
> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
> index 8430096..f10303e 100644
> --- a/src/glsl/linker.cpp
> +++ b/src/glsl/linker.cpp
> @@ -249,6 +249,33 @@ public:
>  };
>  
>  
> +/**
> + * Visitor that determines whether or not a shader uses ir_end_primitive.
> + */
> +class find_end_primitive_visitor : public ir_hierarchical_visitor {
> +public:
> +   find_end_primitive_visitor()
> +      : found(false)
> +   {
> +      /* empty */
> +   }
> +
> +   virtual ir_visitor_status visit(ir_end_primitive *)
> +   {
> +      found = true;
> +      return visit_stop;
> +   }
> +
> +   bool end_primitive_found()
> +   {
> +      return found;
> +   }
> +
> +private:
> +   bool found;
> +};
> +
> +
>  void
>  linker_error(gl_shader_program *prog, const char *fmt, ...)
>  {
> @@ -517,6 +544,10 @@ validate_geometry_shader_executable(struct gl_shader_program *prog,
>  
>     analyze_clip_usage("geometry", prog, shader, &prog->Geom.UsesClipDistance,
>                        &prog->Geom.ClipDistanceArraySize);
> +
> +   find_end_primitive_visitor end_primitive;
> +   end_primitive.run(shader->ir);
> +   prog->Geom.UsesEndPrimitive = end_primitive.end_primitive_found();
>  }
>  
>  
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index ef16c59..18a6f66 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -1931,6 +1931,7 @@ struct gl_geometry_program
>                             GL_TRIANGLES, or GL_TRIANGLES_ADJACENCY_ARB */
>     GLenum OutputType; /**< GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP */
>     GLboolean UsesClipDistance;
> +   GLboolean UsesEndPrimitive;
>  };
>  
>  
> @@ -2364,6 +2365,7 @@ struct gl_shader_program
>        GLboolean UsesClipDistance;
>        GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
>                                           0 if not present. */
> +      GLboolean UsesEndPrimitive;
>     } Geom;
>  
>     /** Vertex shader state */
> diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
> index 4fe9d9c..a2386fb 100644
> --- a/src/mesa/main/shaderapi.c
> +++ b/src/mesa/main/shaderapi.c
> @@ -1872,6 +1872,7 @@ _mesa_copy_linked_program_data(gl_shader_type type,
>        dst_gp->InputType = src->Geom.InputType;
>        dst_gp->OutputType = src->Geom.OutputType;
>        dst_gp->UsesClipDistance = src->Geom.UsesClipDistance;
> +      dst_gp->UsesEndPrimitive = src->Geom.UsesEndPrimitive;
>     }
>        break;
>     default:
> 

We set some similar flags in ir_set_program_inouts.  Specifically, I'm
thinking about UsesDFdy.  someday, it might be nice to consolidate all
the "Does the shader use X?" flags in one place.

I'm fine with your code as is, though.  Progress.


More information about the mesa-dev mailing list