[Spice-devel] [spice-gtk PATCH v2] spice-widget: init egl only after first gl_scanout
Marc-André Lureau
mlureau at redhat.com
Thu Jul 28 12:45:31 UTC 2016
----- Original Message -----
> When using GtkDrawingArea and EGL was not used, it was still initialized.
> This produced warning messages on systems where EGL is not supported.
>
> Move spice_egl_init from drawing_area_realize to gl_scanout.
> ---
> Changes since v2:
> - added drawing_area_realized variable
> - only enable egl after spice-widget is fully realized
> - moved more of the code inside GDK_WINDOWING_X11 guard
> Changes since v1:
> - changed from recursive call to if check
> - moved set_egl_enabled(display, true); after initialisation is finished
> ---
> src/spice-widget-priv.h | 3 +++
> src/spice-widget.c | 34 +++++++++++++++++++++-------------
> 2 files changed, 24 insertions(+), 13 deletions(-)
>
> diff --git a/src/spice-widget-priv.h b/src/spice-widget-priv.h
> index e36baf3..4b905f1 100644
> --- a/src/spice-widget-priv.h
> +++ b/src/spice-widget-priv.h
> @@ -129,6 +129,9 @@ struct _SpiceDisplayPrivate {
> #endif
> #ifndef G_OS_WIN32
> struct {
> +#ifdef GDK_WINDOWING_X11
> + gboolean drawing_area_realized;
> +#endif
There is gtk_widget_get_realized() for that.
The drawing_area_realize() handler could check if there is a gl-scanout already defined on the display channel, to call spice_display_widget_gl_scanout().
> gboolean context_ready;
> gboolean enabled;
> EGLSurface surface;
> diff --git a/src/spice-widget.c b/src/spice-widget.c
> index 9020b07..adbbfd2 100644
> --- a/src/spice-widget.c
> +++ b/src/spice-widget.c
> @@ -568,20 +568,9 @@ drawing_area_realize(GtkWidget *area, gpointer
> user_data)
> {
> #ifdef GDK_WINDOWING_X11
> SpiceDisplay *display = SPICE_DISPLAY(user_data);
> - GError *err = NULL;
> -
> - if (!GDK_IS_X11_DISPLAY(gdk_display_get_default()))
> - return;
>
> - if (!spice_egl_init(display, &err)) {
> - g_critical("egl init failed: %s", err->message);
> - g_clear_error(&err);
> - }
> -
> - if (!spice_egl_realize_display(display, gtk_widget_get_window(area),
> &err)) {
> - g_critical("egl realize failed: %s", err->message);
> - g_clear_error(&err);
> - }
> + if (GDK_IS_X11_DISPLAY(gdk_display_get_default()))
> + display->priv->egl.drawing_area_realized = TRUE;
> #endif
> }
>
> @@ -2662,8 +2651,27 @@ G_GNUC_INTERNAL
> void spice_display_widget_gl_scanout(SpiceDisplay *display)
> {
> SpiceDisplayPrivate *d = display->priv;
> + GError *err = NULL;
>
> SPICE_DEBUG("%s: got scanout", __FUNCTION__);
> +
> +#ifdef GDK_WINDOWING_X11
> + if (GDK_IS_X11_DISPLAY(gdk_display_get_default()) &&
> + !d->egl.context_ready &&
> + d->egl.drawing_area_realized) {
> + if (!spice_egl_init(display, &err)) {
> + g_critical("egl init failed: %s", err->message);
> + g_clear_error(&err);
> + }
> +
> + GtkWidget *area = gtk_stack_get_child_by_name(d->stack,
> "draw-area");
> + if (!spice_egl_realize_display(display, gtk_widget_get_window(area),
> &err)) {
> + g_critical("egl realize failed: %s", err->message);
> + g_clear_error(&err);
> + }
> + }
> +#endif
> +
> set_egl_enabled(display, true);
>
> if (d->egl.context_ready) {
> --
> 2.7.4
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
>
More information about the Spice-devel
mailing list