From fd24be134ffda15c82d163cf9b7e9da8d65407d4 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Wed, 11 Oct 2017 12:10:31 +1100 Subject: [PATCH] radv: make use of on-disk cache If the app provided in-memory pipeline cache doesn't yet contain what we are looking for, or it doesn't provide one at all then we fallback to the on-disk cache. Reviewed-by: Bas Nieuwenhuizen --- src/amd/vulkan/radv_pipeline_cache.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/amd/vulkan/radv_pipeline_cache.c b/src/amd/vulkan/radv_pipeline_cache.c index 625c58e66c7..94437e2b30c 100644 --- a/src/amd/vulkan/radv_pipeline_cache.c +++ b/src/amd/vulkan/radv_pipeline_cache.c @@ -23,6 +23,7 @@ #include "util/mesa-sha1.h" #include "util/debug.h" +#include "util/disk_cache.h" #include "util/u_atomic.h" #include "radv_debug.h" #include "radv_private.h" @@ -165,8 +166,16 @@ radv_create_shader_variant_from_pipeline_cache(struct radv_device *device, else entry = radv_pipeline_cache_search(device->mem_cache, sha1); - if (!entry) - return NULL; + if (!entry) { + uint8_t disk_sha1[20]; + disk_cache_compute_key(device->physical_device->disk_cache, + sha1, 20, disk_sha1); + entry = (struct cache_entry *) + disk_cache_get(device->physical_device->disk_cache, + disk_sha1, NULL); + if (!entry) + return NULL; + } if (!entry->variant) { struct radv_shader_variant *variant; @@ -301,6 +310,20 @@ radv_pipeline_cache_insert_shader(struct radv_device *device, entry->rsrc1 = variant->rsrc1; entry->rsrc2 = variant->rsrc2; entry->code_size = code_size; + + /* Set variant to NULL so we have reproducible cache items */ + entry->variant = NULL; + + /* Always add cache items to disk. This will allow collection of + * compiled shaders by third parties such as steam, even if the app + * implements its own pipeline cache. + */ + uint8_t disk_sha1[20]; + disk_cache_compute_key(device->physical_device->disk_cache, sha1, 20, + disk_sha1); + disk_cache_put(device->physical_device->disk_cache, + disk_sha1, entry, entry_size(entry), NULL); + entry->variant = variant; p_atomic_inc(&variant->ref_count);