qemu-devel.nongnu.org archive mirror
 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).