[v3,13/25] panfrost: Allow testing if a specific batch is targeting a scanout FB

Submitted by Boris Brezillon on Sept. 5, 2019, 7:41 p.m.

Details

Message ID 20190905194150.17608-14-boris.brezillon@collabora.com
State Accepted
Commit e46d95d51bc11301b603f1beb9b1341b3623a46b
Headers show
Series "panfrost: Rework the batch pipelining logic" ( rev: 1 ) in Mesa

Not browsing as part of any series.

Commit Message

Boris Brezillon Sept. 5, 2019, 7:41 p.m.
Rename panfrost_is_scanout() into panfrost_batch_is_scanout(), pass it
a batch instead of a context and move the code to pan_job.c.

With this in place, we can now test if a batch is targeting a scanout
FB even if this batch is not bound to the context.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
---
 src/gallium/drivers/panfrost/pan_context.c | 20 +-------------------
 src/gallium/drivers/panfrost/pan_context.h |  3 ---
 src/gallium/drivers/panfrost/pan_job.c     | 18 ++++++++++++++++++
 src/gallium/drivers/panfrost/pan_job.h     |  3 +++
 src/gallium/drivers/panfrost/pan_mfbd.c    |  3 +--
 5 files changed, 23 insertions(+), 24 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 f0cd8cdb12ea..e34f5757b1cf 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -152,24 +152,6 @@  panfrost_emit_mfbd(struct panfrost_context *ctx, unsigned vertex_count)
         return framebuffer;
 }
 
-/* Are we currently rendering to the screen (rather than an FBO)? */
-
-bool
-panfrost_is_scanout(struct panfrost_context *ctx)
-{
-        /* If there is no color buffer, it's an FBO */
-        if (ctx->pipe_framebuffer.nr_cbufs != 1)
-                return false;
-
-        /* If we're too early that no framebuffer was sent, it's scanout */
-        if (!ctx->pipe_framebuffer.cbufs[0])
-                return true;
-
-        return ctx->pipe_framebuffer.cbufs[0]->texture->bind & PIPE_BIND_DISPLAY_TARGET ||
-               ctx->pipe_framebuffer.cbufs[0]->texture->bind & PIPE_BIND_SCANOUT ||
-               ctx->pipe_framebuffer.cbufs[0]->texture->bind & PIPE_BIND_SHARED;
-}
-
 static void
 panfrost_clear(
         struct pipe_context *pipe,
@@ -2397,7 +2379,7 @@  panfrost_set_framebuffer_state(struct pipe_context *pctx,
          */
 
         struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx);
-        bool is_scanout = panfrost_is_scanout(ctx);
+        bool is_scanout = panfrost_batch_is_scanout(batch);
         bool has_draws = batch->last_job.gpu;
 
         /* Bail out early when the current and new states are the same. */
diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h
index 586b6d854b6c..02552ed23de2 100644
--- a/src/gallium/drivers/panfrost/pan_context.h
+++ b/src/gallium/drivers/panfrost/pan_context.h
@@ -315,9 +315,6 @@  panfrost_flush(
         struct pipe_fence_handle **fence,
         unsigned flags);
 
-bool
-panfrost_is_scanout(struct panfrost_context *ctx);
-
 mali_ptr panfrost_sfbd_fragment(struct panfrost_context *ctx, bool has_draws);
 mali_ptr panfrost_mfbd_fragment(struct panfrost_context *ctx, bool has_draws);
 
diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c
index 56aab13d7d5a..0f7e139f1a64 100644
--- a/src/gallium/drivers/panfrost/pan_job.c
+++ b/src/gallium/drivers/panfrost/pan_job.c
@@ -374,6 +374,24 @@  panfrost_batch_intersection_scissor(struct panfrost_batch *batch,
         batch->maxy = MIN2(batch->maxy, maxy);
 }
 
+/* Are we currently rendering to the screen (rather than an FBO)? */
+
+bool
+panfrost_batch_is_scanout(struct panfrost_batch *batch)
+{
+        /* If there is no color buffer, it's an FBO */
+        if (batch->key.nr_cbufs != 1)
+                return false;
+
+        /* If we're too early that no framebuffer was sent, it's scanout */
+        if (!batch->key.cbufs[0])
+                return true;
+
+        return batch->key.cbufs[0]->texture->bind & PIPE_BIND_DISPLAY_TARGET ||
+               batch->key.cbufs[0]->texture->bind & PIPE_BIND_SCANOUT ||
+               batch->key.cbufs[0]->texture->bind & PIPE_BIND_SHARED;
+}
+
 void
 panfrost_batch_init(struct panfrost_context *ctx)
 {
diff --git a/src/gallium/drivers/panfrost/pan_job.h b/src/gallium/drivers/panfrost/pan_job.h
index e885d0b9fbd5..ea832f2c3efe 100644
--- a/src/gallium/drivers/panfrost/pan_job.h
+++ b/src/gallium/drivers/panfrost/pan_job.h
@@ -195,4 +195,7 @@  panfrost_scoreboard_queue_fused_job_prepend(
 void
 panfrost_scoreboard_link_batch(struct panfrost_batch *batch);
 
+bool
+panfrost_batch_is_scanout(struct panfrost_batch *batch);
+
 #endif
diff --git a/src/gallium/drivers/panfrost/pan_mfbd.c b/src/gallium/drivers/panfrost/pan_mfbd.c
index 618ebd3c4a19..c89b0b44a47c 100644
--- a/src/gallium/drivers/panfrost/pan_mfbd.c
+++ b/src/gallium/drivers/panfrost/pan_mfbd.c
@@ -455,9 +455,8 @@  panfrost_mfbd_fragment(struct panfrost_context *ctx, bool has_draws)
          * The exception is ReadPixels, but this is not supported on GLES so we
          * can safely ignore it. */
 
-        if (panfrost_is_scanout(ctx)) {
+        if (panfrost_batch_is_scanout(batch))
                 batch->requirements &= ~PAN_REQ_DEPTH_WRITE;
-        }
 
         /* Actualize the requirements */
 

Comments

R-b

On Thu, Sep 05, 2019 at 09:41:38PM +0200, Boris Brezillon wrote:
> Rename panfrost_is_scanout() into panfrost_batch_is_scanout(), pass it
> a batch instead of a context and move the code to pan_job.c.
> 
> With this in place, we can now test if a batch is targeting a scanout
> FB even if this batch is not bound to the context.
> 
> Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
> ---
>  src/gallium/drivers/panfrost/pan_context.c | 20 +-------------------
>  src/gallium/drivers/panfrost/pan_context.h |  3 ---
>  src/gallium/drivers/panfrost/pan_job.c     | 18 ++++++++++++++++++
>  src/gallium/drivers/panfrost/pan_job.h     |  3 +++
>  src/gallium/drivers/panfrost/pan_mfbd.c    |  3 +--
>  5 files changed, 23 insertions(+), 24 deletions(-)
> 
> diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
> index f0cd8cdb12ea..e34f5757b1cf 100644
> --- a/src/gallium/drivers/panfrost/pan_context.c
> +++ b/src/gallium/drivers/panfrost/pan_context.c
> @@ -152,24 +152,6 @@ panfrost_emit_mfbd(struct panfrost_context *ctx, unsigned vertex_count)
>          return framebuffer;
>  }
>  
> -/* Are we currently rendering to the screen (rather than an FBO)? */
> -
> -bool
> -panfrost_is_scanout(struct panfrost_context *ctx)
> -{
> -        /* If there is no color buffer, it's an FBO */
> -        if (ctx->pipe_framebuffer.nr_cbufs != 1)
> -                return false;
> -
> -        /* If we're too early that no framebuffer was sent, it's scanout */
> -        if (!ctx->pipe_framebuffer.cbufs[0])
> -                return true;
> -
> -        return ctx->pipe_framebuffer.cbufs[0]->texture->bind & PIPE_BIND_DISPLAY_TARGET ||
> -               ctx->pipe_framebuffer.cbufs[0]->texture->bind & PIPE_BIND_SCANOUT ||
> -               ctx->pipe_framebuffer.cbufs[0]->texture->bind & PIPE_BIND_SHARED;
> -}
> -
>  static void
>  panfrost_clear(
>          struct pipe_context *pipe,
> @@ -2397,7 +2379,7 @@ panfrost_set_framebuffer_state(struct pipe_context *pctx,
>           */
>  
>          struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx);
> -        bool is_scanout = panfrost_is_scanout(ctx);
> +        bool is_scanout = panfrost_batch_is_scanout(batch);
>          bool has_draws = batch->last_job.gpu;
>  
>          /* Bail out early when the current and new states are the same. */
> diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h
> index 586b6d854b6c..02552ed23de2 100644
> --- a/src/gallium/drivers/panfrost/pan_context.h
> +++ b/src/gallium/drivers/panfrost/pan_context.h
> @@ -315,9 +315,6 @@ panfrost_flush(
>          struct pipe_fence_handle **fence,
>          unsigned flags);
>  
> -bool
> -panfrost_is_scanout(struct panfrost_context *ctx);
> -
>  mali_ptr panfrost_sfbd_fragment(struct panfrost_context *ctx, bool has_draws);
>  mali_ptr panfrost_mfbd_fragment(struct panfrost_context *ctx, bool has_draws);
>  
> diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c
> index 56aab13d7d5a..0f7e139f1a64 100644
> --- a/src/gallium/drivers/panfrost/pan_job.c
> +++ b/src/gallium/drivers/panfrost/pan_job.c
> @@ -374,6 +374,24 @@ panfrost_batch_intersection_scissor(struct panfrost_batch *batch,
>          batch->maxy = MIN2(batch->maxy, maxy);
>  }
>  
> +/* Are we currently rendering to the screen (rather than an FBO)? */
> +
> +bool
> +panfrost_batch_is_scanout(struct panfrost_batch *batch)
> +{
> +        /* If there is no color buffer, it's an FBO */
> +        if (batch->key.nr_cbufs != 1)
> +                return false;
> +
> +        /* If we're too early that no framebuffer was sent, it's scanout */
> +        if (!batch->key.cbufs[0])
> +                return true;
> +
> +        return batch->key.cbufs[0]->texture->bind & PIPE_BIND_DISPLAY_TARGET ||
> +               batch->key.cbufs[0]->texture->bind & PIPE_BIND_SCANOUT ||
> +               batch->key.cbufs[0]->texture->bind & PIPE_BIND_SHARED;
> +}
> +
>  void
>  panfrost_batch_init(struct panfrost_context *ctx)
>  {
> diff --git a/src/gallium/drivers/panfrost/pan_job.h b/src/gallium/drivers/panfrost/pan_job.h
> index e885d0b9fbd5..ea832f2c3efe 100644
> --- a/src/gallium/drivers/panfrost/pan_job.h
> +++ b/src/gallium/drivers/panfrost/pan_job.h
> @@ -195,4 +195,7 @@ panfrost_scoreboard_queue_fused_job_prepend(
>  void
>  panfrost_scoreboard_link_batch(struct panfrost_batch *batch);
>  
> +bool
> +panfrost_batch_is_scanout(struct panfrost_batch *batch);
> +
>  #endif
> diff --git a/src/gallium/drivers/panfrost/pan_mfbd.c b/src/gallium/drivers/panfrost/pan_mfbd.c
> index 618ebd3c4a19..c89b0b44a47c 100644
> --- a/src/gallium/drivers/panfrost/pan_mfbd.c
> +++ b/src/gallium/drivers/panfrost/pan_mfbd.c
> @@ -455,9 +455,8 @@ panfrost_mfbd_fragment(struct panfrost_context *ctx, bool has_draws)
>           * The exception is ReadPixels, but this is not supported on GLES so we
>           * can safely ignore it. */
>  
> -        if (panfrost_is_scanout(ctx)) {
> +        if (panfrost_batch_is_scanout(batch))
>                  batch->requirements &= ~PAN_REQ_DEPTH_WRITE;
> -        }
>  
>          /* Actualize the requirements */
>  
> -- 
> 2.21.0