[Mesa-dev] [PATCH 1/2] mesa: Ensure that transform feedback refers to the correct program.

Kenneth Graunke kenneth at whitecape.org
Wed Jan 22 08:20:33 PST 2014


On 01/22/2014 06:07 AM, Paul Berry wrote:
> Previous to this patch, the _mesa_{Begin,Resume}TransformFeedback
> functions were using ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX] to
> find the program that would be the source of transform feedback data.
> This isn't correct--if there's a geometry shader present it should be
> ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY].  (These might be
> different if separate shader objects are in use).
> 
> This patch creates a function get_xfb_source(), which figures out the
> correct program to use based on GL state, and updates
> _mesa_{Begin,Resume}TransformFeedback to call it.  get_xfb_source() is
> written in terms of the gl_shader_stage enum, so it should not need
> modification when we add tessellation shaders in the future.  It also
> creates a new driver flag, NewTransformFeedbackProg, which is flagged
> whenever this program changes.
> 
> To reduce future confusion, this patch also rewords some comments and
> error message text to avoid referring to vertex shaders.
> ---
>  src/mesa/main/mtypes.h            |  8 ++++--
>  src/mesa/main/transformfeedback.c | 52 +++++++++++++++++++++++++++++----------
>  2 files changed, 45 insertions(+), 15 deletions(-)
> 
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 3dd9678..7fd3298 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -1815,8 +1815,9 @@ struct gl_transform_feedback_object
>  
>     /**
>      * The shader program active when BeginTransformFeedback() was called.
> -    * When active and unpaused, this equals
> -    * ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX].
> +    * When active and unpaused, this equals ctx->Shader.CurrentProgram[stage],
> +    * where stage is the pipeline stage that is the source of data for
> +    * transform feedback.
>      */
>     struct gl_shader_program *shader_program;
>  
> @@ -3779,6 +3780,9 @@ struct gl_driver_flags
>     /** gl_context::TransformFeedback::CurrentObject */
>     GLbitfield NewTransformFeedback;
>  
> +   /** gl_context::TransformFeedback::CurrentObject::shader_program */
> +   GLbitfield NewTransformFeedbackProg;
> +
>     /** gl_context::RasterDiscard */
>     GLbitfield NewRasterizerDiscard;
>  
> diff --git a/src/mesa/main/transformfeedback.c b/src/mesa/main/transformfeedback.c
> index 74897ba..9376a9e 100644
> --- a/src/mesa/main/transformfeedback.c
> +++ b/src/mesa/main/transformfeedback.c
> @@ -24,7 +24,7 @@
>  
>  
>  /*
> - * Vertex transform feedback support.
> + * Transform feedback support.
>   *
>   * Authors:
>   *   Brian Paul
> @@ -376,25 +376,48 @@ _mesa_compute_max_transform_feedback_vertices(
>   **/
>  
>  
> +/**
> + * Figure out which stage of the pipeline is the source of transform feedback
> + * data given the current context state, and return its gl_shader_program.
> + *
> + * If no active program can generate transform feedback data (i.e. no vertex
> + * shader is active), returns NULL.
> + */
> +static struct gl_shader_program *
> +get_xfb_source(struct gl_context *ctx)
> +{
> +   int i;
> +   for (i = MESA_SHADER_FRAGMENT - 1; i >= MESA_SHADER_VERTEX; i--) {

I think this would be clearer as:

for (i = MESA_SHADER_GEOMETRY; i >= MESA_SHADER_VERTEX; i--) {
   ...
}

Note that the pipeline ordering is:
Vertex -> Tess. Control -> Tess. Eval -> Geometry -> Transform Feedback
(http://www.opengl.org/wiki/Rendering_Pipeline_Overview)

So either implementation would work even with tessellation shaders.

Either way, this series is:
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
Cc: 10.0 <mesa-stable at lists.freedesktop.org>

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140122/2f30b96c/attachment-0001.pgp>


More information about the mesa-dev mailing list