All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/6] opengl: add headless ui, misc fixes
@ 2017-05-05 10:40 Gerd Hoffmann
  2017-05-05 10:40 ` [Qemu-devel] [PATCH 1/6] virtio-gpu: move virtio_gpu_gl_block Gerd Hoffmann
                   ` (5 more replies)
  0 siblings, 6 replies; 13+ messages in thread
From: Gerd Hoffmann @ 2017-05-05 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann

  Hi,

This patch adds a headless opengl ui (see patch 6 for details) and fixes
a bunch of issues along the way which I've trapped into while coding
things up (patches 1-5).

cheers,
  Gerd

Gerd Hoffmann (6):
  virtio-gpu: move virtio_gpu_gl_block
  egl-helpers: drop support for gles and debug logging
  egl-helpers: fix display init for x11
  egl-helpers: add missing error check
  egl: explicitly ask for core context
  opengl: add egl-headless display

 include/hw/virtio/virtio-gpu.h |   1 +
 include/ui/console.h           |   3 +
 include/ui/egl-helpers.h       |   3 +-
 hw/display/virtio-gpu-3d.c     |  16 +++++
 hw/display/virtio-gpu.c        |  18 +----
 ui/egl-context.c               |   7 +-
 ui/egl-headless.c              | 158 +++++++++++++++++++++++++++++++++++++++++
 ui/egl-helpers.c               |  88 +++++++++--------------
 ui/gtk-egl.c                   |   2 +-
 vl.c                           |  16 +++++
 ui/Makefile.objs               |   1 +
 11 files changed, 239 insertions(+), 74 deletions(-)
 create mode 100644 ui/egl-headless.c

-- 
2.9.3

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Qemu-devel] [PATCH 1/6] virtio-gpu: move virtio_gpu_gl_block
  2017-05-05 10:40 [Qemu-devel] [PATCH 0/6] opengl: add headless ui, misc fixes Gerd Hoffmann
@ 2017-05-05 10:40 ` Gerd Hoffmann
  2017-05-05 11:47   ` Philippe Mathieu-Daudé
  2017-05-05 11:57   ` Marc-André Lureau
  2017-05-05 10:40 ` [Qemu-devel] [PATCH 2/6] egl-helpers: drop support for gles and debug logging Gerd Hoffmann
                   ` (4 subsequent siblings)
  5 siblings, 2 replies; 13+ messages in thread
From: Gerd Hoffmann @ 2017-05-05 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann, Michael S. Tsirkin

Move to virtio-gpu-3d.c where all the other virgl code lives too.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 include/hw/virtio/virtio-gpu.h |  1 +
 hw/display/virtio-gpu-3d.c     | 16 ++++++++++++++++
 hw/display/virtio-gpu.c        | 18 ++----------------
 3 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h
index f3ffdceca4..83f474ffc3 100644
--- a/include/hw/virtio/virtio-gpu.h
+++ b/include/hw/virtio/virtio-gpu.h
@@ -169,6 +169,7 @@ void virtio_gpu_virgl_process_cmd(VirtIOGPU *g,
                                   struct virtio_gpu_ctrl_command *cmd);
 void virtio_gpu_virgl_fence_poll(VirtIOGPU *g);
 void virtio_gpu_virgl_reset(VirtIOGPU *g);
+void virtio_gpu_gl_block(void *opaque, bool block);
 int virtio_gpu_virgl_init(VirtIOGPU *g);
 
 #endif
diff --git a/hw/display/virtio-gpu-3d.c b/hw/display/virtio-gpu-3d.c
index f49b7fe8cd..8c106a662d 100644
--- a/hw/display/virtio-gpu-3d.c
+++ b/hw/display/virtio-gpu-3d.c
@@ -600,6 +600,22 @@ void virtio_gpu_virgl_reset(VirtIOGPU *g)
     }
 }
 
+void virtio_gpu_gl_block(void *opaque, bool block)
+{
+    VirtIOGPU *g = opaque;
+
+    if (block) {
+        g->renderer_blocked++;
+    } else {
+        g->renderer_blocked--;
+    }
+    assert(g->renderer_blocked >= 0);
+
+    if (g->renderer_blocked == 0) {
+        virtio_gpu_process_cmdq(g);
+    }
+}
+
 int virtio_gpu_virgl_init(VirtIOGPU *g)
 {
     int ret;
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index e1056f34df..cfb5dfa336 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -929,28 +929,14 @@ static int virtio_gpu_ui_info(void *opaque, uint32_t idx, QemuUIInfo *info)
     return 0;
 }
 
-static void virtio_gpu_gl_block(void *opaque, bool block)
-{
-    VirtIOGPU *g = opaque;
-
-    if (block) {
-        g->renderer_blocked++;
-    } else {
-        g->renderer_blocked--;
-    }
-    assert(g->renderer_blocked >= 0);
-
-    if (g->renderer_blocked == 0) {
-        virtio_gpu_process_cmdq(g);
-    }
-}
-
 const GraphicHwOps virtio_gpu_ops = {
     .invalidate = virtio_gpu_invalidate_display,
     .gfx_update = virtio_gpu_update_display,
     .text_update = virtio_gpu_text_update,
     .ui_info = virtio_gpu_ui_info,
+#ifdef CONFIG_VIRGL
     .gl_block = virtio_gpu_gl_block,
+#endif
 };
 
 static const VMStateDescription vmstate_virtio_gpu_scanout = {
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [Qemu-devel] [PATCH 2/6] egl-helpers: drop support for gles and debug logging
  2017-05-05 10:40 [Qemu-devel] [PATCH 0/6] opengl: add headless ui, misc fixes Gerd Hoffmann
  2017-05-05 10:40 ` [Qemu-devel] [PATCH 1/6] virtio-gpu: move virtio_gpu_gl_block Gerd Hoffmann
@ 2017-05-05 10:40 ` Gerd Hoffmann
  2017-05-05 11:47   ` Philippe Mathieu-Daudé
  2017-05-05 11:58   ` Marc-André Lureau
  2017-05-05 10:40 ` [Qemu-devel] [PATCH 3/6] egl-helpers: fix display init for x11 Gerd Hoffmann
                   ` (3 subsequent siblings)
  5 siblings, 2 replies; 13+ messages in thread
From: Gerd Hoffmann @ 2017-05-05 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann

Leftover from the early opengl days.
Unused now, so delete the dead code.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 include/ui/egl-helpers.h |  2 +-
 ui/egl-helpers.c         | 52 +++++-------------------------------------------
 ui/gtk-egl.c             |  2 +-
 3 files changed, 7 insertions(+), 49 deletions(-)

diff --git a/include/ui/egl-helpers.h b/include/ui/egl-helpers.h
index 88a13e827b..fec7da14a5 100644
--- a/include/ui/egl-helpers.h
+++ b/include/ui/egl-helpers.h
@@ -21,7 +21,7 @@ int egl_get_fd_for_texture(uint32_t tex_id, EGLint *stride, EGLint *fourcc);
 
 EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, Window win);
 
-int qemu_egl_init_dpy(EGLNativeDisplayType dpy, bool gles, bool debug);
+int qemu_egl_init_dpy(EGLNativeDisplayType dpy);
 EGLContext qemu_egl_init_ctx(void);
 
 #endif /* EGL_HELPERS_H */
diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c
index b7b6b2e3cc..a3d7c3d7f5 100644
--- a/ui/egl-helpers.c
+++ b/ui/egl-helpers.c
@@ -26,18 +26,6 @@ EGLConfig qemu_egl_config;
 
 /* ---------------------------------------------------------------------- */
 
-static bool egl_gles;
-static int egl_debug;
-
-#define egl_dbg(_x ...)                          \
-    do {                                         \
-        if (egl_debug) {                         \
-            fprintf(stderr, "egl: " _x);         \
-        }                                        \
-    } while (0);
-
-/* ---------------------------------------------------------------------- */
-
 #ifdef CONFIG_OPENGL_DMABUF
 
 int qemu_egl_rn_fd;
@@ -105,7 +93,7 @@ int egl_rendernode_init(const char *rendernode)
         goto err;
     }
 
-    qemu_egl_init_dpy((EGLNativeDisplayType)qemu_egl_rn_gbm_dev, false, false);
+    qemu_egl_init_dpy((EGLNativeDisplayType)qemu_egl_rn_gbm_dev);
 
     if (!epoxy_has_egl_extension(qemu_egl_display,
                                  "EGL_KHR_surfaceless_context")) {
@@ -171,8 +159,6 @@ EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, Window win)
     EGLSurface esurface;
     EGLBoolean b;
 
-    egl_dbg("eglCreateWindowSurface (x11 win id 0x%lx) ...\n",
-            (unsigned long) win);
     esurface = eglCreateWindowSurface(qemu_egl_display,
                                       qemu_egl_config,
                                       (EGLNativeWindowType)win, NULL);
@@ -242,7 +228,7 @@ static EGLDisplay qemu_egl_get_display(void *native)
     return dpy;
 }
 
-int qemu_egl_init_dpy(EGLNativeDisplayType dpy, bool gles, bool debug)
+int qemu_egl_init_dpy(EGLNativeDisplayType dpy)
 {
     static const EGLint conf_att_gl[] = {
         EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
@@ -253,56 +239,34 @@ int qemu_egl_init_dpy(EGLNativeDisplayType dpy, bool gles, bool debug)
         EGL_ALPHA_SIZE, 0,
         EGL_NONE,
     };
-    static const EGLint conf_att_gles[] = {
-        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
-        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
-        EGL_RED_SIZE,   5,
-        EGL_GREEN_SIZE, 5,
-        EGL_BLUE_SIZE,  5,
-        EGL_ALPHA_SIZE, 0,
-        EGL_NONE,
-    };
     EGLint major, minor;
     EGLBoolean b;
     EGLint n;
 
-    if (debug) {
-        egl_debug = 1;
-        setenv("EGL_LOG_LEVEL", "debug", true);
-        setenv("LIBGL_DEBUG", "verbose", true);
-    }
-
-    egl_dbg("qemu_egl_get_display (dpy %p) ...\n", dpy);
     qemu_egl_display = qemu_egl_get_display(dpy);
     if (qemu_egl_display == EGL_NO_DISPLAY) {
         error_report("egl: eglGetDisplay failed");
         return -1;
     }
 
-    egl_dbg("eglInitialize ...\n");
     b = eglInitialize(qemu_egl_display, &major, &minor);
     if (b == EGL_FALSE) {
         error_report("egl: eglInitialize failed");
         return -1;
     }
 
-    egl_dbg("eglBindAPI ...\n");
-    b = eglBindAPI(gles ? EGL_OPENGL_ES_API : EGL_OPENGL_API);
+    b = eglBindAPI(EGL_OPENGL_API);
     if (b == EGL_FALSE) {
         error_report("egl: eglBindAPI failed");
         return -1;
     }
 
-    egl_dbg("eglChooseConfig ...\n");
-    b = eglChooseConfig(qemu_egl_display,
-                        gles ? conf_att_gles : conf_att_gl,
+    b = eglChooseConfig(qemu_egl_display, conf_att_gl,
                         &qemu_egl_config, 1, &n);
     if (b == EGL_FALSE || n != 1) {
         error_report("egl: eglChooseConfig failed");
         return -1;
     }
-
-    egl_gles = gles;
     return 0;
 }
 
@@ -311,17 +275,11 @@ EGLContext qemu_egl_init_ctx(void)
     static const EGLint ctx_att_gl[] = {
         EGL_NONE
     };
-    static const EGLint ctx_att_gles[] = {
-        EGL_CONTEXT_CLIENT_VERSION, 2,
-        EGL_NONE
-    };
-
     EGLContext ectx;
     EGLBoolean b;
 
-    egl_dbg("eglCreateContext ...\n");
     ectx = eglCreateContext(qemu_egl_display, qemu_egl_config, EGL_NO_CONTEXT,
-                            egl_gles ? ctx_att_gles : ctx_att_gl);
+                            ctx_att_gl);
     if (ectx == EGL_NO_CONTEXT) {
         error_report("egl: eglCreateContext failed");
         return NULL;
diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
index d53288f027..89492c0e02 100644
--- a/ui/gtk-egl.c
+++ b/ui/gtk-egl.c
@@ -246,7 +246,7 @@ void gtk_egl_init(void)
     GdkDisplay *gdk_display = gdk_display_get_default();
     Display *x11_display = gdk_x11_display_get_xdisplay(gdk_display);
 
-    if (qemu_egl_init_dpy(x11_display, false, false) < 0) {
+    if (qemu_egl_init_dpy(x11_display) < 0) {
         return;
     }
 
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [Qemu-devel] [PATCH 3/6] egl-helpers: fix display init for x11
  2017-05-05 10:40 [Qemu-devel] [PATCH 0/6] opengl: add headless ui, misc fixes Gerd Hoffmann
  2017-05-05 10:40 ` [Qemu-devel] [PATCH 1/6] virtio-gpu: move virtio_gpu_gl_block Gerd Hoffmann
  2017-05-05 10:40 ` [Qemu-devel] [PATCH 2/6] egl-helpers: drop support for gles and debug logging Gerd Hoffmann
@ 2017-05-05 10:40 ` Gerd Hoffmann
  2017-05-05 10:40 ` [Qemu-devel] [PATCH 4/6] egl-helpers: add missing error check Gerd Hoffmann
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: Gerd Hoffmann @ 2017-05-05 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann

When running on gtk we need X11 platform not mesa platform.
Create separate functions for mesa and x11 so we can keep
the egl #ifdef mess local to egl-helpers.c

Fixes: 0ea1523fb6703aa0dcd65e66b59e96fec028e60a
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 include/ui/egl-helpers.h |  3 ++-
 ui/egl-helpers.c         | 34 ++++++++++++++++++++++++++--------
 ui/gtk-egl.c             |  2 +-
 3 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/include/ui/egl-helpers.h b/include/ui/egl-helpers.h
index fec7da14a5..c785d60e91 100644
--- a/include/ui/egl-helpers.h
+++ b/include/ui/egl-helpers.h
@@ -21,7 +21,8 @@ int egl_get_fd_for_texture(uint32_t tex_id, EGLint *stride, EGLint *fourcc);
 
 EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, Window win);
 
-int qemu_egl_init_dpy(EGLNativeDisplayType dpy);
+int qemu_egl_init_dpy_x11(EGLNativeDisplayType dpy);
+int qemu_egl_init_dpy_mesa(EGLNativeDisplayType dpy);
 EGLContext qemu_egl_init_ctx(void);
 
 #endif /* EGL_HELPERS_H */
diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c
index a3d7c3d7f5..ec2e325e21 100644
--- a/ui/egl-helpers.c
+++ b/ui/egl-helpers.c
@@ -93,7 +93,7 @@ int egl_rendernode_init(const char *rendernode)
         goto err;
     }
 
-    qemu_egl_init_dpy((EGLNativeDisplayType)qemu_egl_rn_gbm_dev);
+    qemu_egl_init_dpy_mesa((EGLNativeDisplayType)qemu_egl_rn_gbm_dev);
 
     if (!epoxy_has_egl_extension(qemu_egl_display,
                                  "EGL_KHR_surfaceless_context")) {
@@ -206,20 +206,19 @@ EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, Window win)
  * platform extensions (EGL_KHR_platform_gbm and friends) yet it doesn't seem
  * like mesa will be able to advertise these (even though it can do EGL 1.5).
  */
-static EGLDisplay qemu_egl_get_display(void *native)
+static EGLDisplay qemu_egl_get_display(EGLNativeDisplayType native,
+                                       EGLenum platform)
 {
     EGLDisplay dpy = EGL_NO_DISPLAY;
 
-#ifdef EGL_MESA_platform_gbm
     /* In practise any EGL 1.5 implementation would support the EXT extension */
     if (epoxy_has_egl_extension(NULL, "EGL_EXT_platform_base")) {
         PFNEGLGETPLATFORMDISPLAYEXTPROC getPlatformDisplayEXT =
             (void *) eglGetProcAddress("eglGetPlatformDisplayEXT");
-        if (getPlatformDisplayEXT) {
-            dpy = getPlatformDisplayEXT(EGL_PLATFORM_GBM_MESA, native, NULL);
+        if (getPlatformDisplayEXT && platform != 0) {
+            dpy = getPlatformDisplayEXT(platform, native, NULL);
         }
     }
-#endif
 
     if (dpy == EGL_NO_DISPLAY) {
         /* fallback */
@@ -228,7 +227,8 @@ static EGLDisplay qemu_egl_get_display(void *native)
     return dpy;
 }
 
-int qemu_egl_init_dpy(EGLNativeDisplayType dpy)
+static int qemu_egl_init_dpy(EGLNativeDisplayType dpy,
+                             EGLenum platform)
 {
     static const EGLint conf_att_gl[] = {
         EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
@@ -243,7 +243,7 @@ int qemu_egl_init_dpy(EGLNativeDisplayType dpy)
     EGLBoolean b;
     EGLint n;
 
-    qemu_egl_display = qemu_egl_get_display(dpy);
+    qemu_egl_display = qemu_egl_get_display(dpy, platform);
     if (qemu_egl_display == EGL_NO_DISPLAY) {
         error_report("egl: eglGetDisplay failed");
         return -1;
@@ -270,6 +270,24 @@ int qemu_egl_init_dpy(EGLNativeDisplayType dpy)
     return 0;
 }
 
+int qemu_egl_init_dpy_x11(EGLNativeDisplayType dpy)
+{
+#ifdef EGL_KHR_platform_x11
+    return qemu_egl_init_dpy(dpy, EGL_PLATFORM_X11_KHR);
+#else
+    return qemu_egl_init_dpy(dpy, 0);
+#endif
+}
+
+int qemu_egl_init_dpy_mesa(EGLNativeDisplayType dpy)
+{
+#ifdef EGL_MESA_platform_gbm
+    return qemu_egl_init_dpy(dpy, EGL_PLATFORM_GBM_MESA);
+#else
+    return qemu_egl_init_dpy(dpy, 0);
+#endif
+}
+
 EGLContext qemu_egl_init_ctx(void)
 {
     static const EGLint ctx_att_gl[] = {
diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
index 89492c0e02..cf48cca259 100644
--- a/ui/gtk-egl.c
+++ b/ui/gtk-egl.c
@@ -246,7 +246,7 @@ void gtk_egl_init(void)
     GdkDisplay *gdk_display = gdk_display_get_default();
     Display *x11_display = gdk_x11_display_get_xdisplay(gdk_display);
 
-    if (qemu_egl_init_dpy(x11_display) < 0) {
+    if (qemu_egl_init_dpy_x11(x11_display) < 0) {
         return;
     }
 
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [Qemu-devel] [PATCH 4/6] egl-helpers: add missing error check
  2017-05-05 10:40 [Qemu-devel] [PATCH 0/6] opengl: add headless ui, misc fixes Gerd Hoffmann
                   ` (2 preceding siblings ...)
  2017-05-05 10:40 ` [Qemu-devel] [PATCH 3/6] egl-helpers: fix display init for x11 Gerd Hoffmann
@ 2017-05-05 10:40 ` Gerd Hoffmann
  2017-05-05 11:48   ` Philippe Mathieu-Daudé
  2017-05-05 10:41 ` [Qemu-devel] [PATCH 5/6] egl: explicitly ask for core context Gerd Hoffmann
  2017-05-05 10:41 ` [Qemu-devel] [PATCH 6/6] opengl: add egl-headless display Gerd Hoffmann
  5 siblings, 1 reply; 13+ messages in thread
From: Gerd Hoffmann @ 2017-05-05 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann

Code didn't check for qemu_egl_init_dpy_mesa() failures, add it.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 ui/egl-helpers.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c
index ec2e325e21..b50225158b 100644
--- a/ui/egl-helpers.c
+++ b/ui/egl-helpers.c
@@ -80,6 +80,7 @@ static int qemu_egl_rendernode_open(const char *rendernode)
 int egl_rendernode_init(const char *rendernode)
 {
     qemu_egl_rn_fd = -1;
+    int rc;
 
     qemu_egl_rn_fd = qemu_egl_rendernode_open(rendernode);
     if (qemu_egl_rn_fd == -1) {
@@ -93,7 +94,11 @@ int egl_rendernode_init(const char *rendernode)
         goto err;
     }
 
-    qemu_egl_init_dpy_mesa((EGLNativeDisplayType)qemu_egl_rn_gbm_dev);
+    rc = qemu_egl_init_dpy_mesa((EGLNativeDisplayType)qemu_egl_rn_gbm_dev);
+    if (rc != 0) {
+        /* qemu_egl_init_dpy_mesa reports error */
+        goto err;
+    }
 
     if (!epoxy_has_egl_extension(qemu_egl_display,
                                  "EGL_KHR_surfaceless_context")) {
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [Qemu-devel] [PATCH 5/6] egl: explicitly ask for core context
  2017-05-05 10:40 [Qemu-devel] [PATCH 0/6] opengl: add headless ui, misc fixes Gerd Hoffmann
                   ` (3 preceding siblings ...)
  2017-05-05 10:40 ` [Qemu-devel] [PATCH 4/6] egl-helpers: add missing error check Gerd Hoffmann
@ 2017-05-05 10:41 ` Gerd Hoffmann
  2017-05-05 10:41 ` [Qemu-devel] [PATCH 6/6] opengl: add egl-headless display Gerd Hoffmann
  5 siblings, 0 replies; 13+ messages in thread
From: Gerd Hoffmann @ 2017-05-05 10:41 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 ui/egl-context.c | 7 ++++---
 ui/egl-helpers.c | 1 +
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/ui/egl-context.c b/ui/egl-context.c
index 3a02b68d1a..2161969abe 100644
--- a/ui/egl-context.c
+++ b/ui/egl-context.c
@@ -7,9 +7,10 @@ QEMUGLContext qemu_egl_create_context(DisplayChangeListener *dcl,
 {
    EGLContext ctx;
    EGLint ctx_att[] = {
-      EGL_CONTEXT_CLIENT_VERSION, params->major_ver,
-      EGL_CONTEXT_MINOR_VERSION_KHR, params->minor_ver,
-      EGL_NONE
+       EGL_CONTEXT_OPENGL_PROFILE_MASK, EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT,
+       EGL_CONTEXT_CLIENT_VERSION, params->major_ver,
+       EGL_CONTEXT_MINOR_VERSION_KHR, params->minor_ver,
+       EGL_NONE
    };
 
    ctx = eglCreateContext(qemu_egl_display, qemu_egl_config,
diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c
index b50225158b..4a4d3370ee 100644
--- a/ui/egl-helpers.c
+++ b/ui/egl-helpers.c
@@ -296,6 +296,7 @@ int qemu_egl_init_dpy_mesa(EGLNativeDisplayType dpy)
 EGLContext qemu_egl_init_ctx(void)
 {
     static const EGLint ctx_att_gl[] = {
+        EGL_CONTEXT_OPENGL_PROFILE_MASK, EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT,
         EGL_NONE
     };
     EGLContext ectx;
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [Qemu-devel] [PATCH 6/6] opengl: add egl-headless display
  2017-05-05 10:40 [Qemu-devel] [PATCH 0/6] opengl: add headless ui, misc fixes Gerd Hoffmann
                   ` (4 preceding siblings ...)
  2017-05-05 10:41 ` [Qemu-devel] [PATCH 5/6] egl: explicitly ask for core context Gerd Hoffmann
@ 2017-05-05 10:41 ` Gerd Hoffmann
  2017-05-17  7:56   ` [Qemu-devel] QEMU master is broken (was: [PATCH 6/6] opengl: add egl-headless display) Thomas Huth
  5 siblings, 1 reply; 13+ messages in thread
From: Gerd Hoffmann @ 2017-05-05 10:41 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann, Paolo Bonzini

Add egl-headless user interface.  It doesn't provide a real user
interface, it only provides opengl support using drm render nodes.
It will copy back the bits rendered by the guest using virgl back
to a DisplaySurface and kick the usual display update code paths,
so spice and vnc and screendump can pick it up.

Use it this way:
  qemu -display egl-headless -vnc $display
  qemu -display egl-headless -spice gl=off,$args

Note that you should prefer native spice opengl support (-spice
gl=on) if possible because that delivers better performance.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 include/ui/console.h |   3 +
 ui/egl-headless.c    | 158 +++++++++++++++++++++++++++++++++++++++++++++++++++
 vl.c                 |  16 ++++++
 ui/Makefile.objs     |   1 +
 4 files changed, 178 insertions(+)
 create mode 100644 ui/egl-headless.c

diff --git a/include/ui/console.h b/include/ui/console.h
index d759338816..7262bef6d3 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -527,4 +527,7 @@ static inline void early_gtk_display_init(int opengl)
 }
 #endif
 
+/* egl-headless.c */
+void egl_headless_init(void);
+
 #endif
diff --git a/ui/egl-headless.c b/ui/egl-headless.c
new file mode 100644
index 0000000000..d8d800f8a6
--- /dev/null
+++ b/ui/egl-headless.c
@@ -0,0 +1,158 @@
+#include "qemu/osdep.h"
+#include "qemu-common.h"
+#include "sysemu/sysemu.h"
+#include "ui/console.h"
+#include "ui/egl-helpers.h"
+#include "ui/egl-context.h"
+
+typedef struct egl_dpy {
+    DisplayChangeListener dcl;
+    DisplaySurface *ds;
+    int width, height;
+    GLuint texture;
+    GLuint framebuffer;
+    GLuint blit_texture;
+    GLuint blit_framebuffer;
+    bool y_0_top;
+} egl_dpy;
+
+static void egl_refresh(DisplayChangeListener *dcl)
+{
+    graphic_hw_update(dcl->con);
+}
+
+static void egl_gfx_update(DisplayChangeListener *dcl,
+                           int x, int y, int w, int h)
+{
+}
+
+static void egl_gfx_switch(DisplayChangeListener *dcl,
+                           struct DisplaySurface *new_surface)
+{
+    egl_dpy *edpy = container_of(dcl, egl_dpy, dcl);
+
+    edpy->ds = new_surface;
+}
+
+static void egl_scanout_disable(DisplayChangeListener *dcl)
+{
+    egl_dpy *edpy = container_of(dcl, egl_dpy, dcl);
+
+    edpy->texture = 0;
+    /* XXX: delete framebuffers here ??? */
+}
+
+static void egl_scanout_texture(DisplayChangeListener *dcl,
+                                uint32_t backing_id,
+                                bool backing_y_0_top,
+                                uint32_t backing_width,
+                                uint32_t backing_height,
+                                uint32_t x, uint32_t y,
+                                uint32_t w, uint32_t h)
+{
+    egl_dpy *edpy = container_of(dcl, egl_dpy, dcl);
+
+    edpy->texture = backing_id;
+    edpy->y_0_top = backing_y_0_top;
+
+    /* source framebuffer */
+    if (!edpy->framebuffer) {
+        glGenFramebuffers(1, &edpy->framebuffer);
+    }
+    glBindFramebuffer(GL_FRAMEBUFFER_EXT, edpy->framebuffer);
+    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
+                              GL_TEXTURE_2D, edpy->texture, 0);
+
+    /* dest framebuffer */
+    if (!edpy->blit_framebuffer) {
+        glGenFramebuffers(1, &edpy->blit_framebuffer);
+        glGenTextures(1, &edpy->blit_texture);
+        edpy->width = 0;
+        edpy->height = 0;
+    }
+    if (edpy->width != backing_width || edpy->height != backing_height) {
+        edpy->width   = backing_width;
+        edpy->height  = backing_height;
+        glBindTexture(GL_TEXTURE_2D, edpy->blit_texture);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
+                     edpy->width, edpy->height,
+                     0, GL_BGRA, GL_UNSIGNED_BYTE, 0);
+        glBindFramebuffer(GL_FRAMEBUFFER_EXT, edpy->blit_framebuffer);
+        glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
+                                  GL_TEXTURE_2D, edpy->blit_texture, 0);
+    }
+}
+
+static void egl_scanout_flush(DisplayChangeListener *dcl,
+                              uint32_t x, uint32_t y,
+                              uint32_t w, uint32_t h)
+{
+    egl_dpy *edpy = container_of(dcl, egl_dpy, dcl);
+    GLuint y1, y2;
+
+    if (!edpy->texture || !edpy->ds) {
+        return;
+    }
+    assert(surface_width(edpy->ds)  == edpy->width);
+    assert(surface_height(edpy->ds) == edpy->height);
+    assert(surface_format(edpy->ds) == PIXMAN_x8r8g8b8);
+
+    /* blit framebuffer, flip if needed */
+    glBindFramebuffer(GL_READ_FRAMEBUFFER, edpy->framebuffer);
+    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, edpy->blit_framebuffer);
+    glViewport(0, 0, edpy->width, edpy->height);
+    y1 = edpy->y_0_top ? edpy->height : 0;
+    y2 = edpy->y_0_top ? 0 : edpy->height;
+    glBlitFramebuffer(0, y1, edpy->width, y2,
+                      0, 0, edpy->width, edpy->height,
+                      GL_COLOR_BUFFER_BIT, GL_NEAREST);
+
+    /* read pixels to surface */
+    glBindFramebuffer(GL_READ_FRAMEBUFFER, edpy->blit_framebuffer);
+    glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
+    glReadPixels(0, 0, edpy->width, edpy->height,
+                 GL_BGRA, GL_UNSIGNED_BYTE, surface_data(edpy->ds));
+
+    /* notify about updates */
+    dpy_gfx_update(edpy->dcl.con, x, y, w, h);
+}
+
+static const DisplayChangeListenerOps egl_ops = {
+    .dpy_name                = "egl-headless",
+    .dpy_refresh             = egl_refresh,
+    .dpy_gfx_update          = egl_gfx_update,
+    .dpy_gfx_switch          = egl_gfx_switch,
+
+    .dpy_gl_ctx_create       = qemu_egl_create_context,
+    .dpy_gl_ctx_destroy      = qemu_egl_destroy_context,
+    .dpy_gl_ctx_make_current = qemu_egl_make_context_current,
+    .dpy_gl_ctx_get_current  = qemu_egl_get_current_context,
+
+    .dpy_gl_scanout_disable  = egl_scanout_disable,
+    .dpy_gl_scanout_texture  = egl_scanout_texture,
+    .dpy_gl_update           = egl_scanout_flush,
+};
+
+void egl_headless_init(void)
+{
+    QemuConsole *con;
+    egl_dpy *edpy;
+    int idx;
+
+    if (egl_rendernode_init(NULL) < 0) {
+        error_report("egl: render node init failed");
+        exit(1);
+    }
+
+    for (idx = 0;; idx++) {
+        con = qemu_console_lookup_by_index(idx);
+        if (!con || !qemu_console_is_graphic(con)) {
+            break;
+        }
+
+        edpy = g_new0(egl_dpy, 1);
+        edpy->dcl.con = con;
+        edpy->dcl.ops = &egl_ops;
+        register_displaychangelistener(&edpy->dcl);
+    }
+}
diff --git a/vl.c b/vl.c
index f46e070e0d..4e76e0ceb4 100644
--- a/vl.c
+++ b/vl.c
@@ -2050,6 +2050,7 @@ typedef enum DisplayType {
     DT_SDL,
     DT_COCOA,
     DT_GTK,
+    DT_EGL,
     DT_NONE,
 } DisplayType;
 
@@ -2127,6 +2128,15 @@ static DisplayType select_display(const char *p)
             error_report("VNC requires a display argument vnc=<display>");
             exit(1);
         }
+    } else if (strstart(p, "egl-headless", &opts)) {
+#ifdef CONFIG_OPENGL
+        request_opengl = 1;
+        display_opengl = 1;
+        display = DT_EGL;
+#else
+        fprintf(stderr, "egl support is disabled\n");
+        exit(1);
+#endif
     } else if (strstart(p, "curses", &opts)) {
 #ifdef CONFIG_CURSES
         display = DT_CURSES;
@@ -4662,6 +4672,12 @@ int main(int argc, char **argv, char **envp)
         qemu_spice_display_init();
     }
 
+#ifdef CONFIG_OPENGL
+    if (display_type == DT_EGL) {
+        egl_headless_init();
+    }
+#endif
+
     if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) {
         exit(1);
     }
diff --git a/ui/Makefile.objs b/ui/Makefile.objs
index 27566b32f1..aac6ae8bef 100644
--- a/ui/Makefile.objs
+++ b/ui/Makefile.objs
@@ -33,6 +33,7 @@ common-obj-y += shader.o
 common-obj-y += console-gl.o
 common-obj-y += egl-helpers.o
 common-obj-y += egl-context.o
+common-obj-y += egl-headless.o
 ifeq ($(CONFIG_GTK_GL),y)
 common-obj-$(CONFIG_GTK) += gtk-gl-area.o
 else
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [Qemu-devel] [PATCH 1/6] virtio-gpu: move virtio_gpu_gl_block
  2017-05-05 10:40 ` [Qemu-devel] [PATCH 1/6] virtio-gpu: move virtio_gpu_gl_block Gerd Hoffmann
@ 2017-05-05 11:47   ` Philippe Mathieu-Daudé
  2017-05-05 11:57   ` Marc-André Lureau
  1 sibling, 0 replies; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-05-05 11:47 UTC (permalink / raw)
  To: Gerd Hoffmann, qemu-devel; +Cc: Michael S. Tsirkin

On 05/05/2017 07:40 AM, Gerd Hoffmann wrote:
> Move to virtio-gpu-3d.c where all the other virgl code lives too.
>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

> ---
>  include/hw/virtio/virtio-gpu.h |  1 +
>  hw/display/virtio-gpu-3d.c     | 16 ++++++++++++++++
>  hw/display/virtio-gpu.c        | 18 ++----------------
>  3 files changed, 19 insertions(+), 16 deletions(-)
>
> diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h
> index f3ffdceca4..83f474ffc3 100644
> --- a/include/hw/virtio/virtio-gpu.h
> +++ b/include/hw/virtio/virtio-gpu.h
> @@ -169,6 +169,7 @@ void virtio_gpu_virgl_process_cmd(VirtIOGPU *g,
>                                    struct virtio_gpu_ctrl_command *cmd);
>  void virtio_gpu_virgl_fence_poll(VirtIOGPU *g);
>  void virtio_gpu_virgl_reset(VirtIOGPU *g);
> +void virtio_gpu_gl_block(void *opaque, bool block);
>  int virtio_gpu_virgl_init(VirtIOGPU *g);
>
>  #endif
> diff --git a/hw/display/virtio-gpu-3d.c b/hw/display/virtio-gpu-3d.c
> index f49b7fe8cd..8c106a662d 100644
> --- a/hw/display/virtio-gpu-3d.c
> +++ b/hw/display/virtio-gpu-3d.c
> @@ -600,6 +600,22 @@ void virtio_gpu_virgl_reset(VirtIOGPU *g)
>      }
>  }
>
> +void virtio_gpu_gl_block(void *opaque, bool block)
> +{
> +    VirtIOGPU *g = opaque;
> +
> +    if (block) {
> +        g->renderer_blocked++;
> +    } else {
> +        g->renderer_blocked--;
> +    }
> +    assert(g->renderer_blocked >= 0);
> +
> +    if (g->renderer_blocked == 0) {
> +        virtio_gpu_process_cmdq(g);
> +    }
> +}
> +
>  int virtio_gpu_virgl_init(VirtIOGPU *g)
>  {
>      int ret;
> diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
> index e1056f34df..cfb5dfa336 100644
> --- a/hw/display/virtio-gpu.c
> +++ b/hw/display/virtio-gpu.c
> @@ -929,28 +929,14 @@ static int virtio_gpu_ui_info(void *opaque, uint32_t idx, QemuUIInfo *info)
>      return 0;
>  }
>
> -static void virtio_gpu_gl_block(void *opaque, bool block)
> -{
> -    VirtIOGPU *g = opaque;
> -
> -    if (block) {
> -        g->renderer_blocked++;
> -    } else {
> -        g->renderer_blocked--;
> -    }
> -    assert(g->renderer_blocked >= 0);
> -
> -    if (g->renderer_blocked == 0) {
> -        virtio_gpu_process_cmdq(g);
> -    }
> -}
> -
>  const GraphicHwOps virtio_gpu_ops = {
>      .invalidate = virtio_gpu_invalidate_display,
>      .gfx_update = virtio_gpu_update_display,
>      .text_update = virtio_gpu_text_update,
>      .ui_info = virtio_gpu_ui_info,
> +#ifdef CONFIG_VIRGL
>      .gl_block = virtio_gpu_gl_block,
> +#endif
>  };
>
>  static const VMStateDescription vmstate_virtio_gpu_scanout = {
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Qemu-devel] [PATCH 2/6] egl-helpers: drop support for gles and debug logging
  2017-05-05 10:40 ` [Qemu-devel] [PATCH 2/6] egl-helpers: drop support for gles and debug logging Gerd Hoffmann
@ 2017-05-05 11:47   ` Philippe Mathieu-Daudé
  2017-05-05 11:58   ` Marc-André Lureau
  1 sibling, 0 replies; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-05-05 11:47 UTC (permalink / raw)
  To: Gerd Hoffmann, qemu-devel

On 05/05/2017 07:40 AM, Gerd Hoffmann wrote:
> Leftover from the early opengl days.
> Unused now, so delete the dead code.
>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

> ---
>  include/ui/egl-helpers.h |  2 +-
>  ui/egl-helpers.c         | 52 +++++-------------------------------------------
>  ui/gtk-egl.c             |  2 +-
>  3 files changed, 7 insertions(+), 49 deletions(-)
>
> diff --git a/include/ui/egl-helpers.h b/include/ui/egl-helpers.h
> index 88a13e827b..fec7da14a5 100644
> --- a/include/ui/egl-helpers.h
> +++ b/include/ui/egl-helpers.h
> @@ -21,7 +21,7 @@ int egl_get_fd_for_texture(uint32_t tex_id, EGLint *stride, EGLint *fourcc);
>
>  EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, Window win);
>
> -int qemu_egl_init_dpy(EGLNativeDisplayType dpy, bool gles, bool debug);
> +int qemu_egl_init_dpy(EGLNativeDisplayType dpy);
>  EGLContext qemu_egl_init_ctx(void);
>
>  #endif /* EGL_HELPERS_H */
> diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c
> index b7b6b2e3cc..a3d7c3d7f5 100644
> --- a/ui/egl-helpers.c
> +++ b/ui/egl-helpers.c
> @@ -26,18 +26,6 @@ EGLConfig qemu_egl_config;
>
>  /* ---------------------------------------------------------------------- */
>
> -static bool egl_gles;
> -static int egl_debug;
> -
> -#define egl_dbg(_x ...)                          \
> -    do {                                         \
> -        if (egl_debug) {                         \
> -            fprintf(stderr, "egl: " _x);         \
> -        }                                        \
> -    } while (0);
> -
> -/* ---------------------------------------------------------------------- */
> -
>  #ifdef CONFIG_OPENGL_DMABUF
>
>  int qemu_egl_rn_fd;
> @@ -105,7 +93,7 @@ int egl_rendernode_init(const char *rendernode)
>          goto err;
>      }
>
> -    qemu_egl_init_dpy((EGLNativeDisplayType)qemu_egl_rn_gbm_dev, false, false);
> +    qemu_egl_init_dpy((EGLNativeDisplayType)qemu_egl_rn_gbm_dev);
>
>      if (!epoxy_has_egl_extension(qemu_egl_display,
>                                   "EGL_KHR_surfaceless_context")) {
> @@ -171,8 +159,6 @@ EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, Window win)
>      EGLSurface esurface;
>      EGLBoolean b;
>
> -    egl_dbg("eglCreateWindowSurface (x11 win id 0x%lx) ...\n",
> -            (unsigned long) win);
>      esurface = eglCreateWindowSurface(qemu_egl_display,
>                                        qemu_egl_config,
>                                        (EGLNativeWindowType)win, NULL);
> @@ -242,7 +228,7 @@ static EGLDisplay qemu_egl_get_display(void *native)
>      return dpy;
>  }
>
> -int qemu_egl_init_dpy(EGLNativeDisplayType dpy, bool gles, bool debug)
> +int qemu_egl_init_dpy(EGLNativeDisplayType dpy)
>  {
>      static const EGLint conf_att_gl[] = {
>          EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
> @@ -253,56 +239,34 @@ int qemu_egl_init_dpy(EGLNativeDisplayType dpy, bool gles, bool debug)
>          EGL_ALPHA_SIZE, 0,
>          EGL_NONE,
>      };
> -    static const EGLint conf_att_gles[] = {
> -        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
> -        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
> -        EGL_RED_SIZE,   5,
> -        EGL_GREEN_SIZE, 5,
> -        EGL_BLUE_SIZE,  5,
> -        EGL_ALPHA_SIZE, 0,
> -        EGL_NONE,
> -    };
>      EGLint major, minor;
>      EGLBoolean b;
>      EGLint n;
>
> -    if (debug) {
> -        egl_debug = 1;
> -        setenv("EGL_LOG_LEVEL", "debug", true);
> -        setenv("LIBGL_DEBUG", "verbose", true);
> -    }
> -
> -    egl_dbg("qemu_egl_get_display (dpy %p) ...\n", dpy);
>      qemu_egl_display = qemu_egl_get_display(dpy);
>      if (qemu_egl_display == EGL_NO_DISPLAY) {
>          error_report("egl: eglGetDisplay failed");
>          return -1;
>      }
>
> -    egl_dbg("eglInitialize ...\n");
>      b = eglInitialize(qemu_egl_display, &major, &minor);
>      if (b == EGL_FALSE) {
>          error_report("egl: eglInitialize failed");
>          return -1;
>      }
>
> -    egl_dbg("eglBindAPI ...\n");
> -    b = eglBindAPI(gles ? EGL_OPENGL_ES_API : EGL_OPENGL_API);
> +    b = eglBindAPI(EGL_OPENGL_API);
>      if (b == EGL_FALSE) {
>          error_report("egl: eglBindAPI failed");
>          return -1;
>      }
>
> -    egl_dbg("eglChooseConfig ...\n");
> -    b = eglChooseConfig(qemu_egl_display,
> -                        gles ? conf_att_gles : conf_att_gl,
> +    b = eglChooseConfig(qemu_egl_display, conf_att_gl,
>                          &qemu_egl_config, 1, &n);
>      if (b == EGL_FALSE || n != 1) {
>          error_report("egl: eglChooseConfig failed");
>          return -1;
>      }
> -
> -    egl_gles = gles;
>      return 0;
>  }
>
> @@ -311,17 +275,11 @@ EGLContext qemu_egl_init_ctx(void)
>      static const EGLint ctx_att_gl[] = {
>          EGL_NONE
>      };
> -    static const EGLint ctx_att_gles[] = {
> -        EGL_CONTEXT_CLIENT_VERSION, 2,
> -        EGL_NONE
> -    };
> -
>      EGLContext ectx;
>      EGLBoolean b;
>
> -    egl_dbg("eglCreateContext ...\n");
>      ectx = eglCreateContext(qemu_egl_display, qemu_egl_config, EGL_NO_CONTEXT,
> -                            egl_gles ? ctx_att_gles : ctx_att_gl);
> +                            ctx_att_gl);
>      if (ectx == EGL_NO_CONTEXT) {
>          error_report("egl: eglCreateContext failed");
>          return NULL;
> diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
> index d53288f027..89492c0e02 100644
> --- a/ui/gtk-egl.c
> +++ b/ui/gtk-egl.c
> @@ -246,7 +246,7 @@ void gtk_egl_init(void)
>      GdkDisplay *gdk_display = gdk_display_get_default();
>      Display *x11_display = gdk_x11_display_get_xdisplay(gdk_display);
>
> -    if (qemu_egl_init_dpy(x11_display, false, false) < 0) {
> +    if (qemu_egl_init_dpy(x11_display) < 0) {
>          return;
>      }
>
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Qemu-devel] [PATCH 4/6] egl-helpers: add missing error check
  2017-05-05 10:40 ` [Qemu-devel] [PATCH 4/6] egl-helpers: add missing error check Gerd Hoffmann
@ 2017-05-05 11:48   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-05-05 11:48 UTC (permalink / raw)
  To: Gerd Hoffmann, qemu-devel

On 05/05/2017 07:40 AM, Gerd Hoffmann wrote:
> Code didn't check for qemu_egl_init_dpy_mesa() failures, add it.
>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

> ---
>  ui/egl-helpers.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c
> index ec2e325e21..b50225158b 100644
> --- a/ui/egl-helpers.c
> +++ b/ui/egl-helpers.c
> @@ -80,6 +80,7 @@ static int qemu_egl_rendernode_open(const char *rendernode)
>  int egl_rendernode_init(const char *rendernode)
>  {
>      qemu_egl_rn_fd = -1;
> +    int rc;
>
>      qemu_egl_rn_fd = qemu_egl_rendernode_open(rendernode);
>      if (qemu_egl_rn_fd == -1) {
> @@ -93,7 +94,11 @@ int egl_rendernode_init(const char *rendernode)
>          goto err;
>      }
>
> -    qemu_egl_init_dpy_mesa((EGLNativeDisplayType)qemu_egl_rn_gbm_dev);
> +    rc = qemu_egl_init_dpy_mesa((EGLNativeDisplayType)qemu_egl_rn_gbm_dev);
> +    if (rc != 0) {
> +        /* qemu_egl_init_dpy_mesa reports error */
> +        goto err;
> +    }
>
>      if (!epoxy_has_egl_extension(qemu_egl_display,
>                                   "EGL_KHR_surfaceless_context")) {
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Qemu-devel] [PATCH 1/6] virtio-gpu: move virtio_gpu_gl_block
  2017-05-05 10:40 ` [Qemu-devel] [PATCH 1/6] virtio-gpu: move virtio_gpu_gl_block Gerd Hoffmann
  2017-05-05 11:47   ` Philippe Mathieu-Daudé
@ 2017-05-05 11:57   ` Marc-André Lureau
  1 sibling, 0 replies; 13+ messages in thread
From: Marc-André Lureau @ 2017-05-05 11:57 UTC (permalink / raw)
  To: Gerd Hoffmann, qemu-devel; +Cc: Michael S. Tsirkin

On Fri, May 5, 2017 at 2:49 PM Gerd Hoffmann <kraxel@redhat.com> wrote:

> Move to virtio-gpu-3d.c where all the other virgl code lives too.
>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
>

 Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

---
>  include/hw/virtio/virtio-gpu.h |  1 +
>  hw/display/virtio-gpu-3d.c     | 16 ++++++++++++++++
>  hw/display/virtio-gpu.c        | 18 ++----------------
>  3 files changed, 19 insertions(+), 16 deletions(-)
>
> diff --git a/include/hw/virtio/virtio-gpu.h
> b/include/hw/virtio/virtio-gpu.h
> index f3ffdceca4..83f474ffc3 100644
> --- a/include/hw/virtio/virtio-gpu.h
> +++ b/include/hw/virtio/virtio-gpu.h
> @@ -169,6 +169,7 @@ void virtio_gpu_virgl_process_cmd(VirtIOGPU *g,
>                                    struct virtio_gpu_ctrl_command *cmd);
>  void virtio_gpu_virgl_fence_poll(VirtIOGPU *g);
>  void virtio_gpu_virgl_reset(VirtIOGPU *g);
> +void virtio_gpu_gl_block(void *opaque, bool block);
>  int virtio_gpu_virgl_init(VirtIOGPU *g);
>
>  #endif
> diff --git a/hw/display/virtio-gpu-3d.c b/hw/display/virtio-gpu-3d.c
> index f49b7fe8cd..8c106a662d 100644
> --- a/hw/display/virtio-gpu-3d.c
> +++ b/hw/display/virtio-gpu-3d.c
> @@ -600,6 +600,22 @@ void virtio_gpu_virgl_reset(VirtIOGPU *g)
>      }
>  }
>
> +void virtio_gpu_gl_block(void *opaque, bool block)
> +{
> +    VirtIOGPU *g = opaque;
> +
> +    if (block) {
> +        g->renderer_blocked++;
> +    } else {
> +        g->renderer_blocked--;
> +    }
> +    assert(g->renderer_blocked >= 0);
> +
> +    if (g->renderer_blocked == 0) {
> +        virtio_gpu_process_cmdq(g);
> +    }
> +}
> +
>  int virtio_gpu_virgl_init(VirtIOGPU *g)
>  {
>      int ret;
> diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
> index e1056f34df..cfb5dfa336 100644
> --- a/hw/display/virtio-gpu.c
> +++ b/hw/display/virtio-gpu.c
> @@ -929,28 +929,14 @@ static int virtio_gpu_ui_info(void *opaque, uint32_t
> idx, QemuUIInfo *info)
>      return 0;
>  }
>
> -static void virtio_gpu_gl_block(void *opaque, bool block)
> -{
> -    VirtIOGPU *g = opaque;
> -
> -    if (block) {
> -        g->renderer_blocked++;
> -    } else {
> -        g->renderer_blocked--;
> -    }
> -    assert(g->renderer_blocked >= 0);
> -
> -    if (g->renderer_blocked == 0) {
> -        virtio_gpu_process_cmdq(g);
> -    }
> -}
> -
>  const GraphicHwOps virtio_gpu_ops = {
>      .invalidate = virtio_gpu_invalidate_display,
>      .gfx_update = virtio_gpu_update_display,
>      .text_update = virtio_gpu_text_update,
>      .ui_info = virtio_gpu_ui_info,
> +#ifdef CONFIG_VIRGL
>      .gl_block = virtio_gpu_gl_block,
> +#endif
>  };
>
>  static const VMStateDescription vmstate_virtio_gpu_scanout = {
> --
> 2.9.3
>
>
> --
Marc-André Lureau

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [Qemu-devel] [PATCH 2/6] egl-helpers: drop support for gles and debug logging
  2017-05-05 10:40 ` [Qemu-devel] [PATCH 2/6] egl-helpers: drop support for gles and debug logging Gerd Hoffmann
  2017-05-05 11:47   ` Philippe Mathieu-Daudé
@ 2017-05-05 11:58   ` Marc-André Lureau
  1 sibling, 0 replies; 13+ messages in thread
From: Marc-André Lureau @ 2017-05-05 11:58 UTC (permalink / raw)
  To: Gerd Hoffmann, qemu-devel

On Fri, May 5, 2017 at 2:43 PM Gerd Hoffmann <kraxel@redhat.com> wrote:

> Leftover from the early opengl days.
> Unused now, so delete the dead code.
>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
>


Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>



> ---
>  include/ui/egl-helpers.h |  2 +-
>  ui/egl-helpers.c         | 52
> +++++-------------------------------------------
>  ui/gtk-egl.c             |  2 +-
>  3 files changed, 7 insertions(+), 49 deletions(-)
>
> diff --git a/include/ui/egl-helpers.h b/include/ui/egl-helpers.h
> index 88a13e827b..fec7da14a5 100644
> --- a/include/ui/egl-helpers.h
> +++ b/include/ui/egl-helpers.h
> @@ -21,7 +21,7 @@ int egl_get_fd_for_texture(uint32_t tex_id, EGLint
> *stride, EGLint *fourcc);
>
>  EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, Window win);
>
> -int qemu_egl_init_dpy(EGLNativeDisplayType dpy, bool gles, bool debug);
> +int qemu_egl_init_dpy(EGLNativeDisplayType dpy);
>  EGLContext qemu_egl_init_ctx(void);
>
>  #endif /* EGL_HELPERS_H */
> diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c
> index b7b6b2e3cc..a3d7c3d7f5 100644
> --- a/ui/egl-helpers.c
> +++ b/ui/egl-helpers.c
> @@ -26,18 +26,6 @@ EGLConfig qemu_egl_config;
>
>  /* ----------------------------------------------------------------------
> */
>
> -static bool egl_gles;
> -static int egl_debug;
> -
> -#define egl_dbg(_x ...)                          \
> -    do {                                         \
> -        if (egl_debug) {                         \
> -            fprintf(stderr, "egl: " _x);         \
> -        }                                        \
> -    } while (0);
> -
> -/* ----------------------------------------------------------------------
> */
> -
>  #ifdef CONFIG_OPENGL_DMABUF
>
>  int qemu_egl_rn_fd;
> @@ -105,7 +93,7 @@ int egl_rendernode_init(const char *rendernode)
>          goto err;
>      }
>
> -    qemu_egl_init_dpy((EGLNativeDisplayType)qemu_egl_rn_gbm_dev, false,
> false);
> +    qemu_egl_init_dpy((EGLNativeDisplayType)qemu_egl_rn_gbm_dev);
>
>      if (!epoxy_has_egl_extension(qemu_egl_display,
>                                   "EGL_KHR_surfaceless_context")) {
> @@ -171,8 +159,6 @@ EGLSurface qemu_egl_init_surface_x11(EGLContext ectx,
> Window win)
>      EGLSurface esurface;
>      EGLBoolean b;
>
> -    egl_dbg("eglCreateWindowSurface (x11 win id 0x%lx) ...\n",
> -            (unsigned long) win);
>      esurface = eglCreateWindowSurface(qemu_egl_display,
>                                        qemu_egl_config,
>                                        (EGLNativeWindowType)win, NULL);
> @@ -242,7 +228,7 @@ static EGLDisplay qemu_egl_get_display(void *native)
>      return dpy;
>  }
>
> -int qemu_egl_init_dpy(EGLNativeDisplayType dpy, bool gles, bool debug)
> +int qemu_egl_init_dpy(EGLNativeDisplayType dpy)
>  {
>      static const EGLint conf_att_gl[] = {
>          EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
> @@ -253,56 +239,34 @@ int qemu_egl_init_dpy(EGLNativeDisplayType dpy, bool
> gles, bool debug)
>          EGL_ALPHA_SIZE, 0,
>          EGL_NONE,
>      };
> -    static const EGLint conf_att_gles[] = {
> -        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
> -        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
> -        EGL_RED_SIZE,   5,
> -        EGL_GREEN_SIZE, 5,
> -        EGL_BLUE_SIZE,  5,
> -        EGL_ALPHA_SIZE, 0,
> -        EGL_NONE,
> -    };
>      EGLint major, minor;
>      EGLBoolean b;
>      EGLint n;
>
> -    if (debug) {
> -        egl_debug = 1;
> -        setenv("EGL_LOG_LEVEL", "debug", true);
> -        setenv("LIBGL_DEBUG", "verbose", true);
> -    }
> -
> -    egl_dbg("qemu_egl_get_display (dpy %p) ...\n", dpy);
>      qemu_egl_display = qemu_egl_get_display(dpy);
>      if (qemu_egl_display == EGL_NO_DISPLAY) {
>          error_report("egl: eglGetDisplay failed");
>          return -1;
>      }
>
> -    egl_dbg("eglInitialize ...\n");
>      b = eglInitialize(qemu_egl_display, &major, &minor);
>      if (b == EGL_FALSE) {
>          error_report("egl: eglInitialize failed");
>          return -1;
>      }
>
> -    egl_dbg("eglBindAPI ...\n");
> -    b = eglBindAPI(gles ? EGL_OPENGL_ES_API : EGL_OPENGL_API);
> +    b = eglBindAPI(EGL_OPENGL_API);
>      if (b == EGL_FALSE) {
>          error_report("egl: eglBindAPI failed");
>          return -1;
>      }
>
> -    egl_dbg("eglChooseConfig ...\n");
> -    b = eglChooseConfig(qemu_egl_display,
> -                        gles ? conf_att_gles : conf_att_gl,
> +    b = eglChooseConfig(qemu_egl_display, conf_att_gl,
>                          &qemu_egl_config, 1, &n);
>      if (b == EGL_FALSE || n != 1) {
>          error_report("egl: eglChooseConfig failed");
>          return -1;
>      }
> -
> -    egl_gles = gles;
>      return 0;
>  }
>
> @@ -311,17 +275,11 @@ EGLContext qemu_egl_init_ctx(void)
>      static const EGLint ctx_att_gl[] = {
>          EGL_NONE
>      };
> -    static const EGLint ctx_att_gles[] = {
> -        EGL_CONTEXT_CLIENT_VERSION, 2,
> -        EGL_NONE
> -    };
> -
>      EGLContext ectx;
>      EGLBoolean b;
>
> -    egl_dbg("eglCreateContext ...\n");
>      ectx = eglCreateContext(qemu_egl_display, qemu_egl_config,
> EGL_NO_CONTEXT,
> -                            egl_gles ? ctx_att_gles : ctx_att_gl);
> +                            ctx_att_gl);
>      if (ectx == EGL_NO_CONTEXT) {
>          error_report("egl: eglCreateContext failed");
>          return NULL;
> diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
> index d53288f027..89492c0e02 100644
> --- a/ui/gtk-egl.c
> +++ b/ui/gtk-egl.c
> @@ -246,7 +246,7 @@ void gtk_egl_init(void)
>      GdkDisplay *gdk_display = gdk_display_get_default();
>      Display *x11_display = gdk_x11_display_get_xdisplay(gdk_display);
>
> -    if (qemu_egl_init_dpy(x11_display, false, false) < 0) {
> +    if (qemu_egl_init_dpy(x11_display) < 0) {
>          return;
>      }
>
> --
> 2.9.3
>
>
> --
Marc-André Lureau

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Qemu-devel] QEMU master is broken (was: [PATCH 6/6] opengl: add egl-headless display)
  2017-05-05 10:41 ` [Qemu-devel] [PATCH 6/6] opengl: add egl-headless display Gerd Hoffmann
@ 2017-05-17  7:56   ` Thomas Huth
  0 siblings, 0 replies; 13+ messages in thread
From: Thomas Huth @ 2017-05-17  7:56 UTC (permalink / raw)
  To: Gerd Hoffmann, qemu-devel; +Cc: Paolo Bonzini, Stefan Hajnoczi


 Hi,

I can not compile git master anymore on my RHEL 7.3 installation ...
I think it is due to this patch here. I now get:

  CC      ui/egl-headless.o
/home/thuth/devel/qemu/ui/egl-headless.c: In function ‘egl_headless_init’:
/home/thuth/devel/qemu/ui/egl-headless.c:142:5: error: implicit declaration of function ‘egl_rendernode_init’ [-Werror=implicit-function-declaration]
     if (egl_rendernode_init(NULL) < 0) {
     ^
/home/thuth/devel/qemu/ui/egl-headless.c:142:5: error: nested extern declaration of ‘egl_rendernode_init’ [-Werror=nested-externs]
cc1: all warnings being treated as errors
make: *** [ui/egl-headless.o] Error 1

The problem is likely that the prototype in egl-helpers.h is
protected with some "#ifdef CONFIG_OPENGL_DMABUF" ... so should
the code in egl-headless.c put into such conditionals, too?

 Thomas


On 05.05.2017 12:41, Gerd Hoffmann wrote:
> Add egl-headless user interface.  It doesn't provide a real user
> interface, it only provides opengl support using drm render nodes.
> It will copy back the bits rendered by the guest using virgl back
> to a DisplaySurface and kick the usual display update code paths,
> so spice and vnc and screendump can pick it up.
> 
> Use it this way:
>   qemu -display egl-headless -vnc $display
>   qemu -display egl-headless -spice gl=off,$args
> 
> Note that you should prefer native spice opengl support (-spice
> gl=on) if possible because that delivers better performance.
> 
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  include/ui/console.h |   3 +
>  ui/egl-headless.c    | 158 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  vl.c                 |  16 ++++++
>  ui/Makefile.objs     |   1 +
>  4 files changed, 178 insertions(+)
>  create mode 100644 ui/egl-headless.c
> 
> diff --git a/include/ui/console.h b/include/ui/console.h
> index d759338816..7262bef6d3 100644
> --- a/include/ui/console.h
> +++ b/include/ui/console.h
> @@ -527,4 +527,7 @@ static inline void early_gtk_display_init(int opengl)
>  }
>  #endif
>  
> +/* egl-headless.c */
> +void egl_headless_init(void);
> +
>  #endif
> diff --git a/ui/egl-headless.c b/ui/egl-headless.c
> new file mode 100644
> index 0000000000..d8d800f8a6
> --- /dev/null
> +++ b/ui/egl-headless.c
> @@ -0,0 +1,158 @@
> +#include "qemu/osdep.h"
> +#include "qemu-common.h"
> +#include "sysemu/sysemu.h"
> +#include "ui/console.h"
> +#include "ui/egl-helpers.h"
> +#include "ui/egl-context.h"
> +
> +typedef struct egl_dpy {
> +    DisplayChangeListener dcl;
> +    DisplaySurface *ds;
> +    int width, height;
> +    GLuint texture;
> +    GLuint framebuffer;
> +    GLuint blit_texture;
> +    GLuint blit_framebuffer;
> +    bool y_0_top;
> +} egl_dpy;
> +
> +static void egl_refresh(DisplayChangeListener *dcl)
> +{
> +    graphic_hw_update(dcl->con);
> +}
> +
> +static void egl_gfx_update(DisplayChangeListener *dcl,
> +                           int x, int y, int w, int h)
> +{
> +}
> +
> +static void egl_gfx_switch(DisplayChangeListener *dcl,
> +                           struct DisplaySurface *new_surface)
> +{
> +    egl_dpy *edpy = container_of(dcl, egl_dpy, dcl);
> +
> +    edpy->ds = new_surface;
> +}
> +
> +static void egl_scanout_disable(DisplayChangeListener *dcl)
> +{
> +    egl_dpy *edpy = container_of(dcl, egl_dpy, dcl);
> +
> +    edpy->texture = 0;
> +    /* XXX: delete framebuffers here ??? */
> +}
> +
> +static void egl_scanout_texture(DisplayChangeListener *dcl,
> +                                uint32_t backing_id,
> +                                bool backing_y_0_top,
> +                                uint32_t backing_width,
> +                                uint32_t backing_height,
> +                                uint32_t x, uint32_t y,
> +                                uint32_t w, uint32_t h)
> +{
> +    egl_dpy *edpy = container_of(dcl, egl_dpy, dcl);
> +
> +    edpy->texture = backing_id;
> +    edpy->y_0_top = backing_y_0_top;
> +
> +    /* source framebuffer */
> +    if (!edpy->framebuffer) {
> +        glGenFramebuffers(1, &edpy->framebuffer);
> +    }
> +    glBindFramebuffer(GL_FRAMEBUFFER_EXT, edpy->framebuffer);
> +    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
> +                              GL_TEXTURE_2D, edpy->texture, 0);
> +
> +    /* dest framebuffer */
> +    if (!edpy->blit_framebuffer) {
> +        glGenFramebuffers(1, &edpy->blit_framebuffer);
> +        glGenTextures(1, &edpy->blit_texture);
> +        edpy->width = 0;
> +        edpy->height = 0;
> +    }
> +    if (edpy->width != backing_width || edpy->height != backing_height) {
> +        edpy->width   = backing_width;
> +        edpy->height  = backing_height;
> +        glBindTexture(GL_TEXTURE_2D, edpy->blit_texture);
> +        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
> +                     edpy->width, edpy->height,
> +                     0, GL_BGRA, GL_UNSIGNED_BYTE, 0);
> +        glBindFramebuffer(GL_FRAMEBUFFER_EXT, edpy->blit_framebuffer);
> +        glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
> +                                  GL_TEXTURE_2D, edpy->blit_texture, 0);
> +    }
> +}
> +
> +static void egl_scanout_flush(DisplayChangeListener *dcl,
> +                              uint32_t x, uint32_t y,
> +                              uint32_t w, uint32_t h)
> +{
> +    egl_dpy *edpy = container_of(dcl, egl_dpy, dcl);
> +    GLuint y1, y2;
> +
> +    if (!edpy->texture || !edpy->ds) {
> +        return;
> +    }
> +    assert(surface_width(edpy->ds)  == edpy->width);
> +    assert(surface_height(edpy->ds) == edpy->height);
> +    assert(surface_format(edpy->ds) == PIXMAN_x8r8g8b8);
> +
> +    /* blit framebuffer, flip if needed */
> +    glBindFramebuffer(GL_READ_FRAMEBUFFER, edpy->framebuffer);
> +    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, edpy->blit_framebuffer);
> +    glViewport(0, 0, edpy->width, edpy->height);
> +    y1 = edpy->y_0_top ? edpy->height : 0;
> +    y2 = edpy->y_0_top ? 0 : edpy->height;
> +    glBlitFramebuffer(0, y1, edpy->width, y2,
> +                      0, 0, edpy->width, edpy->height,
> +                      GL_COLOR_BUFFER_BIT, GL_NEAREST);
> +
> +    /* read pixels to surface */
> +    glBindFramebuffer(GL_READ_FRAMEBUFFER, edpy->blit_framebuffer);
> +    glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
> +    glReadPixels(0, 0, edpy->width, edpy->height,
> +                 GL_BGRA, GL_UNSIGNED_BYTE, surface_data(edpy->ds));
> +
> +    /* notify about updates */
> +    dpy_gfx_update(edpy->dcl.con, x, y, w, h);
> +}
> +
> +static const DisplayChangeListenerOps egl_ops = {
> +    .dpy_name                = "egl-headless",
> +    .dpy_refresh             = egl_refresh,
> +    .dpy_gfx_update          = egl_gfx_update,
> +    .dpy_gfx_switch          = egl_gfx_switch,
> +
> +    .dpy_gl_ctx_create       = qemu_egl_create_context,
> +    .dpy_gl_ctx_destroy      = qemu_egl_destroy_context,
> +    .dpy_gl_ctx_make_current = qemu_egl_make_context_current,
> +    .dpy_gl_ctx_get_current  = qemu_egl_get_current_context,
> +
> +    .dpy_gl_scanout_disable  = egl_scanout_disable,
> +    .dpy_gl_scanout_texture  = egl_scanout_texture,
> +    .dpy_gl_update           = egl_scanout_flush,
> +};
> +
> +void egl_headless_init(void)
> +{
> +    QemuConsole *con;
> +    egl_dpy *edpy;
> +    int idx;
> +
> +    if (egl_rendernode_init(NULL) < 0) {
> +        error_report("egl: render node init failed");
> +        exit(1);
> +    }
> +
> +    for (idx = 0;; idx++) {
> +        con = qemu_console_lookup_by_index(idx);
> +        if (!con || !qemu_console_is_graphic(con)) {
> +            break;
> +        }
> +
> +        edpy = g_new0(egl_dpy, 1);
> +        edpy->dcl.con = con;
> +        edpy->dcl.ops = &egl_ops;
> +        register_displaychangelistener(&edpy->dcl);
> +    }
> +}
> diff --git a/vl.c b/vl.c
> index f46e070e0d..4e76e0ceb4 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2050,6 +2050,7 @@ typedef enum DisplayType {
>      DT_SDL,
>      DT_COCOA,
>      DT_GTK,
> +    DT_EGL,
>      DT_NONE,
>  } DisplayType;
>  
> @@ -2127,6 +2128,15 @@ static DisplayType select_display(const char *p)
>              error_report("VNC requires a display argument vnc=<display>");
>              exit(1);
>          }
> +    } else if (strstart(p, "egl-headless", &opts)) {
> +#ifdef CONFIG_OPENGL
> +        request_opengl = 1;
> +        display_opengl = 1;
> +        display = DT_EGL;
> +#else
> +        fprintf(stderr, "egl support is disabled\n");
> +        exit(1);
> +#endif
>      } else if (strstart(p, "curses", &opts)) {
>  #ifdef CONFIG_CURSES
>          display = DT_CURSES;
> @@ -4662,6 +4672,12 @@ int main(int argc, char **argv, char **envp)
>          qemu_spice_display_init();
>      }
>  
> +#ifdef CONFIG_OPENGL
> +    if (display_type == DT_EGL) {
> +        egl_headless_init();
> +    }
> +#endif
> +
>      if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) {
>          exit(1);
>      }
> diff --git a/ui/Makefile.objs b/ui/Makefile.objs
> index 27566b32f1..aac6ae8bef 100644
> --- a/ui/Makefile.objs
> +++ b/ui/Makefile.objs
> @@ -33,6 +33,7 @@ common-obj-y += shader.o
>  common-obj-y += console-gl.o
>  common-obj-y += egl-helpers.o
>  common-obj-y += egl-context.o
> +common-obj-y += egl-headless.o
>  ifeq ($(CONFIG_GTK_GL),y)
>  common-obj-$(CONFIG_GTK) += gtk-gl-area.o
>  else
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2017-05-17  7:56 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-05-05 10:40 [Qemu-devel] [PATCH 0/6] opengl: add headless ui, misc fixes Gerd Hoffmann
2017-05-05 10:40 ` [Qemu-devel] [PATCH 1/6] virtio-gpu: move virtio_gpu_gl_block Gerd Hoffmann
2017-05-05 11:47   ` Philippe Mathieu-Daudé
2017-05-05 11:57   ` Marc-André Lureau
2017-05-05 10:40 ` [Qemu-devel] [PATCH 2/6] egl-helpers: drop support for gles and debug logging Gerd Hoffmann
2017-05-05 11:47   ` Philippe Mathieu-Daudé
2017-05-05 11:58   ` Marc-André Lureau
2017-05-05 10:40 ` [Qemu-devel] [PATCH 3/6] egl-helpers: fix display init for x11 Gerd Hoffmann
2017-05-05 10:40 ` [Qemu-devel] [PATCH 4/6] egl-helpers: add missing error check Gerd Hoffmann
2017-05-05 11:48   ` Philippe Mathieu-Daudé
2017-05-05 10:41 ` [Qemu-devel] [PATCH 5/6] egl: explicitly ask for core context Gerd Hoffmann
2017-05-05 10:41 ` [Qemu-devel] [PATCH 6/6] opengl: add egl-headless display Gerd Hoffmann
2017-05-17  7:56   ` [Qemu-devel] QEMU master is broken (was: [PATCH 6/6] opengl: add egl-headless display) Thomas Huth

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.