From 5a4d095f9b58e127c2eae9aa64595afeb36b554d Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Sat, 14 Sep 2019 17:57:06 +0200 Subject: [PATCH] panfrost: Add the panfrost_batch_create_bo() helper 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 Reviewed-by: Alyssa Rosenzweig --- 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 7938196e3e4..3076c23ab1c 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 90a1e2956a5..6bd6ff71cdc 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 4ffc990a533..cc0db3e440a 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 b0580ea2d47..b1351b902bd 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.30.2