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@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10699>
This commit is contained in:
parent
e3933548c2
commit
73a9dbce6b
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue