On 14 December 2011 13:54, Marek Olšák <span dir="ltr">&lt;<a href="mailto:maraeo@gmail.com">maraeo@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">On Wed, Dec 7, 2011 at 8:09 PM, Paul Berry &lt;<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>&gt; wrote:<br>
&gt; This patch adds a new bit to the ctx-&gt;NewState bitfield,<br>
&gt; _NEW_TRANSFORM_FEEDBACK, to track state changes that affect<br>
&gt; ctx-&gt;TransformFeedback.  This bit can be used by driver back-ends to<br>
&gt; avoid expensive recomputations when transform feedback state has not<br>
&gt; been modified.<br>
&gt;<br>
&gt; Reviewed-by: Kenneth Graunke &lt;<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>&gt;<br>
&gt; ---<br>
&gt;  src/mesa/main/mtypes.h            |    1 +<br>
&gt;  src/mesa/main/transformfeedback.c |    9 ++++++++-<br>
&gt;  2 files changed, 9 insertions(+), 1 deletions(-)<br>
&gt;<br>
&gt; diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h<br>
&gt; index 33b00c6..fc494f7 100644<br>
&gt; --- a/src/mesa/main/mtypes.h<br>
&gt; +++ b/src/mesa/main/mtypes.h<br>
&gt; @@ -3051,6 +3051,7 @@ struct gl_matrix_stack<br>
&gt;  #define _NEW_PROGRAM_CONSTANTS (1 &lt;&lt; 27)<br>
&gt;  #define _NEW_BUFFER_OBJECT     (1 &lt;&lt; 28)<br>
&gt;  #define _NEW_FRAG_CLAMP        (1 &lt;&lt; 29)<br>
&gt; +#define _NEW_TRANSFORM_FEEDBACK (1 &lt;&lt; 30) /**&lt; gl_context::TransformFeedback */<br>
&gt;  #define _NEW_ALL ~0<br>
&gt;  /*@}*/<br>
&gt;<br>
&gt; diff --git a/src/mesa/main/transformfeedback.c b/src/mesa/main/transformfeedback.c<br>
&gt; index 11abd03..799245d 100644<br>
&gt; --- a/src/mesa/main/transformfeedback.c<br>
&gt; +++ b/src/mesa/main/transformfeedback.c<br>
&gt; @@ -376,6 +376,7 @@ _mesa_BeginTransformFeedback(GLenum mode)<br>
&gt;       return;<br>
&gt;    }<br>
&gt;<br>
&gt; +   FLUSH_VERTICES(ctx, _NEW_TRANSFORM_FEEDBACK);<br>
&gt;    obj-&gt;Active = GL_TRUE;<br>
&gt;    ctx-&gt;TransformFeedback.Mode = mode;<br>
&gt;<br>
&gt; @@ -398,6 +399,7 @@ _mesa_EndTransformFeedback(void)<br>
&gt;       return;<br>
&gt;    }<br>
&gt;<br>
&gt; +   FLUSH_VERTICES(ctx, _NEW_TRANSFORM_FEEDBACK);<br>
&gt;    ctx-&gt;TransformFeedback.CurrentObject-&gt;Active = GL_FALSE;<br>
&gt;<br>
&gt;    assert(ctx-&gt;Driver.EndTransformFeedback);<br>
&gt; @@ -415,6 +417,7 @@ bind_buffer_range(struct gl_context *ctx, GLuint index,<br>
&gt;  {<br>
&gt;    struct gl_transform_feedback_object *obj =<br>
&gt;       ctx-&gt;TransformFeedback.CurrentObject;<br>
&gt; +   FLUSH_VERTICES(ctx, _NEW_TRANSFORM_FEEDBACK);<br>
&gt;<br>
&gt;    /* The general binding point */<br>
&gt;    _mesa_reference_buffer_object(ctx,<br>
<br>
</div></div>Sorry for the late reply.<br>
<br>
There&#39;s no need to set _NEW_TRANSFORM_FEEDBACK in bind_buffer_range,<br>
because it&#39;s not allowed to change buffer bindings for an active TFB<br>
object. Buffer bindings can only be changed for inactive TFB objects.<br>
And because they&#39;re inactive, the drivers don&#39;t need to know about it.<br>
The TFB buffers are effectively bound through BeginTransformFeedback<br>
and unbound through EndTransformFeedback (likewise for Resume and<br>
Pause).<br>
<span class="HOEnZb"><font color="#888888"><br>
Marek<br>
</font></span></blockquote></div><br>Ah, you&#39;re right.  I missed this subtlety.  I&#39;ve already landed this patch, so I&#39;ll submit a follow-up patch that replaces the unnecessary calls to FLUSH_VERTICES() with comments explaining why a flush is unnecessary.<br>