[v2,19/37] panfrost: Add the panfrost_batch_create_bo() helper

Submitted by Boris Brezillon on Sept. 16, 2019, 9:36 a.m.

Details

Message ID 20190916093715.32203-20-boris.brezillon@collabora.com
State Accepted
Commit 5a4d095f9b58e127c2eae9aa64595afeb36b554d
Headers show
Series "panfrost: Support batch pipelining" ( rev: 1 ) in Mesa

Not browsing as part of any series.

Commit Message

Boris Brezillon Sept. 16, 2019, 9:36 a.m.
This helper automates the panfrost_bo_create()+panfrost_batch_add_bo()+
panfrost_bo_unreference() sequence that's done for all per-batch BOs.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
---
 src/gallium/drivers/panfrost/pan_allocate.c  |  9 +-----
 src/gallium/drivers/panfrost/pan_blend_cso.c |  8 ++---
 src/gallium/drivers/panfrost/pan_job.c       | 32 +++++++++++++-------
 src/gallium/drivers/panfrost/pan_job.h       |  4 +++
 4 files changed, 28 insertions(+), 25 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/gallium/drivers/panfrost/pan_allocate.c b/src/gallium/drivers/panfrost/pan_allocate.c
index 7938196e3e4f..3076c23ab1cc 100644
--- a/src/gallium/drivers/panfrost/pan_allocate.c
+++ b/src/gallium/drivers/panfrost/pan_allocate.c
@@ -42,8 +42,6 @@ 
 struct panfrost_transfer
 panfrost_allocate_transient(struct panfrost_batch *batch, size_t sz)
 {
-        struct panfrost_screen *screen = pan_screen(batch->ctx->base.screen);
-
         /* Pad the size */
         sz = ALIGN_POT(sz, ALIGNMENT);
 
@@ -66,12 +64,7 @@  panfrost_allocate_transient(struct panfrost_batch *batch, size_t sz)
                                TRANSIENT_SLAB_SIZE : ALIGN_POT(sz, 4096);
 
                 /* We can't reuse the current BO, but we can create a new one. */
-                bo = panfrost_bo_create(screen, bo_sz, 0);
-                panfrost_batch_add_bo(batch, bo);
-
-                /* Creating a BO adds a reference, and then the job adds a
-                 * second one. So we need to pop back one reference */
-                panfrost_bo_unreference(bo);
+                bo = panfrost_batch_create_bo(batch, bo_sz, 0);
 
                 if (sz < TRANSIENT_SLAB_SIZE) {
                         batch->transient_bo = bo;
diff --git a/src/gallium/drivers/panfrost/pan_blend_cso.c b/src/gallium/drivers/panfrost/pan_blend_cso.c
index 90a1e2956a53..6bd6ff71cdc7 100644
--- a/src/gallium/drivers/panfrost/pan_blend_cso.c
+++ b/src/gallium/drivers/panfrost/pan_blend_cso.c
@@ -227,7 +227,6 @@  panfrost_blend_constant(float *out, float *in, unsigned mask)
 struct panfrost_blend_final
 panfrost_get_blend_for_context(struct panfrost_context *ctx, unsigned rti)
 {
-        struct panfrost_screen *screen = pan_screen(ctx->base.screen);
         struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx);
 
         /* Grab the format, falling back gracefully if called invalidly (which
@@ -273,13 +272,10 @@  panfrost_get_blend_for_context(struct panfrost_context *ctx, unsigned rti)
         final.shader.first_tag = shader->first_tag;
 
         /* Upload the shader */
-        final.shader.bo = panfrost_bo_create(screen, shader->size, PAN_BO_EXECUTE);
+        final.shader.bo = panfrost_batch_create_bo(batch, shader->size,
+                                                   PAN_BO_EXECUTE);
         memcpy(final.shader.bo->cpu, shader->buffer, shader->size);
 
-        /* Pass BO ownership to job */
-        panfrost_batch_add_bo(batch, final.shader.bo);
-        panfrost_bo_unreference(final.shader.bo);
-
         if (shader->patch_index) {
                 /* We have to specialize the blend shader to use constants, so
                  * patch in the current constants */
diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c
index 4ffc990a5334..cc0db3e440a1 100644
--- a/src/gallium/drivers/panfrost/pan_job.c
+++ b/src/gallium/drivers/panfrost/pan_job.c
@@ -144,6 +144,25 @@  panfrost_batch_add_bo(struct panfrost_batch *batch, struct panfrost_bo *bo)
         _mesa_set_add(batch->bos, bo);
 }
 
+struct panfrost_bo *
+panfrost_batch_create_bo(struct panfrost_batch *batch, size_t size,
+                         uint32_t create_flags)
+{
+        struct panfrost_bo *bo;
+
+        bo = panfrost_bo_create(pan_screen(batch->ctx->base.screen), size,
+                                create_flags);
+        panfrost_batch_add_bo(batch, bo);
+
+        /* panfrost_batch_add_bo() has retained a reference and
+         * panfrost_bo_create() initialize the refcnt to 1, so let's
+         * unreference the BO here so it gets released when the batch is
+         * destroyed (unless it's retained by someone else in the meantime).
+         */
+        panfrost_bo_unreference(bo);
+        return bo;
+}
+
 /* Returns the polygon list's GPU address if available, or otherwise allocates
  * the polygon list.  It's perfectly fast to use allocate/free BO directly,
  * since we'll hit the BO cache and this is one-per-batch anyway. */
@@ -154,19 +173,10 @@  panfrost_batch_get_polygon_list(struct panfrost_batch *batch, unsigned size)
         if (batch->polygon_list) {
                 assert(batch->polygon_list->size >= size);
         } else {
-                struct panfrost_screen *screen = pan_screen(batch->ctx->base.screen);
-
                 /* Create the BO as invisible, as there's no reason to map */
 
-                batch->polygon_list = panfrost_bo_create(screen, size,
-                                                         PAN_BO_INVISIBLE);
-                panfrost_batch_add_bo(batch, batch->polygon_list);
-
-                /* A BO reference has been retained by panfrost_batch_add_bo(),
-                 * so we need to unreference it here if we want the BO to be
-                 * automatically released when the batch is destroyed.
-                 */
-                panfrost_bo_unreference(&screen->base, batch->polygon_list);
+                batch->polygon_list = panfrost_batch_create_bo(batch, size,
+				                               PAN_BO_INVISIBLE);
         }
 
         return batch->polygon_list->gpu;
diff --git a/src/gallium/drivers/panfrost/pan_job.h b/src/gallium/drivers/panfrost/pan_job.h
index b0580ea2d470..b1351b902bd2 100644
--- a/src/gallium/drivers/panfrost/pan_job.h
+++ b/src/gallium/drivers/panfrost/pan_job.h
@@ -124,6 +124,10 @@  panfrost_batch_init(struct panfrost_context *ctx);
 void
 panfrost_batch_add_bo(struct panfrost_batch *batch, struct panfrost_bo *bo);
 
+struct panfrost_bo *
+panfrost_batch_create_bo(struct panfrost_batch *batch, size_t size,
+                         uint32_t create_flags);
+
 void
 panfrost_batch_submit(struct panfrost_batch *batch);
 

Comments

R-b, wonderful

On Mon, Sep 16, 2019 at 11:36:57AM +0200, Boris Brezillon wrote:
> This helper automates the panfrost_bo_create()+panfrost_batch_add_bo()+
> panfrost_bo_unreference() sequence that's done for all per-batch BOs.
> 
> Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
> ---
>  src/gallium/drivers/panfrost/pan_allocate.c  |  9 +-----
>  src/gallium/drivers/panfrost/pan_blend_cso.c |  8 ++---
>  src/gallium/drivers/panfrost/pan_job.c       | 32 +++++++++++++-------
>  src/gallium/drivers/panfrost/pan_job.h       |  4 +++
>  4 files changed, 28 insertions(+), 25 deletions(-)
> 
> diff --git a/src/gallium/drivers/panfrost/pan_allocate.c b/src/gallium/drivers/panfrost/pan_allocate.c
> index 7938196e3e4f..3076c23ab1cc 100644
> --- a/src/gallium/drivers/panfrost/pan_allocate.c
> +++ b/src/gallium/drivers/panfrost/pan_allocate.c
> @@ -42,8 +42,6 @@
>  struct panfrost_transfer
>  panfrost_allocate_transient(struct panfrost_batch *batch, size_t sz)
>  {
> -        struct panfrost_screen *screen = pan_screen(batch->ctx->base.screen);
> -
>          /* Pad the size */
>          sz = ALIGN_POT(sz, ALIGNMENT);
>  
> @@ -66,12 +64,7 @@ panfrost_allocate_transient(struct panfrost_batch *batch, size_t sz)
>                                 TRANSIENT_SLAB_SIZE : ALIGN_POT(sz, 4096);
>  
>                  /* We can't reuse the current BO, but we can create a new one. */
> -                bo = panfrost_bo_create(screen, bo_sz, 0);
> -                panfrost_batch_add_bo(batch, bo);
> -
> -                /* Creating a BO adds a reference, and then the job adds a
> -                 * second one. So we need to pop back one reference */
> -                panfrost_bo_unreference(bo);
> +                bo = panfrost_batch_create_bo(batch, bo_sz, 0);
>  
>                  if (sz < TRANSIENT_SLAB_SIZE) {
>                          batch->transient_bo = bo;
> diff --git a/src/gallium/drivers/panfrost/pan_blend_cso.c b/src/gallium/drivers/panfrost/pan_blend_cso.c
> index 90a1e2956a53..6bd6ff71cdc7 100644
> --- a/src/gallium/drivers/panfrost/pan_blend_cso.c
> +++ b/src/gallium/drivers/panfrost/pan_blend_cso.c
> @@ -227,7 +227,6 @@ panfrost_blend_constant(float *out, float *in, unsigned mask)
>  struct panfrost_blend_final
>  panfrost_get_blend_for_context(struct panfrost_context *ctx, unsigned rti)
>  {
> -        struct panfrost_screen *screen = pan_screen(ctx->base.screen);
>          struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx);
>  
>          /* Grab the format, falling back gracefully if called invalidly (which
> @@ -273,13 +272,10 @@ panfrost_get_blend_for_context(struct panfrost_context *ctx, unsigned rti)
>          final.shader.first_tag = shader->first_tag;
>  
>          /* Upload the shader */
> -        final.shader.bo = panfrost_bo_create(screen, shader->size, PAN_BO_EXECUTE);
> +        final.shader.bo = panfrost_batch_create_bo(batch, shader->size,
> +                                                   PAN_BO_EXECUTE);
>          memcpy(final.shader.bo->cpu, shader->buffer, shader->size);
>  
> -        /* Pass BO ownership to job */
> -        panfrost_batch_add_bo(batch, final.shader.bo);
> -        panfrost_bo_unreference(final.shader.bo);
> -
>          if (shader->patch_index) {
>                  /* We have to specialize the blend shader to use constants, so
>                   * patch in the current constants */
> diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c
> index 4ffc990a5334..cc0db3e440a1 100644
> --- a/src/gallium/drivers/panfrost/pan_job.c
> +++ b/src/gallium/drivers/panfrost/pan_job.c
> @@ -144,6 +144,25 @@ panfrost_batch_add_bo(struct panfrost_batch *batch, struct panfrost_bo *bo)
>          _mesa_set_add(batch->bos, bo);
>  }
>  
> +struct panfrost_bo *
> +panfrost_batch_create_bo(struct panfrost_batch *batch, size_t size,
> +                         uint32_t create_flags)
> +{
> +        struct panfrost_bo *bo;
> +
> +        bo = panfrost_bo_create(pan_screen(batch->ctx->base.screen), size,
> +                                create_flags);
> +        panfrost_batch_add_bo(batch, bo);
> +
> +        /* panfrost_batch_add_bo() has retained a reference and
> +         * panfrost_bo_create() initialize the refcnt to 1, so let's
> +         * unreference the BO here so it gets released when the batch is
> +         * destroyed (unless it's retained by someone else in the meantime).
> +         */
> +        panfrost_bo_unreference(bo);
> +        return bo;
> +}
> +
>  /* Returns the polygon list's GPU address if available, or otherwise allocates
>   * the polygon list.  It's perfectly fast to use allocate/free BO directly,
>   * since we'll hit the BO cache and this is one-per-batch anyway. */
> @@ -154,19 +173,10 @@ panfrost_batch_get_polygon_list(struct panfrost_batch *batch, unsigned size)
>          if (batch->polygon_list) {
>                  assert(batch->polygon_list->size >= size);
>          } else {
> -                struct panfrost_screen *screen = pan_screen(batch->ctx->base.screen);
> -
>                  /* Create the BO as invisible, as there's no reason to map */
>  
> -                batch->polygon_list = panfrost_bo_create(screen, size,
> -                                                         PAN_BO_INVISIBLE);
> -                panfrost_batch_add_bo(batch, batch->polygon_list);
> -
> -                /* A BO reference has been retained by panfrost_batch_add_bo(),
> -                 * so we need to unreference it here if we want the BO to be
> -                 * automatically released when the batch is destroyed.
> -                 */
> -                panfrost_bo_unreference(&screen->base, batch->polygon_list);
> +                batch->polygon_list = panfrost_batch_create_bo(batch, size,
> +				                               PAN_BO_INVISIBLE);
>          }
>  
>          return batch->polygon_list->gpu;
> diff --git a/src/gallium/drivers/panfrost/pan_job.h b/src/gallium/drivers/panfrost/pan_job.h
> index b0580ea2d470..b1351b902bd2 100644
> --- a/src/gallium/drivers/panfrost/pan_job.h
> +++ b/src/gallium/drivers/panfrost/pan_job.h
> @@ -124,6 +124,10 @@ panfrost_batch_init(struct panfrost_context *ctx);
>  void
>  panfrost_batch_add_bo(struct panfrost_batch *batch, struct panfrost_bo *bo);
>  
> +struct panfrost_bo *
> +panfrost_batch_create_bo(struct panfrost_batch *batch, size_t size,
> +                         uint32_t create_flags);
> +
>  void
>  panfrost_batch_submit(struct panfrost_batch *batch);
>  
> -- 
> 2.21.0