diff --git a/.pick_status.json b/.pick_status.json index 03ef5e66120..96c440e25a7 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -454,7 +454,7 @@ "description": "zink: stop leaking descriptor sets", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/gallium/drivers/zink/zink_descriptors.c b/src/gallium/drivers/zink/zink_descriptors.c index 260aebbac21..87dca30105d 100644 --- a/src/gallium/drivers/zink/zink_descriptors.c +++ b/src/gallium/drivers/zink/zink_descriptors.c @@ -804,20 +804,28 @@ zink_descriptor_set_get(struct zink_context *ctx, simple_mtx_lock(&pool->mtx); if (last_set && last_set->hash == hash && desc_state_equal(&last_set->key, &key)) { + bool was_recycled = false; zds = last_set; *cache_hit = !zds->invalid; if (zds->recycled) { struct hash_entry *he = _mesa_hash_table_search_pre_hashed(pool->free_desc_sets, hash, &key); - if (he) + if (he) { + was_recycled = true; _mesa_hash_table_remove(pool->free_desc_sets, he); + } zds->recycled = false; } if (zds->invalid) { if (zink_batch_usage_exists(zds->batch_uses)) punt_invalid_set(zds, NULL); - else + else { + if (was_recycled) { + descriptor_set_invalidate(zds); + goto out; + } /* this set is guaranteed to be in pool->alloc_desc_sets */ goto skip_hash_tables; + } zds = NULL; } if (zds)