venus: cache query batches at cmd pool
Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24009>
This commit is contained in:
@@ -514,6 +514,28 @@ struct vn_command_buffer_query_batch {
|
|||||||
struct list_head head;
|
struct list_head head;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline struct vn_command_buffer_query_batch *
|
||||||
|
vn_cmd_query_batch_alloc(struct vn_command_pool *pool)
|
||||||
|
{
|
||||||
|
if (list_is_empty(&pool->free_query_batches)) {
|
||||||
|
return vk_alloc(&pool->allocator,
|
||||||
|
sizeof(struct vn_command_buffer_query_batch),
|
||||||
|
VN_DEFAULT_ALIGN, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct vn_command_buffer_query_batch *batch = list_first_entry(
|
||||||
|
&pool->free_query_batches, struct vn_command_buffer_query_batch, head);
|
||||||
|
list_del(&batch->head);
|
||||||
|
return batch;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
vn_cmd_query_batch_free(struct vn_command_pool *pool,
|
||||||
|
struct vn_command_buffer_query_batch *batch)
|
||||||
|
{
|
||||||
|
list_add(&batch->head, &pool->free_query_batches);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
vn_cmd_record_batched_query_feedback(struct vn_command_buffer *cmd)
|
vn_cmd_record_batched_query_feedback(struct vn_command_buffer *cmd)
|
||||||
{
|
{
|
||||||
@@ -525,7 +547,7 @@ vn_cmd_record_batched_query_feedback(struct vn_command_buffer *cmd)
|
|||||||
batch->query_count);
|
batch->query_count);
|
||||||
|
|
||||||
list_del(&batch->head);
|
list_del(&batch->head);
|
||||||
vk_free(&cmd->pool->allocator, batch);
|
vn_cmd_query_batch_free(cmd->pool, batch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -536,10 +558,8 @@ vn_cmd_merge_batched_query_feedback(struct vn_command_buffer *primary_cmd,
|
|||||||
list_for_each_entry_safe(struct vn_command_buffer_query_batch,
|
list_for_each_entry_safe(struct vn_command_buffer_query_batch,
|
||||||
secondary_batch, &secondary_cmd->query_batches,
|
secondary_batch, &secondary_cmd->query_batches,
|
||||||
head) {
|
head) {
|
||||||
/* TODO: add a cache for batch allocs inside cmd pool */
|
|
||||||
struct vn_command_buffer_query_batch *primary_batch =
|
struct vn_command_buffer_query_batch *primary_batch =
|
||||||
vk_alloc(&primary_cmd->pool->allocator, sizeof(*primary_batch),
|
vn_cmd_query_batch_alloc(primary_cmd->pool);
|
||||||
VN_DEFAULT_ALIGN, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
|
|
||||||
if (!primary_batch) {
|
if (!primary_batch) {
|
||||||
primary_cmd->state = VN_COMMAND_BUFFER_STATE_INVALID;
|
primary_cmd->state = VN_COMMAND_BUFFER_STATE_INVALID;
|
||||||
return;
|
return;
|
||||||
@@ -662,6 +682,7 @@ vn_CreateCommandPool(VkDevice device,
|
|||||||
pool->device = dev;
|
pool->device = dev;
|
||||||
pool->queue_family_index = pCreateInfo->queueFamilyIndex;
|
pool->queue_family_index = pCreateInfo->queueFamilyIndex;
|
||||||
list_inithead(&pool->command_buffers);
|
list_inithead(&pool->command_buffers);
|
||||||
|
list_inithead(&pool->free_query_batches);
|
||||||
|
|
||||||
VkCommandPool pool_handle = vn_command_pool_to_handle(pool);
|
VkCommandPool pool_handle = vn_command_pool_to_handle(pool);
|
||||||
vn_async_vkCreateCommandPool(dev->instance, device, pCreateInfo, NULL,
|
vn_async_vkCreateCommandPool(dev->instance, device, pCreateInfo, NULL,
|
||||||
@@ -712,6 +733,10 @@ vn_DestroyCommandPool(VkDevice device,
|
|||||||
vk_free(alloc, cmd);
|
vk_free(alloc, cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list_for_each_entry_safe(struct vn_command_buffer_query_batch, batch,
|
||||||
|
&pool->free_query_batches, head)
|
||||||
|
vk_free(alloc, batch);
|
||||||
|
|
||||||
vn_object_base_fini(&pool->base);
|
vn_object_base_fini(&pool->base);
|
||||||
vk_free(alloc, pool);
|
vk_free(alloc, pool);
|
||||||
}
|
}
|
||||||
@@ -736,7 +761,7 @@ vn_cmd_reset(struct vn_command_buffer *cmd)
|
|||||||
list_for_each_entry_safe(struct vn_command_buffer_query_batch, batch,
|
list_for_each_entry_safe(struct vn_command_buffer_query_batch, batch,
|
||||||
&cmd->query_batches, head) {
|
&cmd->query_batches, head) {
|
||||||
list_del(&batch->head);
|
list_del(&batch->head);
|
||||||
vk_free(&cmd->pool->allocator, batch);
|
vn_cmd_query_batch_free(cmd->pool, batch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -856,7 +881,7 @@ vn_FreeCommandBuffers(VkDevice device,
|
|||||||
list_for_each_entry_safe(struct vn_command_buffer_query_batch, batch,
|
list_for_each_entry_safe(struct vn_command_buffer_query_batch, batch,
|
||||||
&cmd->query_batches, head) {
|
&cmd->query_batches, head) {
|
||||||
list_del(&batch->head);
|
list_del(&batch->head);
|
||||||
vk_free(alloc, batch);
|
vn_cmd_query_batch_free(pool, batch);
|
||||||
}
|
}
|
||||||
|
|
||||||
vn_object_base_fini(&cmd->base);
|
vn_object_base_fini(&cmd->base);
|
||||||
@@ -1776,10 +1801,8 @@ vn_cmd_add_query_feedback(VkCommandBuffer cmd_handle,
|
|||||||
if (!pool->feedback)
|
if (!pool->feedback)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* TODO: add a cache for batch allocs inside cmd pool */
|
|
||||||
struct vn_command_buffer_query_batch *batch =
|
struct vn_command_buffer_query_batch *batch =
|
||||||
vk_alloc(&cmd->pool->allocator, sizeof(*batch), VN_DEFAULT_ALIGN,
|
vn_cmd_query_batch_alloc(cmd->pool);
|
||||||
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
|
|
||||||
if (!batch) {
|
if (!batch) {
|
||||||
cmd->state = VN_COMMAND_BUFFER_STATE_INVALID;
|
cmd->state = VN_COMMAND_BUFFER_STATE_INVALID;
|
||||||
return;
|
return;
|
||||||
|
@@ -23,6 +23,8 @@ struct vn_command_pool {
|
|||||||
uint32_t queue_family_index;
|
uint32_t queue_family_index;
|
||||||
|
|
||||||
struct list_head command_buffers;
|
struct list_head command_buffers;
|
||||||
|
|
||||||
|
struct list_head free_query_batches;
|
||||||
};
|
};
|
||||||
VK_DEFINE_NONDISP_HANDLE_CASTS(vn_command_pool,
|
VK_DEFINE_NONDISP_HANDLE_CASTS(vn_command_pool,
|
||||||
base.base,
|
base.base,
|
||||||
|
Reference in New Issue
Block a user