turnip: rework GetSemaphoreFdKHR
authorJonathan Marek <jonathan@marek.ca>
Tue, 29 Sep 2020 02:56:07 +0000 (22:56 -0400)
committerMarge Bot <eric+marge@anholt.net>
Wed, 30 Sep 2020 00:32:40 +0000 (00:32 +0000)
Fixes:
- permanent payload not being restored for the OPAQUE_FD case
- incorrectly resetting the permanent payload in SYNC_FD case

Signed-off-by: Jonathan Marek <jonathan@marek.ca>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6719>

src/freedreno/vulkan/tu_drm.c

index 7edf7c6..10af2da 100644 (file)
@@ -542,34 +542,30 @@ tu_ImportSemaphoreFdKHR(VkDevice _device,
 
 VkResult
 tu_GetSemaphoreFdKHR(VkDevice _device,
-                     const VkSemaphoreGetFdInfoKHR *pGetFdInfo,
+                     const VkSemaphoreGetFdInfoKHR *info,
                      int *pFd)
 {
    TU_FROM_HANDLE(tu_device, device, _device);
-   TU_FROM_HANDLE(tu_semaphore, sem, pGetFdInfo->semaphore);
+   TU_FROM_HANDLE(tu_semaphore, sem, info->semaphore);
    int ret;
-   uint32_t syncobj_handle = sem->temporary ?: sem->permanent;
-
-   switch(pGetFdInfo->handleType) {
-   case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT:
-      ret = drmSyncobjHandleToFD(device->fd, syncobj_handle, pFd);
-      break;
-   case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT:
-      ret = drmSyncobjExportSyncFile(device->fd, syncobj_handle, pFd);
-      if (!ret) {
-         if (sem->temporary) {
-            semaphore_set_temporary(device, sem, 0);
-         } else {
-            drmSyncobjReset(device->fd, &syncobj_handle, 1);
-         }
-      }
-      break;
-   default:
-      unreachable("Unhandled semaphore handle type");
-   }
 
+   assert(info->handleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT ||
+          info->handleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT);
+
+   struct drm_syncobj_handle handle = {
+      .handle = sem->temporary ?: sem->permanent,
+      .flags = COND(info->handleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT,
+                    DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE),
+      .fd = -1,
+   };
+   ret = ioctl(device->fd, DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, &handle);
    if (ret)
       return vk_error(device->instance, VK_ERROR_INVALID_EXTERNAL_HANDLE);
+
+   /* restore permanent payload on export */
+   semaphore_set_temporary(device, sem, 0);
+
+   *pFd = handle.fd;
    return VK_SUCCESS;
 }