-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 <[email protected]>
- Loading branch information
Showing
6 changed files
with
253 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters