Mesa (main): zink: split batch usage setting from refcounting

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jul 2 01:48:11 UTC 2021


Module: Mesa
Branch: main
Commit: 6acd2e9de3270bcf84249771e4d2216c8cf4881c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6acd2e9de3270bcf84249771e4d2216c8cf4881c

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Tue May 11 08:44:29 2021 -0400

zink: split batch usage setting from refcounting

batch tracking has until now been the same as refcounting, but this
is inefficient and incurs additional overhead from constant atomic ops,
so make them separate

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11684>

---

 src/gallium/drivers/zink/zink_batch.c       | 30 ++++++++++++++---------------
 src/gallium/drivers/zink/zink_batch.h       |  2 +-
 src/gallium/drivers/zink/zink_descriptors.c |  4 +++-
 3 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c
index d9423d27f41..dd8ab13ae0b 100644
--- a/src/gallium/drivers/zink/zink_batch.c
+++ b/src/gallium/drivers/zink/zink_batch.c
@@ -597,45 +597,41 @@ zink_batch_reference_resource_rw(struct zink_batch *batch, struct zink_resource
 }
 
 bool
-batch_ptr_add_usage(struct zink_batch *batch, struct set *s, void *ptr, struct zink_batch_usage **u)
+batch_ptr_add_usage(struct zink_batch *batch, struct set *s, void *ptr)
 {
    bool found = false;
-   if (*u == &batch->state->usage)
-      return false;
-   _mesa_set_search_and_add(s, ptr, &found);
-   assert(!found);
-   zink_batch_usage_set(u, batch->state);
-   return true;
+   _mesa_set_search_or_add(s, ptr, &found);
+   return !found;
 }
 
 void
 zink_batch_reference_resource(struct zink_batch *batch, struct zink_resource *res)
 {
-   bool found = false;
-   _mesa_set_search_and_add(batch->state->resources, res->obj, &found);
-   if (!found) {
-      pipe_reference(NULL, &res->obj->reference);
-      batch->state->resource_size += res->obj->size;
-   }
+   if (!batch_ptr_add_usage(batch, batch->state->resources, res->obj))
+      return;
+   pipe_reference(NULL, &res->obj->reference);
+   batch->state->resource_size += res->obj->size;
    batch->has_work = true;
 }
 
 void
 zink_batch_reference_bufferview(struct zink_batch *batch, struct zink_buffer_view *buffer_view)
 {
-   if (!batch_ptr_add_usage(batch, batch->state->bufferviews, buffer_view, &buffer_view->batch_uses))
+   if (!batch_ptr_add_usage(batch, batch->state->bufferviews, buffer_view))
       return;
    pipe_reference(NULL, &buffer_view->reference);
+   zink_batch_usage_set(&buffer_view->batch_uses, batch->state);
    batch->has_work = true;
 }
 
 void
 zink_batch_reference_surface(struct zink_batch *batch, struct zink_surface *surface)
 {
-   if (!batch_ptr_add_usage(batch, batch->state->surfaces, surface, &surface->batch_uses))
+   if (!batch_ptr_add_usage(batch, batch->state->surfaces, surface))
       return;
    struct pipe_surface *surf = NULL;
    pipe_surface_reference(&surf, &surface->base);
+   zink_batch_usage_set(&surface->batch_uses, batch->state);
    batch->has_work = true;
 }
 
@@ -663,9 +659,11 @@ void
 zink_batch_reference_program(struct zink_batch *batch,
                              struct zink_program *pg)
 {
-   if (!batch_ptr_add_usage(batch, batch->state->programs, pg, &pg->batch_uses))
+   if (zink_batch_usage_matches(pg->batch_uses, batch->state) ||
+       !batch_ptr_add_usage(batch, batch->state->programs, pg))
       return;
    pipe_reference(NULL, &pg->reference);
+   zink_batch_usage_set(&pg->batch_uses, batch->state);
    batch->has_work = true;
 }
 
diff --git a/src/gallium/drivers/zink/zink_batch.h b/src/gallium/drivers/zink/zink_batch.h
index b998af399c6..3448f2b6e68 100644
--- a/src/gallium/drivers/zink/zink_batch.h
+++ b/src/gallium/drivers/zink/zink_batch.h
@@ -58,7 +58,7 @@ struct zink_batch_usage {
 
 /* not real api don't use */
 bool
-batch_ptr_add_usage(struct zink_batch *batch, struct set *s, void *ptr, struct zink_batch_usage **u);
+batch_ptr_add_usage(struct zink_batch *batch, struct set *s, void *ptr);
 
 struct zink_batch_state {
    struct zink_fence fence;
diff --git a/src/gallium/drivers/zink/zink_descriptors.c b/src/gallium/drivers/zink/zink_descriptors.c
index a39e6441f66..54d7eef3e83 100644
--- a/src/gallium/drivers/zink/zink_descriptors.c
+++ b/src/gallium/drivers/zink/zink_descriptors.c
@@ -101,9 +101,11 @@ pdd_cached(struct zink_program *pg)
 static bool
 batch_add_desc_set(struct zink_batch *batch, struct zink_descriptor_set *zds)
 {
-   if (!batch_ptr_add_usage(batch, batch->state->dd->desc_sets, zds, &zds->batch_uses))
+   if (zink_batch_usage_matches(zds->batch_uses, batch->state) ||
+       !batch_ptr_add_usage(batch, batch->state->dd->desc_sets, zds))
       return false;
    pipe_reference(NULL, &zds->reference);
+   zink_batch_usage_set(&zds->batch_uses, batch->state);
    return true;
 }
 



More information about the mesa-commit mailing list