diff options
author | Dave Airlie <[email protected]> | 2017-02-09 03:24:05 +0000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2017-02-09 23:45:33 +0000 |
commit | e5a5d17d1363fe9b00cee93a5c7bc98b134f235b (patch) | |
tree | 2f509661207d307fb940dec50927f5aba03b3839 /src/amd | |
parent | a4086bb5310984b97054ecec8e3a04780f99d646 (diff) |
radv: handle queue submission with no cs but semaphores
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 <[email protected]>
Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/amd')
-rw-r--r-- | src/amd/vulkan/radv_device.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 98d4b91ac40..8a54a2ad03b 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -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, |