turnip: rework GetSemaphoreFdKHR

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>
This commit is contained in:
Jonathan Marek
2020-09-28 22:56:07 -04:00
committed by Marge Bot
parent fb76af24a2
commit 8343c32f5a

View 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;
}