[Mesa-dev] [PATCH] glsl/gs: Fix transform feedback of gl_ClipDistance.

Pohjolainen, Topi topi.pohjolainen at intel.com
Thu Oct 24 09:13:17 CEST 2013


On Wed, Oct 23, 2013 at 01:08:42PM -0700, Paul Berry wrote:
> Since gl_ClipDistance is lowered from an array of floats to an array
> of vec4's during compilation, transform feedback has special logic to
> keep track of the pre-lowered array size so that attempting to perform
> transform feedback on gl_ClipDistance produces a result with the
> correct size.
> 
> Previously, this special logic always consulted the vertex shader's
> size for gl_ClipDistance.  This patch fixes it so that it uses the
> geometry shader's size for gl_ClipDistance when a geometry shader is
> in use.
> 
> Fixes piglit test spec/glsl-1.50/transform-feedback-type-and-size.
> ---
>  src/glsl/link_varyings.cpp | 2 +-
>  src/glsl/linker.cpp        | 2 ++
>  src/mesa/main/mtypes.h     | 6 ++++++
>  3 files changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp
> index 4ba6d8a..c503645 100644
> --- a/src/glsl/link_varyings.cpp
> +++ b/src/glsl/link_varyings.cpp
> @@ -328,7 +328,7 @@ tfeedback_decl::assign_location(struct gl_context *ctx,
>        const unsigned vector_elements =
>           this->matched_candidate->type->fields.array->vector_elements;
>        unsigned actual_array_size = this->is_clip_distance_mesa ?
> -         prog->Vert.ClipDistanceArraySize :
> +         prog->LastClipDistanceArraySize :
>           this->matched_candidate->type->array_size();
>  
>        if (this->is_subscripted) {
> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
> index b23c31a..d8f655c 100644
> --- a/src/glsl/linker.cpp
> +++ b/src/glsl/linker.cpp
> @@ -2100,6 +2100,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
>        validate_vertex_shader_executable(prog, sh);
>        if (!prog->LinkStatus)
>  	 goto done;
> +      prog->LastClipDistanceArraySize = prog->Vert.ClipDistanceArraySize;
>  
>        _mesa_reference_shader(ctx, &prog->_LinkedShaders[MESA_SHADER_VERTEX],
>  			     sh);
> @@ -2132,6 +2133,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
>        validate_geometry_shader_executable(prog, sh);
>        if (!prog->LinkStatus)
>  	 goto done;
> +      prog->LastClipDistanceArraySize = prog->Geom.ClipDistanceArraySize;
>  
>        _mesa_reference_shader(ctx, &prog->_LinkedShaders[MESA_SHADER_GEOMETRY],
>  			     sh);
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 6374e8c..bc7dea4 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -2476,6 +2476,12 @@ struct gl_shader_program
>     unsigned NumUserUniformStorage;
>     struct gl_uniform_storage *UniformStorage;
>  
> +   /**
> +    * Size of the gl_ClipDistance array that is output from the last pipeline
> +    * stage before the geometry shader.

Can you explain the "before the geometry shader" part? This is used by the
transform feedback mechanism and hence represents the size of the varying output
by the geometry shader (if present of course), right? This comment in turn
refers to the varying output by vertex shader and _read_ by geometry shader.

> +    */
> +   GLuint LastClipDistanceArraySize;
> +
>     struct gl_uniform_block *UniformBlocks;
>     unsigned NumUniformBlocks;
>  
> -- 
> 1.8.4.1
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list