summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Beckett <bob.beckett@collabora.com>2022-10-21 18:13:52 +0100
committerMarge Bot <emma+marge@anholt.net>2023-06-14 05:43:55 +0000
commitea3162e08b458c57cead6e8618c104e1bf7fcf8b (patch)
tree767c73b5ea8a32015c902d52a1ac54638e6415a7
parent00d14ccb16915048b1ab29432daecf6f4d28056e (diff)
vrend: keep fd during set_type resource promotion
Keep the fd during set_type resource promotion to allow it to be exported during vkAllocateMemory dispatch and directly scanned out via dmabuf. Allow resource info to expose the fd directly. This allows vmm to directly scanout blob resources via the dmabuf fd. This fixes the use case of qemu guest running gamescope + kmscube. This was tested with a qemu change to land after this to scanout via the fd. Signed-off-by: Robert Beckett <bob.beckett@collabora.com> Part-of: <https://gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests/967>
-rw-r--r--src/virglrenderer.c9
-rw-r--r--src/virglrenderer.h1
-rw-r--r--src/vrend_renderer.c3
3 files changed, 8 insertions, 5 deletions
diff --git a/src/virglrenderer.c b/src/virglrenderer.c
index c81d8b4..a4676e7 100644
--- a/src/virglrenderer.c
+++ b/src/virglrenderer.c
@@ -472,14 +472,19 @@ static int virgl_renderer_resource_get_info_common(int res_handle,
TRACE_FUNC();
struct virgl_resource *res = virgl_resource_lookup(res_handle);
- if (!res || !res->pipe_resource)
+ if (!res)
return EINVAL;
if (!info)
return EINVAL;
+ info->handle = res_handle;
+ info->fd = res->fd;
+
+ if (!res->pipe_resource)
+ return 0;
+
vrend_renderer_resource_get_info(res->pipe_resource,
(struct vrend_renderer_resource_info *)info);
- info->handle = res_handle;
#ifdef WIN32
if (d3d_tex2d)
diff --git a/src/virglrenderer.h b/src/virglrenderer.h
index fb28ad0..3687b57 100644
--- a/src/virglrenderer.h
+++ b/src/virglrenderer.h
@@ -314,6 +314,7 @@ struct virgl_renderer_resource_info {
uint32_t tex_id;
uint32_t stride;
int drm_fourcc;
+ int fd;
};
#define VIRGL_RENDERER_RESOURCE_INFO_EXT_VERSION 0
diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index 275e2f2..3b4e879 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -12802,9 +12802,6 @@ vrend_renderer_pipe_resource_set_type(struct vrend_context *ctx,
}
/* "promote" the fd to pipe_resource */
- close(res->fd);
- res->fd = -1;
- res->fd_type = VIRGL_RESOURCE_FD_INVALID;
res->pipe_resource = &gr->base;
#else /* HAVE_EPOXY_EGL_H */
(void)args;