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