radv: Move normal (non-empty) queue submit to a separate function.
Also move the preamble update into this function, as that is only needed by this code path and not needed for empty submits. With this change, the goal is to make radv_queue_submit easier to read and understand. This prepares it for future work when we'll add the capability to submit to multiple queues at the same time. Signed-off-by: Timur Kristóf <timur.kristof@gmail.com> Reviewed-by: Dave Airlie <airlied@redhat.com> Reviewed-By: Tatsuyuki Ishi <ishitatsuyuki@gmail.com> Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16358>
This commit is contained in:
parent
0c77c94b8e
commit
4ea82fad24
|
@ -4551,10 +4551,10 @@ radv_queue_submit_empty(struct radv_queue *queue, struct vk_queue_submit *submis
|
|||
}
|
||||
|
||||
static VkResult
|
||||
radv_queue_submit(struct vk_queue *vqueue, struct vk_queue_submit *submission)
|
||||
radv_queue_submit_normal(struct radv_queue *queue, struct vk_queue_submit *submission)
|
||||
{
|
||||
struct radv_queue *queue = (struct radv_queue *)vqueue;
|
||||
struct radeon_winsys_ctx *ctx = queue->hw_ctx;
|
||||
enum amd_ip_type ring = radv_queue_ring(queue);
|
||||
uint32_t max_cs_submission = queue->device->trace_bo ? 1 : RADV_MAX_IBS_PER_SUBMIT;
|
||||
bool can_patch = true;
|
||||
uint32_t advance;
|
||||
|
@ -4562,33 +4562,23 @@ radv_queue_submit(struct vk_queue *vqueue, struct vk_queue_submit *submission)
|
|||
struct radeon_cmdbuf *initial_preamble_cs = NULL;
|
||||
struct radeon_cmdbuf *initial_flush_preamble_cs = NULL;
|
||||
struct radeon_cmdbuf *continue_preamble_cs = NULL;
|
||||
enum amd_ip_type ring = radv_queue_ring(queue);
|
||||
|
||||
result =
|
||||
radv_get_preambles(queue, submission->command_buffers, submission->command_buffer_count,
|
||||
&initial_flush_preamble_cs, &initial_preamble_cs, &continue_preamble_cs);
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
return result;
|
||||
|
||||
result = radv_queue_submit_bind_sparse_memory(queue->device, submission);
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
|
||||
if (!submission->command_buffer_count && !submission->wait_count && !submission->signal_count)
|
||||
return VK_SUCCESS;
|
||||
|
||||
if (!submission->command_buffer_count) {
|
||||
result = radv_queue_submit_empty(queue, submission);
|
||||
} else {
|
||||
if (queue->device->trace_bo)
|
||||
simple_mtx_lock(&queue->device->trace_mtx);
|
||||
|
||||
struct radeon_cmdbuf **cs_array =
|
||||
malloc(sizeof(struct radeon_cmdbuf *) * (submission->command_buffer_count));
|
||||
if (!cs_array)
|
||||
goto fail;
|
||||
|
||||
for (uint32_t j = 0; j < submission->command_buffer_count; j++) {
|
||||
struct radv_cmd_buffer *cmd_buffer =
|
||||
(struct radv_cmd_buffer *)submission->command_buffers[j];
|
||||
struct radv_cmd_buffer *cmd_buffer = (struct radv_cmd_buffer *)submission->command_buffers[j];
|
||||
assert(cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_PRIMARY);
|
||||
|
||||
cs_array[j] = cmd_buffer->cs;
|
||||
|
@ -4614,12 +4604,9 @@ radv_queue_submit(struct vk_queue *vqueue, struct vk_queue_submit *submission)
|
|||
ctx, ring, queue->vk.index_in_family, cs_array + j, advance, initial_preamble,
|
||||
continue_preamble_cs, j == 0 ? submission->wait_count : 0, submission->waits,
|
||||
last_submit ? submission->signal_count : 0, submission->signals, can_patch);
|
||||
if (result != VK_SUCCESS) {
|
||||
free(cs_array);
|
||||
if (queue->device->trace_bo)
|
||||
simple_mtx_unlock(&queue->device->trace_mtx);
|
||||
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (queue->device->trace_bo) {
|
||||
radv_check_gpu_hangs(queue, cs_array[j]);
|
||||
|
@ -4630,9 +4617,31 @@ radv_queue_submit(struct vk_queue *vqueue, struct vk_queue_submit *submission)
|
|||
}
|
||||
}
|
||||
|
||||
fail:
|
||||
free(cs_array);
|
||||
if (queue->device->trace_bo)
|
||||
simple_mtx_unlock(&queue->device->trace_mtx);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static VkResult
|
||||
radv_queue_submit(struct vk_queue *vqueue, struct vk_queue_submit *submission)
|
||||
{
|
||||
struct radv_queue *queue = (struct radv_queue *)vqueue;
|
||||
VkResult result;
|
||||
|
||||
result = radv_queue_submit_bind_sparse_memory(queue->device, submission);
|
||||
if (result != VK_SUCCESS)
|
||||
goto fail;
|
||||
|
||||
if (!submission->command_buffer_count && !submission->wait_count && !submission->signal_count)
|
||||
return VK_SUCCESS;
|
||||
|
||||
if (!submission->command_buffer_count) {
|
||||
result = radv_queue_submit_empty(queue, submission);
|
||||
} else {
|
||||
result = radv_queue_submit_normal(queue, submission);
|
||||
}
|
||||
|
||||
fail:
|
||||
|
|
Loading…
Reference in New Issue