[Mesa-dev] [PATCH] radv: handle queue submission with no cs but semaphores

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Thu Feb 9 08:35:15 UTC 2017


Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>

I'll adjust the sparse binding patches.

On Thu, Feb 9, 2017, at 04:25, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
> 
> 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.
> 
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/amd/vulkan/radv_device.c | 22 ++++++++++++++++++++--
>  1 file changed, 20 insertions(+), 2 deletions(-)
> 
> diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
> index 65ba119..91c0506 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);
> @@ -1465,6 +1482,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,
> @@ -1482,7 +1500,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,
> -- 
> 2.7.4
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list