--- src/amd/vulkan/radv_pipeline.c | 27 +++++--- src/amd/vulkan/radv_pipeline_cache.c | 127 ----------------------------------- src/amd/vulkan/radv_private.h | 12 +--- 3 files changed, 17 insertions(+), 149 deletions(-)
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 4bb9fbb15b..e95925fda5 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -1544,25 +1544,23 @@ void radv_create_shaders(struct radv_pipeline *pipeline, strlen(modules[i]->nir->info.name), modules[i]->sha1); } } radv_hash_shaders(hash, pStages, pipeline->layout, keys, get_hash_flags(device)); memcpy(gs_copy_hash, hash, 20); gs_copy_hash[0] ^= 1; if (modules[MESA_SHADER_GEOMETRY]) { - pipeline->gs_copy_shader = - radv_create_shader_variant_from_pipeline_cache( - pipeline->device, - cache, - gs_copy_hash); + struct radv_shader_variant *variants[MESA_SHADER_STAGES] = {0}; + radv_create_shader_variants_from_pipeline_cache(device, cache, gs_copy_hash, variants); + pipeline->gs_copy_shader = variants[MESA_SHADER_GEOMETRY]; } if (radv_create_shader_variants_from_pipeline_cache(device, cache, hash, pipeline->shaders) && (!modules[MESA_SHADER_GEOMETRY] || pipeline->gs_copy_shader)) return; if (!modules[MESA_SHADER_FRAGMENT]) { nir_builder fs_b; nir_builder_init_simple_shader(&fs_b, NULL, MESA_SHADER_FRAGMENT, NULL); fs_b.shader->info.name = ralloc_strdup(fs_b.shader, "noop_fs"); @@ -1622,26 +1620,33 @@ void radv_create_shaders(struct radv_pipeline *pipeline, void *gs_copy_code = NULL; unsigned gs_copy_code_size = 0; if (!pipeline->gs_copy_shader) { pipeline->gs_copy_shader = radv_create_gs_copy_shader( device, nir[MESA_SHADER_GEOMETRY], &gs_copy_code, &gs_copy_code_size, keys[MESA_SHADER_GEOMETRY].has_multiview_view_index); } if (pipeline->gs_copy_shader) { - pipeline->gs_copy_shader = - radv_pipeline_cache_insert_shader(device, cache, - gs_copy_hash, - pipeline->gs_copy_shader, - gs_copy_code, - gs_copy_code_size); + void *code[MESA_SHADER_STAGES] = {0}; + unsigned code_size[MESA_SHADER_STAGES] = {0}; + struct radv_shader_variant *variants[MESA_SHADER_STAGES] = {0}; + + code[MESA_SHADER_GEOMETRY] = gs_copy_code; + code_size[MESA_SHADER_GEOMETRY] = gs_copy_code_size; + variants[MESA_SHADER_GEOMETRY] = pipeline->gs_copy_shader; + + radv_pipeline_cache_insert_shaders(device, cache, + gs_copy_hash, + variants, + (const void**)code, + code_size); } free(gs_copy_code); } radv_pipeline_cache_insert_shaders(device, cache, hash, pipeline->shaders, (const void**)codes, code_sizes); for (int i = 0; i < MESA_SHADER_STAGES; ++i) { free(codes[i]); if (modules[i] && !modules[i]->nir) diff --git a/src/amd/vulkan/radv_pipeline_cache.c b/src/amd/vulkan/radv_pipeline_cache.c index d29098eea0..1e8a703ce2 100644 --- a/src/amd/vulkan/radv_pipeline_cache.c +++ b/src/amd/vulkan/radv_pipeline_cache.c @@ -163,74 +163,20 @@ radv_pipeline_cache_search(struct radv_pipeline_cache *cache, pthread_mutex_lock(&cache->mutex); entry = radv_pipeline_cache_search_unlocked(cache, sha1); pthread_mutex_unlock(&cache->mutex); return entry; } -struct radv_shader_variant * -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) { - if (!device->physical_device->disk_cache) - return NULL; - 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->variants[0]) { - struct radv_shader_variant *variant; - char *p = entry->code; - struct cache_entry_variant_info info; - - variant = calloc(1, sizeof(struct radv_shader_variant)); - if (!variant) - return NULL; - - memcpy(&info, p, sizeof(struct cache_entry_variant_info)); - p += sizeof(struct cache_entry_variant_info); - - variant->code_size = entry->code_sizes[0]; - variant->config = info.config; - variant->info = info.variant_info; - variant->rsrc1 = info.rsrc1; - variant->rsrc2 = info.rsrc2; - variant->ref_count = 1; - - void *ptr = radv_alloc_shader_memory(device, variant); - memcpy(ptr, p, entry->code_sizes[0]); - - entry->variants[0] = variant; - } - - p_atomic_inc(&entry->variants[0]->ref_count); - return entry->variants[0]; -} - bool radv_create_shader_variants_from_pipeline_cache(struct radv_device *device, struct radv_pipeline_cache *cache, const unsigned char *sha1, struct radv_shader_variant **variants) { struct cache_entry *entry; if (cache) entry = radv_pipeline_cache_search(cache, sha1); else @@ -350,93 +296,20 @@ radv_pipeline_cache_add_entry(struct radv_pipeline_cache *cache, if (cache->kernel_count == cache->table_size / 2) radv_pipeline_cache_grow(cache); /* Failing to grow that hash table isn't fatal, but may mean we don't * have enough space to add this new kernel. Only add it if there's room. */ if (cache->kernel_count < cache->table_size / 2) radv_pipeline_cache_set_entry(cache, entry); } -struct radv_shader_variant * -radv_pipeline_cache_insert_shader(struct radv_device *device, - struct radv_pipeline_cache *cache, - const unsigned char *sha1, - struct radv_shader_variant *variant, - const void *code, unsigned code_size) -{ - if (!cache) - cache = device->mem_cache; - - pthread_mutex_lock(&cache->mutex); - struct cache_entry *entry = radv_pipeline_cache_search_unlocked(cache, sha1); - if (entry) { - if (entry->variants[0]) { - radv_shader_variant_destroy(cache->device, variant); - variant = entry->variants[0]; - } else { - entry->variants[0] = variant; - } - p_atomic_inc(&variant->ref_count); - pthread_mutex_unlock(&cache->mutex); - return variant; - } - - entry = vk_alloc(&cache->alloc, sizeof(*entry) + sizeof(struct cache_entry_variant_info) + code_size, 8, - VK_SYSTEM_ALLOCATION_SCOPE_CACHE); - if (!entry) { - pthread_mutex_unlock(&cache->mutex); - return variant; - } - - memset(entry, 0, sizeof(*entry)); - - char* p = entry->code; - struct cache_entry_variant_info info; - - info.config = variant->config; - info.variant_info = variant->info; - info.rsrc1 = variant->rsrc1; - info.rsrc2 = variant->rsrc2; - memcpy(p, &info, sizeof(struct cache_entry_variant_info)); - p += sizeof(struct cache_entry_variant_info); - - memcpy(entry->sha1, sha1, 20); - memcpy(p, code, code_size); - - entry->code_sizes[0] = code_size; - - /* Set variant to NULL so we have reproducible cache items */ - entry->variants[0] = 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. - */ - if (device->physical_device->disk_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->variants[0] = variant; - p_atomic_inc(&variant->ref_count); - - radv_pipeline_cache_add_entry(cache, entry); - - cache->modified = true; - pthread_mutex_unlock(&cache->mutex); - return variant; -} - void radv_pipeline_cache_insert_shaders(struct radv_device *device, struct radv_pipeline_cache *cache, const unsigned char *sha1, struct radv_shader_variant **variants, const void *const *codes, const unsigned *code_sizes) { if (!cache) cache = device->mem_cache; diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 683ea3155e..576836e970 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -318,31 +318,21 @@ struct radv_pipeline_cache { void radv_pipeline_cache_init(struct radv_pipeline_cache *cache, struct radv_device *device); void radv_pipeline_cache_finish(struct radv_pipeline_cache *cache); void radv_pipeline_cache_load(struct radv_pipeline_cache *cache, const void *data, size_t size); -struct radv_shader_variant * -radv_create_shader_variant_from_pipeline_cache(struct radv_device *device, - struct radv_pipeline_cache *cache, - const unsigned char *sha1); - -struct radv_shader_variant * -radv_pipeline_cache_insert_shader(struct radv_device *device, - struct radv_pipeline_cache *cache, - const unsigned char *sha1, - struct radv_shader_variant *variant, - const void *code, unsigned code_size); +struct radv_shader_variant; bool radv_create_shader_variants_from_pipeline_cache(struct radv_device *device, struct radv_pipeline_cache *cache, const unsigned char *sha1, struct radv_shader_variant **variants); void radv_pipeline_cache_insert_shaders(struct radv_device *device, struct radv_pipeline_cache *cache, -- 2.13.6 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev