Mesa (main): zink: pop descriptor refs when invalidating sets
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed May 12 02:50:20 UTC 2021
Module: Mesa
Branch: main
Commit: 73a9dbce6b6052136feab850c93a41259db03227
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=73a9dbce6b6052136feab850c93a41259db03227
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Thu Apr 1 14:52:21 2021 -0400
zink: pop descriptor refs when invalidating sets
this avoids memory ballooning, mainly for samplers, when a descriptorset
component has refs for a very, very large number of sets
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10699>
---
src/gallium/drivers/zink/zink_descriptors.c | 40 +++++++++++++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/src/gallium/drivers/zink/zink_descriptors.c b/src/gallium/drivers/zink/zink_descriptors.c
index e8034107f2a..00d5bb6e3ef 100644
--- a/src/gallium/drivers/zink/zink_descriptors.c
+++ b/src/gallium/drivers/zink/zink_descriptors.c
@@ -88,10 +88,50 @@ desc_state_hash(const void *key)
return hash;
}
+static void
+pop_desc_set_ref(struct zink_descriptor_set *zds, struct util_dynarray *refs)
+{
+ size_t size = sizeof(struct zink_descriptor_reference);
+ unsigned num_elements = refs->size / size;
+ for (unsigned i = 0; i < num_elements; i++) {
+ struct zink_descriptor_reference *ref = util_dynarray_element(refs, struct zink_descriptor_reference, i);
+ if (&zds->invalid == ref->invalid) {
+ memcpy(util_dynarray_element(refs, struct zink_descriptor_reference, i),
+ util_dynarray_pop_ptr(refs, struct zink_descriptor_reference), size);
+ break;
+ }
+ }
+}
+
static void
descriptor_set_invalidate(struct zink_descriptor_set *zds)
{
zds->invalid = true;
+ for (unsigned i = 0; i < zds->pool->key.layout->num_descriptors; i++) {
+ switch (zds->pool->type) {
+ case ZINK_DESCRIPTOR_TYPE_UBO:
+ case ZINK_DESCRIPTOR_TYPE_SSBO:
+ if (zds->res_objs[i])
+ pop_desc_set_ref(zds, &zds->res_objs[i]->desc_set_refs.refs);
+ zds->res_objs[i] = NULL;
+ break;
+ case ZINK_DESCRIPTOR_TYPE_IMAGE:
+ if (zds->image_views[i])
+ pop_desc_set_ref(zds, &zds->image_views[i]->desc_set_refs.refs);
+ zds->image_views[i] = NULL;
+ break;
+ case ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW:
+ if (zds->sampler_views[i])
+ pop_desc_set_ref(zds, &zds->sampler_views[i]->desc_set_refs.refs);
+ zds->sampler_views[i] = NULL;
+ if (zds->sampler_states[i])
+ pop_desc_set_ref(zds, &zds->sampler_states[i]->desc_set_refs.refs);
+ zds->sampler_states[i] = NULL;
+ break;
+ default:
+ break;
+ }
+ }
}
#ifndef NDEBUG
More information about the mesa-commit
mailing list