summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Marek <jonathan@marek.ca>2020-09-28 23:01:38 -0400
committerMarge Bot <eric+marge@anholt.net>2020-09-30 00:32:40 +0000
commitc4d5010c54d83f102f07a98575189a5f1429b6a1 (patch)
tree2be87d43ab18253b6f925f89cbe8b88053a8ac46
parent8343c32f5af33d773df703b845562385c5126758 (diff)
turnip: rework ImportSemaphoreFdKHR
The behavior of OPAQUE_FD should be unchanged. SYNC_FD case is reworked to be more like what anv does: a new temporary syncobj is always created, with the CREATE_SIGNALED flag if necessary. Signed-off-by: Jonathan Marek <jonathan@marek.ca> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6719>
-rw-r--r--src/freedreno/vulkan/tu_drm.c78
1 files changed, 44 insertions, 34 deletions
diff --git a/src/freedreno/vulkan/tu_drm.c b/src/freedreno/vulkan/tu_drm.c
index 10af2dae259..15e9c4f568e 100644
--- a/src/freedreno/vulkan/tu_drm.c
+++ b/src/freedreno/vulkan/tu_drm.c
@@ -487,56 +487,66 @@ tu_DestroySemaphore(VkDevice _device,
VkResult
tu_ImportSemaphoreFdKHR(VkDevice _device,
- const VkImportSemaphoreFdInfoKHR *pImportSemaphoreFdInfo)
+ const VkImportSemaphoreFdInfoKHR *info)
{
TU_FROM_HANDLE(tu_device, device, _device);
- TU_FROM_HANDLE(tu_semaphore, sem, pImportSemaphoreFdInfo->semaphore);
+ TU_FROM_HANDLE(tu_semaphore, sem, info->semaphore);
int ret;
- uint32_t *dst = NULL;
-
- if (pImportSemaphoreFdInfo->flags & VK_SEMAPHORE_IMPORT_TEMPORARY_BIT) {
- dst = &sem->temporary;
- } else {
- dst = &sem->permanent;
- }
-
- uint32_t syncobj = *dst;
- switch(pImportSemaphoreFdInfo->handleType) {
+ switch(info->handleType) {
case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT: {
- uint32_t old_syncobj = syncobj;
- ret = drmSyncobjFDToHandle(device->fd, pImportSemaphoreFdInfo->fd, &syncobj);
- if (ret == 0) {
- close(pImportSemaphoreFdInfo->fd);
- if (old_syncobj)
- drmSyncobjDestroy(device->fd, old_syncobj);
+ uint32_t *dst;
+ if (info->flags & VK_SEMAPHORE_IMPORT_TEMPORARY_BIT)
+ dst = &sem->temporary;
+ else
+ dst = &sem->permanent;
+
+ struct drm_syncobj_handle handle = { .fd = info->fd };
+ ret = ioctl(device->fd, DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, &handle);
+ if (ret)
+ return VK_ERROR_INVALID_EXTERNAL_HANDLE;
+
+ if (*dst) {
+ ioctl(device->fd, DRM_IOCTL_SYNCOBJ_DESTROY,
+ &(struct drm_syncobj_destroy) { .handle = *dst });
}
+ *dst = handle.handle;
+ close(info->fd);
break;
}
case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT: {
- if (!syncobj) {
- ret = drmSyncobjCreate(device->fd, 0, &syncobj);
- if (ret)
- break;
+ assert(info->flags & VK_SEMAPHORE_IMPORT_TEMPORARY_BIT);
+
+ struct drm_syncobj_create create = {};
+
+ if (info->fd == -1)
+ create.flags |= DRM_SYNCOBJ_CREATE_SIGNALED;
+
+ ret = ioctl(device->fd, DRM_IOCTL_SYNCOBJ_CREATE, &create);
+ if (ret)
+ return VK_ERROR_INVALID_EXTERNAL_HANDLE;
+
+ if (info->fd != -1) {
+ ret = ioctl(device->fd, DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, &(struct drm_syncobj_handle) {
+ .fd = info->fd,
+ .handle = create.handle,
+ .flags = DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE,
+ });
+ if (ret) {
+ ioctl(device->fd, DRM_IOCTL_SYNCOBJ_DESTROY,
+ &(struct drm_syncobj_destroy) { .handle = create.handle });
+ return VK_ERROR_INVALID_EXTERNAL_HANDLE;
+ }
+ close(info->fd);
}
- if (pImportSemaphoreFdInfo->fd == -1) {
- ret = drmSyncobjSignal(device->fd, &syncobj, 1);
- } else {
- ret = drmSyncobjImportSyncFile(device->fd, syncobj, pImportSemaphoreFdInfo->fd);
- }
- if (!ret)
- close(pImportSemaphoreFdInfo->fd);
+
+ semaphore_set_temporary(device, sem, create.handle);
break;
}
default:
unreachable("Unhandled semaphore handle type");
}
- if (ret) {
- return VK_ERROR_INVALID_EXTERNAL_HANDLE;
- }
- *dst = syncobj;
-
return VK_SUCCESS;
}