* [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
* 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 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
* [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
* 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 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] [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
* 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
* [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
* [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