Mesa (main): vulkan/runtime: Refactor queue submit to take an argument struct.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Dec 31 15:40:22 UTC 2021


Module: Mesa
Branch: main
Commit: 73cdc302ab9bdb3fde57fe161a0a169b5a807344
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=73cdc302ab9bdb3fde57fe161a0a169b5a807344

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date:   Sun Nov 28 18:24:16 2021 +0100

vulkan/runtime: Refactor queue submit to take an argument struct.

For merging with the sparse binding structs.

Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13974>

---

 src/vulkan/runtime/vk_queue.c | 73 ++++++++++++++++++++++++++++---------------
 1 file changed, 48 insertions(+), 25 deletions(-)

diff --git a/src/vulkan/runtime/vk_queue.c b/src/vulkan/runtime/vk_queue.c
index 41dceb7e2d8..c76a7321b6f 100644
--- a/src/vulkan/runtime/vk_queue.c
+++ b/src/vulkan/runtime/vk_queue.c
@@ -506,10 +506,24 @@ vk_queue_disable_submit_thread(struct vk_queue *queue)
    queue->submit.has_thread = false;
 }
 
+struct vulkan_submit_info {
+   const void *pNext;
+
+   uint32_t command_buffer_count;
+   const VkCommandBufferSubmitInfoKHR *command_buffers;
+
+   uint32_t wait_count;
+   const VkSemaphoreSubmitInfoKHR *waits;
+
+   uint32_t signal_count;
+   const VkSemaphoreSubmitInfoKHR *signals;
+
+   struct vk_fence *fence;
+};
+
 static VkResult
 vk_queue_submit(struct vk_queue *queue,
-                const VkSubmitInfo2KHR *info,
-                struct vk_fence *fence)
+                const struct vulkan_submit_info *info)
 {
    VkResult result;
 
@@ -520,10 +534,10 @@ vk_queue_submit(struct vk_queue *queue,
                           queue->base.device->create_sync_for_memory != NULL;
 
    struct vk_queue_submit *submit =
-      vk_queue_submit_alloc(queue, info->waitSemaphoreInfoCount,
-                            info->commandBufferInfoCount,
-                            info->signalSemaphoreInfoCount +
-                            signal_mem_sync + (fence != NULL));
+      vk_queue_submit_alloc(queue, info->wait_count,
+                            info->command_buffer_count,
+                            info->signal_count +
+                            signal_mem_sync + (info->fence != NULL));
    if (unlikely(submit == NULL))
       return vk_error(queue, VK_ERROR_OUT_OF_HOST_MEMORY);
 
@@ -537,9 +551,9 @@ vk_queue_submit(struct vk_queue *queue,
    submit->perf_pass_index = perf_info ? perf_info->counterPassIndex : 0;
 
    bool has_binary_permanent_semaphore_wait = false;
-   for (uint32_t i = 0; i < info->waitSemaphoreInfoCount; i++) {
+   for (uint32_t i = 0; i < info->wait_count; i++) {
       VK_FROM_HANDLE(vk_semaphore, semaphore,
-                     info->pWaitSemaphoreInfos[i].semaphore);
+                     info->waits[i].semaphore);
 
       /* From the Vulkan 1.2.194 spec:
        *
@@ -576,29 +590,29 @@ vk_queue_submit(struct vk_queue *queue,
       }
 
       uint32_t wait_value = semaphore->type == VK_SEMAPHORE_TYPE_TIMELINE ?
-                            info->pWaitSemaphoreInfos[i].value : 0;
+                            info->waits[i].value : 0;
 
       submit->waits[i] = (struct vk_sync_wait) {
          .sync = sync,
-         .stage_mask = info->pWaitSemaphoreInfos[i].stageMask,
+         .stage_mask = info->waits[i].stageMask,
          .wait_value = wait_value,
       };
    }
 
-   for (uint32_t i = 0; i < info->commandBufferInfoCount; i++) {
+   for (uint32_t i = 0; i < info->command_buffer_count; i++) {
       VK_FROM_HANDLE(vk_command_buffer, cmd_buffer,
-                     info->pCommandBufferInfos[i].commandBuffer);
-      assert(info->pCommandBufferInfos[i].deviceMask == 0 ||
-             info->pCommandBufferInfos[i].deviceMask == 1);
+                     info->command_buffers[i].commandBuffer);
+      assert(info->command_buffers[i].deviceMask == 0 ||
+             info->command_buffers[i].deviceMask == 1);
       submit->command_buffers[i] = cmd_buffer;
    }
 
-   for (uint32_t i = 0; i < info->signalSemaphoreInfoCount; i++) {
+   for (uint32_t i = 0; i < info->signal_count; i++) {
       VK_FROM_HANDLE(vk_semaphore, semaphore,
-                     info->pSignalSemaphoreInfos[i].semaphore);
+                     info->signals[i].semaphore);
 
       struct vk_sync *sync = vk_semaphore_get_active_sync(semaphore);
-      uint32_t signal_value = info->pSignalSemaphoreInfos[i].value;
+      uint32_t signal_value = info->signals[i].value;
       if (semaphore->type == VK_SEMAPHORE_TYPE_TIMELINE) {
          if (signal_value == 0) {
             result = vk_queue_set_lost(queue,
@@ -633,12 +647,12 @@ vk_queue_submit(struct vk_queue *queue,
 
       submit->signals[i] = (struct vk_sync_signal) {
          .sync = sync,
-         .stage_mask = info->pSignalSemaphoreInfos[i].stageMask,
+         .stage_mask = info->signals[i].stageMask,
          .signal_value = signal_value,
       };
    }
 
-   uint32_t signal_count = info->signalSemaphoreInfoCount;
+   uint32_t signal_count = info->signal_count;
    if (signal_mem_sync) {
       struct vk_sync *mem_sync;
       result = queue->base.device->create_sync_for_memory(queue->base.device,
@@ -656,10 +670,10 @@ vk_queue_submit(struct vk_queue *queue,
       };
    }
 
-   if (fence != NULL) {
+   if (info->fence != NULL) {
       assert(submit->signals[signal_count].sync == NULL);
       submit->signals[signal_count++] = (struct vk_sync_signal) {
-         .sync = vk_fence_get_active_sync(fence),
+         .sync = vk_fence_get_active_sync(info->fence),
          .stage_mask = ~(VkPipelineStageFlags2KHR)0,
       };
    }
@@ -693,9 +707,9 @@ vk_queue_submit(struct vk_queue *queue,
 
       if (vk_queue_has_submit_thread(queue)) {
          if (has_binary_permanent_semaphore_wait) {
-            for (uint32_t i = 0; i < info->waitSemaphoreInfoCount; i++) {
+            for (uint32_t i = 0; i < info->wait_count; i++) {
                VK_FROM_HANDLE(vk_semaphore, semaphore,
-                              info->pWaitSemaphoreInfos[i].semaphore);
+                              info->waits[i].semaphore);
 
                if (semaphore->type != VK_SEMAPHORE_TYPE_BINARY)
                   continue;
@@ -1001,8 +1015,17 @@ vk_common_QueueSubmit2KHR(VkQueue _queue,
    }
 
    for (uint32_t i = 0; i < submitCount; i++) {
-      VkResult result = vk_queue_submit(queue, &pSubmits[i],
-                                        i == submitCount - 1 ? fence : NULL);
+      struct vulkan_submit_info info = {
+         .pNext = pSubmits[i].pNext,
+         .command_buffer_count = pSubmits[i].commandBufferInfoCount,
+         .command_buffers = pSubmits[i].pCommandBufferInfos,
+         .wait_count = pSubmits[i].waitSemaphoreInfoCount,
+         .waits = pSubmits[i].pWaitSemaphoreInfos,
+         .signal_count = pSubmits[i].signalSemaphoreInfoCount,
+         .signals = pSubmits[i].pSignalSemaphoreInfos,
+         .fence = i == submitCount - 1 ? fence : NULL
+      };
+      VkResult result = vk_queue_submit(queue, &info);
       if (unlikely(result != VK_SUCCESS))
          return result;
    }



More information about the mesa-commit mailing list