* [Qemu-devel] [PULL 0/5] gtk: add opengl rendering support.
@ 2015-05-29 10:07 Gerd Hoffmann
2015-05-29 10:07 ` [Qemu-devel] [PULL 1/5] ui: use libexpoxy Gerd Hoffmann
` (5 more replies)
0 siblings, 6 replies; 12+ messages in thread
From: Gerd Hoffmann @ 2015-05-29 10:07 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Hi,
Here is the pull to add opengl support to the gtk ui.
please pull,
Gerd
The following changes since commit ce0274f730eacbd24c706523ddbbabb6b95d0659:
Revert "gdbstub: Do not kill target in system emulation mode" (2015-05-28 16:57:35 +0100)
are available in the git repository at:
git://git.kraxel.org/qemu tags/pull-gtk-20150529-1
for you to fetch changes up to 63c67b6d4462b6589b371d55e3740e9f0dba3281:
gtk: Replace gdk_cursor_new() (2015-05-29 11:43:29 +0200)
----------------------------------------------------------------
gtk: add opengl rendering support.
small bugfixes for gtk and opengl ui code.
----------------------------------------------------------------
Gerd Hoffmann (4):
ui: use libexpoxy
ui: shader.h protect against double inclusion
ui: add egl-helpers
gtk: add opengl support, using egl
Max Reitz (1):
gtk: Replace gdk_cursor_new()
configure | 4 +-
include/ui/console.h | 5 +-
include/ui/egl-helpers.h | 16 +++++
include/ui/gtk.h | 23 ++++++++
include/ui/shader.h | 10 ++--
ui/Makefile.objs | 6 ++
ui/egl-helpers.c | 148 +++++++++++++++++++++++++++++++++++++++++++++++
ui/gtk-egl.c | 141 ++++++++++++++++++++++++++++++++++++++++++++
ui/gtk.c | 95 +++++++++++++++++++++++++-----
vl.c | 11 +++-
10 files changed, 433 insertions(+), 26 deletions(-)
create mode 100644 include/ui/egl-helpers.h
create mode 100644 ui/egl-helpers.c
create mode 100644 ui/gtk-egl.c
^ permalink raw reply [flat|nested] 12+ messages in thread* [Qemu-devel] [PULL 1/5] ui: use libexpoxy 2015-05-29 10:07 [Qemu-devel] [PULL 0/5] gtk: add opengl rendering support Gerd Hoffmann @ 2015-05-29 10:07 ` Gerd Hoffmann 2015-05-29 10:07 ` [Qemu-devel] [PULL 2/5] ui: shader.h protect against double inclusion Gerd Hoffmann ` (4 subsequent siblings) 5 siblings, 0 replies; 12+ messages in thread From: Gerd Hoffmann @ 2015-05-29 10:07 UTC (permalink / raw) To: qemu-devel; +Cc: Gerd Hoffmann libepoxy does the opengl extension handling for us. It also is helpful for trouble-shooting as it prints nice error messages instead of silently failing or segfaulting in case we do something wrong, like using gl commands not supported by the current context. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> --- configure | 4 ++-- include/ui/console.h | 3 +-- include/ui/shader.h | 5 +---- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/configure b/configure index b707429..ac37296 100755 --- a/configure +++ b/configure @@ -3166,14 +3166,14 @@ else fi if test "$opengl" != "no" ; then - opengl_pkgs="gl glesv2" + opengl_pkgs="gl glesv2 epoxy" if $pkg_config $opengl_pkgs x11 && test "$have_glx" = "yes"; then opengl_cflags="$($pkg_config --cflags $opengl_pkgs) $x11_cflags" opengl_libs="$($pkg_config --libs $opengl_pkgs) $x11_libs" opengl=yes else if test "$opengl" = "yes" ; then - feature_not_found "opengl" "Install GL devel (e.g. MESA)" + feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs" fi opengl_cflags="" opengl_libs="" diff --git a/include/ui/console.h b/include/ui/console.h index e8b3a9e..383dec2 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -10,8 +10,7 @@ #include "qapi/error.h" #ifdef CONFIG_OPENGL -# include <GLES2/gl2.h> -# include <GLES2/gl2ext.h> +# include <epoxy/gl.h> #endif /* keyboard/mouse support */ diff --git a/include/ui/shader.h b/include/ui/shader.h index 1ff926c..992cde6 100644 --- a/include/ui/shader.h +++ b/include/ui/shader.h @@ -1,7 +1,4 @@ -#ifdef CONFIG_OPENGL -# include <GLES2/gl2.h> -# include <GLES2/gl2ext.h> -#endif +#include <epoxy/gl.h> void qemu_gl_run_texture_blit(GLint texture_blit_prog); -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 2/5] ui: shader.h protect against double inclusion 2015-05-29 10:07 [Qemu-devel] [PULL 0/5] gtk: add opengl rendering support Gerd Hoffmann 2015-05-29 10:07 ` [Qemu-devel] [PULL 1/5] ui: use libexpoxy Gerd Hoffmann @ 2015-05-29 10:07 ` Gerd Hoffmann 2015-05-29 10:07 ` [Qemu-devel] [PULL 3/5] ui: add egl-helpers Gerd Hoffmann ` (3 subsequent siblings) 5 siblings, 0 replies; 12+ messages in thread From: Gerd Hoffmann @ 2015-05-29 10:07 UTC (permalink / raw) To: qemu-devel; +Cc: Gerd Hoffmann Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> --- include/ui/shader.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/ui/shader.h b/include/ui/shader.h index 992cde6..8509596 100644 --- a/include/ui/shader.h +++ b/include/ui/shader.h @@ -1,3 +1,6 @@ +#ifndef QEMU_SHADER_H +#define QEMU_SHADER_H + #include <epoxy/gl.h> void qemu_gl_run_texture_blit(GLint texture_blit_prog); @@ -6,3 +9,5 @@ GLuint qemu_gl_create_compile_shader(GLenum type, const GLchar *src); GLuint qemu_gl_create_link_program(GLuint vert, GLuint frag); GLuint qemu_gl_create_compile_link_program(const GLchar *vert_src, const GLchar *frag_src); + +#endif /* QEMU_SHADER_H */ -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 3/5] ui: add egl-helpers 2015-05-29 10:07 [Qemu-devel] [PULL 0/5] gtk: add opengl rendering support Gerd Hoffmann 2015-05-29 10:07 ` [Qemu-devel] [PULL 1/5] ui: use libexpoxy Gerd Hoffmann 2015-05-29 10:07 ` [Qemu-devel] [PULL 2/5] ui: shader.h protect against double inclusion Gerd Hoffmann @ 2015-05-29 10:07 ` Gerd Hoffmann 2015-05-29 10:07 ` [Qemu-devel] [PULL 4/5] gtk: add opengl support, using egl Gerd Hoffmann ` (2 subsequent siblings) 5 siblings, 0 replies; 12+ messages in thread From: Gerd Hoffmann @ 2015-05-29 10:07 UTC (permalink / raw) To: qemu-devel; +Cc: Gerd Hoffmann Add helper functions to initialize OpenGL using egl. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> --- configure | 2 +- include/ui/egl-helpers.h | 16 +++++ ui/Makefile.objs | 3 + ui/egl-helpers.c | 148 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 include/ui/egl-helpers.h create mode 100644 ui/egl-helpers.c diff --git a/configure b/configure index ac37296..4e2f78a 100755 --- a/configure +++ b/configure @@ -3166,7 +3166,7 @@ else fi if test "$opengl" != "no" ; then - opengl_pkgs="gl glesv2 epoxy" + opengl_pkgs="gl glesv2 epoxy egl" if $pkg_config $opengl_pkgs x11 && test "$have_glx" = "yes"; then opengl_cflags="$($pkg_config --cflags $opengl_pkgs) $x11_cflags" opengl_libs="$($pkg_config --libs $opengl_pkgs) $x11_libs" diff --git a/include/ui/egl-helpers.h b/include/ui/egl-helpers.h new file mode 100644 index 0000000..5ad5dc3 --- /dev/null +++ b/include/ui/egl-helpers.h @@ -0,0 +1,16 @@ +#ifndef EGL_HELPERS_H +#define EGL_HELPERS_H + +#include <epoxy/gl.h> +#include <epoxy/egl.h> + +extern EGLDisplay *qemu_egl_display; +extern EGLConfig qemu_egl_config; + +EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, Window win); + +int qemu_egl_init_dpy(EGLNativeDisplayType dpy, bool gles, bool debug); +EGLContext qemu_egl_init_ctx(void); +bool qemu_egl_has_ext(const char *haystack, const char *needle); + +#endif /* EGL_HELPERS_H */ diff --git a/ui/Makefile.objs b/ui/Makefile.objs index 029a42a..5c46870 100644 --- a/ui/Makefile.objs +++ b/ui/Makefile.objs @@ -30,11 +30,14 @@ sdl.mo-cflags := $(SDL_CFLAGS) ifeq ($(CONFIG_OPENGL),y) common-obj-y += shader.o common-obj-y += console-gl.o +common-obj-y += egl-helpers.o endif gtk.o-cflags := $(GTK_CFLAGS) $(VTE_CFLAGS) shader.o-cflags += $(OPENGL_CFLAGS) console-gl.o-cflags += $(OPENGL_CFLAGS) +egl-helpers.o-cflags += $(OPENGL_CFLAGS) shader.o-libs += $(OPENGL_LIBS) console-gl.o-libs += $(OPENGL_LIBS) +egl-helpers.o-libs += $(OPENGL_LIBS) diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c new file mode 100644 index 0000000..87d77af --- /dev/null +++ b/ui/egl-helpers.c @@ -0,0 +1,148 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <stdbool.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> +#include <fcntl.h> +#include <glob.h> + +#include "ui/egl-helpers.h" + +EGLDisplay *qemu_egl_display; +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); + +/* ---------------------------------------------------------------------- */ + +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); + if (esurface == EGL_NO_SURFACE) { + fprintf(stderr, "egl: eglCreateWindowSurface failed\n"); + return NULL; + } + + b = eglMakeCurrent(qemu_egl_display, esurface, esurface, ectx); + if (b == EGL_FALSE) { + fprintf(stderr, "egl: eglMakeCurrent failed\n"); + return NULL; + } + + return esurface; +} + +/* ---------------------------------------------------------------------- */ + +int qemu_egl_init_dpy(EGLNativeDisplayType dpy, bool gles, bool debug) +{ + static const EGLint conf_att_gl[] = { + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, + EGL_RED_SIZE, 5, + EGL_GREEN_SIZE, 5, + EGL_BLUE_SIZE, 5, + 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("eglGetDisplay (dpy %p) ...\n", dpy); + qemu_egl_display = eglGetDisplay(dpy); + if (qemu_egl_display == EGL_NO_DISPLAY) { + fprintf(stderr, "egl: eglGetDisplay failed\n"); + return -1; + } + + egl_dbg("eglInitialize ...\n"); + b = eglInitialize(qemu_egl_display, &major, &minor); + if (b == EGL_FALSE) { + fprintf(stderr, "egl: eglInitialize failed\n"); + return -1; + } + + egl_dbg("eglBindAPI ...\n"); + b = eglBindAPI(gles ? EGL_OPENGL_ES_API : EGL_OPENGL_API); + if (b == EGL_FALSE) { + fprintf(stderr, "egl: eglBindAPI failed\n"); + return -1; + } + + egl_dbg("eglChooseConfig ...\n"); + b = eglChooseConfig(qemu_egl_display, + gles ? conf_att_gles : conf_att_gl, + &qemu_egl_config, 1, &n); + if (b == EGL_FALSE || n != 1) { + fprintf(stderr, "egl: eglChooseConfig failed\n"); + return -1; + } + + egl_gles = gles; + return 0; +} + +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); + if (ectx == EGL_NO_CONTEXT) { + fprintf(stderr, "egl: eglCreateContext failed\n"); + return NULL; + } + + b = eglMakeCurrent(qemu_egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, ectx); + if (b == EGL_FALSE) { + fprintf(stderr, "egl: eglMakeCurrent failed\n"); + return NULL; + } + + return ectx; +} -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 4/5] gtk: add opengl support, using egl 2015-05-29 10:07 [Qemu-devel] [PULL 0/5] gtk: add opengl rendering support Gerd Hoffmann ` (2 preceding siblings ...) 2015-05-29 10:07 ` [Qemu-devel] [PULL 3/5] ui: add egl-helpers Gerd Hoffmann @ 2015-05-29 10:07 ` Gerd Hoffmann 2015-06-05 10:20 ` Paolo Bonzini 2015-05-29 10:07 ` [Qemu-devel] [PULL 5/5] gtk: Replace gdk_cursor_new() Gerd Hoffmann 2015-05-29 14:31 ` [Qemu-devel] [PULL 0/5] gtk: add opengl rendering support Peter Maydell 5 siblings, 1 reply; 12+ messages in thread From: Gerd Hoffmann @ 2015-05-29 10:07 UTC (permalink / raw) To: qemu-devel; +Cc: Paolo Bonzini, Gerd Hoffmann This adds opengl rendering support to the gtk ui, using egl. It's off by default for now, use 'qemu -display gtk,gl=on' to play with this. Note that gtk got native opengl support with release 3.16. There most likely will be a separate implementation for 3.16+, using the native gtk opengl support. This patch covers older versions (and for the time being 3.16 too, hopefully without rendering quirks). Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- include/ui/console.h | 2 +- include/ui/gtk.h | 23 +++++++++ ui/Makefile.objs | 3 ++ ui/gtk-egl.c | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++ ui/gtk.c | 90 ++++++++++++++++++++++++++------ vl.c | 11 +++- 6 files changed, 253 insertions(+), 17 deletions(-) create mode 100644 ui/gtk-egl.c diff --git a/include/ui/console.h b/include/ui/console.h index 383dec2..6f7550e 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -393,7 +393,7 @@ void curses_display_init(DisplayState *ds, int full_screen); int index_from_key(const char *key); /* gtk.c */ -void early_gtk_display_init(void); +void early_gtk_display_init(int opengl); void gtk_display_init(DisplayState *ds, bool full_screen, bool grab_on_hover); #endif diff --git a/include/ui/gtk.h b/include/ui/gtk.h index b750845..ee6dffd 100644 --- a/include/ui/gtk.h +++ b/include/ui/gtk.h @@ -22,6 +22,10 @@ #include <X11/XKBlib.h> #endif +#if defined(CONFIG_OPENGL) +#include "ui/egl-helpers.h" +#endif + /* Compatibility define to let us build on both Gtk2 and Gtk3 */ #if GTK_CHECK_VERSION(3, 0, 0) static inline void gdk_drawable_get_size(GdkWindow *w, gint *ww, gint *wh) @@ -41,6 +45,12 @@ typedef struct VirtualGfxConsole { cairo_surface_t *surface; double scale_x; double scale_y; +#if defined(CONFIG_OPENGL) + ConsoleGLState *gls; + EGLContext ectx; + EGLSurface esurface; + int glupdates; +#endif } VirtualGfxConsole; #if defined(CONFIG_VTE) @@ -73,4 +83,17 @@ typedef struct VirtualConsole { }; } VirtualConsole; +/* ui/gtk.c */ +void gd_update_windowsize(VirtualConsole *vc); + +/* ui/gtk-egl.c */ +void gd_egl_init(VirtualConsole *vc); +void gd_egl_draw(VirtualConsole *vc); +void gd_egl_update(DisplayChangeListener *dcl, + int x, int y, int w, int h); +void gd_egl_refresh(DisplayChangeListener *dcl); +void gd_egl_switch(DisplayChangeListener *dcl, + DisplaySurface *surface); +void gtk_egl_init(void); + #endif /* UI_GTK_H */ diff --git a/ui/Makefile.objs b/ui/Makefile.objs index 5c46870..023914c 100644 --- a/ui/Makefile.objs +++ b/ui/Makefile.objs @@ -31,13 +31,16 @@ ifeq ($(CONFIG_OPENGL),y) common-obj-y += shader.o common-obj-y += console-gl.o common-obj-y += egl-helpers.o +common-obj-$(CONFIG_GTK) += gtk-egl.o endif gtk.o-cflags := $(GTK_CFLAGS) $(VTE_CFLAGS) +gtk-egl.o-cflags := $(GTK_CFLAGS) $(VTE_CFLAGS) $(OPENGL_CFLAGS) shader.o-cflags += $(OPENGL_CFLAGS) console-gl.o-cflags += $(OPENGL_CFLAGS) egl-helpers.o-cflags += $(OPENGL_CFLAGS) +gtk-egl.o-libs += $(OPENGL_LIBS) shader.o-libs += $(OPENGL_LIBS) console-gl.o-libs += $(OPENGL_LIBS) egl-helpers.o-libs += $(OPENGL_LIBS) diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c new file mode 100644 index 0000000..15b41f2 --- /dev/null +++ b/ui/gtk-egl.c @@ -0,0 +1,141 @@ +/* + * GTK UI -- egl opengl code. + * + * Note that gtk 3.16+ (released 2015-03-23) has a GtkGLArea widget, + * which is GtkDrawingArea like widget with opengl rendering support. + * + * This code handles opengl support on older gtk versions, using egl + * to get a opengl context for the X11 window. + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include "qemu-common.h" + +#include "trace.h" + +#include "ui/console.h" +#include "ui/gtk.h" +#include "ui/egl-helpers.h" + +#include "sysemu/sysemu.h" + +/** DisplayState Callbacks (opengl version) **/ + +void gd_egl_init(VirtualConsole *vc) +{ + GdkWindow *gdk_window = gtk_widget_get_window(vc->gfx.drawing_area); + if (!gdk_window) { + return; + } + +#if GTK_CHECK_VERSION(3, 0, 0) + Window x11_window = gdk_x11_window_get_xid(gdk_window); +#else + Window x11_window = gdk_x11_drawable_get_xid(gdk_window); +#endif + if (!x11_window) { + return; + } + + vc->gfx.ectx = qemu_egl_init_ctx(); + vc->gfx.esurface = qemu_egl_init_surface_x11(vc->gfx.ectx, x11_window); + + assert(vc->gfx.esurface); +} + +void gd_egl_draw(VirtualConsole *vc) +{ + GdkWindow *window; + int ww, wh; + + if (!vc->gfx.gls || !vc->gfx.ds) { + return; + } + + eglMakeCurrent(qemu_egl_display, vc->gfx.esurface, + vc->gfx.esurface, vc->gfx.ectx); + + window = gtk_widget_get_window(vc->gfx.drawing_area); + gdk_drawable_get_size(window, &ww, &wh); + surface_gl_setup_viewport(vc->gfx.gls, vc->gfx.ds, ww, wh); + surface_gl_render_texture(vc->gfx.gls, vc->gfx.ds); + + eglSwapBuffers(qemu_egl_display, vc->gfx.esurface); +} + +void gd_egl_update(DisplayChangeListener *dcl, + int x, int y, int w, int h) +{ + VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl); + + if (!vc->gfx.gls || !vc->gfx.ds) { + return; + } + + eglMakeCurrent(qemu_egl_display, vc->gfx.esurface, + vc->gfx.esurface, vc->gfx.ectx); + surface_gl_update_texture(vc->gfx.gls, vc->gfx.ds, x, y, w, h); + vc->gfx.glupdates++; +} + +void gd_egl_refresh(DisplayChangeListener *dcl) +{ + VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl); + + if (!vc->gfx.esurface) { + gd_egl_init(vc); + if (!vc->gfx.esurface) { + return; + } + vc->gfx.gls = console_gl_init_context(); + if (vc->gfx.ds) { + surface_gl_create_texture(vc->gfx.gls, vc->gfx.ds); + } + } + + graphic_hw_update(dcl->con); + + if (vc->gfx.glupdates) { + vc->gfx.glupdates = 0; + gd_egl_draw(vc); + } +} + +void gd_egl_switch(DisplayChangeListener *dcl, + DisplaySurface *surface) +{ + VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl); + bool resized = true; + + trace_gd_switch(vc->label, surface_width(surface), surface_height(surface)); + + if (vc->gfx.ds && + surface_width(vc->gfx.ds) == surface_width(surface) && + surface_height(vc->gfx.ds) == surface_height(surface)) { + resized = false; + } + + surface_gl_destroy_texture(vc->gfx.gls, vc->gfx.ds); + vc->gfx.ds = surface; + if (vc->gfx.gls) { + surface_gl_create_texture(vc->gfx.gls, vc->gfx.ds); + } + + if (resized) { + gd_update_windowsize(vc); + } +} + +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) { + return; + } + + display_opengl = 1; +} diff --git a/ui/gtk.c b/ui/gtk.c index c58028f..2477e37 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -339,7 +339,7 @@ static void gd_update_geometry_hints(VirtualConsole *vc) gtk_window_set_geometry_hints(geo_window, geo_widget, &geo, mask); } -static void gd_update_windowsize(VirtualConsole *vc) +void gd_update_windowsize(VirtualConsole *vc) { GtkDisplayState *s = vc->s; @@ -581,6 +581,33 @@ static void gd_switch(DisplayChangeListener *dcl, } } +static const DisplayChangeListenerOps dcl_ops = { + .dpy_name = "gtk", + .dpy_gfx_update = gd_update, + .dpy_gfx_switch = gd_switch, + .dpy_gfx_check_format = qemu_pixman_check_format, + .dpy_refresh = gd_refresh, + .dpy_mouse_set = gd_mouse_set, + .dpy_cursor_define = gd_cursor_define, +}; + + +#if defined(CONFIG_OPENGL) + +/** DisplayState Callbacks (opengl version) **/ + +static const DisplayChangeListenerOps dcl_egl_ops = { + .dpy_name = "gtk-egl", + .dpy_gfx_update = gd_egl_update, + .dpy_gfx_switch = gd_egl_switch, + .dpy_gfx_check_format = console_gl_check_format, + .dpy_refresh = gd_egl_refresh, + .dpy_mouse_set = gd_mouse_set, + .dpy_cursor_define = gd_cursor_define, +}; + +#endif + /** QEMU Events **/ static void gd_change_runstate(void *opaque, int running, RunState state) @@ -637,6 +664,13 @@ static gboolean gd_draw_event(GtkWidget *widget, cairo_t *cr, void *opaque) int ww, wh; int fbw, fbh; +#if defined(CONFIG_OPENGL) + if (vc->gfx.gls) { + gd_egl_draw(vc); + return TRUE; + } +#endif + if (!gtk_widget_get_realized(widget)) { return FALSE; } @@ -1676,16 +1710,6 @@ static GtkWidget *gd_create_menu_machine(GtkDisplayState *s) return machine_menu; } -static const DisplayChangeListenerOps dcl_ops = { - .dpy_name = "gtk", - .dpy_gfx_update = gd_update, - .dpy_gfx_switch = gd_switch, - .dpy_gfx_check_format = qemu_pixman_check_format, - .dpy_refresh = gd_refresh, - .dpy_mouse_set = gd_mouse_set, - .dpy_cursor_define = gd_cursor_define, -}; - static GSList *gd_vc_gfx_init(GtkDisplayState *s, VirtualConsole *vc, QemuConsole *con, int idx, GSList *group, GtkWidget *view_menu) @@ -1713,7 +1737,29 @@ static GSList *gd_vc_gfx_init(GtkDisplayState *s, VirtualConsole *vc, gtk_notebook_append_page(GTK_NOTEBOOK(s->notebook), vc->tab_item, gtk_label_new(vc->label)); - vc->gfx.dcl.ops = &dcl_ops; +#if defined(CONFIG_OPENGL) + if (display_opengl) { + /* + * gtk_widget_set_double_buffered() was deprecated in 3.14. + * It is required for opengl rendering on X11 though. A + * proper replacement (native opengl support) is only + * available in 3.16+. Silence the warning if possible. + */ +#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + gtk_widget_set_double_buffered(vc->gfx.drawing_area, FALSE); +#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE +#pragma GCC diagnostic pop +#endif + vc->gfx.dcl.ops = &dcl_egl_ops; + } else +#endif + { + vc->gfx.dcl.ops = &dcl_ops; + } + vc->gfx.dcl.con = con; register_displaychangelistener(&vc->gfx.dcl); @@ -1876,8 +1922,6 @@ void gtk_display_init(DisplayState *ds, bool full_screen, bool grab_on_hover) GtkDisplayState *s = g_malloc0(sizeof(*s)); char *filename; - gtk_init(NULL, NULL); - s->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); #if GTK_CHECK_VERSION(3, 2, 0) s->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); @@ -1954,8 +1998,24 @@ void gtk_display_init(DisplayState *ds, bool full_screen, bool grab_on_hover) gd_set_keycode_type(s); } -void early_gtk_display_init(void) +void early_gtk_display_init(int opengl) { + gtk_init(NULL, NULL); + + switch (opengl) { + case -1: /* default */ + case 0: /* off */ + break; + case 1: /* on */ +#if defined(CONFIG_OPENGL) + gtk_egl_init(); +#endif + break; + default: + g_assert_not_reached(); + break; + } + #if defined(CONFIG_VTE) register_vc_handler(gd_vc_handler); #endif diff --git a/vl.c b/vl.c index 15bccc4..26b1e7e 100644 --- a/vl.c +++ b/vl.c @@ -2047,6 +2047,15 @@ static DisplayType select_display(const char *p) } else { goto invalid_gtk_args; } + } else if (strstart(opts, ",gl=", &nextopt)) { + opts = nextopt; + if (strstart(opts, "on", &nextopt)) { + request_opengl = 1; + } else if (strstart(opts, "off", &nextopt)) { + request_opengl = 0; + } else { + goto invalid_gtk_args; + } } else { invalid_gtk_args: fprintf(stderr, "Invalid GTK option string: %s\n", p); @@ -4012,7 +4021,7 @@ int main(int argc, char **argv, char **envp) #if defined(CONFIG_GTK) if (display_type == DT_GTK) { - early_gtk_display_init(); + early_gtk_display_init(request_opengl); } #endif #if defined(CONFIG_SDL) -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PULL 4/5] gtk: add opengl support, using egl 2015-05-29 10:07 ` [Qemu-devel] [PULL 4/5] gtk: add opengl support, using egl Gerd Hoffmann @ 2015-06-05 10:20 ` Paolo Bonzini 2015-06-05 11:01 ` Gerd Hoffmann 0 siblings, 1 reply; 12+ messages in thread From: Paolo Bonzini @ 2015-06-05 10:20 UTC (permalink / raw) To: Gerd Hoffmann, qemu-devel On 29/05/2015 12:07, Gerd Hoffmann wrote: > This adds opengl rendering support to the gtk ui, using egl. > It's off by default for now, use 'qemu -display gtk,gl=on' > to play with this. > > Note that gtk got native opengl support with release 3.16. > There most likely will be a separate implementation for 3.16+, > using the native gtk opengl support. This patch covers older > versions (and for the time being 3.16 too, hopefully without > rendering quirks). > > Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> This unfortunately breaks "-device help" if you do not have an X11 connection. gtk_init exits the program. Paolo > --- > include/ui/console.h | 2 +- > include/ui/gtk.h | 23 +++++++++ > ui/Makefile.objs | 3 ++ > ui/gtk-egl.c | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++ > ui/gtk.c | 90 ++++++++++++++++++++++++++------ > vl.c | 11 +++- > 6 files changed, 253 insertions(+), 17 deletions(-) > create mode 100644 ui/gtk-egl.c > > diff --git a/include/ui/console.h b/include/ui/console.h > index 383dec2..6f7550e 100644 > --- a/include/ui/console.h > +++ b/include/ui/console.h > @@ -393,7 +393,7 @@ void curses_display_init(DisplayState *ds, int full_screen); > int index_from_key(const char *key); > > /* gtk.c */ > -void early_gtk_display_init(void); > +void early_gtk_display_init(int opengl); > void gtk_display_init(DisplayState *ds, bool full_screen, bool grab_on_hover); > > #endif > diff --git a/include/ui/gtk.h b/include/ui/gtk.h > index b750845..ee6dffd 100644 > --- a/include/ui/gtk.h > +++ b/include/ui/gtk.h > @@ -22,6 +22,10 @@ > #include <X11/XKBlib.h> > #endif > > +#if defined(CONFIG_OPENGL) > +#include "ui/egl-helpers.h" > +#endif > + > /* Compatibility define to let us build on both Gtk2 and Gtk3 */ > #if GTK_CHECK_VERSION(3, 0, 0) > static inline void gdk_drawable_get_size(GdkWindow *w, gint *ww, gint *wh) > @@ -41,6 +45,12 @@ typedef struct VirtualGfxConsole { > cairo_surface_t *surface; > double scale_x; > double scale_y; > +#if defined(CONFIG_OPENGL) > + ConsoleGLState *gls; > + EGLContext ectx; > + EGLSurface esurface; > + int glupdates; > +#endif > } VirtualGfxConsole; > > #if defined(CONFIG_VTE) > @@ -73,4 +83,17 @@ typedef struct VirtualConsole { > }; > } VirtualConsole; > > +/* ui/gtk.c */ > +void gd_update_windowsize(VirtualConsole *vc); > + > +/* ui/gtk-egl.c */ > +void gd_egl_init(VirtualConsole *vc); > +void gd_egl_draw(VirtualConsole *vc); > +void gd_egl_update(DisplayChangeListener *dcl, > + int x, int y, int w, int h); > +void gd_egl_refresh(DisplayChangeListener *dcl); > +void gd_egl_switch(DisplayChangeListener *dcl, > + DisplaySurface *surface); > +void gtk_egl_init(void); > + > #endif /* UI_GTK_H */ > diff --git a/ui/Makefile.objs b/ui/Makefile.objs > index 5c46870..023914c 100644 > --- a/ui/Makefile.objs > +++ b/ui/Makefile.objs > @@ -31,13 +31,16 @@ ifeq ($(CONFIG_OPENGL),y) > common-obj-y += shader.o > common-obj-y += console-gl.o > common-obj-y += egl-helpers.o > +common-obj-$(CONFIG_GTK) += gtk-egl.o > endif > > gtk.o-cflags := $(GTK_CFLAGS) $(VTE_CFLAGS) > +gtk-egl.o-cflags := $(GTK_CFLAGS) $(VTE_CFLAGS) $(OPENGL_CFLAGS) > shader.o-cflags += $(OPENGL_CFLAGS) > console-gl.o-cflags += $(OPENGL_CFLAGS) > egl-helpers.o-cflags += $(OPENGL_CFLAGS) > > +gtk-egl.o-libs += $(OPENGL_LIBS) > shader.o-libs += $(OPENGL_LIBS) > console-gl.o-libs += $(OPENGL_LIBS) > egl-helpers.o-libs += $(OPENGL_LIBS) > diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c > new file mode 100644 > index 0000000..15b41f2 > --- /dev/null > +++ b/ui/gtk-egl.c > @@ -0,0 +1,141 @@ > +/* > + * GTK UI -- egl opengl code. > + * > + * Note that gtk 3.16+ (released 2015-03-23) has a GtkGLArea widget, > + * which is GtkDrawingArea like widget with opengl rendering support. > + * > + * This code handles opengl support on older gtk versions, using egl > + * to get a opengl context for the X11 window. > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or later. > + * See the COPYING file in the top-level directory. > + */ > + > +#include "qemu-common.h" > + > +#include "trace.h" > + > +#include "ui/console.h" > +#include "ui/gtk.h" > +#include "ui/egl-helpers.h" > + > +#include "sysemu/sysemu.h" > + > +/** DisplayState Callbacks (opengl version) **/ > + > +void gd_egl_init(VirtualConsole *vc) > +{ > + GdkWindow *gdk_window = gtk_widget_get_window(vc->gfx.drawing_area); > + if (!gdk_window) { > + return; > + } > + > +#if GTK_CHECK_VERSION(3, 0, 0) > + Window x11_window = gdk_x11_window_get_xid(gdk_window); > +#else > + Window x11_window = gdk_x11_drawable_get_xid(gdk_window); > +#endif > + if (!x11_window) { > + return; > + } > + > + vc->gfx.ectx = qemu_egl_init_ctx(); > + vc->gfx.esurface = qemu_egl_init_surface_x11(vc->gfx.ectx, x11_window); > + > + assert(vc->gfx.esurface); > +} > + > +void gd_egl_draw(VirtualConsole *vc) > +{ > + GdkWindow *window; > + int ww, wh; > + > + if (!vc->gfx.gls || !vc->gfx.ds) { > + return; > + } > + > + eglMakeCurrent(qemu_egl_display, vc->gfx.esurface, > + vc->gfx.esurface, vc->gfx.ectx); > + > + window = gtk_widget_get_window(vc->gfx.drawing_area); > + gdk_drawable_get_size(window, &ww, &wh); > + surface_gl_setup_viewport(vc->gfx.gls, vc->gfx.ds, ww, wh); > + surface_gl_render_texture(vc->gfx.gls, vc->gfx.ds); > + > + eglSwapBuffers(qemu_egl_display, vc->gfx.esurface); > +} > + > +void gd_egl_update(DisplayChangeListener *dcl, > + int x, int y, int w, int h) > +{ > + VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl); > + > + if (!vc->gfx.gls || !vc->gfx.ds) { > + return; > + } > + > + eglMakeCurrent(qemu_egl_display, vc->gfx.esurface, > + vc->gfx.esurface, vc->gfx.ectx); > + surface_gl_update_texture(vc->gfx.gls, vc->gfx.ds, x, y, w, h); > + vc->gfx.glupdates++; > +} > + > +void gd_egl_refresh(DisplayChangeListener *dcl) > +{ > + VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl); > + > + if (!vc->gfx.esurface) { > + gd_egl_init(vc); > + if (!vc->gfx.esurface) { > + return; > + } > + vc->gfx.gls = console_gl_init_context(); > + if (vc->gfx.ds) { > + surface_gl_create_texture(vc->gfx.gls, vc->gfx.ds); > + } > + } > + > + graphic_hw_update(dcl->con); > + > + if (vc->gfx.glupdates) { > + vc->gfx.glupdates = 0; > + gd_egl_draw(vc); > + } > +} > + > +void gd_egl_switch(DisplayChangeListener *dcl, > + DisplaySurface *surface) > +{ > + VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl); > + bool resized = true; > + > + trace_gd_switch(vc->label, surface_width(surface), surface_height(surface)); > + > + if (vc->gfx.ds && > + surface_width(vc->gfx.ds) == surface_width(surface) && > + surface_height(vc->gfx.ds) == surface_height(surface)) { > + resized = false; > + } > + > + surface_gl_destroy_texture(vc->gfx.gls, vc->gfx.ds); > + vc->gfx.ds = surface; > + if (vc->gfx.gls) { > + surface_gl_create_texture(vc->gfx.gls, vc->gfx.ds); > + } > + > + if (resized) { > + gd_update_windowsize(vc); > + } > +} > + > +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) { > + return; > + } > + > + display_opengl = 1; > +} > diff --git a/ui/gtk.c b/ui/gtk.c > index c58028f..2477e37 100644 > --- a/ui/gtk.c > +++ b/ui/gtk.c > @@ -339,7 +339,7 @@ static void gd_update_geometry_hints(VirtualConsole *vc) > gtk_window_set_geometry_hints(geo_window, geo_widget, &geo, mask); > } > > -static void gd_update_windowsize(VirtualConsole *vc) > +void gd_update_windowsize(VirtualConsole *vc) > { > GtkDisplayState *s = vc->s; > > @@ -581,6 +581,33 @@ static void gd_switch(DisplayChangeListener *dcl, > } > } > > +static const DisplayChangeListenerOps dcl_ops = { > + .dpy_name = "gtk", > + .dpy_gfx_update = gd_update, > + .dpy_gfx_switch = gd_switch, > + .dpy_gfx_check_format = qemu_pixman_check_format, > + .dpy_refresh = gd_refresh, > + .dpy_mouse_set = gd_mouse_set, > + .dpy_cursor_define = gd_cursor_define, > +}; > + > + > +#if defined(CONFIG_OPENGL) > + > +/** DisplayState Callbacks (opengl version) **/ > + > +static const DisplayChangeListenerOps dcl_egl_ops = { > + .dpy_name = "gtk-egl", > + .dpy_gfx_update = gd_egl_update, > + .dpy_gfx_switch = gd_egl_switch, > + .dpy_gfx_check_format = console_gl_check_format, > + .dpy_refresh = gd_egl_refresh, > + .dpy_mouse_set = gd_mouse_set, > + .dpy_cursor_define = gd_cursor_define, > +}; > + > +#endif > + > /** QEMU Events **/ > > static void gd_change_runstate(void *opaque, int running, RunState state) > @@ -637,6 +664,13 @@ static gboolean gd_draw_event(GtkWidget *widget, cairo_t *cr, void *opaque) > int ww, wh; > int fbw, fbh; > > +#if defined(CONFIG_OPENGL) > + if (vc->gfx.gls) { > + gd_egl_draw(vc); > + return TRUE; > + } > +#endif > + > if (!gtk_widget_get_realized(widget)) { > return FALSE; > } > @@ -1676,16 +1710,6 @@ static GtkWidget *gd_create_menu_machine(GtkDisplayState *s) > return machine_menu; > } > > -static const DisplayChangeListenerOps dcl_ops = { > - .dpy_name = "gtk", > - .dpy_gfx_update = gd_update, > - .dpy_gfx_switch = gd_switch, > - .dpy_gfx_check_format = qemu_pixman_check_format, > - .dpy_refresh = gd_refresh, > - .dpy_mouse_set = gd_mouse_set, > - .dpy_cursor_define = gd_cursor_define, > -}; > - > static GSList *gd_vc_gfx_init(GtkDisplayState *s, VirtualConsole *vc, > QemuConsole *con, int idx, > GSList *group, GtkWidget *view_menu) > @@ -1713,7 +1737,29 @@ static GSList *gd_vc_gfx_init(GtkDisplayState *s, VirtualConsole *vc, > gtk_notebook_append_page(GTK_NOTEBOOK(s->notebook), > vc->tab_item, gtk_label_new(vc->label)); > > - vc->gfx.dcl.ops = &dcl_ops; > +#if defined(CONFIG_OPENGL) > + if (display_opengl) { > + /* > + * gtk_widget_set_double_buffered() was deprecated in 3.14. > + * It is required for opengl rendering on X11 though. A > + * proper replacement (native opengl support) is only > + * available in 3.16+. Silence the warning if possible. > + */ > +#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE > +#pragma GCC diagnostic push > +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" > +#endif > + gtk_widget_set_double_buffered(vc->gfx.drawing_area, FALSE); > +#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE > +#pragma GCC diagnostic pop > +#endif > + vc->gfx.dcl.ops = &dcl_egl_ops; > + } else > +#endif > + { > + vc->gfx.dcl.ops = &dcl_ops; > + } > + > vc->gfx.dcl.con = con; > register_displaychangelistener(&vc->gfx.dcl); > > @@ -1876,8 +1922,6 @@ void gtk_display_init(DisplayState *ds, bool full_screen, bool grab_on_hover) > GtkDisplayState *s = g_malloc0(sizeof(*s)); > char *filename; > > - gtk_init(NULL, NULL); > - > s->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); > #if GTK_CHECK_VERSION(3, 2, 0) > s->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); > @@ -1954,8 +1998,24 @@ void gtk_display_init(DisplayState *ds, bool full_screen, bool grab_on_hover) > gd_set_keycode_type(s); > } > > -void early_gtk_display_init(void) > +void early_gtk_display_init(int opengl) > { > + gtk_init(NULL, NULL); > + > + switch (opengl) { > + case -1: /* default */ > + case 0: /* off */ > + break; > + case 1: /* on */ > +#if defined(CONFIG_OPENGL) > + gtk_egl_init(); > +#endif > + break; > + default: > + g_assert_not_reached(); > + break; > + } > + > #if defined(CONFIG_VTE) > register_vc_handler(gd_vc_handler); > #endif > diff --git a/vl.c b/vl.c > index 15bccc4..26b1e7e 100644 > --- a/vl.c > +++ b/vl.c > @@ -2047,6 +2047,15 @@ static DisplayType select_display(const char *p) > } else { > goto invalid_gtk_args; > } > + } else if (strstart(opts, ",gl=", &nextopt)) { > + opts = nextopt; > + if (strstart(opts, "on", &nextopt)) { > + request_opengl = 1; > + } else if (strstart(opts, "off", &nextopt)) { > + request_opengl = 0; > + } else { > + goto invalid_gtk_args; > + } > } else { > invalid_gtk_args: > fprintf(stderr, "Invalid GTK option string: %s\n", p); > @@ -4012,7 +4021,7 @@ int main(int argc, char **argv, char **envp) > > #if defined(CONFIG_GTK) > if (display_type == DT_GTK) { > - early_gtk_display_init(); > + early_gtk_display_init(request_opengl); > } > #endif > #if defined(CONFIG_SDL) > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PULL 4/5] gtk: add opengl support, using egl 2015-06-05 10:20 ` Paolo Bonzini @ 2015-06-05 11:01 ` Gerd Hoffmann 2015-06-05 11:09 ` Gerd Hoffmann 0 siblings, 1 reply; 12+ messages in thread From: Gerd Hoffmann @ 2015-06-05 11:01 UTC (permalink / raw) To: Paolo Bonzini; +Cc: qemu-devel On Fr, 2015-06-05 at 12:20 +0200, Paolo Bonzini wrote: > > On 29/05/2015 12:07, Gerd Hoffmann wrote: > > This adds opengl rendering support to the gtk ui, using egl. > > It's off by default for now, use 'qemu -display gtk,gl=on' > > to play with this. > > > > Note that gtk got native opengl support with release 3.16. > > There most likely will be a separate implementation for 3.16+, > > using the native gtk opengl support. This patch covers older > > versions (and for the time being 3.16 too, hopefully without > > rendering quirks). > > > > Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> > > This unfortunately breaks "-device help" if you do not have an X11 > connection. gtk_init exits the program. Ah, *this* is where the libvirt breakage comes from. Was about to bisect that one, can stop now ;) I'll have a look ASAP. cheers, Gerd ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PULL 4/5] gtk: add opengl support, using egl 2015-06-05 11:01 ` Gerd Hoffmann @ 2015-06-05 11:09 ` Gerd Hoffmann 2015-06-05 12:50 ` Gerd Hoffmann 0 siblings, 1 reply; 12+ messages in thread From: Gerd Hoffmann @ 2015-06-05 11:09 UTC (permalink / raw) To: Paolo Bonzini; +Cc: qemu-devel > > This unfortunately breaks "-device help" if you do not have an X11 > > connection. gtk_init exits the program. > > Ah, *this* is where the libvirt breakage comes from. Was about to > bisect that one, can stop now ;) Hmm, no, there seems to be more. Patch sent for the gtk breakage. cheers, Gerd ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PULL 4/5] gtk: add opengl support, using egl 2015-06-05 11:09 ` Gerd Hoffmann @ 2015-06-05 12:50 ` Gerd Hoffmann 2015-06-08 12:57 ` Markus Armbruster 0 siblings, 1 reply; 12+ messages in thread From: Gerd Hoffmann @ 2015-06-05 12:50 UTC (permalink / raw) To: Paolo Bonzini, Markus Armbruster; +Cc: qemu-devel On Fr, 2015-06-05 at 13:09 +0200, Gerd Hoffmann wrote: > > > This unfortunately breaks "-device help" if you do not have an X11 > > > connection. gtk_init exits the program. > > > > Ah, *this* is where the libvirt breakage comes from. Was about to > > bisect that one, can stop now ;) > > Hmm, no, there seems to be more. nilsson kraxel ~/projects/qemu (master)# virsh start fedora-org-base error: Failed to start domain fedora-org-base error: internal error: unable to execute QEMU command 'qmp_capabilities': QMP input object member 'id' is unexpected Bisected to: 65207c5 monitor: Drop broken, unused asynchronous command interface Possibly related: Updated libvirt this morning, to libvirt-1.2.15-2.el7.x86_64 cheers, Gerd ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PULL 4/5] gtk: add opengl support, using egl 2015-06-05 12:50 ` Gerd Hoffmann @ 2015-06-08 12:57 ` Markus Armbruster 0 siblings, 0 replies; 12+ messages in thread From: Markus Armbruster @ 2015-06-08 12:57 UTC (permalink / raw) To: Gerd Hoffmann; +Cc: Paolo Bonzini, qemu-devel Gerd Hoffmann <kraxel@redhat.com> writes: > On Fr, 2015-06-05 at 13:09 +0200, Gerd Hoffmann wrote: >> > > This unfortunately breaks "-device help" if you do not have an X11 >> > > connection. gtk_init exits the program. >> > >> > Ah, *this* is where the libvirt breakage comes from. Was about to >> > bisect that one, can stop now ;) >> >> Hmm, no, there seems to be more. > > nilsson kraxel ~/projects/qemu (master)# virsh start fedora-org-base > error: Failed to start domain fedora-org-base > error: internal error: unable to execute QEMU command > qmp_capabilities': QMP input object member 'id' is unexpected > > Bisected to: 65207c5 monitor: Drop broken, unused asynchronous command interface > > Possibly related: Updated libvirt this morning, to libvirt-1.2.15-2.el7.x86_64 Fixed in current master: commit 779cec4. Sorry for the inconvenience! ^ permalink raw reply [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 5/5] gtk: Replace gdk_cursor_new() 2015-05-29 10:07 [Qemu-devel] [PULL 0/5] gtk: add opengl rendering support Gerd Hoffmann ` (3 preceding siblings ...) 2015-05-29 10:07 ` [Qemu-devel] [PULL 4/5] gtk: add opengl support, using egl Gerd Hoffmann @ 2015-05-29 10:07 ` Gerd Hoffmann 2015-05-29 14:31 ` [Qemu-devel] [PULL 0/5] gtk: add opengl rendering support Peter Maydell 5 siblings, 0 replies; 12+ messages in thread From: Gerd Hoffmann @ 2015-05-29 10:07 UTC (permalink / raw) To: qemu-devel; +Cc: Gerd Hoffmann, Max Reitz From: Max Reitz <mreitz@redhat.com> gdk_cursor_new() has been deprecated in GTK 3.16, it is recommended to use gdk_cursor_new_for_display() instead, so do that. Signed-off-by: Max Reitz <mreitz@redhat.com> Reviewed-by: Cole Robinson <crobinso@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- ui/gtk.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ui/gtk.c b/ui/gtk.c index 2477e37..126326a 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -1921,6 +1921,7 @@ void gtk_display_init(DisplayState *ds, bool full_screen, bool grab_on_hover) { GtkDisplayState *s = g_malloc0(sizeof(*s)); char *filename; + GdkDisplay *window_display; s->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); #if GTK_CHECK_VERSION(3, 2, 0) @@ -1937,7 +1938,9 @@ void gtk_display_init(DisplayState *ds, bool full_screen, bool grab_on_hover) bindtextdomain("qemu", CONFIG_QEMU_LOCALEDIR); textdomain("qemu"); - s->null_cursor = gdk_cursor_new(GDK_BLANK_CURSOR); + window_display = gtk_widget_get_display(s->window); + s->null_cursor = gdk_cursor_new_for_display(window_display, + GDK_BLANK_CURSOR); s->mouse_mode_notifier.notify = gd_mouse_mode_change; qemu_add_mouse_mode_change_notifier(&s->mouse_mode_notifier); -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PULL 0/5] gtk: add opengl rendering support. 2015-05-29 10:07 [Qemu-devel] [PULL 0/5] gtk: add opengl rendering support Gerd Hoffmann ` (4 preceding siblings ...) 2015-05-29 10:07 ` [Qemu-devel] [PULL 5/5] gtk: Replace gdk_cursor_new() Gerd Hoffmann @ 2015-05-29 14:31 ` Peter Maydell 5 siblings, 0 replies; 12+ messages in thread From: Peter Maydell @ 2015-05-29 14:31 UTC (permalink / raw) To: Gerd Hoffmann; +Cc: QEMU Developers On 29 May 2015 at 11:07, Gerd Hoffmann <kraxel@redhat.com> wrote: > Hi, > > Here is the pull to add opengl support to the gtk ui. > > please pull, > Gerd > > The following changes since commit ce0274f730eacbd24c706523ddbbabb6b95d0659: > > Revert "gdbstub: Do not kill target in system emulation mode" (2015-05-28 16:57:35 +0100) > > are available in the git repository at: > > git://git.kraxel.org/qemu tags/pull-gtk-20150529-1 > > for you to fetch changes up to 63c67b6d4462b6589b371d55e3740e9f0dba3281: > > gtk: Replace gdk_cursor_new() (2015-05-29 11:43:29 +0200) > > ---------------------------------------------------------------- > gtk: add opengl rendering support. > small bugfixes for gtk and opengl ui code. > > ---------------------------------------------------------------- Applied, thanks. -- PMM ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2015-06-08 12:57 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-05-29 10:07 [Qemu-devel] [PULL 0/5] gtk: add opengl rendering support Gerd Hoffmann 2015-05-29 10:07 ` [Qemu-devel] [PULL 1/5] ui: use libexpoxy Gerd Hoffmann 2015-05-29 10:07 ` [Qemu-devel] [PULL 2/5] ui: shader.h protect against double inclusion Gerd Hoffmann 2015-05-29 10:07 ` [Qemu-devel] [PULL 3/5] ui: add egl-helpers Gerd Hoffmann 2015-05-29 10:07 ` [Qemu-devel] [PULL 4/5] gtk: add opengl support, using egl Gerd Hoffmann 2015-06-05 10:20 ` Paolo Bonzini 2015-06-05 11:01 ` Gerd Hoffmann 2015-06-05 11:09 ` Gerd Hoffmann 2015-06-05 12:50 ` Gerd Hoffmann 2015-06-08 12:57 ` Markus Armbruster 2015-05-29 10:07 ` [Qemu-devel] [PULL 5/5] gtk: Replace gdk_cursor_new() Gerd Hoffmann 2015-05-29 14:31 ` [Qemu-devel] [PULL 0/5] gtk: add opengl rendering support Peter Maydell
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.