Module: Mesa Branch: main Commit: ed17b6f81744749df85befbb53685508285beb08 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ed17b6f81744749df85befbb53685508285beb08
Author: Mike Blumenkrantz <[email protected]> Date: Wed Aug 30 16:05:31 2023 -0400 zink: make submitinfo handling easier to manage with enum this was starting to get hard to read Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24962> --- src/gallium/drivers/zink/zink_batch.c | 58 +++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index 67b10798f06..e01bb13b889 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -538,20 +538,22 @@ post_submit(void *data, void *gdata, int thread_index) memset(&bs->buffer_indices_hashlist, -1, sizeof(bs->buffer_indices_hashlist)); } +typedef enum { + ZINK_SUBMIT_WAIT_ACQUIRE, + ZINK_SUBMIT_CMDBUF, + ZINK_SUBMIT_SIGNAL, + ZINK_SUBMIT_MAX +} zink_submit; + static void submit_queue(void *data, void *gdata, int thread_index) { struct zink_batch_state *bs = data; struct zink_context *ctx = bs->ctx; struct zink_screen *screen = zink_screen(ctx->base.screen); - /* 3 submit infos: - * - waits - * - main cmdbuf payload - * - signals - */ - VkSubmitInfo si[3] = {0}; + VkSubmitInfo si[ZINK_SUBMIT_MAX] = {0}; VkSubmitInfo *submit = si; - int num_si = 2; + int num_si = ZINK_SUBMIT_MAX; while (!bs->fence.batch_id) bs->fence.batch_id = (uint32_t)p_atomic_inc_return(&screen->curr_batch); bs->usage.usage = bs->fence.batch_id; @@ -559,48 +561,49 @@ submit_queue(void *data, void *gdata, int thread_index) uint64_t batch_id = bs->fence.batch_id; /* first submit is just for acquire waits since they have a separate array */ - si[0].sType = si[1].sType = si[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - si[0].waitSemaphoreCount = util_dynarray_num_elements(&bs->acquires, VkSemaphore); - si[0].pWaitSemaphores = bs->acquires.data; - while (util_dynarray_num_elements(&bs->acquire_flags, VkPipelineStageFlags) < si[0].waitSemaphoreCount) { + for (unsigned i = 0; i < ARRAY_SIZE(si); i++) + si[i].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + si[ZINK_SUBMIT_WAIT_ACQUIRE].waitSemaphoreCount = util_dynarray_num_elements(&bs->acquires, VkSemaphore); + si[ZINK_SUBMIT_WAIT_ACQUIRE].pWaitSemaphores = bs->acquires.data; + while (util_dynarray_num_elements(&bs->acquire_flags, VkPipelineStageFlags) < si[ZINK_SUBMIT_WAIT_ACQUIRE].waitSemaphoreCount) { VkPipelineStageFlags mask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; util_dynarray_append(&bs->acquire_flags, VkPipelineStageFlags, mask); } assert(util_dynarray_num_elements(&bs->acquires, VkSemaphore) <= util_dynarray_num_elements(&bs->acquire_flags, VkPipelineStageFlags)); - si[0].pWaitDstStageMask = bs->acquire_flags.data; + si[ZINK_SUBMIT_WAIT_ACQUIRE].pWaitDstStageMask = bs->acquire_flags.data; - if (si[0].waitSemaphoreCount == 0) { + if (si[ZINK_SUBMIT_WAIT_ACQUIRE].waitSemaphoreCount == 0) { num_si--; submit++; } /* then the real submit */ - si[1].waitSemaphoreCount = util_dynarray_num_elements(&bs->wait_semaphores, VkSemaphore); - si[1].pWaitSemaphores = bs->wait_semaphores.data; - si[1].pWaitDstStageMask = bs->wait_semaphore_stages.data; - si[1].commandBufferCount = bs->has_barriers ? 2 : 1; + si[ZINK_SUBMIT_CMDBUF].waitSemaphoreCount = util_dynarray_num_elements(&bs->wait_semaphores, VkSemaphore); + si[ZINK_SUBMIT_CMDBUF].pWaitSemaphores = bs->wait_semaphores.data; + si[ZINK_SUBMIT_CMDBUF].pWaitDstStageMask = bs->wait_semaphore_stages.data; + si[ZINK_SUBMIT_CMDBUF].commandBufferCount = bs->has_barriers ? 2 : 1; VkCommandBuffer cmdbufs[2] = { bs->barrier_cmdbuf, bs->cmdbuf, }; - si[1].pCommandBuffers = bs->has_barriers ? cmdbufs : &cmdbufs[1]; + si[ZINK_SUBMIT_CMDBUF].pCommandBuffers = bs->has_barriers ? cmdbufs : &cmdbufs[1]; VkSemaphore signals[3]; - si[1].signalSemaphoreCount = !!bs->signal_semaphore; + si[ZINK_SUBMIT_CMDBUF].signalSemaphoreCount = !!bs->signal_semaphore; signals[0] = bs->signal_semaphore; - si[1].pSignalSemaphores = signals; + si[ZINK_SUBMIT_CMDBUF].pSignalSemaphores = signals; VkTimelineSemaphoreSubmitInfo tsi = {0}; uint64_t signal_values[2] = {0}; tsi.sType = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO; - si[1].pNext = &tsi; + si[ZINK_SUBMIT_CMDBUF].pNext = &tsi; tsi.pSignalSemaphoreValues = signal_values; - signal_values[si[1].signalSemaphoreCount] = batch_id; - signals[si[1].signalSemaphoreCount++] = screen->sem; - tsi.signalSemaphoreValueCount = si[1].signalSemaphoreCount; + signal_values[si[ZINK_SUBMIT_CMDBUF].signalSemaphoreCount] = batch_id; + signals[si[ZINK_SUBMIT_CMDBUF].signalSemaphoreCount++] = screen->sem; + tsi.signalSemaphoreValueCount = si[ZINK_SUBMIT_CMDBUF].signalSemaphoreCount; if (bs->present) - signals[si[1].signalSemaphoreCount++] = bs->present; - tsi.signalSemaphoreValueCount = si[1].signalSemaphoreCount; + signals[si[ZINK_SUBMIT_CMDBUF].signalSemaphoreCount++] = bs->present; + tsi.signalSemaphoreValueCount = si[ZINK_SUBMIT_CMDBUF].signalSemaphoreCount; VkResult result = VKSCR(EndCommandBuffer)(bs->cmdbuf); if (result != VK_SUCCESS) { @@ -627,6 +630,9 @@ submit_queue(void *data, void *gdata, int thread_index) } } + if (!si[ZINK_SUBMIT_SIGNAL].signalSemaphoreCount) + num_si--; + simple_mtx_lock(&screen->queue_lock); result = VKSCR(QueueSubmit)(screen->queue, num_si, submit, VK_NULL_HANDLE); if (result != VK_SUCCESS) {
