[2/3] panfrost: Draw the wallpaper when only depth/stencil bufs are cleared

Submitted by Boris Brezillon on Sept. 20, 2019, 2:53 p.m.

Details

Message ID 20190920145339.27781-2-boris.brezillon@collabora.com
State New
Headers show
Series "Series without cover letter" ( rev: 1 ) in Mesa

Not browsing as part of any series.

Commit Message

Boris Brezillon Sept. 20, 2019, 2:53 p.m.
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 <boris.brezillon@collabora.com>
---
There might be a more optimal solution to do that (like not passing the
color bufs to the fragment job?), but this solution seems to fix a few
deqp tests.
---
 src/gallium/drivers/panfrost/pan_context.c |  2 +-
 src/gallium/drivers/panfrost/pan_job.c     | 16 ++++++++++++++--
 2 files changed, 15 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
index b2f2a9da7a51..c99bf1b26ce7 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -1333,7 +1333,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 4ec2aa0565d7..a2df31f96f00 100644
--- a/src/gallium/drivers/panfrost/pan_job.c
+++ b/src/gallium/drivers/panfrost/pan_job.c
@@ -698,10 +698,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];
@@ -923,8 +936,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);
 

Comments

R-b, nice fix :)

On Fri, Sep 20, 2019 at 04:53:38PM +0200, Boris Brezillon wrote:
> 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 <boris.brezillon@collabora.com>
> ---
> There might be a more optimal solution to do that (like not passing the
> color bufs to the fragment job?), but this solution seems to fix a few
> deqp tests.
> ---
>  src/gallium/drivers/panfrost/pan_context.c |  2 +-
>  src/gallium/drivers/panfrost/pan_job.c     | 16 ++++++++++++++--
>  2 files changed, 15 insertions(+), 3 deletions(-)
> 
> diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
> index b2f2a9da7a51..c99bf1b26ce7 100644
> --- a/src/gallium/drivers/panfrost/pan_context.c
> +++ b/src/gallium/drivers/panfrost/pan_context.c
> @@ -1333,7 +1333,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 4ec2aa0565d7..a2df31f96f00 100644
> --- a/src/gallium/drivers/panfrost/pan_job.c
> +++ b/src/gallium/drivers/panfrost/pan_job.c
> @@ -698,10 +698,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];
> @@ -923,8 +936,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);
>  
> -- 
> 2.21.0