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