[Mesa-dev] [PATCH 1/3] panfrost: Make sure a clear does not re-use a pre-existing batch

Boris Brezillon boris.brezillon at collabora.com
Sun Sep 22 13:24:10 UTC 2019


On Sun, 22 Sep 2019 08:38:30 -0400
Alyssa Rosenzweig <alyssa at rosenzweig.io> wrote:

> > > To be clear, if we have a batch and do the following operations:
> > > 
> > > 	clear red
> > > 	draw 1
> > > 	clear green
> > > 	draw 2
> > > 	flush
> > > 
> > > All we should see is #2 on a green background, which this patch handles
> > > by the second clear invalidating all the clears/draws that came before
> > > it (provided there is no flush in between). 
> > > 
> > > I might just be tripped up by the "freeze" name. That really means throw
> > > away / free here, I guess?  
> > 
> > Nope. Freeze means "stop queuing new draws to this batch". I guess we
> > could free the batch as well if the result of the previous draws/clear
> > are really overwritten by this new clear, but that implies checking the
> > new clear flags to make sure they target the same depth/stencil/color
> > combination. On the other hand, I'm wondering if it's really the
> > driver's job to try to optimize silly things the apps might do. I mean,
> > the sequence you describe does not look like a wise thing to do since
> > the "clear red+draw 1" end up being overwritten by "clear green + draw
> > 2".  
> 
> I'm quite confused how this patch works, then.
> 
> A few thoughts: if the app clears all buffers in the middle, then yes
> it's silly and yes we may as well optimize it out. (Should that be a thing GL
> drivers have to do? I mean, if the other drivers are too...)
> 
> If the sequence is more like:
> 
> 	clear all buffers
> 	draw 1
> 	clear color buffer (preserve depth stencil)
> 	draw 2
> 	flush
> 
> That second clear should really be done by drawing a full screen quad,
> just like if we were wallpapering, except loading its colour from a
> uniform instead of a texture.
> 
> Similarly, a depth-only clear mid-frame can be emulated by drawing a
> full-screen quad with the gl_Position.zw components juryrigged to the
> desired depth components, and disabling colour draws by setting the
> colour mask to 0x0. That also means you can skip having any shader at
> all (literally set the shader pointer to 0x0) so that's faster.
> 
> Finally, a stencil-only clear can occur similarly playing tricks with
> the stencil test parameters.
> 
> I suspect u_blitter or mesa/st is capable of doing these sorts of tricks
> on our behalf, but I have not researched it extensively.

AFAIU, mesa/st does not transform the clear into a quad-draw for
depth/stencil only clears, it only does that for the color(s)-masked
case. That's certainly something we can do in Panfrost if we want to
avoid creating a new batch in such situations though.

> 
> In any case, for a partial clear mid-frame, we would much rather do:
> 
> 	clear all buffers
> 	draw 1
> 	draw fullscreen quad (disable Z/S writes)
> 	draw 2
> 	flush
> 
> than what it sounds like this patch does
> 
> 	clear all buffers
> 	draw 1
> 	flush
> 
> 	clear all buffers
> 	wallpaper
> 	draw 2
> 	flush
> 
> Please do correct me if I've misunderstood the logic here.


There's no flush introduced by this patch, it just adds a dep between
batch 2 and 1:

batch1:	clear all buffers
 	draw 1

batch2: clear all buffers
	wallpaper
	draw 2

	flush (actually flushes batch 1 and 2)

with batch2 --depends-on--> batch1


More information about the mesa-dev mailing list