From 2ef5ce11985c7ccd34887d00ab57e32d4036dbed Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Wed, 31 Jan 2018 15:53:37 +0100 Subject: [PATCH] radv: do not insert shaders in cache when it's disabled When the application doesn't provide its own pipeline cache, the driver uses a in-memory cache but it shouldn't insert any entries when the cache is explicitely disabled by the user. Found while running my experimental pipeline-db tool with a ton of shaders, the memory footprint was just huge, and sometimes the process was even killed... Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen --- src/amd/vulkan/radv_pipeline_cache.c | 29 +++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/amd/vulkan/radv_pipeline_cache.c b/src/amd/vulkan/radv_pipeline_cache.c index db48895817e..7205a3d8969 100644 --- a/src/amd/vulkan/radv_pipeline_cache.c +++ b/src/amd/vulkan/radv_pipeline_cache.c @@ -241,6 +241,17 @@ radv_pipeline_cache_add_entry(struct radv_pipeline_cache *cache, radv_pipeline_cache_set_entry(cache, entry); } +static bool +radv_is_cache_disabled(struct radv_device *device) +{ + /* Pipeline caches can be disabled with RADV_DEBUG=nocache, with + * MESA_GLSL_CACHE_DISABLE=1, and when VK_AMD_shader_info is requested. + */ + return (device->instance->debug_flags & RADV_DEBUG_NO_CACHE) || + !device->physical_device->disk_cache || + device->keep_shader_info; +} + bool radv_create_shader_variants_from_pipeline_cache(struct radv_device *device, struct radv_pipeline_cache *cache, @@ -257,11 +268,10 @@ radv_create_shader_variants_from_pipeline_cache(struct radv_device *device, entry = radv_pipeline_cache_search_unlocked(cache, sha1); if (!entry) { - /* Again, don't cache when we want debug info, since this isn't - * present in the cache. */ - if (!device->physical_device->disk_cache || - (device->instance->debug_flags & RADV_DEBUG_NO_CACHE) || - device->keep_shader_info) { + /* Don't cache when we want debug info, since this isn't + * present in the cache. + */ + if (radv_is_cache_disabled(device)) { pthread_mutex_unlock(&cache->mutex); return false; } @@ -362,6 +372,15 @@ radv_pipeline_cache_insert_shaders(struct radv_device *device, pthread_mutex_unlock(&cache->mutex); return; } + + /* Don't cache when we want debug info, since this isn't + * present in the cache. + */ + if (radv_is_cache_disabled(device)) { + pthread_mutex_unlock(&cache->mutex); + return; + } + size_t size = sizeof(*entry); for (int i = 0; i < MESA_SHADER_STAGES; ++i) if (variants[i]) -- 2.30.2