From 46b6ecd4ab687c666149476de9727a18d9ab1e39 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 31 Aug 2021 16:42:17 -0400 Subject: [PATCH] zink: move resource unrefs to flush thread unrefs here (almost always) mean destruction, which means eating the cost of the atomics for the unrefs and then also the destructors instead, handle this at the end of the next submit from this batch, since the submit thread is never as busy as the driver thread Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_batch.c | 15 ++++++++++++++- src/gallium/drivers/zink/zink_batch.h | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index 8e772d8701f..c3a559d0b37 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -37,7 +37,7 @@ zink_reset_batch_state(struct zink_context *ctx, struct zink_batch_state *bs) set_foreach_remove(bs->resources, entry) { struct zink_resource_object *obj = (struct zink_resource_object *)entry->key; zink_resource_object_usage_unset(obj, bs); - zink_resource_object_reference(screen, &obj, NULL); + util_dynarray_append(&bs->unref_resources, struct zink_resource_object*, obj); } set_foreach_remove(bs->active_queries, entry) { @@ -97,11 +97,21 @@ zink_reset_batch_state(struct zink_context *ctx, struct zink_batch_state *bs) bs->usage.usage = 0; } +static void +unref_resources(struct zink_screen *screen, struct zink_batch_state *bs) +{ + while (util_dynarray_contains(&bs->unref_resources, struct zink_resource_object*)) { + struct zink_resource_object *obj = util_dynarray_pop(&bs->unref_resources, struct zink_resource_object*); + zink_resource_object_reference(screen, &obj, NULL); + } +} + void zink_clear_batch_state(struct zink_context *ctx, struct zink_batch_state *bs) { bs->fence.completed = true; zink_reset_batch_state(ctx, bs); + unref_resources(zink_screen(ctx->base.screen), bs); } void @@ -141,6 +151,7 @@ zink_batch_state_destroy(struct zink_screen *screen, struct zink_batch_state *bs util_dynarray_fini(&bs->zombie_samplers); util_dynarray_fini(&bs->dead_framebuffers); + util_dynarray_fini(&bs->unref_resources); _mesa_set_destroy(bs->surfaces, NULL); _mesa_set_destroy(bs->bufferviews, NULL); _mesa_set_destroy(bs->programs, NULL); @@ -189,6 +200,7 @@ create_batch_state(struct zink_context *ctx) util_dynarray_init(&bs->zombie_samplers, NULL); util_dynarray_init(&bs->dead_framebuffers, NULL); util_dynarray_init(&bs->persistent_resources, NULL); + util_dynarray_init(&bs->unref_resources, NULL); cnd_init(&bs->usage.flush); mtx_init(&bs->usage.mtx, mtx_plain); @@ -392,6 +404,7 @@ end: cnd_broadcast(&bs->usage.flush); p_atomic_set(&bs->fence.submitted, true); + unref_resources(screen, bs); } diff --git a/src/gallium/drivers/zink/zink_batch.h b/src/gallium/drivers/zink/zink_batch.h index 2e475ef8de2..4b077646369 100644 --- a/src/gallium/drivers/zink/zink_batch.h +++ b/src/gallium/drivers/zink/zink_batch.h @@ -81,6 +81,8 @@ struct zink_batch_state { struct set *surfaces; struct set *bufferviews; + struct util_dynarray unref_resources; + struct util_dynarray persistent_resources; struct util_dynarray zombie_samplers; struct util_dynarray dead_framebuffers;