mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-05 09:00:08 +01:00
radv: Add implementation of cmd buffers for a sparse binding queue.
None of the commands are allowed on these ... Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16935>
This commit is contained in:
parent
4f48a140ac
commit
6ff98f9313
2 changed files with 61 additions and 46 deletions
|
|
@ -323,37 +323,39 @@ radv_destroy_cmd_buffer(struct vk_command_buffer *vk_cmd_buffer)
|
|||
{
|
||||
struct radv_cmd_buffer *cmd_buffer = container_of(vk_cmd_buffer, struct radv_cmd_buffer, vk);
|
||||
|
||||
list_for_each_entry_safe (struct radv_cmd_buffer_upload, up, &cmd_buffer->upload.list, list) {
|
||||
radv_rmv_log_command_buffer_bo_destroy(cmd_buffer->device, up->upload_bo);
|
||||
cmd_buffer->device->ws->buffer_destroy(cmd_buffer->device->ws, up->upload_bo);
|
||||
list_del(&up->list);
|
||||
free(up);
|
||||
if (cmd_buffer->qf != RADV_QUEUE_SPARSE) {
|
||||
list_for_each_entry_safe (struct radv_cmd_buffer_upload, up, &cmd_buffer->upload.list, list) {
|
||||
radv_rmv_log_command_buffer_bo_destroy(cmd_buffer->device, up->upload_bo);
|
||||
cmd_buffer->device->ws->buffer_destroy(cmd_buffer->device->ws, up->upload_bo);
|
||||
list_del(&up->list);
|
||||
free(up);
|
||||
}
|
||||
|
||||
if (cmd_buffer->upload.upload_bo) {
|
||||
radv_rmv_log_command_buffer_bo_destroy(cmd_buffer->device, cmd_buffer->upload.upload_bo);
|
||||
cmd_buffer->device->ws->buffer_destroy(cmd_buffer->device->ws, cmd_buffer->upload.upload_bo);
|
||||
}
|
||||
|
||||
if (cmd_buffer->cs)
|
||||
cmd_buffer->device->ws->cs_destroy(cmd_buffer->cs);
|
||||
if (cmd_buffer->gang.cs)
|
||||
cmd_buffer->device->ws->cs_destroy(cmd_buffer->gang.cs);
|
||||
if (cmd_buffer->transfer.copy_temp)
|
||||
cmd_buffer->device->ws->buffer_destroy(cmd_buffer->device->ws, cmd_buffer->transfer.copy_temp);
|
||||
|
||||
radv_cmd_buffer_finish_shader_part_cache(cmd_buffer);
|
||||
|
||||
for (unsigned i = 0; i < MAX_BIND_POINTS; i++) {
|
||||
struct radv_descriptor_set_header *set = &cmd_buffer->descriptors[i].push_set.set;
|
||||
free(set->mapped_ptr);
|
||||
if (set->layout)
|
||||
vk_descriptor_set_layout_unref(&cmd_buffer->device->vk, &set->layout->vk);
|
||||
vk_object_base_finish(&set->base);
|
||||
}
|
||||
|
||||
vk_object_base_finish(&cmd_buffer->meta_push_descriptors.base);
|
||||
}
|
||||
|
||||
if (cmd_buffer->upload.upload_bo) {
|
||||
radv_rmv_log_command_buffer_bo_destroy(cmd_buffer->device, cmd_buffer->upload.upload_bo);
|
||||
cmd_buffer->device->ws->buffer_destroy(cmd_buffer->device->ws, cmd_buffer->upload.upload_bo);
|
||||
}
|
||||
|
||||
if (cmd_buffer->cs)
|
||||
cmd_buffer->device->ws->cs_destroy(cmd_buffer->cs);
|
||||
if (cmd_buffer->gang.cs)
|
||||
cmd_buffer->device->ws->cs_destroy(cmd_buffer->gang.cs);
|
||||
if (cmd_buffer->transfer.copy_temp)
|
||||
cmd_buffer->device->ws->buffer_destroy(cmd_buffer->device->ws, cmd_buffer->transfer.copy_temp);
|
||||
|
||||
radv_cmd_buffer_finish_shader_part_cache(cmd_buffer);
|
||||
|
||||
for (unsigned i = 0; i < MAX_BIND_POINTS; i++) {
|
||||
struct radv_descriptor_set_header *set = &cmd_buffer->descriptors[i].push_set.set;
|
||||
free(set->mapped_ptr);
|
||||
if (set->layout)
|
||||
vk_descriptor_set_layout_unref(&cmd_buffer->device->vk, &set->layout->vk);
|
||||
vk_object_base_finish(&set->base);
|
||||
}
|
||||
|
||||
vk_object_base_finish(&cmd_buffer->meta_push_descriptors.base);
|
||||
|
||||
vk_command_buffer_finish(&cmd_buffer->vk);
|
||||
vk_free(&cmd_buffer->vk.pool->alloc, cmd_buffer);
|
||||
}
|
||||
|
|
@ -375,30 +377,33 @@ radv_create_cmd_buffer(struct vk_command_pool *pool, struct vk_command_buffer **
|
|||
return result;
|
||||
}
|
||||
|
||||
if (!radv_cmd_buffer_init_shader_part_cache(device, cmd_buffer)) {
|
||||
radv_destroy_cmd_buffer(&cmd_buffer->vk);
|
||||
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||
}
|
||||
|
||||
list_inithead(&cmd_buffer->upload.list);
|
||||
|
||||
cmd_buffer->device = device;
|
||||
|
||||
cmd_buffer->qf = vk_queue_to_radv(device->physical_device, pool->queue_family_index);
|
||||
|
||||
ring = radv_queue_family_to_ring(device->physical_device, cmd_buffer->qf);
|
||||
if (cmd_buffer->qf != RADV_QUEUE_SPARSE) {
|
||||
list_inithead(&cmd_buffer->upload.list);
|
||||
|
||||
cmd_buffer->cs = device->ws->cs_create(device->ws, ring, cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY);
|
||||
if (!cmd_buffer->cs) {
|
||||
radv_destroy_cmd_buffer(&cmd_buffer->vk);
|
||||
return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
|
||||
if (!radv_cmd_buffer_init_shader_part_cache(device, cmd_buffer)) {
|
||||
radv_destroy_cmd_buffer(&cmd_buffer->vk);
|
||||
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||
}
|
||||
|
||||
ring = radv_queue_family_to_ring(device->physical_device, cmd_buffer->qf);
|
||||
|
||||
cmd_buffer->cs =
|
||||
device->ws->cs_create(device->ws, ring, cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY);
|
||||
if (!cmd_buffer->cs) {
|
||||
radv_destroy_cmd_buffer(&cmd_buffer->vk);
|
||||
return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
|
||||
}
|
||||
|
||||
vk_object_base_init(&device->vk, &cmd_buffer->meta_push_descriptors.base, VK_OBJECT_TYPE_DESCRIPTOR_SET);
|
||||
|
||||
for (unsigned i = 0; i < MAX_BIND_POINTS; i++)
|
||||
vk_object_base_init(&device->vk, &cmd_buffer->descriptors[i].push_set.set.base, VK_OBJECT_TYPE_DESCRIPTOR_SET);
|
||||
}
|
||||
|
||||
vk_object_base_init(&device->vk, &cmd_buffer->meta_push_descriptors.base, VK_OBJECT_TYPE_DESCRIPTOR_SET);
|
||||
|
||||
for (unsigned i = 0; i < MAX_BIND_POINTS; i++)
|
||||
vk_object_base_init(&device->vk, &cmd_buffer->descriptors[i].push_set.set.base, VK_OBJECT_TYPE_DESCRIPTOR_SET);
|
||||
|
||||
*cmd_buffer_out = &cmd_buffer->vk;
|
||||
|
||||
return VK_SUCCESS;
|
||||
|
|
@ -417,6 +422,9 @@ radv_reset_cmd_buffer(struct vk_command_buffer *vk_cmd_buffer, UNUSED VkCommandB
|
|||
|
||||
vk_command_buffer_reset(&cmd_buffer->vk);
|
||||
|
||||
if (cmd_buffer->qf == RADV_QUEUE_SPARSE)
|
||||
return;
|
||||
|
||||
cmd_buffer->device->ws->cs_reset(cmd_buffer->cs);
|
||||
if (cmd_buffer->gang.cs)
|
||||
cmd_buffer->device->ws->cs_reset(cmd_buffer->gang.cs);
|
||||
|
|
@ -5659,6 +5667,9 @@ radv_BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBegi
|
|||
|
||||
vk_command_buffer_begin(&cmd_buffer->vk, pBeginInfo);
|
||||
|
||||
if (cmd_buffer->qf == RADV_QUEUE_SPARSE)
|
||||
return result;
|
||||
|
||||
memset(&cmd_buffer->state, 0, sizeof(cmd_buffer->state));
|
||||
cmd_buffer->state.last_index_type = -1;
|
||||
cmd_buffer->state.last_num_instances = -1;
|
||||
|
|
@ -6087,6 +6098,9 @@ radv_EndCommandBuffer(VkCommandBuffer commandBuffer)
|
|||
{
|
||||
RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
if (cmd_buffer->qf == RADV_QUEUE_SPARSE)
|
||||
return vk_command_buffer_end(&cmd_buffer->vk);
|
||||
|
||||
radv_emit_mip_change_flush_default(cmd_buffer);
|
||||
|
||||
const bool is_gfx_or_ace = cmd_buffer->qf == RADV_QUEUE_GENERAL || cmd_buffer->qf == RADV_QUEUE_COMPUTE;
|
||||
|
|
|
|||
|
|
@ -261,6 +261,7 @@ enum radv_queue_family {
|
|||
RADV_QUEUE_GENERAL,
|
||||
RADV_QUEUE_COMPUTE,
|
||||
RADV_QUEUE_TRANSFER,
|
||||
RADV_QUEUE_SPARSE,
|
||||
RADV_QUEUE_VIDEO_DEC,
|
||||
RADV_QUEUE_VIDEO_ENC,
|
||||
RADV_MAX_QUEUE_FAMILIES,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue