From cfe0bf5a4a28a81fb31fd4552b42747d783808c9 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 14 Sep 2021 13:01:59 -0400 Subject: [PATCH] zink: unbreak dmabuf handling this does need kms handling to do literally anything. Reviewed-by: Adam Jackson Part-of: --- src/gallium/drivers/zink/zink_resource.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index 59ad23b88bb..27a71250297 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -916,7 +916,7 @@ zink_resource_get_handle(struct pipe_screen *pscreen, struct winsys_handle *whandle, unsigned usage) { - if (whandle->type == WINSYS_HANDLE_TYPE_FD) { + if (whandle->type == WINSYS_HANDLE_TYPE_FD || whandle->type == WINSYS_HANDLE_TYPE_KMS) { #ifdef ZINK_USE_DMABUF struct zink_resource *res = zink_resource(tex); struct zink_screen *screen = zink_screen(pscreen); @@ -935,6 +935,14 @@ zink_resource_get_handle(struct pipe_screen *pscreen, VkResult result = VKSCR(GetMemoryFdKHR)(screen->dev, &fd_info, &fd); if (result != VK_SUCCESS) return false; + if (whandle->type == WINSYS_HANDLE_TYPE_KMS) { + uint32_t h; + if (drmPrimeFDToHandle(screen->drm_fd, fd, &h)) { + return false; + } + close(fd); + fd = h; + } whandle->handle = fd; uint64_t value; zink_resource_get_param(pscreen, context, tex, 0, 0, 0, PIPE_RESOURCE_PARAM_MODIFIER, 0, &value);