<p dir="ltr"><br>
On Mar 26, 2016 12:55 AM, "Kenneth Graunke" <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>> wrote:<br>
><br>
> Our driver uses the brw_render_cache mechanism to track buffers we've<br>
> rendered to and are about to sample from.<br>
><br>
> Previously, we did a single PIPE_CONTROL with the following bits set:<br>
> - Render Target Flush<br>
> - Depth Cache Flush<br>
> - Texture Cache Invalidate<br>
> - VF Cache Invalidate<br>
> - Instruction Cache Invalidate<br>
> - CS Stall<br>
><br>
> This combined both "top of pipe" invalidations and "bottom of pipe"<br>
> flushes, which isn't how the hardware is intended to be programmed.<br>
><br>
> The "top of pipe" invalidations may happen right away, without any<br>
> guarantees that rendering using those caches has completed.  That<br>
> rendering may continue altering the caches.  The "bottom of pipe"<br>
> flushes do wait for the rendering to complete.  The CS stall also<br>
> prevents further work from happening until data is flushed out.<br>
><br>
> What we wanted to do was wait for rendering complete, flush the new<br>
> data out of the render and depth caches, wait, then invalidate any<br>
> stale data in read-only caches.  We can accomplish this by doing the<br>
> "bottom of pipe" flushes with a CS stall, then the "top of pipe"<br>
> flushes as a second PIPE_CONTROL.  The flushes will wait until the<br>
> rendering is complete, and the CS stall will prevent the second<br>
> PIPE_CONTROL with the invalidations from executing until the first<br>
> is done.<br>
><br>
> Fixes dEQP-GLES3.functional.texture.specification.teximage2d_pbo<br>
> subtests on Braswell and Skylake.  These tests hit the meta PBO<br>
> texture upload path, which binds the PBO as a texture and samples<br>
> from it, while rendering to the destination texture.  The tests<br>
> then sample from the texture.<br>
><br>
> For now, we leave Gen4-5 alone.  It probably needs work too, but<br>
> apparently it hasn't even been setting the (G45+) TC invalidation<br>
> bit at all...</p>
<p dir="ltr">This all seems reasonable.  Assuming Jenkins is happy,</p>
<p dir="ltr">Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>></p>
<p dir="ltr">> Cc: <a href="mailto:mesa-stable@lists.freedesktop.org">mesa-stable@lists.freedesktop.org</a><br>
> Suggested-by: Francisco Jerez <<a href="mailto:currojerez@riseup.net">currojerez@riseup.net</a>><br>
> Signed-off-by: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>><br>
> ---<br>
>  src/mesa/drivers/dri/i965/brw_pipe_control.c |  2 --<br>
>  src/mesa/drivers/dri/i965/intel_fbo.c        | 15 ++++++++++++++-<br>
>  2 files changed, 14 insertions(+), 3 deletions(-)<br>
><br>
> diff --git a/src/mesa/drivers/dri/i965/brw_pipe_control.c b/src/mesa/drivers/dri/i965/brw_pipe_control.c<br>
> index b41e28e..4672efd 100644<br>
> --- a/src/mesa/drivers/dri/i965/brw_pipe_control.c<br>
> +++ b/src/mesa/drivers/dri/i965/brw_pipe_control.c<br>
> @@ -338,8 +338,6 @@ brw_emit_mi_flush(struct brw_context *brw)<br>
>        }<br>
>        brw_emit_pipe_control_flush(brw, flags);<br>
>     }<br>
> -<br>
> -   brw_render_cache_set_clear(brw);<br>
>  }<br>
><br>
>  int<br>
> diff --git a/src/mesa/drivers/dri/i965/intel_fbo.c b/src/mesa/drivers/dri/i965/intel_fbo.c<br>
> index b7b6796..707041a 100644<br>
> --- a/src/mesa/drivers/dri/i965/intel_fbo.c<br>
> +++ b/src/mesa/drivers/dri/i965/intel_fbo.c<br>
> @@ -1065,7 +1065,20 @@ brw_render_cache_set_check_flush(struct brw_context *brw, drm_intel_bo *bo)<br>
>     if (!_mesa_set_search(brw->render_cache, bo))<br>
>        return;<br>
><br>
> -   brw_emit_mi_flush(brw);<br>
> +   if (brw->gen >= 6) {<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>
> +                                  PIPE_CONTROL_CONST_CACHE_INVALIDATE);<br>
> +   } else {<br>
> +      brw_emit_mi_flush(brw);<br>
> +   }<br>
> +<br>
> +   brw_render_cache_set_clear(brw);<br>
>  }<br>
><br>
>  /**<br>
> --<br>
> 2.7.3<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>
</p>