Mesa (main): dzn: Add an eventfd sync implementation

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jul 6 12:34:28 UTC 2022


Module: Mesa
Branch: main
Commit: 45ad8125f554360e34b147bc3381ae13d609c663
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=45ad8125f554360e34b147bc3381ae13d609c663

Author: Jesse Natalie <jenatali at microsoft.com>
Date:   Fri Jul  1 09:05:25 2022 -0700

dzn: Add an eventfd sync implementation

Reviewed-by: Boris Brezillon <boris.brezillon at collabora.com>
Reviewed-by: Bill Kristiansen <billkris at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17340>

---

 src/microsoft/vulkan/dzn_sync.c | 42 ++++++++++++++++++++++++++++++++++-------
 1 file changed, 35 insertions(+), 7 deletions(-)

diff --git a/src/microsoft/vulkan/dzn_sync.c b/src/microsoft/vulkan/dzn_sync.c
index dd1f1fa4fe5..f2cc8f85f0c 100644
--- a/src/microsoft/vulkan/dzn_sync.c
+++ b/src/microsoft/vulkan/dzn_sync.c
@@ -30,6 +30,11 @@
 #include "util/macros.h"
 #include "util/os_time.h"
 
+#ifndef _WIN32
+#include <sys/eventfd.h>
+#include <libsync.h>
+#endif
+
 static VkResult
 dzn_sync_init(struct vk_device *device,
               struct vk_sync *sync,
@@ -128,9 +133,17 @@ dzn_sync_wait(struct vk_device *device,
 {
    struct dzn_device *ddev = container_of(device, struct dzn_device, vk);
 
+#ifdef _WIN32
    HANDLE event = CreateEventA(NULL, FALSE, FALSE, NULL);
    if (event == NULL)
       return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
+#else
+   int event_fd = eventfd(0, EFD_CLOEXEC);
+   if (event_fd == -1)
+      return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
+   /* The D3D12 event-based APIs in WSL expect an eventfd file descriptor cast to HANDLE */
+   HANDLE event = (HANDLE)(intptr_t)event_fd;
+#endif
 
    STACK_ARRAY(ID3D12Fence *, fences, wait_count);
    STACK_ARRAY(uint64_t, values, wait_count);
@@ -155,14 +168,24 @@ dzn_sync_wait(struct vk_device *device,
                                                               event))) {
       STACK_ARRAY_FINISH(fences);
       STACK_ARRAY_FINISH(values);
+#ifdef _WIN32
       CloseHandle(event);
+#else
+      close(event_fd);
+#endif
       return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
    }
 
+#ifdef _WIN32
    DWORD timeout_ms;
+   static const DWORD timeout_infinite = INFINITE;
+#else
+   int timeout_ms;
+   static const int timeout_infinite = -1;
+#endif
 
    if (abs_timeout_ns == OS_TIMEOUT_INFINITE) {
-      timeout_ms = INFINITE;
+      timeout_ms = timeout_infinite;
    } else {
       uint64_t cur_time = os_time_get_nano();
       uint64_t rel_timeout_ns =
@@ -171,20 +194,25 @@ dzn_sync_wait(struct vk_device *device,
       timeout_ms = (rel_timeout_ns / 1000000) + (rel_timeout_ns % 1000000 ? 1 : 0);
    }
 
+#ifdef _WIN32
    DWORD res =
       WaitForSingleObject(event, timeout_ms);
 
    CloseHandle(event);
+   VkResult ret = VK_SUCCESS;
+   if (res == WAIT_TIMEOUT)
+      ret = VK_TIMEOUT;
+   else if (res != WAIT_OBJECT_0)
+      ret = vk_error(device, VK_ERROR_UNKNOWN);
+#else
+   VkResult ret = sync_wait(event_fd, timeout_ms) != 0 ? VK_TIMEOUT : VK_SUCCESS;
+   close(event_fd);
+#endif
 
    STACK_ARRAY_FINISH(fences);
    STACK_ARRAY_FINISH(values);
 
-   if (res == WAIT_TIMEOUT)
-      return VK_TIMEOUT;
-   else if (res != WAIT_OBJECT_0)
-      return vk_error(device, VK_ERROR_UNKNOWN);
-
-   return VK_SUCCESS;
+   return ret;
 }
 
 const struct vk_sync_type dzn_sync_type = {



More information about the mesa-commit mailing list