anv: extract embedded samplers from pipeline_cache

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Ivan Briano <ivan.briano@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36512>
This commit is contained in:
Lionel Landwerlin 2024-08-06 22:16:35 +03:00 committed by Marge Bot
parent fe6e9284c9
commit 7e98a339a7
4 changed files with 120 additions and 111 deletions

View file

@ -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;
}

View file

@ -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);

View file

@ -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;

View file

@ -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',