Mesa (main): venus: add support for external semaphores on Android
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Jun 11 23:54:30 UTC 2021
Module: Mesa
Branch: main
Commit: 5e4ff4ef1ff3330b1f49249bf8300dd4b7be0e14
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5e4ff4ef1ff3330b1f49249bf8300dd4b7be0e14
Author: Chia-I Wu <olvaffe at gmail.com>
Date: Tue Jun 8 12:46:22 2021 -0700
venus: add support for external semaphores on Android
This is a hack.
Signed-off-by: Chia-I Wu <olvaffe at gmail.com>
Reviewed-by: Yiwei Zhang <zzyiwei at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11253>
---
src/virtio/vulkan/vn_device.c | 8 ++++++++
src/virtio/vulkan/vn_queue.c | 46 +++++++++++++++++++++++++++++++++++++++++--
2 files changed, 52 insertions(+), 2 deletions(-)
diff --git a/src/virtio/vulkan/vn_device.c b/src/virtio/vulkan/vn_device.c
index 2ea3efb4f85..5502e5f31c9 100644
--- a/src/virtio/vulkan/vn_device.c
+++ b/src/virtio/vulkan/vn_device.c
@@ -1445,6 +1445,13 @@ vn_physical_device_init_external_semaphore_handles(
*/
physical_dev->external_binary_semaphore_handles = 0;
physical_dev->external_timeline_semaphore_handles = 0;
+
+#ifdef ANDROID
+ if (physical_dev->instance->experimental.globalFencing) {
+ physical_dev->external_binary_semaphore_handles =
+ VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT;
+ }
+#endif
}
static void
@@ -1478,6 +1485,7 @@ vn_physical_device_get_native_extensions(
#ifdef ANDROID
if (instance->experimental.globalFencing) {
exts->KHR_external_fence_fd = true;
+ exts->KHR_external_semaphore_fd = true;
}
#endif
diff --git a/src/virtio/vulkan/vn_queue.c b/src/virtio/vulkan/vn_queue.c
index c694d734b78..0ddc731e447 100644
--- a/src/virtio/vulkan/vn_queue.c
+++ b/src/virtio/vulkan/vn_queue.c
@@ -972,7 +972,27 @@ vn_ImportSemaphoreFdKHR(
VkDevice device, const VkImportSemaphoreFdInfoKHR *pImportSemaphoreFdInfo)
{
struct vn_device *dev = vn_device_from_handle(device);
- return vn_error(dev->instance, VK_ERROR_UNKNOWN);
+ struct vn_semaphore *sem =
+ vn_semaphore_from_handle(pImportSemaphoreFdInfo->semaphore);
+ ASSERTED const bool sync_file =
+ pImportSemaphoreFdInfo->handleType ==
+ VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT;
+ const int fd = pImportSemaphoreFdInfo->fd;
+
+ assert(dev->instance->experimental.globalFencing);
+ assert(sync_file);
+ if (fd >= 0) {
+ const int ret = sync_wait(fd, -1);
+ if (ret)
+ return vn_error(dev->instance, VK_ERROR_INVALID_EXTERNAL_HANDLE);
+
+ close(fd);
+ }
+
+ /* abuse VN_SYNC_TYPE_WSI_SIGNALED */
+ vn_semaphore_signal_wsi(dev, sem);
+
+ return VK_SUCCESS;
}
VkResult
@@ -981,7 +1001,29 @@ vn_GetSemaphoreFdKHR(VkDevice device,
int *pFd)
{
struct vn_device *dev = vn_device_from_handle(device);
- return vn_error(dev->instance, VK_ERROR_UNKNOWN);
+ struct vn_semaphore *sem = vn_semaphore_from_handle(pGetFdInfo->semaphore);
+ const bool sync_file =
+ pGetFdInfo->handleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT;
+ struct vn_sync_payload *payload = sem->payload;
+
+ assert(dev->instance->experimental.globalFencing);
+ assert(sync_file);
+ int fd = -1;
+ if (payload->type == VN_SYNC_TYPE_DEVICE_ONLY) {
+ VkResult result = vn_create_sync_file(dev, &fd);
+ if (result != VK_SUCCESS)
+ return vn_error(dev->instance, result);
+ }
+
+ if (sync_file) {
+ vn_sync_payload_release(dev, &sem->temporary);
+ sem->payload = &sem->permanent;
+
+ /* XXX implies wait operation on the host semaphore */
+ }
+
+ *pFd = fd;
+ return VK_SUCCESS;
}
/* event commands */
More information about the mesa-commit
mailing list