zink: move resource unrefs to flush thread
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Tue, 31 Aug 2021 20:42:17 +0000 (16:42 -0400)
committerMarge Bot <eric+marge@anholt.net>
Mon, 13 Sep 2021 00:38:42 +0000 (00:38 +0000)
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 <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12759>

src/gallium/drivers/zink/zink_batch.c
src/gallium/drivers/zink/zink_batch.h

index 8e772d8..c3a559d 100644 (file)
@@ -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);
 }
 
 
index 2e475ef..4b07764 100644 (file)
@@ -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;