venus: refactor to add vn_cached_storage

Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27649>
This commit is contained in:
Yiwei Zhang
2024-02-14 14:22:22 -08:00
committed by Marge Bot
parent 0973590579
commit 1e122861da
3 changed files with 57 additions and 32 deletions
+9 -23
View File
@@ -67,30 +67,12 @@ vn_dependency_info_has_present_src(uint32_t dep_count,
return false;
}
static void *
vn_cmd_get_tmp_data(struct vn_command_buffer *cmd, size_t size)
{
struct vn_command_pool *pool = cmd->pool;
/* avoid shrinking in case of non efficient reallocation implementation */
if (size > pool->tmp.size) {
void *data =
vk_realloc(&pool->allocator, pool->tmp.data, size, VN_DEFAULT_ALIGN,
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
if (!data)
return NULL;
pool->tmp.data = data;
pool->tmp.size = size;
}
return pool->tmp.data;
}
static inline VkImageMemoryBarrier *
vn_cmd_get_image_memory_barriers(struct vn_command_buffer *cmd,
uint32_t count)
{
return vn_cmd_get_tmp_data(cmd, count * sizeof(VkImageMemoryBarrier));
return vn_cached_storage_get(&cmd->pool->storage,
count * sizeof(VkImageMemoryBarrier));
}
/* About VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, the spec says
@@ -403,7 +385,7 @@ vn_cmd_fix_dependency_infos(struct vn_command_buffer *cmd,
size_t tmp_size = dep_count * sizeof(VkDependencyInfo) +
total_barrier_count * sizeof(VkImageMemoryBarrier2);
void *tmp = vn_cmd_get_tmp_data(cmd, tmp_size);
void *tmp = vn_cached_storage_get(&cmd->pool->storage, tmp_size);
if (!tmp) {
cmd->state = VN_COMMAND_BUFFER_STATE_INVALID;
return dep_infos;
@@ -682,6 +664,8 @@ vn_CreateCommandPool(VkDevice device,
list_inithead(&pool->command_buffers);
list_inithead(&pool->free_query_batches);
vn_cached_storage_init(&pool->storage, alloc);
VkCommandPool pool_handle = vn_command_pool_to_handle(pool);
vn_async_vkCreateCommandPool(dev->primary_ring, device, pCreateInfo, NULL,
&pool_handle);
@@ -735,8 +719,7 @@ vn_DestroyCommandPool(VkDevice device,
&pool->free_query_batches, head)
vk_free(alloc, batch);
if (pool->tmp.data)
vk_free(alloc, pool->tmp.data);
vn_cached_storage_fini(&pool->storage);
vn_object_base_fini(&pool->base);
vk_free(alloc, pool);
@@ -784,6 +767,9 @@ vn_ResetCommandPool(VkDevice device,
list_for_each_entry_safe(struct vn_feedback_query_batch, batch,
&pool->free_query_batches, head)
vk_free(&pool->allocator, batch);
vn_cached_storage_fini(&pool->storage);
vn_cached_storage_init(&pool->storage, &pool->allocator);
}
vn_async_vkResetCommandPool(dev->primary_ring, device, commandPool, flags);
+2 -9
View File
@@ -42,15 +42,8 @@ struct vn_command_pool {
*/
struct list_head free_query_batches;
/* Temporary storage for scrubbing VK_IMAGE_LAYOUT_PRESENT_SRC_KHR. The
* storage's lifetime is the command pool's lifetime. We increase the
* storage as needed, but never shrink it. Upon used by the cmd buffer, the
* storage must fit within command scope to avoid locking or suballocation.
*/
struct {
void *data;
size_t size;
} tmp;
/* for scrubbing VK_IMAGE_LAYOUT_PRESENT_SRC_KHR */
struct vn_cached_storage storage;
};
VK_DEFINE_NONDISP_HANDLE_CASTS(vn_command_pool,
base.base,
+46
View File
@@ -238,6 +238,21 @@ struct vn_tls {
struct list_head tls_rings;
};
/* A cached storage for object internal usages with below constraints:
* - It belongs to the object and shares the lifetime.
* - The storage reuse is protected by external synchronization.
* - The returned storage is not zero-initialized.
* - It never shrinks unless being purged via fini.
*
* The current users are:
* - VkCommandPool
*/
struct vn_cached_storage {
const VkAllocationCallbacks *alloc;
size_t size;
void *data;
};
void
vn_env_init(void);
@@ -548,4 +563,35 @@ vn_cache_key_equal_function(const void *key1, const void *key2)
return memcmp(key1, key2, SHA1_DIGEST_LENGTH) == 0;
}
static inline void
vn_cached_storage_init(struct vn_cached_storage *storage,
const VkAllocationCallbacks *alloc)
{
storage->alloc = alloc;
storage->size = 0;
storage->data = NULL;
}
static inline void *
vn_cached_storage_get(struct vn_cached_storage *storage, size_t size)
{
if (size > storage->size) {
void *data =
vk_realloc(storage->alloc, storage->data, size, VN_DEFAULT_ALIGN,
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
if (!data)
return NULL;
storage->size = size;
storage->data = data;
}
return storage->data;
}
static inline void
vn_cached_storage_fini(struct vn_cached_storage *storage)
{
vk_free(storage->alloc, storage->data);
}
#endif /* VN_COMMON_H */