radv: do not insert shaders in cache when it's disabled
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Wed, 31 Jan 2018 14:53:37 +0000 (15:53 +0100)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 1 Feb 2018 08:40:11 +0000 (09:40 +0100)
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 <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_pipeline_cache.c

index db48895817e4e1cd1000e0b94b756f84cb631bab..7205a3d8969302a5a20e8586a0ee493d9593b376 100644 (file)
@@ -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])