[Mesa-dev] [PATCH 6/9] panfrost: Don't emit a new FB desc when setting a new FB state

Alyssa Rosenzweig alyssa.rosenzweig at collabora.com
Fri Aug 2 15:12:15 UTC 2019


So, in the future, we'll want to have multiple jobs for different
framebuffers independently in flight at the same time. As an
illustrative example, we would like the app to be able to do a sequence
like:

	bind scanout
	clear
	draw something
	bind FBO
	clear
	draw something
	bind scanout
	draw something else
	bind FBO
	draw something else
	bind scanout
	draw the fbo
	flush

Ideally, nothing should happen until the final flush. So the order
submitted to the hardware would be:

	FBO:
	clear
	draw something
	draw something else 
	draw something else

	Scanout:
	clear
	draw something
	draw something else 
	draw the fbo

Unfortunately, right now that panfrost_flush() call makes the order
instead:

	Scanout:
	clear
	draw something
	
	FBO:
	clear
	draw something

	Scanout:
	clear
	wallpaper scanout
	draw something else

	FBO:
	clear
	wallpaper fbo
	draw something else

	Scanout:
	clear
	wallpaper scanout
	draw FBO

Clearly this is extremely suboptimal (I believe the extra wallpaper
blits are related to our poor performance on FBO-heavy apps. glmark's
-bdesktop and -bterrain are suspects here.)

The solution is to be able to have switching framebuffers be a no-op,
since all the important stuff is in the panfrost_job/batch. So
panfrost_set_framebuffer_state is just doing the copy, but no flush and
almost no logic, so we can switch back and forth freely without
incurring a flush/clear/wallpaper cycle each time.

This patch series is not the right time to focus on pipelined
performance (though I'd love if somebody gave it some love at some
point). But I do want to caution from a code smell that will make
whoever that someone is -- quite possibly you! -- quite grumpy when they
work on this in future.

On Fri, Aug 02, 2019 at 12:12:54PM +0200, Boris Brezillon wrote:
> The FB desc will be emitted/attached on the first draw targetting
> this new FB.
> 
> Signed-off-by: Boris Brezillon <boris.brezillon at collabora.com>
> ---
>  src/gallium/drivers/panfrost/pan_context.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
> index 1091caeb1148..2b7906eea155 100644
> --- a/src/gallium/drivers/panfrost/pan_context.c
> +++ b/src/gallium/drivers/panfrost/pan_context.c
> @@ -2384,6 +2384,9 @@ panfrost_set_framebuffer_state(struct pipe_context *pctx,
>  
>          if (!is_scanout || has_draws)
>                  panfrost_flush(pctx, NULL, PIPE_FLUSH_END_OF_FRAME);
> +        else
> +                assert(!ctx->payloads[PIPE_SHADER_VERTEX].postfix.framebuffer &&
> +                       !ctx->payloads[PIPE_SHADER_FRAGMENT].postfix.framebuffer);
>  
>          util_copy_framebuffer_state(&ctx->pipe_framebuffer, fb);
>  
> @@ -2391,7 +2394,8 @@ panfrost_set_framebuffer_state(struct pipe_context *pctx,
>          struct panfrost_screen *screen = pan_screen(ctx->base.screen);
>  
>          panfrost_hint_afbc(screen, &ctx->pipe_framebuffer);
> -        panfrost_attach_vt_framebuffer(ctx, false);
> +        for (unsigned i = 0; i < PIPE_SHADER_TYPES; ++i)
> +                ctx->payloads[i].postfix.framebuffer = 0;
>  }
>  
>  static void *
> -- 
> 2.21.0
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20190802/bc7781d1/attachment.sig>


More information about the mesa-dev mailing list