aboutsummaryrefslogtreecommitdiff
path: root/ui/sdl2.c
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2014-11-11 16:54:45 +0100
committerGerd Hoffmann <kraxel@redhat.com>2015-05-05 10:48:26 +0200
commit0b71a5d5caa4f709d37fa1d7786dffc2c94f8414 (patch)
treedb4697889cfdac1fae3cf5a42055cb21cd08aa72 /ui/sdl2.c
parent19dadfccd0124804e2790e7cb075c9df7cd3154f (diff)
downloadqemu-0b71a5d5caa4f709d37fa1d7786dffc2c94f8414.zip
qemu-0b71a5d5caa4f709d37fa1d7786dffc2c94f8414.tar.gz
qemu-0b71a5d5caa4f709d37fa1d7786dffc2c94f8414.tar.bz2
sdl2: add support for display rendering using opengl.
Add new sdl2-gl.c file, with display rendering functions using opengl. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com>
Diffstat (limited to 'ui/sdl2.c')
-rw-r--r--ui/sdl2.c65
1 files changed, 58 insertions, 7 deletions
diff --git a/ui/sdl2.c b/ui/sdl2.c
index 610ddb0..2d60179 100644
--- a/ui/sdl2.c
+++ b/ui/sdl2.c
@@ -86,6 +86,9 @@ void sdl2_window_create(struct sdl2_console *scon)
surface_height(scon->surface),
flags);
scon->real_renderer = SDL_CreateRenderer(scon->real_window, -1, 0);
+ if (scon->opengl) {
+ scon->winctx = SDL_GL_GetCurrentContext();
+ }
sdl_update_caption(scon);
}
@@ -112,6 +115,17 @@ void sdl2_window_resize(struct sdl2_console *scon)
surface_height(scon->surface));
}
+static void sdl2_redraw(struct sdl2_console *scon)
+{
+ if (scon->opengl) {
+#ifdef CONFIG_OPENGL
+ sdl2_gl_redraw(scon);
+#endif
+ } else {
+ sdl2_2d_redraw(scon);
+ }
+}
+
static void sdl_update_caption(struct sdl2_console *scon)
{
char win_title[1024];
@@ -310,7 +324,7 @@ static void toggle_full_screen(struct sdl2_console *scon)
}
SDL_SetWindowFullscreen(scon->real_window, 0);
}
- sdl2_2d_redraw(scon);
+ sdl2_redraw(scon);
}
static void handle_keydown(SDL_Event *ev)
@@ -358,8 +372,10 @@ static void handle_keydown(SDL_Event *ev)
case SDL_SCANCODE_U:
sdl2_window_destroy(scon);
sdl2_window_create(scon);
- /* re-create texture */
- sdl2_2d_switch(&scon->dcl, scon->surface);
+ if (!scon->opengl) {
+ /* re-create scon->texture */
+ sdl2_2d_switch(&scon->dcl, scon->surface);
+ }
gui_keysym = 1;
break;
#if 0
@@ -378,7 +394,7 @@ static void handle_keydown(SDL_Event *ev)
fprintf(stderr, "%s: scale to %dx%d\n",
__func__, width, height);
sdl_scale(scon, width, height);
- sdl2_2d_redraw(scon);
+ sdl2_redraw(scon);
gui_keysym = 1;
}
#endif
@@ -514,10 +530,10 @@ static void handle_windowevent(SDL_Event *ev)
info.height = ev->window.data2;
dpy_set_ui_info(scon->dcl.con, &info);
}
- sdl2_2d_redraw(scon);
+ sdl2_redraw(scon);
break;
case SDL_WINDOWEVENT_EXPOSED:
- sdl2_2d_redraw(scon);
+ sdl2_redraw(scon);
break;
case SDL_WINDOWEVENT_FOCUS_GAINED:
case SDL_WINDOWEVENT_ENTER:
@@ -671,6 +687,35 @@ static const DisplayChangeListenerOps dcl_2d_ops = {
.dpy_cursor_define = sdl_mouse_define,
};
+#ifdef CONFIG_OPENGL
+static const DisplayChangeListenerOps dcl_gl_ops = {
+ .dpy_name = "sdl2-gl",
+ .dpy_gfx_update = sdl2_gl_update,
+ .dpy_gfx_switch = sdl2_gl_switch,
+ .dpy_gfx_check_format = console_gl_check_format,
+ .dpy_refresh = sdl2_gl_refresh,
+ .dpy_mouse_set = sdl_mouse_warp,
+ .dpy_cursor_define = sdl_mouse_define,
+};
+#endif
+
+void sdl_display_early_init(int opengl)
+{
+ switch (opengl) {
+ case -1: /* default */
+ case 0: /* off */
+ break;
+ case 1: /* on */
+#ifdef CONFIG_OPENGL
+ display_opengl = 1;
+#endif
+ break;
+ default:
+ g_assert_not_reached();
+ break;
+ }
+}
+
void sdl_display_init(DisplayState *ds, int full_screen, int no_frame)
{
int flags;
@@ -716,10 +761,16 @@ void sdl_display_init(DisplayState *ds, int full_screen, int no_frame)
if (!qemu_console_is_graphic(con)) {
sdl2_console[i].hidden = true;
}
+ sdl2_console[i].idx = i;
+#ifdef CONFIG_OPENGL
+ sdl2_console[i].opengl = display_opengl;
+ sdl2_console[i].dcl.ops = display_opengl ? &dcl_gl_ops : &dcl_2d_ops;
+#else
+ sdl2_console[i].opengl = 0;
sdl2_console[i].dcl.ops = &dcl_2d_ops;
+#endif
sdl2_console[i].dcl.con = con;
register_displaychangelistener(&sdl2_console[i].dcl);
- sdl2_console[i].idx = i;
}
/* Load a 32x32x4 image. White pixels are transparent. */