[Mesa-dev] [PATCH] i965/blorp: Do and end-of-pipe sync on both sides of fast-clear ops

Jason Ekstrand jason at jlekstrand.net
Mon May 15 15:58:25 UTC 2017


On Mon, May 15, 2017 at 8:12 AM, Pohjolainen, Topi <
topi.pohjolainen at gmail.com> wrote:

> On Mon, May 15, 2017 at 07:55:46AM -0700, Jason Ekstrand wrote:
> > We've discovered in the Vulkan driver that simply doing the end-of-pipe
> > sync afterwards is insufficient.  The specific requirement stated in the
> > PRM is that you have to do one every time you transition between the
> > tree modes of "clear", "render", and "resolve".  This is GL, so we could
> > track it but any attempt to do so would most likely get it wrong.  For
> > now, it's easier to just assume that every fast-clear op is an island
> > and do the sync both before and after.
> >
> > This also removes the unneeded flush and stall after slow-clear
> > operations.
> >
> > Cc: "17.0 17.1" <mesa-stable at lists.freedesktop.org>
> > ---
> >  src/mesa/drivers/dri/i965/brw_blorp.c | 56
> ++++++++++++++++++++++++-----------
> >  1 file changed, 38 insertions(+), 18 deletions(-)
> >
> > diff --git a/src/mesa/drivers/dri/i965/brw_blorp.c
> b/src/mesa/drivers/dri/i965/brw_blorp.c
> > index b69cb4f..ebc4612 100644
> > --- a/src/mesa/drivers/dri/i965/brw_blorp.c
> > +++ b/src/mesa/drivers/dri/i965/brw_blorp.c
> > @@ -876,6 +876,22 @@ do_single_blorp_clear(struct brw_context *brw,
> struct gl_framebuffer *fb,
> >        DBG("%s (fast) to mt %p level %d layers %d+%d\n", __FUNCTION__,
> >            irb->mt, irb->mt_level, irb->mt_layer, num_layers);
> >
> > +      /* Ivybrigde PRM Vol 2, Part 1, "11.7 MCS Buffer for Render
> Target(s)":
> > +       *
> > +       *    "Any transition from any value in {Clear, Render, Resolve}
> to a
> > +       *    different value in {Clear, Render, Resolve} requires end of
> pipe
> > +       *    synchronization."
>
> I've been meaning to ask should we add some clarification when we refer to
> end-of-pipe sync but don't actually do exactly what the spec says.
> According
> to spec there should be also a write just after the flush. I have quite a
> bit
> of details in:
>

Yeah, it's a bit confusing.  In this particular case, there are a couple
other spots in the PRM which talk about this:

   /* From the Sky Lake PRM Vol. 7, "Render Target Resolve":
    *
    *    "When performing a render target resolve, PIPE_CONTROL with end of
    *    pipe sync must be delivered."

   /* From the Sky Lake PRM Vol. 7, "Render Target Fast Clear":
    *
    *    "After Render target fast clear, pipe-control with color cache
    *    write-flush must be issued before sending any DRAW commands on
    *    that render target."

So, yeah, it's a bit mirky...  In practice, at least in the Vulkan driver,
the flush and CS stall appear to be sufficient.

Reading the post-sync docs in the BSPEC, I think your patch is correct
according to the docs.  I think I would rather add an "post_sync" boolean
parameter emit_pipe_control_flush than have a separate function for it
though.  That said, I still don't understand why the writes are required
over and above a CS stall.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170515/529e20c2/attachment-0001.html>


More information about the mesa-dev mailing list