From e8ceb8f56aae8b2b391801bc5958b68fc34cecdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= Date: Fri, 7 Aug 2020 15:16:19 +0200 Subject: [PATCH] v3dv/meta: fix hash table insertion So far we were using directly the local variable key to do the insertion, when the hash table expects a permanent address. We add a key field on all the meta structures (that are already basically a wrapper over v3dv_pipeline). Part-of: --- src/broadcom/vulkan/v3dv_meta_clear.c | 8 ++++++-- src/broadcom/vulkan/v3dv_meta_copy.c | 4 +++- src/broadcom/vulkan/v3dv_private.h | 7 +++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_meta_clear.c b/src/broadcom/vulkan/v3dv_meta_clear.c index 07d2a20070e..26e7e8fb006 100644 --- a/src/broadcom/vulkan/v3dv_meta_clear.c +++ b/src/broadcom/vulkan/v3dv_meta_clear.c @@ -575,7 +575,9 @@ get_color_clear_pipeline(struct v3dv_device *device, if (result != VK_SUCCESS) goto fail; - _mesa_hash_table_insert(device->meta.color_clear.cache, &key, *pipeline); + (*pipeline)->key = key; + _mesa_hash_table_insert(device->meta.color_clear.cache, + &(*pipeline)->key, *pipeline); mtx_unlock(&device->meta.mtx); return VK_SUCCESS; @@ -653,7 +655,9 @@ get_depth_clear_pipeline(struct v3dv_device *device, if (result != VK_SUCCESS) goto fail; - _mesa_hash_table_insert(device->meta.depth_clear.cache, &key, *pipeline); + (*pipeline)->key = key; + _mesa_hash_table_insert(device->meta.depth_clear.cache, + &(*pipeline)->key, *pipeline); mtx_unlock(&device->meta.mtx); return VK_SUCCESS; diff --git a/src/broadcom/vulkan/v3dv_meta_copy.c b/src/broadcom/vulkan/v3dv_meta_copy.c index aea5278a8db..e1e63071a97 100644 --- a/src/broadcom/vulkan/v3dv_meta_copy.c +++ b/src/broadcom/vulkan/v3dv_meta_copy.c @@ -3609,7 +3609,9 @@ get_blit_pipeline(struct v3dv_device *device, if (!ok) goto fail; - _mesa_hash_table_insert(device->meta.blit.cache[src_type], &key, *pipeline); + memcpy((*pipeline)->key, key, sizeof((*pipeline)->key)); + _mesa_hash_table_insert(device->meta.blit.cache[src_type], + &(*pipeline)->key, *pipeline); mtx_unlock(&device->meta.mtx); return true; diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index efce022f737..82a5a634749 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -228,23 +228,26 @@ struct v3dv_queue { mtx_t mutex; }; +#define V3DV_META_BLIT_CACHE_KEY_SIZE (4 * sizeof(uint32_t)) + struct v3dv_meta_color_clear_pipeline { VkPipeline pipeline; VkRenderPass pass; bool free_render_pass; + uint64_t key; }; struct v3dv_meta_depth_clear_pipeline { VkPipeline pipeline; + uint64_t key; }; struct v3dv_meta_blit_pipeline { VkPipeline pipeline; VkRenderPass pass; + uint8_t key[V3DV_META_BLIT_CACHE_KEY_SIZE]; }; -#define V3DV_META_BLIT_CACHE_KEY_SIZE (4 * sizeof(uint32_t)) - struct v3dv_pipeline_cache_stats { uint32_t miss; uint32_t hit;