util/set: Fix the _mesa_set_clear function to not leave tombstones.

This implementation was broken and should have just been the same as the
hash_table_clear() one, which I copied over here.  It was setting all
formerly-present entries to deleted, yet also setting deleted_entries to
0.  This meant that all new searches or additions after clearing would
have to reprobe the whole table until a rehash happened, and that rehash
would be delayed because we violated the deleted_entries invariant.

No statistically significant performance difference on softpipe
KHR-GL33.texture_swizzle.functional runtime (n=18)

Fixes: 5c075b0855 ("util/set: add a set_clear function")
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7244>
This commit is contained in:
Eric Anholt 2020-10-20 14:37:10 -07:00 committed by Marge Bot
parent 4618ca82c3
commit 2afdd94f86

View file

@ -223,13 +223,17 @@ _mesa_set_clear(struct set *set, void (*delete_function)(struct set_entry *entry
if (!set)
return;
set_foreach (set, entry) {
if (delete_function)
struct set_entry *entry;
for (entry = set->table; entry != set->table + set->size; entry++) {
if (entry_is_present(entry) && delete_function != NULL)
delete_function(entry);
entry->key = deleted_key;
entry->key = NULL;
}
set->entries = set->deleted_entries = 0;
set->entries = 0;
set->deleted_entries = 0;
}
/**