On 14 December 2011 02:59, Kenneth Graunke <span dir="ltr">&lt;<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</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="im">On 12/13/2011 03:35 PM, Paul Berry wrote:<br>
&gt; Previous to this patch, the function intel_batchbuffer_emit_mi_flush()<br>
&gt; was a bit of a misnomer.  On Gen4+, when not using the blit engine, it<br>
&gt; didn&#39;t actually flush the pipeline--it simply generated a<br>
&gt; _3DSTATE_PIPE_CONTROL command with the necessary bits set to flush GPU<br>
<br>
</div>It&#39;s actually just called &quot;PIPE_CONTROL&quot;, never 3DSTATE_PIPE_CONTROL.<br></blockquote><div><br>(Checks the docs).  Hmm, you&#39;re right.  For some reason we call it _3DSTATE_PIPE_CONTROL in our #defines (see intel_reg.h).  Still, it seems better for the commit message to match the documentation.  I&#39;ll change the commit message.<br>
 </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div class="im"><br>
&gt; caches.  This was usually sufficient, since in most situations where<br>
&gt; intel_batchbuffer_emit_mi_flush() wass called, all we really care<br>
<br>
</div>&quot;... was called, all we really cared&quot; (typo, tense)<br></blockquote><div><br>Heh, oops.<br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<br>
This makes a lot of sense.  At some point, I think we ought to convert<br>
some of the callers of this function to emit the proper PIPE_CONTROL<br>
directly (with only the necessary bits and workarounds).  But this is<br>
the right way to start.  Nice work figuring this out.<br></blockquote><div><br>Agreed.  As my CS professor Bob Keller once said, &quot;get it right first, then make it fast.&quot;<br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<br>
Reviewed-by: Kenneth Graunke &lt;<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>&gt;<br>
<div class="HOEnZb"><div class="h5"><br>
&gt; about was ensuring cache coherency.<br>
&gt;<br>
&gt; However, with the advent of OpenGL 3.0, there are two cases in which<br>
&gt; data output by one stage of the pipeline might be consumed, in a later<br>
&gt; draw operation, by an earlier stage of the pipeline:<br>
&gt;<br>
&gt; (a) When using textures in the vertex shader.<br>
&gt;<br>
&gt; (b) When using drawing with a vertex buffer that was previously<br>
&gt;     generated using transform feedback.<br>
&gt;<br>
&gt; This patch addresses case (a) by changing<br>
&gt; intel_batchbuffer_emit_mi_flush() so that on Gen6+, it sets the<br>
&gt; PIPE_CONTROL_CS_STALL bit (this forces the pipeline to actually<br>
&gt; flush).  (Case (b) will be addressed by the next patch in the series).<br>
&gt;<br>
&gt; This is not an ideal solution--in a perfect world, the driver would<br>
&gt; have some buffer dependency tracking so that we would only have to<br>
&gt; flush the pipeline in the two cases above.  Until that dependency<br>
&gt; tracking is implemented, however, it seems prudent to have<br>
&gt; intel_batchbuffer_emit_mi_flush() actually flush the pipeline, so that<br>
&gt; we get correct rendering, at the expense of a (hopefully small)<br>
&gt; performance hit.<br>
&gt;<br>
&gt; The change is only applied to Gen6+, since at the moment only Gen6+<br>
&gt; supports the OpenGL 3.0 features that make a full pipeline flush<br>
&gt; necessary.<br>
&gt; ---<br>
&gt;  src/mesa/drivers/dri/intel/intel_batchbuffer.c |    3 ++-<br>
&gt;  1 files changed, 2 insertions(+), 1 deletions(-)<br>
&gt;<br>
&gt; diff --git a/src/mesa/drivers/dri/intel/intel_batchbuffer.c b/src/mesa/drivers/dri/intel/intel_batchbuffer.c<br>
&gt; index 6991db8..4ff098a 100644<br>
&gt; --- a/src/mesa/drivers/dri/intel/intel_batchbuffer.c<br>
&gt; +++ b/src/mesa/drivers/dri/intel/intel_batchbuffer.c<br>
&gt; @@ -461,7 +461,8 @@ intel_batchbuffer_emit_mi_flush(struct intel_context *intel)<br>
&gt;                  PIPE_CONTROL_WRITE_FLUSH |<br>
&gt;                  PIPE_CONTROL_DEPTH_CACHE_FLUSH |<br>
&gt;                  PIPE_CONTROL_TC_FLUSH |<br>
&gt; -                PIPE_CONTROL_NO_WRITE);<br>
&gt; +                PIPE_CONTROL_NO_WRITE |<br>
&gt; +                   PIPE_CONTROL_CS_STALL);<br>
&gt;        OUT_BATCH(0); /* write address */<br>
&gt;        OUT_BATCH(0); /* write data */<br>
&gt;        ADVANCE_BATCH();<br>
<br>
</div></div></blockquote></div><br>