From 71eda74f7c8c9536f231bc7dc92f3ddfae83ad00 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Fri, 20 Sep 2019 08:55:54 +0200 Subject: panfrost: Draw the wallpaper when only depth/stencil bufs are cleared When only the depth/stencil bufs are cleared, we should make sure the color content is reloaded into the tile buffers if we want to preserve their content. Signed-off-by: Boris Brezillon Reviewed-by: Alyssa Rosenzweig --- src/gallium/drivers/panfrost/pan_context.c | 2 +- src/gallium/drivers/panfrost/pan_job.c | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) (limited to 'src/gallium') diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index b8edf302803..bb605280c36 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -1334,7 +1334,7 @@ panfrost_queue_draw(struct panfrost_context *ctx) if (rasterizer_discard) panfrost_scoreboard_queue_vertex_job(batch, vertex, FALSE); - else if (ctx->wallpaper_batch) + else if (ctx->wallpaper_batch && batch->first_tiler.gpu) panfrost_scoreboard_queue_fused_job_prepend(batch, vertex, tiler); else panfrost_scoreboard_queue_fused_job(batch, vertex, tiler); diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c index ae482a9a7a6..8ba75cde6c4 100644 --- a/src/gallium/drivers/panfrost/pan_job.c +++ b/src/gallium/drivers/panfrost/pan_job.c @@ -686,10 +686,23 @@ panfrost_batch_get_tiler_dummy(struct panfrost_batch *batch) static void panfrost_batch_draw_wallpaper(struct panfrost_batch *batch) { + /* Color 0 is cleared, no need to draw the wallpaper. + * TODO: MRT wallpapers. + */ + if (batch->clear & PIPE_CLEAR_COLOR0) + return; + /* Nothing to reload? TODO: MRT wallpapers */ if (batch->key.cbufs[0] == NULL) return; + /* No draw calls, and no clear on the depth/stencil bufs. + * Drawing the wallpaper would be useless. + */ + if (!batch->last_tiler.gpu && + !(batch->clear & PIPE_CLEAR_DEPTHSTENCIL)) + return; + /* Check if the buffer has any content on it worth preserving */ struct pipe_surface *surf = batch->key.cbufs[0]; @@ -911,8 +924,7 @@ panfrost_batch_submit(struct panfrost_batch *batch) goto out; } - if (!batch->clear && batch->last_tiler.gpu) - panfrost_batch_draw_wallpaper(batch); + panfrost_batch_draw_wallpaper(batch); panfrost_scoreboard_link_batch(batch); -- cgit v1.2.3