If the app provided and in-memory pipeline caches don't contain
what we are looking for then we fallback to the on-disk cache.
---
 src/amd/vulkan/radv_pipeline_cache.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/amd/vulkan/radv_pipeline_cache.c 
b/src/amd/vulkan/radv_pipeline_cache.c
index 3a58f6a..ffcb8e5 100644
--- a/src/amd/vulkan/radv_pipeline_cache.c
+++ b/src/amd/vulkan/radv_pipeline_cache.c
@@ -16,20 +16,21 @@
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
 
 #include "util/mesa-sha1.h"
 #include "util/debug.h"
+#include "util/disk_cache.h"
 #include "radv_private.h"
 
 #include "ac_nir_to_llvm.h"
 
 struct cache_entry {
        union {
                unsigned char sha1[20];
                uint32_t sha1_dw[5];
        };
        uint32_t code_size;
@@ -152,22 +153,28 @@ radv_create_shader_variant_from_pipeline_cache(struct 
radv_device *device,
                                               struct radv_pipeline_cache 
*cache,
                                               const unsigned char *sha1)
 {
        struct cache_entry *entry = NULL;
 
        if (cache)
                entry = radv_pipeline_cache_search(cache, sha1);
        else
                entry = radv_pipeline_cache_search(device->mem_cache, sha1);
 
-       if (!entry)
-               return NULL;
+       if (!entry) {
+               size_t entry_size;
+               entry = (struct cache_entry *)
+                       disk_cache_get(device->physical_device->disk_cache,
+                                      sha1, &entry_size);
+               if (!entry)
+                       return NULL;
+       }
 
        if (!entry->variant) {
                struct radv_shader_variant *variant;
 
                variant = calloc(1, sizeof(struct radv_shader_variant));
                if (!variant)
                        return NULL;
 
                variant->config = entry->config;
                variant->info = entry->variant_info;
@@ -294,20 +301,22 @@ radv_pipeline_cache_insert_shader(struct radv_device 
*device,
        memcpy(entry->code, code, code_size);
        entry->config = variant->config;
        entry->variant_info = variant->info;
        entry->rsrc1 = variant->rsrc1;
        entry->rsrc2 = variant->rsrc2;
        entry->code_size = code_size;
        entry->variant = variant;
        __sync_fetch_and_add(&variant->ref_count, 1);
 
        radv_pipeline_cache_add_entry(cache, entry);
+       disk_cache_put(device->physical_device->disk_cache,
+                      sha1, entry, sizeof(*entry) + code_size);
 
        cache->modified = true;
        pthread_mutex_unlock(&cache->mutex);
        return variant;
 }
 
 struct cache_header {
        uint32_t header_size;
        uint32_t header_version;
        uint32_t vendor_id;
-- 
2.9.3

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to