<p dir="ltr"><br>
On Jun 30, 2016 9:25 PM, "Francisco Jerez" <<a href="mailto:currojerez@riseup.net">currojerez@riseup.net</a>> wrote:<br>
><br>
> Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>> writes:<br>
><br>
> > Fwiw, I very much like the way I did this in the Vulkan driver where it<br>
> > splits it into two pipe controls automatically based on the input bits.<br>
> > (Look at genX_cmd_buffer.c cmd_buffer_apply_pipe_flushes.)  I very much<br>
> > doubt that this is the only place we have this problem in the GL driver.<br>
><br>
> Yes, it definitely isn't.<br>
><br>
> > We should probably fix it in brw_emit_pipe_control.<br>
><br>
> I had been poking around with making brw_emit_pipe_control_flush (I<br>
> think that's what you meant by brw_emit_pipe_control?) catch the racy<br>
> invalidate+flush combinations and emit two pipe controls instead.  I'm<br>
> not terribly attached to the idea of hard-coding this much policy into<br>
> the rather low-level brw_emit_pipe_control_flush(), but it is sure less<br>
> code (and more idiot-proof) than fixing all of its users individually.<br>
><br>
> In case other people don't like it I have another series that fixes the<br>
> remaining PIPE_CONTROL races manually and just adds an assertion to<br>
> brw_emit_pipe_control_flush() checking that the caller is not trying to<br>
> flush and invalidate at the same time in a single PIPE_CONTROL command,<br>
> I don't really care doing it one way or another.</p>
<p dir="ltr">Since you've already written all that code, you should be in top form for answering this question:  Is there anywhere in the code where we emit a pipe control containing both flushes and invalidates but *don't* want the stall?  If not, then I'm a big fan of idiot-proof.</p>
<p dir="ltr">> I'll reply to this thread with the fixes I've written which apply on top<br>
> of Alejandro's patch -- I believe we want to land v3 of his fix anyway<br>
> because it replaces a call to brw_emit_mi_flush [AKA "I don't know how<br>
> to use pipe control, just flush everything for me" ;)] with the right<br>
> sequence of cache flushes and invalidations, which is always a good<br>
> thing.<br>
><br>
> > On Jun 30, 2016 12:00 AM, "Alejandro Piñeiro" <<a href="mailto:apinheiro@igalia.com">apinheiro@igalia.com</a>> wrote:<br>
> ><br>
> > Fixes:<br>
> > GL44-CTS.texture_barrier_ARB.same-texel-rw-multipass<br>
> ><br>
> > On Haswell, Broadwell and Skylake (note that in order to execute that<br>
> > test, it is needed to override GL and GLSL versions).<br>
> ><br>
> > On gen6 this test was already working without this change. It keeps<br>
> > working after it.<br>
> ><br>
> > This commit replaces the call to brw_emit_mi_flush for gen6+ with two<br>
> > calls to brw_emit_pipe_control_flush:<br>
> ><br>
> >  * The first one with RENDER_TARGET_FLUSH and CS_STALL set to initiate<br>
> >    a render cache flush after any concurrent rendering completes and<br>
> >    cause the CS to stop parsing commands until the render cache<br>
> >    becomes coherent with memory.<br>
> ><br>
> >  * The second one have TEXTURE_CACHE_INVALIDATE set (and no CS stall)<br>
> >    to clean up any stale data from the sampler caches before rendering<br>
> >    continues.<br>
> ><br>
> > Didn't touch gen4-5, basically because I don't have a way to test<br>
> > them.<br>
> ><br>
> > More info on commits:<br>
> > 0aa4f99f562a05880a779707cbcd46be459863bf<br>
> > 72473658c51d5e074ce219c1e6385a4cce29f467<br>
> ><br>
> > Thanks to Curro to help to tracking this down, as the root case was a<br>
> > hw race condition.<br>
> ><br>
> > v2: use two calls to pipe_control_flush instead of a combination of<br>
> >     gen7_emit_cs_stall_flush and brw_emit_mi_flush calls (Curro)<br>
> > v3: no need to const cache invalidation (Curro)<br>
> > ---<br>
> ><br>
> > FWIW: checked with the CTS tests, and the piglit series, and confirmed<br>
> > that the const cache invalidation is not needed.<br>
> ><br>
> >  src/mesa/drivers/dri/i965/intel_tex.c | 21 ++++++++++++++++++++-<br>
> >  1 file changed, 20 insertions(+), 1 deletion(-)<br>
> ><br>
> > diff --git a/src/mesa/drivers/dri/i965/intel_tex.c<br>
> > b/src/mesa/drivers/dri/i965/intel_tex.c<br>
> > index cac33ac..a802d5a 100644<br>
> > --- a/src/mesa/drivers/dri/i965/intel_tex.c<br>
> > +++ b/src/mesa/drivers/dri/i965/intel_tex.c<br>
> > @@ -9,6 +9,7 @@<br>
> >  #include "intel_mipmap_tree.h"<br>
> >  #include "intel_tex.h"<br>
> >  #include "intel_fbo.h"<br>
> > +#include "intel_reg.h"<br>
> ><br>
> >  #define FILE_DEBUG_FLAG DEBUG_TEXTURE<br>
> ><br>
> > @@ -362,7 +363,25 @@ intel_texture_barrier(struct gl_context *ctx)<br>
> >  {<br>
> >     struct brw_context *brw = brw_context(ctx);<br>
> ><br>
> > -   brw_emit_mi_flush(brw);<br>
> > +   if (brw->gen >= 6) {<br>
> > +      if (brw->gen == 6) {<br>
> > +         /* [Dev-SNB{W/A}]: Before a PIPE_CONTROL with Write Cache<br>
> > +          * Flush Enable = 1, a PIPE_CONTROL with any non-zero<br>
> > +          * post-sync-op is required.<br>
> > +          */<br>
> > +         brw_emit_post_sync_nonzero_flush(brw);<br>
> > +      }<br>
> > +<br>
> > +      brw_emit_pipe_control_flush(brw,<br>
> > +                                  PIPE_CONTROL_DEPTH_CACHE_FLUSH |<br>
> > +                                  PIPE_CONTROL_RENDER_TARGET_FLUSH |<br>
> > +                                  PIPE_CONTROL_CS_STALL);<br>
> > +<br>
> > +      brw_emit_pipe_control_flush(brw,<br>
> > +                                  PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE);<br>
> > +   } else {<br>
> > +      brw_emit_mi_flush(brw);<br>
> > +   }<br>
> >  }<br>
> ><br>
> >  void<br>
> > --<br>
> > 2.7.4<br>
> ><br>
> > _______________________________________________<br>
> > mesa-dev mailing list<br>
> > <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> > <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
> > _______________________________________________<br>
> > mesa-dev mailing list<br>
> > <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> > <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</p>