提交 9d8256eb 编写于 作者: M Marc-André Lureau 提交者: Gerd Hoffmann

virgl: pass whole GL scanout dimensions

Spice client needs the whole GL texture dimension to be able to show a
scanout with a monitor offset (different than +0+0).

Furthermore, this fixes a crash when calling surface_{width,height}()
after dpy_gfx_replace_surface(con, NULL) was called in
virgl_cmd_set_scanout()
Signed-off-by: NMarc-André Lureau <marcandre.lureau@redhat.com>
Message-id: 1465911849-30423-4-git-send-email-marcandre.lureau@redhat.com
Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
上级 c61d8126
...@@ -171,13 +171,14 @@ static void virgl_cmd_set_scanout(VirtIOGPU *g, ...@@ -171,13 +171,14 @@ static void virgl_cmd_set_scanout(VirtIOGPU *g,
virgl_renderer_force_ctx_0(); virgl_renderer_force_ctx_0();
dpy_gl_scanout(g->scanout[ss.scanout_id].con, info.tex_id, dpy_gl_scanout(g->scanout[ss.scanout_id].con, info.tex_id,
info.flags & 1 /* FIXME: Y_0_TOP */, info.flags & 1 /* FIXME: Y_0_TOP */,
info.width, info.height,
ss.r.x, ss.r.y, ss.r.width, ss.r.height); ss.r.x, ss.r.y, ss.r.width, ss.r.height);
} else { } else {
if (ss.scanout_id != 0) { if (ss.scanout_id != 0) {
dpy_gfx_replace_surface(g->scanout[ss.scanout_id].con, NULL); dpy_gfx_replace_surface(g->scanout[ss.scanout_id].con, NULL);
} }
dpy_gl_scanout(g->scanout[ss.scanout_id].con, 0, false, dpy_gl_scanout(g->scanout[ss.scanout_id].con, 0, false,
0, 0, 0, 0); 0, 0, 0, 0, 0, 0);
} }
g->scanout[ss.scanout_id].resource_id = ss.resource_id; g->scanout[ss.scanout_id].resource_id = ss.resource_id;
} }
...@@ -580,7 +581,7 @@ void virtio_gpu_virgl_reset(VirtIOGPU *g) ...@@ -580,7 +581,7 @@ void virtio_gpu_virgl_reset(VirtIOGPU *g)
if (i != 0) { if (i != 0) {
dpy_gfx_replace_surface(g->scanout[i].con, NULL); dpy_gfx_replace_surface(g->scanout[i].con, NULL);
} }
dpy_gl_scanout(g->scanout[i].con, 0, false, 0, 0, 0, 0); dpy_gl_scanout(g->scanout[i].con, 0, false, 0, 0, 0, 0, 0, 0);
} }
} }
......
...@@ -217,6 +217,7 @@ typedef struct DisplayChangeListenerOps { ...@@ -217,6 +217,7 @@ typedef struct DisplayChangeListenerOps {
void (*dpy_gl_scanout)(DisplayChangeListener *dcl, void (*dpy_gl_scanout)(DisplayChangeListener *dcl,
uint32_t backing_id, bool backing_y_0_top, 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); uint32_t x, uint32_t y, uint32_t w, uint32_t h);
void (*dpy_gl_update)(DisplayChangeListener *dcl, void (*dpy_gl_update)(DisplayChangeListener *dcl,
uint32_t x, uint32_t y, uint32_t w, uint32_t h); uint32_t x, uint32_t y, uint32_t w, uint32_t h);
...@@ -285,6 +286,7 @@ bool dpy_gfx_check_format(QemuConsole *con, ...@@ -285,6 +286,7 @@ bool dpy_gfx_check_format(QemuConsole *con,
void dpy_gl_scanout(QemuConsole *con, void dpy_gl_scanout(QemuConsole *con,
uint32_t backing_id, bool backing_y_0_top, 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); uint32_t x, uint32_t y, uint32_t w, uint32_t h);
void dpy_gl_update(QemuConsole *con, void dpy_gl_update(QemuConsole *con,
uint32_t x, uint32_t y, uint32_t w, uint32_t h); uint32_t x, uint32_t y, uint32_t w, uint32_t h);
......
...@@ -101,6 +101,7 @@ QEMUGLContext gd_egl_create_context(DisplayChangeListener *dcl, ...@@ -101,6 +101,7 @@ QEMUGLContext gd_egl_create_context(DisplayChangeListener *dcl,
QEMUGLParams *params); QEMUGLParams *params);
void gd_egl_scanout(DisplayChangeListener *dcl, void gd_egl_scanout(DisplayChangeListener *dcl,
uint32_t backing_id, bool backing_y_0_top, 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 x, uint32_t y,
uint32_t w, uint32_t h); uint32_t w, uint32_t h);
void gd_egl_scanout_flush(DisplayChangeListener *dcl, void gd_egl_scanout_flush(DisplayChangeListener *dcl,
......
...@@ -64,6 +64,7 @@ QEMUGLContext sdl2_gl_get_current_context(DisplayChangeListener *dcl); ...@@ -64,6 +64,7 @@ QEMUGLContext sdl2_gl_get_current_context(DisplayChangeListener *dcl);
void sdl2_gl_scanout(DisplayChangeListener *dcl, void sdl2_gl_scanout(DisplayChangeListener *dcl,
uint32_t backing_id, bool backing_y_0_top, 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 x, uint32_t y,
uint32_t w, uint32_t h); uint32_t w, uint32_t h);
void sdl2_gl_scanout_flush(DisplayChangeListener *dcl, void sdl2_gl_scanout_flush(DisplayChangeListener *dcl,
......
...@@ -1709,11 +1709,13 @@ QEMUGLContext dpy_gl_ctx_get_current(QemuConsole *con) ...@@ -1709,11 +1709,13 @@ QEMUGLContext dpy_gl_ctx_get_current(QemuConsole *con)
void dpy_gl_scanout(QemuConsole *con, void dpy_gl_scanout(QemuConsole *con,
uint32_t backing_id, bool backing_y_0_top, 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 width, uint32_t height) uint32_t x, uint32_t y, uint32_t width, uint32_t height)
{ {
assert(con->gl); assert(con->gl);
con->gl->ops->dpy_gl_scanout(con->gl, backing_id, con->gl->ops->dpy_gl_scanout(con->gl, backing_id,
backing_y_0_top, backing_y_0_top,
backing_width, backing_height,
x, y, width, height); x, y, width, height);
} }
......
...@@ -172,6 +172,7 @@ QEMUGLContext gd_egl_create_context(DisplayChangeListener *dcl, ...@@ -172,6 +172,7 @@ QEMUGLContext gd_egl_create_context(DisplayChangeListener *dcl,
void gd_egl_scanout(DisplayChangeListener *dcl, void gd_egl_scanout(DisplayChangeListener *dcl,
uint32_t backing_id, bool backing_y_0_top, 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 x, uint32_t y,
uint32_t w, uint32_t h) uint32_t w, uint32_t h)
{ {
......
...@@ -186,6 +186,7 @@ QEMUGLContext sdl2_gl_get_current_context(DisplayChangeListener *dcl) ...@@ -186,6 +186,7 @@ QEMUGLContext sdl2_gl_get_current_context(DisplayChangeListener *dcl)
void sdl2_gl_scanout(DisplayChangeListener *dcl, void sdl2_gl_scanout(DisplayChangeListener *dcl,
uint32_t backing_id, bool backing_y_0_top, 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 x, uint32_t y,
uint32_t w, uint32_t h) uint32_t w, uint32_t h)
{ {
......
...@@ -861,6 +861,8 @@ static QEMUGLContext qemu_spice_gl_create_context(DisplayChangeListener *dcl, ...@@ -861,6 +861,8 @@ static QEMUGLContext qemu_spice_gl_create_context(DisplayChangeListener *dcl,
static void qemu_spice_gl_scanout(DisplayChangeListener *dcl, static void qemu_spice_gl_scanout(DisplayChangeListener *dcl,
uint32_t tex_id, uint32_t tex_id,
bool y_0_top, bool y_0_top,
uint32_t backing_width,
uint32_t backing_height,
uint32_t x, uint32_t y, uint32_t x, uint32_t y,
uint32_t w, uint32_t h) uint32_t w, uint32_t h)
{ {
...@@ -883,9 +885,7 @@ static void qemu_spice_gl_scanout(DisplayChangeListener *dcl, ...@@ -883,9 +885,7 @@ static void qemu_spice_gl_scanout(DisplayChangeListener *dcl,
assert(!tex_id || fd >= 0); assert(!tex_id || fd >= 0);
/* note: spice server will close the fd */ /* note: spice server will close the fd */
spice_qxl_gl_scanout(&ssd->qxl, fd, spice_qxl_gl_scanout(&ssd->qxl, fd, backing_width, backing_height,
surface_width(ssd->ds),
surface_height(ssd->ds),
stride, fourcc, y_0_top); stride, fourcc, y_0_top);
qemu_spice_gl_monitor_config(ssd, x, y, w, h); qemu_spice_gl_monitor_config(ssd, x, y, w, h);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册