From 69919fd21bd370bbbebd688d6ae64015b4850797 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Thu, 10 Jul 2025 11:00:20 -0400 Subject: [PATCH] zink: Add a resource_get_dma_buf() helper We had the same code in two paces and one of them had a bug (see previous commit) so let's make it one place. Reviewed-by: Mike Blumenkrantz Part-of: --- src/gallium/drivers/zink/zink_screen.c | 46 +++++++++++++------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index ea9d46bcda4..e1871b0ea1c 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -2300,6 +2300,27 @@ zink_create_exportable_semaphore(struct zink_screen *screen) return ret == VK_SUCCESS ? sem : VK_NULL_HANDLE; } +#if defined(HAVE_LIBDRM) && (DETECT_OS_LINUX || DETECT_OS_BSD) +static int +zink_resource_get_dma_buf(struct zink_screen *screen, struct zink_resource *res) +{ + if (res->obj->is_aux) { + return os_dupfd_cloexec(res->obj->handle); + } else { + VkMemoryGetFdInfoKHR fd_info = {0}; + fd_info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR; + fd_info.memory = zink_bo_get_mem(res->obj->bo); + fd_info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT; + + int fd; + if (VKSCR(GetMemoryFdKHR)(screen->dev, &fd_info, &fd) != VK_SUCCESS) + return -1; + + return fd; + } +} +#endif + VkSemaphore zink_screen_export_dmabuf_semaphore(struct zink_screen *screen, struct zink_resource *res) { @@ -2310,18 +2331,7 @@ zink_screen_export_dmabuf_semaphore(struct zink_screen *screen, struct zink_reso .fd = -1, }; - int fd = -1; - if (res->obj->is_aux) { - fd = os_dupfd_cloexec(res->obj->handle); - } else { - VkMemoryGetFdInfoKHR fd_info = {0}; - fd_info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR; - fd_info.memory = zink_bo_get_mem(res->obj->bo); - fd_info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT; - if (VKSCR(GetMemoryFdKHR)(screen->dev, &fd_info, &fd) != VK_SUCCESS) - fd = -1; - } - + int fd = zink_resource_get_dma_buf(screen, res); if (unlikely(fd < 0)) { mesa_loge("MESA: Unable to get a valid memory fd"); return VK_NULL_HANDLE; @@ -2374,17 +2384,7 @@ zink_screen_import_dmabuf_semaphore(struct zink_screen *screen, struct zink_reso } bool ret = false; - int fd; - if (res->obj->is_aux) { - fd = os_dupfd_cloexec(res->obj->handle); - } else { - VkMemoryGetFdInfoKHR fd_info = {0}; - fd_info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR; - fd_info.memory = zink_bo_get_mem(res->obj->bo); - fd_info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT; - if (VKSCR(GetMemoryFdKHR)(screen->dev, &fd_info, &fd) != VK_SUCCESS) - fd = -1; - } + int fd = zink_resource_get_dma_buf(screen, res); if (fd != -1) { struct dma_buf_import_sync_file import = { .flags = DMA_BUF_SYNC_RW,