[Spice-devel] [spice-gtk PATCH v2] spice-widget: init egl only after first gl_scanout

Marc-André Lureau mlureau at redhat.com
Wed Jul 27 13:56:07 UTC 2016


Hi

----- 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.

Not sure it's really a big problem since we require GL anyway.

Which system doesn't support egl?

> 
> Move spice_egl_init from drawing_area_realize to gl_scanout.
> Drawing_area_realize is no longer needed.
> ---
> Changes since v1:
>  - changed from recursive call to if check
>  - moved set_egl_enabled(display, true); after initialisation is finished
> ---

Have you checked the behaviour on wayland?

>  src/spice-widget.c | 42 +++++++++++++++++++-----------------------
>  1 file changed, 19 insertions(+), 23 deletions(-)
> 
> diff --git a/src/spice-widget.c b/src/spice-widget.c
> index c7dd553..feb2bcc 100644
> --- a/src/spice-widget.c
> +++ b/src/spice-widget.c
> @@ -563,28 +563,6 @@ gl_area_realize(GtkGLArea *area, gpointer user_data)
>  #endif
>  #endif
>  
> -static void
> -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);
> -    }
> -#endif
> -}
> -
>  static void spice_display_init(SpiceDisplay *display)
>  {
>      GtkWidget *widget = GTK_WIDGET(display);
> @@ -599,7 +577,6 @@ static void spice_display_init(SpiceDisplay *display)
>  
>      g_object_connect(area,
>                       "signal::draw", draw_event, display,
> -                     "signal::realize", drawing_area_realize, display,
>                       NULL);
>      gtk_stack_add_named(d->stack, area, "draw-area");
>      gtk_widget_set_double_buffered(area, true);
> @@ -2633,8 +2610,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__);
> +
> +    if (!d->egl.context_ready) {
> +        if (!spice_egl_init(display, &err)) {
> +            g_critical("egl init failed: %s", err->message);
> +            g_clear_error(&err);
> +        }
> +

Because spice_egl_init() is already called in gl_area_realize in this case.

Furthermore, there is no guarantee that the widget is realized when spice_display_widget_gl_scanout() is called, which would results in other warnings/criticals messages.


> +#ifdef GDK_WINDOWING_X11
> +        if (GDK_IS_X11_DISPLAY(gdk_display_get_default())) {
> +            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