[virglrenderer-devel] [PATCH virglrenderer] virgl_renderer_callbacks: add get_drm_fd()

marcandre.lureau at redhat.com marcandre.lureau at redhat.com
Fri Jun 15 15:54:21 UTC 2018


From: Marc-André Lureau <marcandre.lureau at redhat.com>

Allow the caller to provide a pre-opened DRM file descriptor, to be
used by the EGL context.

Bump callback interface version for compatibility.

Signed-off-by: Marc-André Lureau <marcandre.lureau at redhat.com>
---
 src/virgl_egl.h         | 2 +-
 src/virgl_egl_context.c | 8 ++++++--
 src/virglrenderer.c     | 8 ++++++--
 src/virglrenderer.h     | 4 ++++
 4 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/src/virgl_egl.h b/src/virgl_egl.h
index 1a651a0..3bda418 100644
--- a/src/virgl_egl.h
+++ b/src/virgl_egl.h
@@ -27,7 +27,7 @@
 #include "vrend_renderer.h"
 struct virgl_egl;
 
-struct virgl_egl *virgl_egl_init(void);
+struct virgl_egl *virgl_egl_init(int fd);
 void virgl_egl_destroy(struct virgl_egl *ve);
 
 virgl_renderer_gl_context virgl_egl_create_context(struct virgl_egl *ve, struct virgl_gl_ctx_param *vparams);
diff --git a/src/virgl_egl_context.c b/src/virgl_egl_context.c
index 6195394..04f300c 100644
--- a/src/virgl_egl_context.c
+++ b/src/virgl_egl_context.c
@@ -123,7 +123,7 @@ static bool virgl_egl_has_extension_in_string(const char *haystack, const char *
    return false;
 }
 
-struct virgl_egl *virgl_egl_init(void)
+struct virgl_egl *virgl_egl_init(int fd)
 {
    static const EGLint conf_att[] = {
       EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
@@ -148,7 +148,11 @@ struct virgl_egl *virgl_egl_init(void)
    if (!d)
       return NULL;
 
-   d->fd = egl_rendernode_open();
+   if (fd >= 0) {
+      d->fd = fd;
+   } else {
+      d->fd = egl_rendernode_open();
+   }
    if (d->fd == -1)
       goto fail;
    d->gbm_dev = gbm_create_device(d->fd);
diff --git a/src/virglrenderer.c b/src/virglrenderer.c
index 252355d..86824f8 100644
--- a/src/virglrenderer.c
+++ b/src/virglrenderer.c
@@ -303,7 +303,7 @@ int virgl_renderer_init(void *cookie, int flags, struct virgl_renderer_callbacks
    if (!cookie || !cbs)
       return -1;
 
-   if (cbs->version != 1)
+   if (cbs->version < 1 || cbs->version > VIRGL_RENDERER_CALLBACKS_VERSION)
       return -1;
 
    dev_cookie = cookie;
@@ -311,7 +311,11 @@ int virgl_renderer_init(void *cookie, int flags, struct virgl_renderer_callbacks
 
    if (flags & VIRGL_RENDERER_USE_EGL) {
 #ifdef HAVE_EPOXY_EGL_H
-      egl_info = virgl_egl_init();
+      int fd = -1;
+      if (cbs->version >= 2 && cbs->get_drm_fd) {
+         fd = cbs->get_drm_fd(cookie);
+      }
+      egl_info = virgl_egl_init(fd);
       if (!egl_info)
          return -1;
       use_context = CONTEXT_EGL;
diff --git a/src/virglrenderer.h b/src/virglrenderer.h
index 4b79d39..5baecdd 100644
--- a/src/virglrenderer.h
+++ b/src/virglrenderer.h
@@ -44,6 +44,8 @@ struct virgl_renderer_gl_ctx_param {
    int minor_ver;
 };
 
+#define VIRGL_RENDERER_CALLBACKS_VERSION 2
+
 struct virgl_renderer_callbacks {
    int version;
    void (*write_fence)(void *cookie, uint32_t fence);
@@ -52,6 +54,8 @@ struct virgl_renderer_callbacks {
    virgl_renderer_gl_context (*create_gl_context)(void *cookie, int scanout_idx, struct virgl_renderer_gl_ctx_param *param);
    void (*destroy_gl_context)(void *cookie, virgl_renderer_gl_context ctx);
    int (*make_current)(void *cookie, int scanout_idx, virgl_renderer_gl_context ctx);
+
+   int (*get_drm_fd)(void *cookie); /* v2, used with flags & VIRGL_RENDERER_USE_EGL */
 };
 
 /* virtio-gpu compatible interface */
-- 
2.18.0.rc1



More information about the virglrenderer-devel mailing list