bug-14746: add batched submit for semaphores and command buffers
diff --git a/icd/intel/queue.c b/icd/intel/queue.c
index 4e58d44..7189a3a 100644
--- a/icd/intel/queue.c
+++ b/icd/intel/queue.c
@@ -350,6 +350,17 @@
     return intel_fence_wait(queue->fence, timeout);
 }
 
+static void intel_wait_queue_semaphore(struct intel_queue *queue, struct intel_semaphore *semaphore)
+{
+    intel_queue_wait(queue, -1);
+    semaphore->references--;
+}
+
+static void intel_signal_queue_semaphore(struct intel_queue *queue, struct intel_semaphore *semaphore)
+{
+    semaphore->references++;
+}
+
 ICD_EXPORT VkResult VKAPI vkQueueWaitIdle(
     VkQueue                                   queue_)
 {
@@ -360,8 +371,8 @@
 
 ICD_EXPORT VkResult VKAPI vkQueueSubmit(
     VkQueue                                   queue_,
-    uint32_t                                    cmdBufferCount,
-    const VkCmdBuffer*                       pCmdBuffers,
+    uint32_t                                  submitCount,
+    const VkSubmitInfo*                       pSubmitInfo,
     VkFence                                   fence_)
 {
     struct intel_queue *queue = intel_queue(queue_);
@@ -369,42 +380,57 @@
     struct intel_cmd *last_cmd;
     uint32_t i;
 
-    if (unlikely(intel_debug)) {
-        for (i = 0; i < cmdBufferCount; i++) {
-            struct intel_cmd *cmd = intel_cmd(pCmdBuffers[i]);
-            ret = queue_submit_cmd_debug(queue, cmd);
-            if (ret != VK_SUCCESS)
-                break;
+    for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
+
+        const VkSubmitInfo *submit = &pSubmitInfo[submit_idx];
+
+        for (i = 0; i < submit->waitSemCount; i++) {
+            struct intel_semaphore *pSemaphore = intel_semaphore(submit->pWaitSemaphores[i]);
+            intel_wait_queue_semaphore(queue, pSemaphore);
         }
-    } else {
-        for (i = 0; i < cmdBufferCount; i++) {
-            struct intel_cmd *cmd = intel_cmd(pCmdBuffers[i]);
-            ret = queue_submit_cmd(queue, cmd);
-            if (ret != VK_SUCCESS)
-                break;
+
+        if (unlikely(intel_debug)) {
+            for (i = 0; i < submit->cmdBufferCount; i++) {
+                struct intel_cmd *cmd = intel_cmd(submit->pCommandBuffers[i]);
+                ret = queue_submit_cmd_debug(queue, cmd);
+                if (ret != VK_SUCCESS)
+                    break;
+            }
+        } else {
+            for (i = 0; i < submit->cmdBufferCount; i++) {
+                struct intel_cmd *cmd = intel_cmd(submit->pCommandBuffers[i]);
+                ret = queue_submit_cmd(queue, cmd);
+                if (ret != VK_SUCCESS)
+                    break;
+            }
         }
-    }
 
-    /* no cmd submitted */
-    if (i == 0)
-        return ret;
+        /* no cmd submitted */
+        if (i == 0)
+            return ret;
 
-    last_cmd = intel_cmd(pCmdBuffers[i - 1]);
+        last_cmd = intel_cmd(submit->pCommandBuffers[i - 1]);
 
-    if (ret == VK_SUCCESS) {
-        intel_fence_set_seqno(queue->fence,
-                intel_cmd_get_batch(last_cmd, NULL));
+        if (ret == VK_SUCCESS) {
+            intel_fence_set_seqno(queue->fence,
+                    intel_cmd_get_batch(last_cmd, NULL));
 
-        if (fence_.handle != VK_NULL_HANDLE) {
-            struct intel_fence *fence = intel_fence(fence_);
-            intel_fence_copy(fence, queue->fence);
+            if (fence_.handle != VK_NULL_HANDLE) {
+                struct intel_fence *fence = intel_fence(fence_);
+                intel_fence_copy(fence, queue->fence);
+            }
+        } else {
+            struct intel_bo *last_bo;
+
+            /* unbusy submitted BOs */
+            last_bo = intel_cmd_get_batch(last_cmd, NULL);
+            intel_bo_wait(last_bo, -1);
         }
-    } else {
-        struct intel_bo *last_bo;
 
-        /* unbusy submitted BOs */
-        last_bo = intel_cmd_get_batch(last_cmd, NULL);
-        intel_bo_wait(last_bo, -1);
+        for (i = 0; i < submit->signalSemCount; i++) {
+            struct intel_semaphore *pSemaphore = intel_semaphore(submit->pSignalSemaphores[i]);
+            intel_signal_queue_semaphore(queue, pSemaphore);
+        }
     }
 
     return ret;
@@ -440,21 +466,22 @@
 }
 
 ICD_EXPORT VkResult VKAPI vkQueueSignalSemaphore(
-    VkQueue                                   queue,
+    VkQueue                                   queue_,
     VkSemaphore                               semaphore)
 {
     struct intel_semaphore *pSemaphore = intel_semaphore(semaphore);
-    pSemaphore->references++;
+    struct intel_queue *queue = intel_queue(queue_);
+    intel_signal_queue_semaphore(queue, pSemaphore);
     return VK_SUCCESS;
 }
 
 ICD_EXPORT VkResult VKAPI vkQueueWaitSemaphore(
-    VkQueue                                   queue,
+    VkQueue                                   queue_,
     VkSemaphore                               semaphore)
 {
     struct intel_semaphore *pSemaphore = intel_semaphore(semaphore);
-    vkQueueWaitIdle(queue);
-    pSemaphore->references--;
+    struct intel_queue *queue = intel_queue(queue_);
+    intel_wait_queue_semaphore(queue, pSemaphore);
 
     return VK_SUCCESS;
 }