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

Pohjolainen, Topi topi.pohjolainen at intel.com
Thu Oct 24 15:38:35 CEST 2013


On Thu, Oct 24, 2013 at 03:38:49AM -0700, Paul Berry wrote:
>    On 24 October 2013 00:13, Pohjolainen, Topi <topi.pohjolainen at intel.com>
>    wrote:
> 
>      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.
> 
>    Oops.  I meant to say "...output from the last pipeline stage before the
>    fragment shader".  Is that clearer?
>    In other words, for now, it's the geometry shader (if present), and the
>    vertex shader otherwise.  But in the future, when we add tessellation
>    shaders, it'll be:
>    - the size of gl_ClipDistance output by the geometry shader, if present.
>    - Otherwise, the size of gl_ClipDistance output by the tessellation
>    evaluation shader, if present.
>    - Otherwise, the size of gl_ClipDistance output by the tessellation
>    control shader, if present.
>    - Otherwise, the size of gl_ClipDistance output by the vertex shader.

This makes perfect sense, thanks!

>     
> 
>      > +    */
>      > +   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