diff --git a/src/amd/vulkan/radv_physical_device.c b/src/amd/vulkan/radv_physical_device.c index 40b5e449a0a..010bf77f8da 100644 --- a/src/amd/vulkan/radv_physical_device.c +++ b/src/amd/vulkan/radv_physical_device.c @@ -9,6 +9,7 @@ */ #include +#include "util/os_file.h" #include "util/os_misc.h" #include "vulkan/vulkan_core.h" @@ -2464,7 +2465,7 @@ radv_physical_device_try_create(struct radv_instance *instance, drmDevicePtr drm #else VkResult result; int fd = -1; - int wsi_master_fd = -1; + int wsi_master_fd = -1, wsi_syncobj_fd = -1; const char *path = drm_device->nodes[DRM_NODE_RENDER]; enum radv_drm_device_type drm_device_type; drmVersionPtr version; @@ -2582,6 +2583,9 @@ radv_physical_device_try_create(struct radv_instance *instance, drmDevicePtr drm wsi_master_fd = -1; } } + + if (fd != -1) + wsi_syncobj_fd = os_dupfd_cloexec(fd); } /* Allow all devices on a virtual winsys, otherwise do a basic support check. */ @@ -2599,6 +2603,7 @@ radv_physical_device_try_create(struct radv_instance *instance, drmDevicePtr drm } pdev->wsi_master_fd = wsi_master_fd; + pdev->wsi_syncobj_fd = wsi_syncobj_fd; pdev->use_llvm = instance->debug_flags & RADV_DEBUG_LLVM; #if !AMD_LLVM_AVAILABLE @@ -2814,6 +2819,8 @@ fail_fd: close(fd); if (wsi_master_fd != -1) close(wsi_master_fd); + if (wsi_syncobj_fd != -1) + close(wsi_syncobj_fd); return result; #endif } @@ -2861,6 +2868,8 @@ radv_physical_device_destroy(struct vk_physical_device *vk_device) disk_cache_destroy(pdev->disk_cache_meta); if (pdev->wsi_master_fd != -1) close(pdev->wsi_master_fd); + if (pdev->wsi_syncobj_fd != -1) + close(pdev->wsi_syncobj_fd); simple_mtx_destroy(&pdev->drm_device_mtx); #ifndef _WIN32 if (pdev->drm_device) diff --git a/src/amd/vulkan/radv_physical_device.h b/src/amd/vulkan/radv_physical_device.h index 32b8e7d0409..e31bc52c271 100644 --- a/src/amd/vulkan/radv_physical_device.h +++ b/src/amd/vulkan/radv_physical_device.h @@ -90,6 +90,7 @@ struct radv_physical_device { struct ac_addrlib *addrlib; int wsi_master_fd; + int wsi_syncobj_fd; struct wsi_device wsi_device; /* Whether DCC should be enabled for MSAA textures. */ diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c index d5ab1a70a3d..5c8dfb1acb1 100644 --- a/src/amd/vulkan/radv_wsi.c +++ b/src/amd/vulkan/radv_wsi.c @@ -109,7 +109,7 @@ radv_init_wsi(struct radv_physical_device *pdev) pdev->wsi_device.supports_protected[i] = radv_tmz_enabled(pdev); } - wsi_device_setup_syncobj_fd(&pdev->wsi_device, pdev->ws->get_fd(pdev->ws)); + wsi_device_setup_syncobj_fd(&pdev->wsi_device, pdev->wsi_syncobj_fd); pdev->vk.wsi_device = &pdev->wsi_device;