From 6cf9b5ece627b2d424a62fac7ee32f9e4935a56a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Tue, 12 Jun 2018 14:47:59 +0200 Subject: [PATCH] egl: add virgl_renderer_get_fd_for_texture2() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit virgl_renderer_resource_get_info() doesn't return the underlying image stride. eglExportDMABUFImageMESA() does. This fixes imports failing due to a stride mismatch under certain resolutions. (note that qemu uses its own export methods, perhaps because Gerd noticed the problem with virgl egl export functions) Signed-off-by: Marc-André Lureau Signed-off-by: Dave Airlie --- src/virgl_egl.h | 1 + src/virgl_egl_context.c | 23 +++++++++++++++++++++++ src/virglrenderer.c | 9 +++++++++ src/virglrenderer.h | 1 + 4 files changed, 34 insertions(+) diff --git a/src/virgl_egl.h b/src/virgl_egl.h index 3038f21..1a651a0 100644 --- a/src/virgl_egl.h +++ b/src/virgl_egl.h @@ -37,5 +37,6 @@ virgl_renderer_gl_context virgl_egl_get_current_context(struct virgl_egl *ve); int virgl_egl_get_fourcc_for_texture(struct virgl_egl *ve, uint32_t tex_id, uint32_t format, int *fourcc); int virgl_egl_get_fd_for_texture(struct virgl_egl *ve, uint32_t tex_id, int *fd); +int virgl_egl_get_fd_for_texture2(struct virgl_egl *ve, uint32_t tex_id, int *fd, int *stride, int *offset); uint32_t virgl_egl_get_gbm_format(uint32_t format); #endif diff --git a/src/virgl_egl_context.c b/src/virgl_egl_context.c index e850d23..6195394 100644 --- a/src/virgl_egl_context.c +++ b/src/virgl_egl_context.c @@ -315,6 +315,29 @@ int virgl_egl_get_fourcc_for_texture(struct virgl_egl *ve, uint32_t tex_id, uint return ret; } +int virgl_egl_get_fd_for_texture2(struct virgl_egl *ve, uint32_t tex_id, int *fd, + int *stride, int *offset) +{ + int ret = EINVAL; + EGLImageKHR image = eglCreateImageKHR(ve->egl_display, eglGetCurrentContext(), + EGL_GL_TEXTURE_2D_KHR, + (EGLClientBuffer)(unsigned long)tex_id, NULL); + if (!image) + return EINVAL; + if (!ve->have_mesa_dma_buf_img_export) + goto out_destroy; + + if (!eglExportDMABUFImageMESA(ve->egl_display, image, fd, + stride, offset)) + goto out_destroy; + + ret = 0; + +out_destroy: + eglDestroyImageKHR(ve->egl_display, image); + return ret; +} + int virgl_egl_get_fd_for_texture(struct virgl_egl *ve, uint32_t tex_id, int *fd) { EGLImageKHR image; diff --git a/src/virglrenderer.c b/src/virglrenderer.c index c2ef019..562ff83 100644 --- a/src/virglrenderer.c +++ b/src/virglrenderer.c @@ -337,6 +337,15 @@ int virgl_renderer_get_fd_for_texture(uint32_t tex_id, int *fd) #endif } +int virgl_renderer_get_fd_for_texture2(uint32_t tex_id, int *fd, int *stride, int *offset) +{ +#ifdef HAVE_EPOXY_EGL_H + return virgl_egl_get_fd_for_texture2(egl_info, tex_id, fd, stride, offset); +#else + return -1; +#endif +} + void virgl_renderer_reset(void) { vrend_renderer_reset(); diff --git a/src/virglrenderer.h b/src/virglrenderer.h index 9596dce..a095210 100644 --- a/src/virglrenderer.h +++ b/src/virglrenderer.h @@ -73,6 +73,7 @@ VIRGL_EXPORT void virgl_renderer_get_rect(int resource_id, struct iovec *iov, un uint32_t offset, int x, int y, int width, int height); VIRGL_EXPORT int virgl_renderer_get_fd_for_texture(uint32_t tex_id, int *fd); +VIRGL_EXPORT int virgl_renderer_get_fd_for_texture2(uint32_t tex_id, int *fd, int *stride, int *offset); /* virgl bind flags - these are compatible with mesa 10.5 gallium. but are fixed, no other should be passed to virgl either. */