Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/kraxel/tags/ui-20180427-pull-re…
Browse files Browse the repository at this point in the history
…quest' into staging

vnc: fix use-after-free.
sdl2: gles support.
vfio-display: add reset support.

# gpg: Signature made Fri 27 Apr 2018 10:54:17 BST
# gpg:                using RSA key 4CB6D8EED3E87138
# gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>"
# gpg:                 aka "Gerd Hoffmann <gerd@kraxel.org>"
# gpg:                 aka "Gerd Hoffmann (private) <kraxel@gmail.com>"
# Primary key fingerprint: A032 8CFF B93A 17A7 9901  FE7D 4CB6 D8EE D3E8 7138

* remotes/kraxel/tags/ui-20180427-pull-request:
  ui: introduce vfio_display_reset
  console: introduce dpy_gfx_update_full
  sdl: Allow OpenGL ES context creation
  sdl: Move DisplayOptions global to sdl2_console
  qapi: Parameter gl of DisplayType now accept an enum
  vnc: fix use-after-free

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
pm215 committed Apr 27, 2018
2 parents dcbd26f + 8983e3e commit 10f4718
Show file tree
Hide file tree
Showing 12 changed files with 82 additions and 16 deletions.
11 changes: 11 additions & 0 deletions hw/vfio/display.c
Expand Up @@ -198,6 +198,17 @@ static void vfio_display_dmabuf_exit(VFIODisplay *dpy)
}

/* ---------------------------------------------------------------------- */
void vfio_display_reset(VFIOPCIDevice *vdev)
{
if (!vdev || !vdev->dpy || !vdev->dpy->con ||
!vdev->dpy->dmabuf.primary) {
return;
}

dpy_gl_scanout_disable(vdev->dpy->con);
vfio_display_dmabuf_exit(vdev->dpy);
dpy_gfx_update_full(vdev->dpy->con);
}

static void vfio_display_region_update(void *opaque)
{
Expand Down
4 changes: 4 additions & 0 deletions hw/vfio/pci.c
Expand Up @@ -3103,6 +3103,10 @@ static void vfio_pci_reset(DeviceState *dev)

vfio_pci_pre_reset(vdev);

if (vdev->display != ON_OFF_AUTO_OFF) {
vfio_display_reset(vdev);
}

if (vdev->resetfn && !vdev->resetfn(vdev)) {
goto post_reset;
}
Expand Down
1 change: 1 addition & 0 deletions hw/vfio/pci.h
Expand Up @@ -176,6 +176,7 @@ int vfio_pci_igd_opregion_init(VFIOPCIDevice *vdev,
struct vfio_region_info *info,
Error **errp);

void vfio_display_reset(VFIOPCIDevice *vdev);
int vfio_display_probe(VFIOPCIDevice *vdev, Error **errp);
void vfio_display_finalize(VFIOPCIDevice *vdev);

Expand Down
1 change: 1 addition & 0 deletions include/ui/console.h
Expand Up @@ -291,6 +291,7 @@ bool dpy_ui_info_supported(QemuConsole *con);
int dpy_set_ui_info(QemuConsole *con, QemuUIInfo *info);

void dpy_gfx_update(QemuConsole *con, int x, int y, int w, int h);
void dpy_gfx_update_full(QemuConsole *con);
void dpy_gfx_replace_surface(QemuConsole *con,
DisplaySurface *surface);
void dpy_text_cursor(QemuConsole *con, int x, int y);
Expand Down
1 change: 1 addition & 0 deletions include/ui/sdl2.h
Expand Up @@ -14,6 +14,7 @@
struct sdl2_console {
DisplayChangeListener dcl;
DisplaySurface *surface;
DisplayOptions *opts;
SDL_Texture *texture;
SDL_Window *real_window;
SDL_Renderer *real_renderer;
Expand Down
20 changes: 19 additions & 1 deletion qapi/ui.json
Expand Up @@ -1019,6 +1019,24 @@
{ 'struct' : 'DisplayGTK',
'data' : { '*grab-on-hover' : 'bool' } }

##
# @DisplayGLMode:
#
# Display OpenGL mode.
#
# @off: Disable OpenGL (default).
# @on: Use OpenGL, pick context type automatically.
# Would better be named 'auto' but is called 'on' for backward
# compatibility with bool type.
# @core: Use OpenGL with Core (desktop) Context.
# @es: Use OpenGL with ES (embedded systems) Context.
#
# Since: 2.13
#
##
{ 'enum' : 'DisplayGLMode',
'data' : [ 'off', 'on', 'core', 'es' ] }

##
# @DisplayType:
#
Expand Down Expand Up @@ -1048,7 +1066,7 @@
'base' : { 'type' : 'DisplayType',
'*full-screen' : 'bool',
'*window-close' : 'bool',
'*gl' : 'bool' },
'*gl' : 'DisplayGLMode' },
'discriminator' : 'type',
'data' : { 'default' : 'DisplayNoOpts',
'none' : 'DisplayNoOpts',
Expand Down
2 changes: 1 addition & 1 deletion qemu-options.hx
Expand Up @@ -1240,7 +1240,7 @@ ETEXI
DEF("display", HAS_ARG, QEMU_OPTION_display,
"-display sdl[,frame=on|off][,alt_grab=on|off][,ctrl_grab=on|off]\n"
" [,window_close=on|off][,gl=on|off]\n"
" [,window_close=on|off][,gl=on|core|es|off]\n"
"-display gtk[,grab_on_hover=on|off][,gl=on|off]|\n"
"-display vnc=<display>[,<optargs>]\n"
"-display curses\n"
Expand Down
10 changes: 10 additions & 0 deletions ui/console.c
Expand Up @@ -1574,6 +1574,16 @@ void dpy_gfx_update(QemuConsole *con, int x, int y, int w, int h)
}
}

void dpy_gfx_update_full(QemuConsole *con)
{
if (!con->surface) {
return;
}
dpy_gfx_update(con, 0, 0,
surface_width(con->surface),
surface_height(con->surface));
}

void dpy_gfx_replace_surface(QemuConsole *con,
DisplaySurface *surface)
{
Expand Down
19 changes: 17 additions & 2 deletions ui/sdl2-gl.c
Expand Up @@ -140,12 +140,27 @@ QEMUGLContext sdl2_gl_create_context(DisplayChangeListener *dcl,
SDL_GL_MakeCurrent(scon->real_window, scon->winctx);

SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 1);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,
SDL_GL_CONTEXT_PROFILE_CORE);
if (scon->opts->gl == DISPLAYGL_MODE_ON ||
scon->opts->gl == DISPLAYGL_MODE_CORE) {
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,
SDL_GL_CONTEXT_PROFILE_CORE);
} else if (scon->opts->gl == DISPLAYGL_MODE_ES) {
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,
SDL_GL_CONTEXT_PROFILE_ES);
}
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, params->major_ver);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, params->minor_ver);

ctx = SDL_GL_CreateContext(scon->real_window);

/* If SDL fail to create a GL context and we use the "on" flag,
* then try to fallback to GLES.
*/
if (!ctx && scon->opts->gl == DISPLAYGL_MODE_ON) {
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,
SDL_GL_CONTEXT_PROFILE_ES);
ctx = SDL_GL_CreateContext(scon->real_window);
}
return (QEMUGLContext)ctx;
}

Expand Down
10 changes: 5 additions & 5 deletions ui/sdl2.c
Expand Up @@ -32,7 +32,6 @@

static int sdl2_num_outputs;
static struct sdl2_console *sdl2_console;
static DisplayOptions *opts;

static SDL_Surface *guest_sprite_surface;
static int gui_grab; /* if true, all keyboard/mouse events are grabbed */
Expand Down Expand Up @@ -566,7 +565,7 @@ static void handle_windowevent(SDL_Event *ev)
break;
case SDL_WINDOWEVENT_CLOSE:
if (qemu_console_is_graphic(scon->dcl.con)) {
if (opts->has_window_close && !opts->window_close) {
if (scon->opts->has_window_close && !scon->opts->window_close) {
allow_close = false;
}
if (allow_close) {
Expand Down Expand Up @@ -613,7 +612,7 @@ void sdl2_poll_events(struct sdl2_console *scon)
handle_textinput(ev);
break;
case SDL_QUIT:
if (opts->has_window_close && !opts->window_close) {
if (scon->opts->has_window_close && !scon->opts->window_close) {
allow_close = false;
}
if (allow_close) {
Expand Down Expand Up @@ -770,7 +769,6 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
SDL_SysWMinfo info;

assert(o->type == DISPLAY_TYPE_SDL);
opts = o;

#ifdef __linux__
/* on Linux, SDL may use fbcon|directfb|svgalib when run without
Expand Down Expand Up @@ -806,6 +804,7 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
return;
}
sdl2_console = g_new0(struct sdl2_console, sdl2_num_outputs);
sdl2_console->opts = o;
for (i = 0; i < sdl2_num_outputs; i++) {
QemuConsole *con = qemu_console_lookup_by_index(i);
assert(con != NULL);
Expand Down Expand Up @@ -846,7 +845,8 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
g_free(filename);
}

if (opts->has_full_screen && opts->full_screen) {
if (sdl2_console->opts->has_full_screen &&
sdl2_console->opts->full_screen) {
gui_fullscreen = 1;
sdl_grab_start(0);
}
Expand Down
5 changes: 3 additions & 2 deletions ui/vnc.c
Expand Up @@ -1539,13 +1539,14 @@ gboolean vnc_client_io(QIOChannel *ioc G_GNUC_UNUSED,
VncState *vs = opaque;
if (condition & G_IO_IN) {
if (vnc_client_read(vs) < 0) {
goto end;
/* vs is free()ed here */
return TRUE;
}
}
if (condition & G_IO_OUT) {
vnc_client_write(vs);
}
end:

if (vs->disconnecting) {
if (vs->ioc_tag != 0) {
g_source_remove(vs->ioc_tag);
Expand Down
14 changes: 9 additions & 5 deletions vl.c
Expand Up @@ -2143,9 +2143,13 @@ static void parse_display(const char *p)
opts = nextopt;
dpy.has_gl = true;
if (strstart(opts, "on", &nextopt)) {
dpy.gl = true;
dpy.gl = DISPLAYGL_MODE_ON;
} else if (strstart(opts, "core", &nextopt)) {
dpy.gl = DISPLAYGL_MODE_CORE;
} else if (strstart(opts, "es", &nextopt)) {
dpy.gl = DISPLAYGL_MODE_ES;
} else if (strstart(opts, "off", &nextopt)) {
dpy.gl = false;
dpy.gl = DISPLAYGL_MODE_OFF;
} else {
goto invalid_sdl_args;
}
Expand Down Expand Up @@ -2186,9 +2190,9 @@ static void parse_display(const char *p)
opts = nextopt;
dpy.has_gl = true;
if (strstart(opts, "on", &nextopt)) {
dpy.gl = true;
dpy.gl = DISPLAYGL_MODE_ON;
} else if (strstart(opts, "off", &nextopt)) {
dpy.gl = false;
dpy.gl = DISPLAYGL_MODE_OFF;
} else {
goto invalid_gtk_args;
}
Expand Down Expand Up @@ -4356,7 +4360,7 @@ int main(int argc, char **argv, char **envp)
qemu_display_early_init(&dpy);
qemu_console_early_init();

if (dpy.has_gl && dpy.gl && display_opengl == 0) {
if (dpy.has_gl && dpy.gl != DISPLAYGL_MODE_OFF && display_opengl == 0) {
#if defined(CONFIG_OPENGL)
error_report("OpenGL is not supported by the display");
#else
Expand Down

0 comments on commit 10f4718

Please sign in to comment.