From 7e98a339a78829e7cb43505e2f9b95470a795a0d Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Tue, 6 Aug 2024 22:16:35 +0300 Subject: [PATCH] anv: extract embedded samplers from pipeline_cache Signed-off-by: Lionel Landwerlin Reviewed-by: Ivan Briano Part-of: --- src/intel/vulkan/anv_embedded_sampler.c | 100 ++++++++++++++++++++++ src/intel/vulkan/anv_pipeline_cache.c | 109 +----------------------- src/intel/vulkan/anv_private.h | 21 ++++- src/intel/vulkan/meson.build | 1 + 4 files changed, 120 insertions(+), 111 deletions(-) create mode 100644 src/intel/vulkan/anv_embedded_sampler.c diff --git a/src/intel/vulkan/anv_embedded_sampler.c b/src/intel/vulkan/anv_embedded_sampler.c new file mode 100644 index 00000000000..09dda485aab --- /dev/null +++ b/src/intel/vulkan/anv_embedded_sampler.c @@ -0,0 +1,100 @@ +/* Copyright © 2024 Intel Corporation + * SPDX-License-Identifier: MIT + */ + +#include "anv_private.h" + +static unsigned +embedded_sampler_key_hash(const void *key) +{ + return _mesa_hash_data(key, sizeof(struct anv_embedded_sampler_key)); +} + +static bool +embedded_sampler_key_equal(const void *a, const void *b) +{ + return memcmp(a, b, sizeof(struct anv_embedded_sampler_key)) == 0; +} + +static void +anv_embedded_sampler_free(struct anv_device *device, + struct anv_embedded_sampler *sampler) +{ + anv_state_pool_free(&device->dynamic_state_pool, sampler->sampler_state); + anv_state_pool_free(&device->dynamic_state_pool, sampler->border_color_state); + vk_free(&device->vk.alloc, sampler); +} + +void +anv_embedded_sampler_unref(struct anv_device *device, + struct anv_embedded_sampler *sampler) +{ + simple_mtx_lock(&device->embedded_samplers.mutex); + if (--sampler->ref_cnt == 0) { + _mesa_hash_table_remove_key(device->embedded_samplers.map, + &sampler->key); + anv_embedded_sampler_free(device, sampler); + } + simple_mtx_unlock(&device->embedded_samplers.mutex); +} + +void +anv_device_init_embedded_samplers(struct anv_device *device) +{ + simple_mtx_init(&device->embedded_samplers.mutex, mtx_plain); + device->embedded_samplers.map = + _mesa_hash_table_create(NULL, + embedded_sampler_key_hash, + embedded_sampler_key_equal); +} + +void +anv_device_finish_embedded_samplers(struct anv_device *device) +{ + hash_table_foreach(device->embedded_samplers.map, entry) { + anv_embedded_sampler_free(device, entry->data); + } + ralloc_free(device->embedded_samplers.map); + simple_mtx_destroy(&device->embedded_samplers.mutex); +} + +VkResult +anv_device_get_embedded_samplers(struct anv_device *device, + struct anv_embedded_sampler **out_samplers, + const struct anv_pipeline_bind_map *bind_map) +{ + VkResult result = VK_SUCCESS; + + simple_mtx_lock(&device->embedded_samplers.mutex); + + for (uint32_t i = 0; i < bind_map->embedded_sampler_count; i++) { + struct hash_entry *entry = + _mesa_hash_table_search(device->embedded_samplers.map, + &bind_map->embedded_sampler_to_binding[i].key); + if (entry == NULL) { + out_samplers[i] = + vk_zalloc(&device->vk.alloc, + sizeof(struct anv_embedded_sampler), 8, + VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); + if (out_samplers[i] == NULL) { + result = vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + for (uint32_t j = 0; j < i; j++) + anv_embedded_sampler_unref(device, out_samplers[i]); + goto err; + } + + anv_genX(device->info, emit_embedded_sampler)( + device, out_samplers[i], + &bind_map->embedded_sampler_to_binding[i]); + _mesa_hash_table_insert(device->embedded_samplers.map, + &out_samplers[i]->key, + out_samplers[i]); + } else { + out_samplers[i] = anv_embedded_sampler_ref(entry->data); + } + } + + err: + simple_mtx_unlock(&device->embedded_samplers.mutex); + return result; +} diff --git a/src/intel/vulkan/anv_pipeline_cache.c b/src/intel/vulkan/anv_pipeline_cache.c index 0864d65241c..9942a4cf98e 100644 --- a/src/intel/vulkan/anv_pipeline_cache.c +++ b/src/intel/vulkan/anv_pipeline_cache.c @@ -35,113 +35,6 @@ #include "shaders/float64_spv.h" #include "util/u_printf.h" -/** - * Embedded sampler management. - */ - -static unsigned -embedded_sampler_key_hash(const void *key) -{ - return _mesa_hash_data(key, sizeof(struct anv_embedded_sampler_key)); -} - -static bool -embedded_sampler_key_equal(const void *a, const void *b) -{ - return memcmp(a, b, sizeof(struct anv_embedded_sampler_key)) == 0; -} - -static void -anv_embedded_sampler_free(struct anv_device *device, - struct anv_embedded_sampler *sampler) -{ - anv_state_pool_free(&device->dynamic_state_pool, sampler->sampler_state); - anv_state_pool_free(&device->dynamic_state_pool, sampler->border_color_state); - vk_free(&device->vk.alloc, sampler); -} - -static struct anv_embedded_sampler * -anv_embedded_sampler_ref(struct anv_embedded_sampler *sampler) -{ - sampler->ref_cnt++; - return sampler; -} - -static void -anv_embedded_sampler_unref(struct anv_device *device, - struct anv_embedded_sampler *sampler) -{ - simple_mtx_lock(&device->embedded_samplers.mutex); - if (--sampler->ref_cnt == 0) { - _mesa_hash_table_remove_key(device->embedded_samplers.map, - &sampler->key); - anv_embedded_sampler_free(device, sampler); - } - simple_mtx_unlock(&device->embedded_samplers.mutex); -} - -void -anv_device_init_embedded_samplers(struct anv_device *device) -{ - simple_mtx_init(&device->embedded_samplers.mutex, mtx_plain); - device->embedded_samplers.map = - _mesa_hash_table_create(NULL, - embedded_sampler_key_hash, - embedded_sampler_key_equal); -} - -void -anv_device_finish_embedded_samplers(struct anv_device *device) -{ - hash_table_foreach(device->embedded_samplers.map, entry) { - anv_embedded_sampler_free(device, entry->data); - } - ralloc_free(device->embedded_samplers.map); - simple_mtx_destroy(&device->embedded_samplers.mutex); -} - -static VkResult -anv_shader_bin_get_embedded_samplers(struct anv_device *device, - struct anv_shader_bin *shader, - const struct anv_pipeline_bind_map *bind_map) -{ - VkResult result = VK_SUCCESS; - - simple_mtx_lock(&device->embedded_samplers.mutex); - - for (uint32_t i = 0; i < bind_map->embedded_sampler_count; i++) { - struct hash_entry *entry = - _mesa_hash_table_search(device->embedded_samplers.map, - &bind_map->embedded_sampler_to_binding[i].key); - if (entry == NULL) { - shader->embedded_samplers[i] = - vk_zalloc(&device->vk.alloc, - sizeof(struct anv_embedded_sampler), 8, - VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); - if (shader->embedded_samplers[i] == NULL) { - result = vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); - goto err; - } - - anv_genX(device->info, emit_embedded_sampler)( - device, shader->embedded_samplers[i], - &bind_map->embedded_sampler_to_binding[i]); - _mesa_hash_table_insert(device->embedded_samplers.map, - &shader->embedded_samplers[i]->key, - shader->embedded_samplers[i]); - } else { - shader->embedded_samplers[i] = anv_embedded_sampler_ref(entry->data); - } - } - - err: - simple_mtx_unlock(&device->embedded_samplers.mutex); - return result; -} - -/** - * - */ static bool anv_shader_bin_serialize(struct vk_pipeline_cache_object *object, @@ -258,7 +151,7 @@ anv_shader_bin_create(struct anv_device *device, if (bind_map->embedded_sampler_count > 0) { shader->embedded_samplers = embedded_samplers; - if (anv_shader_bin_get_embedded_samplers(device, shader, bind_map) != VK_SUCCESS) { + if (anv_device_get_embedded_samplers(device, embedded_samplers, bind_map) != VK_SUCCESS) { ANV_DMR_SP_FREE(&device->vk.base, &device->instruction_state_pool, shader->kernel); anv_state_pool_free(&device->instruction_state_pool, shader->kernel); vk_free(&device->vk.alloc, shader); diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 65991e2b235..e8436505299 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1465,9 +1465,6 @@ struct anv_pipeline_bind_map; struct anv_pipeline_sets_layout; struct anv_push_descriptor_info; -void anv_device_init_embedded_samplers(struct anv_device *device); -void anv_device_finish_embedded_samplers(struct anv_device *device); - extern const struct vk_pipeline_cache_object_ops *const anv_cache_import_ops[2]; struct anv_shader_bin * @@ -4801,6 +4798,24 @@ struct anv_embedded_sampler { struct anv_state border_color_state; }; +void anv_device_init_embedded_samplers(struct anv_device *device); +void anv_device_finish_embedded_samplers(struct anv_device *device); + +static inline struct anv_embedded_sampler * +anv_embedded_sampler_ref(struct anv_embedded_sampler *sampler) +{ + sampler->ref_cnt++; + return sampler; +} + +void anv_embedded_sampler_unref(struct anv_device *device, + struct anv_embedded_sampler *sampler); + +VkResult +anv_device_get_embedded_samplers(struct anv_device *device, + struct anv_embedded_sampler **out_samplers, + const struct anv_pipeline_bind_map *bind_map); + struct anv_shader_bin { struct vk_pipeline_cache_object base; diff --git a/src/intel/vulkan/meson.build b/src/intel/vulkan/meson.build index cbef578a845..cdc04f0b2ab 100644 --- a/src/intel/vulkan/meson.build +++ b/src/intel/vulkan/meson.build @@ -157,6 +157,7 @@ libanv_files = files( 'anv_cmd_buffer.c', 'anv_descriptor_set.c', 'anv_device.c', + 'anv_embedded_sampler.c', 'anv_event.c', 'anv_formats.c', 'anv_genX.h',