From: Stefan Dösinger stefan@codeweavers.com
FIXME: Calling put/get from the enum callback will deadlock with a unix build that uses posix mutexes instead of win32 critical sections. --- libs/vkd3d/cache.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d/cache.c b/libs/vkd3d/cache.c index c7f543a64..6ca261507 100644 --- a/libs/vkd3d/cache.c +++ b/libs/vkd3d/cache.c @@ -194,6 +194,14 @@ static uint64_t hash_key(const void *key, size_t size) return ret; }
+static void vkd3d_shader_cache_lock(struct vkd3d_shader_cache *cache) +{ + if (cache->desc.flags & (VKD3D_SHADER_CACHE_FLAGS_NO_SERIALIZE | VKD3D_SHADER_CACHE_FLAGS_READ_ONLY)) + return; + + vkd3d_mutex_lock(&cache->lock); +} + static bool vkd3d_shader_cache_trylock(struct vkd3d_shader_cache *cache) { if (cache->desc.flags & (VKD3D_SHADER_CACHE_FLAGS_NO_SERIALIZE | VKD3D_SHADER_CACHE_FLAGS_READ_ONLY)) @@ -360,7 +368,17 @@ void vkd3d_shader_cache_delete_on_destroy(struct vkd3d_shader_cache *cache) }
void vkd3d_shader_cache_enumerate(struct vkd3d_shader_cache *cache, - vkd3d_shader_cache_traverse_func *cb, void *context) + vkd3d_shader_cache_traverse_func *cb, void *ctx) { - FIXME("%p, %p, %p: stub!\n", cache, cb, context); + struct shader_cache_entry *e; + struct rb_entry *iter; + + vkd3d_shader_cache_lock(cache); + RB_FOR_EACH(iter, &cache->tree) + { + e = RB_ENTRY_VALUE(iter, struct shader_cache_entry, entry); + if(!cb(cache, e->payload, e->d.key_size, e->payload + e->d.key_size, e->d.value_size, ctx)) + break; + } + vkd3d_shader_cache_unlock(cache); }