diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index defa33f2fbb..610c9db083f 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -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; diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index caee8d17474..7ff9b195967 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -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,