Since 2.8, QEMU no longer creates QXL primary surfaces when using GL. This change broke client-side mouse mode, because Spice server relies on having a primary surface. When GL is enabled, use GL scanout informations. Mouse mode is always client when GL surfaces are used. This patch and most of the message are based on a patch from Marc-André Lureau, just moving responsibility from reds to RedQxl. Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/red-qxl.c | 31 +++++++++++++++++++++---------- server/red-qxl.h | 3 +-- server/reds.c | 3 +-- 3 files changed, 23 insertions(+), 14 deletions(-) Changes since v2: - call reds_update_client_mouse_allowed from spice_qxl_gl_scanout; - fix some typos; - update a comment in code. diff --git a/server/red-qxl.c b/server/red-qxl.c index 7dc13bbdc..336bb2e68 100644 --- a/server/red-qxl.c +++ b/server/red-qxl.c @@ -841,6 +841,8 @@ void spice_qxl_gl_scanout(QXLInstance *qxl, /* FIXME: find a way to coallesce all pending SCANOUTs */ dispatcher_send_message(qxl_state->dispatcher, RED_WORKER_MESSAGE_GL_SCANOUT, &payload); + + reds_update_client_mouse_allowed(qxl_state->reds); } SPICE_GNUC_VISIBLE @@ -964,20 +966,29 @@ void red_qxl_clear_pending(QXLState *qxl_state, int pending) clear_bit(pending, &qxl_state->pending); } -gboolean red_qxl_get_primary_active(QXLInstance *qxl) +bool red_qxl_get_allow_client_mouse(QXLInstance *qxl, int *x_res, int *y_res, int *allow_now) { - return qxl->st->primary_active; -} + // try to get resolution when 3D enabled, since qemu did not create QXL primary surface + SpiceMsgDisplayGlScanoutUnix *gl; + if ((gl = red_qxl_get_gl_scanout(qxl))) { + *x_res = gl->width; + *y_res = gl->height; + *allow_now = TRUE; + red_qxl_put_gl_scanout(qxl, gl); + return true; + } + + // check for 2D + if (!qxl->st->primary_active) { + return false; + } -gboolean red_qxl_get_allow_client_mouse(QXLInstance *qxl, gint *x_res, gint *y_res) -{ if (qxl->st->use_hardware_cursor) { - if (x_res) - *x_res = qxl->st->x_res; - if (y_res) - *y_res = qxl->st->y_res; + *x_res = qxl->st->x_res; + *y_res = qxl->st->y_res; } - return qxl->st->use_hardware_cursor; + *allow_now = qxl->st->use_hardware_cursor; + return true; } void red_qxl_on_ic_change(QXLInstance *qxl, SpiceImageCompression ic) diff --git a/server/red-qxl.h b/server/red-qxl.h index 51ec14562..6014d32a1 100644 --- a/server/red-qxl.h +++ b/server/red-qxl.h @@ -34,8 +34,7 @@ void red_qxl_stop(QXLInstance *qxl); void red_qxl_start(QXLInstance *qxl); uint32_t red_qxl_get_ram_size(QXLInstance *qxl); gboolean red_qxl_client_monitors_config(QXLInstance *qxl, VDAgentMonitorsConfig *monitors_config); -gboolean red_qxl_get_primary_active(QXLInstance *qxl); -gboolean red_qxl_get_allow_client_mouse(QXLInstance *qxl, gint *x_res, gint *y_res); +bool red_qxl_get_allow_client_mouse(QXLInstance *qxl, int *x_res, int *y_res, int *allow_now); SpiceMsgDisplayGlScanoutUnix *red_qxl_get_gl_scanout(QXLInstance *qxl); void red_qxl_put_gl_scanout(QXLInstance *qxl, SpiceMsgDisplayGlScanoutUnix *scanout); void red_qxl_gl_draw_async_complete(QXLInstance *qxl); diff --git a/server/reds.c b/server/reds.c index ddc933524..12c33570a 100644 --- a/server/reds.c +++ b/server/reds.c @@ -4376,8 +4376,7 @@ void reds_update_client_mouse_allowed(RedsState *reds) allow_now = TRUE; FOREACH_QXL_INSTANCE(reds, qxl) { - if (red_qxl_get_primary_active(qxl)) { - allow_now = red_qxl_get_allow_client_mouse(qxl, &x_res, &y_res); + if (red_qxl_get_allow_client_mouse(qxl, &x_res, &y_res, &allow_now)) { break; } } -- 2.13.6 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel