radv: handle queue submission with no cs but semaphores
authorDave Airlie <airlied@redhat.com>
Thu, 9 Feb 2017 03:24:05 +0000 (03:24 +0000)
committerDave Airlie <airlied@redhat.com>
Thu, 9 Feb 2017 23:45:33 +0000 (23:45 +0000)
It's legal to submit just semaphores with no command streams,
this patch fixes this case by emitting the empty cs, it also
handles the fence emission for this case better.

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/amd/vulkan/radv_device.c

index 98d4b91ac40219c0bfec18b600176d3def3045c8..8a54a2ad03b4d67500e7b90f5d83776e4f24ab76 100644 (file)
@@ -1400,6 +1400,7 @@ VkResult radv_QueueSubmit(
        uint32_t esgs_ring_size = 0, gsvs_ring_size = 0;
        struct radeon_winsys_cs *preamble_cs = NULL;
        VkResult result;
+       bool fence_emitted = false;
 
        /* Do this first so failing to allocate scratch buffers can't result in
         * partially executed submissions. */
@@ -1425,8 +1426,24 @@ VkResult radv_QueueSubmit(
                bool can_patch = true;
                uint32_t advance;
 
-               if (!pSubmits[i].commandBufferCount)
+               if (!pSubmits[i].commandBufferCount) {
+                       if (pSubmits[i].waitSemaphoreCount || pSubmits[i].signalSemaphoreCount) {
+                               ret = queue->device->ws->cs_submit(ctx, queue->queue_idx,
+                                                                  &queue->device->empty_cs[queue->queue_family_index],
+                                                                  1, NULL,
+                                                                  (struct radeon_winsys_sem **)pSubmits[i].pWaitSemaphores,
+                                                                  pSubmits[i].waitSemaphoreCount,
+                                                                  (struct radeon_winsys_sem **)pSubmits[i].pSignalSemaphores,
+                                                                  pSubmits[i].signalSemaphoreCount,
+                                                                  false, base_fence);
+                               if (ret) {
+                                       radv_loge("failed to submit CS %d\n", i);
+                                       abort();
+                               }
+                               fence_emitted = true;
+                       }
                        continue;
+               }
 
                cs_array = malloc(sizeof(struct radeon_winsys_cs *) *
                                                pSubmits[i].commandBufferCount);
@@ -1462,6 +1479,7 @@ VkResult radv_QueueSubmit(
                                radv_loge("failed to submit CS %d\n", i);
                                abort();
                        }
+                       fence_emitted = true;
                        if (queue->device->trace_bo) {
                                bool success = queue->device->ws->ctx_wait_idle(
                                                        queue->hw_ctx,
@@ -1479,7 +1497,7 @@ VkResult radv_QueueSubmit(
        }
 
        if (fence) {
-               if (!submitCount)
+               if (!fence_emitted)
                        ret = queue->device->ws->cs_submit(ctx, queue->queue_idx,
                                                           &queue->device->empty_cs[queue->queue_family_index],
                                                           1, NULL, NULL, 0, NULL, 0,