From 0b08f83817456510eb4d3796acaf9b45731d036d Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Mon, 13 Jan 2020 08:53:26 +0100 Subject: [PATCH] v3dv: implement vkDeviceWaitIdle This is really a hack, but it is better than not having anything. In the future we should have a syncobject that we could wait on. Part-of: --- src/broadcom/vulkan/v3dv_device.c | 18 +++++++++++++++++- src/broadcom/vulkan/v3dv_private.h | 5 ++++- src/broadcom/vulkan/v3dv_queue.c | 4 ++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 5587491..07f3d52 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -954,6 +954,14 @@ v3dv_CreateDevice(VkPhysicalDevice physicalDevice, device->devinfo = physical_device->devinfo; device->enabled_extensions = enabled_extensions; + int ret = drmSyncobjCreate(device->fd, + DRM_SYNCOBJ_CREATE_SIGNALED, + &device->last_job_sync); + if (ret) { + result = VK_ERROR_INITIALIZATION_FAILED; + goto fail_fd; + } + init_device_dispatch(device); *pDevice = v3dv_device_to_handle(device); @@ -973,6 +981,8 @@ v3dv_DestroyDevice(VkDevice _device, const VkAllocationCallbacks *pAllocator) { V3DV_FROM_HANDLE(v3dv_device, device, _device); + + drmSyncobjDestroy(device->fd, device->last_job_sync); queue_finish(&device->queue); vk_free2(&default_alloc, pAllocator, device); } @@ -994,7 +1004,13 @@ v3dv_GetDeviceQueue(VkDevice _device, VkResult v3dv_DeviceWaitIdle(VkDevice _device) { - /* FIXME: stub */ + V3DV_FROM_HANDLE(v3dv_device, device, _device); + + int ret = + drmSyncobjWait(device->fd, &device->last_job_sync, 1, INT64_MAX, 0, NULL); + if (ret) + return VK_ERROR_DEVICE_LOST; + return VK_SUCCESS; } diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 6c03739..4247814 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -195,7 +195,10 @@ struct v3dv_device { struct v3d_device_info devinfo; struct v3dv_queue queue; - /* FIXME: stub */ + /* Last command buffer submitted on this device. We use this to check if + * the GPU is idle. + */ + uint32_t last_job_sync; }; struct v3dv_device_memory { diff --git a/src/broadcom/vulkan/v3dv_queue.c b/src/broadcom/vulkan/v3dv_queue.c index 186c9f0..cbef88b 100644 --- a/src/broadcom/vulkan/v3dv_queue.c +++ b/src/broadcom/vulkan/v3dv_queue.c @@ -68,8 +68,8 @@ job_submit(struct v3dv_job *job) */ submit.in_sync_rcl = 0; /* FIXME */ - /* Update the sync object for the last rendering by our context. */ - submit.out_sync = 0; /* FIXME */ + /* Update the sync object for the last rendering by this device. */ + submit.out_sync = job->cmd_buffer->device->last_job_sync; submit.bcl_start = job->bcl.bo->offset; submit.bcl_end = job->bcl.bo->offset + v3dv_cl_offset(&job->bcl); -- 2.7.4