From c028ffea7085297ea21d565dbc3913162ab70635 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg=20Kristensen?= Date: Thu, 3 Mar 2016 16:48:31 -0800 Subject: [PATCH] anv: Serialize as much pipeline cache as we can We can serialize as much as the application asks for and just stop once we run out of memory. This lets applications use a fixed amount of space for caching and still get some benefit. --- src/intel/vulkan/anv_pipeline_cache.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/intel/vulkan/anv_pipeline_cache.c b/src/intel/vulkan/anv_pipeline_cache.c index fa41637d2c0..932baddb83a 100644 --- a/src/intel/vulkan/anv_pipeline_cache.c +++ b/src/intel/vulkan/anv_pipeline_cache.c @@ -77,6 +77,16 @@ struct cache_entry { /* kernel follows prog_data at next 64 byte aligned address */ }; +static uint32_t +entry_size(struct cache_entry *entry) +{ + /* This returns the number of bytes needed to serialize an entry, which + * doesn't include the alignment padding bytes. + */ + + return sizeof(*entry) + entry->prog_data_size + entry->kernel_size; +} + void anv_hash_shader(unsigned char *hash, const void *key, size_t key_size, struct anv_shader_module *module, @@ -146,10 +156,7 @@ anv_pipeline_cache_add_entry(struct anv_pipeline_cache *cache, } } - /* We don't include the alignment padding bytes when we serialize, so - * don't include taht in the the total size. */ - cache->total_size += - sizeof(*entry) + entry->prog_data_size + entry->kernel_size; + cache->total_size += entry_size(entry); cache->kernel_count++; } @@ -345,12 +352,12 @@ VkResult anv_GetPipelineCacheData( return VK_SUCCESS; } - if (*pDataSize < size) { + if (*pDataSize < sizeof(*header)) { *pDataSize = 0; return VK_INCOMPLETE; } - void *p = pData; + void *p = pData, *end = pData + *pDataSize; header = p; header->header_size = sizeof(*header); header->header_version = VK_PIPELINE_CACHE_HEADER_VERSION_ONE; @@ -365,6 +372,8 @@ VkResult anv_GetPipelineCacheData( continue; entry = cache->program_stream.block_pool->map + cache->table[i]; + if (end < p + entry_size(entry)) + break; memcpy(p, entry, sizeof(*entry) + entry->prog_data_size); p += sizeof(*entry) + entry->prog_data_size; @@ -376,6 +385,8 @@ VkResult anv_GetPipelineCacheData( p += entry->kernel_size; } + *pDataSize = p - pData; + return VK_SUCCESS; } -- 2.30.2