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:
Bas Nieuwenhuizen 2022-06-08 00:37:09 +02:00 committed by Marge Bot
parent 4f48a140ac
commit 6ff98f9313
2 changed files with 61 additions and 46 deletions

View file

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

View file

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