From: Marc-André Lureau <marcandre.lureau@xxxxxxxxxx> Allow to set whether GL scanout capability is set, at the session level. SPICE_DISABLE_GL_SCANOUT environment variable can be used for tweaking and testing. Note: the server doesn't seem to handle this case very nicely yet: the simplest solution could perhaps be to disconnect the client, instead of having it hang waiting for a display. Signed-off-by: Marc-André Lureau <marcandre.lureau@xxxxxxxxxx> --- src/channel-display.c | 7 ++++--- src/spice-session-priv.h | 1 + src/spice-session.c | 43 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/channel-display.c b/src/channel-display.c index bec72ab..581ca80 100644 --- a/src/channel-display.c +++ b/src/channel-display.c @@ -845,6 +845,7 @@ static SpiceImageSurfacesOps image_surfaces_ops = { static void spice_display_channel_set_capabilities(SpiceChannel *channel) { + SpiceSession *s = spice_channel_get_session(channel); guint i; spice_channel_set_capability(channel, SPICE_DISPLAY_CAP_SIZED_STREAM); @@ -857,9 +858,9 @@ static void spice_display_channel_set_capabilities(SpiceChannel *channel) if (SPICE_DISPLAY_CHANNEL(channel)->priv->enable_adaptive_streaming) { spice_channel_set_capability(channel, SPICE_DISPLAY_CAP_STREAM_REPORT); } -#ifdef G_OS_UNIX - spice_channel_set_capability(channel, SPICE_DISPLAY_CAP_GL_SCANOUT); -#endif + if (spice_session_get_gl_scanout_enabled(s)) { + spice_channel_set_capability(channel, SPICE_DISPLAY_CAP_GL_SCANOUT); + } spice_channel_set_capability(channel, SPICE_DISPLAY_CAP_MULTI_CODEC); #ifdef HAVE_BUILTIN_MJPEG spice_channel_set_capability(channel, SPICE_DISPLAY_CAP_CODEC_MJPEG); diff --git a/src/spice-session-priv.h b/src/spice-session-priv.h index 0190c1f..6ece7e0 100644 --- a/src/spice-session-priv.h +++ b/src/spice-session-priv.h @@ -89,6 +89,7 @@ void spice_session_sync_playback_latency(SpiceSession *session); gboolean spice_session_get_audio_enabled(SpiceSession *session); gboolean spice_session_get_smartcard_enabled(SpiceSession *session); gboolean spice_session_get_usbredir_enabled(SpiceSession *session); +gboolean spice_session_get_gl_scanout_enabled(SpiceSession *session); const guint8* spice_session_get_webdav_magic(SpiceSession *session); PhodavServer *spice_session_get_webdav_server(SpiceSession *session); diff --git a/src/spice-session.c b/src/spice-session.c index a2ed401..74c1f6e 100644 --- a/src/spice-session.c +++ b/src/spice-session.c @@ -61,6 +61,9 @@ struct _SpiceSessionPrivate { /* whether to enable smartcard event forwarding to the server */ gboolean smartcard; + /* whether to enable GL scanout */ + gboolean gl_scanout; + /* list of certificates to use for the software smartcard reader if * enabled. For now, it has to contain exactly 3 certificates for * the software reader to be functional @@ -191,6 +194,7 @@ enum { PROP_USERNAME, PROP_UNIX_PATH, PROP_PREF_COMPRESSION, + PROP_GL_SCANOUT, }; /* signals */ @@ -699,6 +703,9 @@ static void spice_session_get_property(GObject *gobject, case PROP_PREF_COMPRESSION: g_value_set_enum(value, s->preferred_compression); break; + case PROP_GL_SCANOUT: + g_value_set_boolean(value, s->gl_scanout); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec); break; @@ -838,6 +845,13 @@ static void spice_session_set_property(GObject *gobject, case PROP_PREF_COMPRESSION: s->preferred_compression = g_value_get_enum(value); break; + case PROP_GL_SCANOUT: +#ifdef G_OS_UNIX + s->gl_scanout = g_value_get_boolean(value); +#else + g_warning("SpiceSession:gl-scanout is only available on Unix"); +#endif + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec); break; @@ -1478,6 +1492,35 @@ static void spice_session_class_init(SpiceSessionClass *klass) SPICE_IMAGE_COMPRESSION_INVALID, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * SpiceSession:gl-scanout: + * + * Whether to enable gl-scanout (Unix only). Set to TRUE by + * default on EGL-enabled host, unless SPICE_DISABLE_GL_SCANOUT + * environment variable is set. + * + * Since: 0.36 + **/ + g_object_class_install_property + (gobject_class, PROP_GL_SCANOUT, + g_param_spec_boolean("gl-scanout", + "Enable GL scanout support", + "Enable GL scanout support", +#ifdef HAVE_EGL + g_getenv("SPICE_DISABLE_GL_SCANOUT") == NULL, + G_PARAM_CONSTRUCT | +#else + false, +#endif + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); +} + +G_GNUC_INTERNAL +gboolean spice_session_get_gl_scanout_enabled(SpiceSession *session) +{ + return session->priv->gl_scanout; } /* ------------------------------------------------------------------ */ -- 2.20.1.2.gb21ebb671b _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel