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 <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36048>
This commit is contained in:
Faith Ekstrand
2025-07-10 11:00:20 -04:00
committed by Marge Bot
parent de4224a57c
commit 69919fd21b
+23 -23
View File
@@ -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,