diff --git a/src/virgl_egl.h b/src/virgl_egl.h index 3faa664..3038f21 100644 --- a/src/virgl_egl.h +++ b/src/virgl_egl.h @@ -35,6 +35,7 @@ void virgl_egl_destroy_context(struct virgl_egl *ve, virgl_renderer_gl_context v int virgl_egl_make_context_current(struct virgl_egl *ve, virgl_renderer_gl_context virglctx); 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); 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 1376237..43c77b4 100644 --- a/src/virgl_egl_context.c +++ b/src/virgl_egl_context.c @@ -258,17 +258,54 @@ virgl_renderer_gl_context virgl_egl_get_current_context(struct virgl_egl *ve) return (virgl_renderer_gl_context)eglctx; } -int virgl_egl_get_fd_for_texture(struct virgl_egl *ve, uint32_t tex_id, int *fd) +int virgl_egl_get_fourcc_for_texture(struct virgl_egl *ve, uint32_t tex_id, uint32_t format, int *fourcc) { + int ret; + +#ifndef EGL_MESA_image_dma_buf_export + ret = 0; + goto fallback; +#else EGLImageKHR image; EGLint stride; EGLBoolean b; + if (!ve->have_mesa_dma_buf_img_export) + goto fallback; + + image = eglCreateImageKHR(ve->egl_display, eglGetCurrentContext(), EGL_GL_TEXTURE_2D_KHR, (EGLClientBuffer)(unsigned long)tex_id, NULL); + + if (!image) + return EINVAL; + + ret = EINVAL; + b = eglExportDMABUFImageQueryMESA(ve->egl_display, image, fourcc, NULL); + if (!b) + goto out_destroy; + ret = 0; + out_destroy: + eglDestroyImageKHR(ve->egl_display, image); + return ret; + +#endif + +fallback: + *fourcc = virgl_egl_get_gbm_format(format); + return ret; +} + +int virgl_egl_get_fd_for_texture(struct virgl_egl *ve, uint32_t tex_id, int *fd) +{ + EGLImageKHR image; + EGLint stride; + EGLBoolean b; + int ret; image = eglCreateImageKHR(ve->egl_display, eglGetCurrentContext(), EGL_GL_TEXTURE_2D_KHR, (EGLClientBuffer)(unsigned long)tex_id, NULL); if (!image) return EINVAL; + ret = EINVAL; if (ve->have_mesa_dma_buf_img_export) { #ifdef EGL_MESA_image_dma_buf_export b = eglExportDMABUFImageMESA(ve->egl_display, @@ -276,7 +313,7 @@ int virgl_egl_get_fd_for_texture(struct virgl_egl *ve, uint32_t tex_id, int *fd) fd, &stride); #else - return EINVAL; + goto out_destroy; #endif } else { #ifdef EGL_MESA_drm_image @@ -288,18 +325,21 @@ int virgl_egl_get_fd_for_texture(struct virgl_egl *ve, uint32_t tex_id, int *fd) &stride); if (!b) - return EINVAL; + goto out_destroy; fprintf(stderr,"image exported %d %d\n", handle, stride); r = drmPrimeHandleToFD(ve->fd, handle, DRM_CLOEXEC, fd); if (r < 0) - return EINVAL; + goto out_destroy; #else - return EINVAL; + goto out_destroy; #endif } - return 0; + ret = 0; +out_destroy: + eglDestroyImageKHR(ve->egl_display, image); + return ret; } uint32_t virgl_egl_get_gbm_format(uint32_t format) diff --git a/src/virglrenderer.c b/src/virglrenderer.c index 9c84e7b..739efa7 100644 --- a/src/virglrenderer.c +++ b/src/virglrenderer.c @@ -42,6 +42,8 @@ #include "virglrenderer.h" #include "virgl_egl.h" + +struct virgl_egl *egl_info; /* new API - just wrap internal API for now */ int virgl_renderer_resource_create(struct virgl_renderer_resource_create_args *args, struct iovec *iov, uint32_t num_iovs) @@ -161,7 +163,7 @@ int virgl_renderer_resource_get_info(int res_handle, int ret; ret = vrend_renderer_resource_get_info(res_handle, (struct vrend_renderer_resource_info *)info); if (ret == 0) - info->gbm_format = virgl_egl_get_gbm_format(info->virgl_format); + return virgl_egl_get_fourcc_for_texture(egl_info, info->tex_id, info->virgl_format, &info->drm_fourcc); return ret; } @@ -182,7 +184,7 @@ static struct virgl_renderer_callbacks *rcbs; static void *dev_cookie; static int use_egl_context; -struct virgl_egl *egl_info; + static struct vrend_if_cbs virgl_cbs; void vrend_transfer_write_return(void *data, uint32_t bytes, uint64_t offset, diff --git a/src/virglrenderer.h b/src/virglrenderer.h index a4f02ba..bc67163 100644 --- a/src/virglrenderer.h +++ b/src/virglrenderer.h @@ -141,7 +141,7 @@ struct virgl_renderer_resource_info { uint32_t flags; uint32_t tex_id; uint32_t stride; - uint32_t gbm_format; + int drm_fourcc; }; VIRGL_EXPORT int virgl_renderer_resource_get_info(int res_handle, diff --git a/tests/test_virgl_init.c b/tests/test_virgl_init.c index 1292488..ba946b2 100644 --- a/tests/test_virgl_init.c +++ b/tests/test_virgl_init.c @@ -328,7 +328,7 @@ START_TEST(virgl_test_get_resource_info) ret = virgl_renderer_resource_get_info(res.handle, &info); ck_assert_int_eq(ret, 0); - ck_assert_int_eq(info.gbm_format, GBM_FORMAT_XRGB8888); + ck_assert_int_eq(info.drm_fourcc, GBM_FORMAT_XRGB8888); ck_assert_int_eq(info.virgl_format, res.format); ck_assert_int_eq(res.width, info.width); ck_assert_int_eq(res.height, info.height);