On Wed, 2016-05-25 at 12:20 +0200, Marc-André Lureau wrote: > When the display is not yet realized, spice_display_widget_gl_scanout() > will fail because the egl context is not ready. The display is never > marked ready because the egl.image (and egl.scanout) is not set, and > some clients, such as virt-viewer will not realize the widget until the > display is ready. > > Deal with gl scanout updates when the widget is not yet realized, and > mark the display as ready when egl is enabled (when last display draw > signal is from gl). > > Signed-off-by: Marc-André Lureau <marcandre.lureau@xxxxxxxxx> > --- > src/spice-widget.c | 25 ++++++++++++++----------- > 1 file changed, 14 insertions(+), 11 deletions(-) > > diff --git a/src/spice-widget.c b/src/spice-widget.c > index f13a066..4ffeac7 100644 > --- a/src/spice-widget.c > +++ b/src/spice-widget.c > @@ -238,7 +238,7 @@ static void update_ready(SpiceDisplay *display) > > if (d->monitor_ready) { > #ifndef G_OS_WIN32 > - ready = d->egl.enabled ? d->egl.image != NULL : d->mark != 0; > + ready = d->egl.enabled || d->mark != 0; > #else > ready = d->mark != 0; > #endif > @@ -2296,9 +2296,12 @@ static void update_area(SpiceDisplay *display, > > #ifndef G_OS_WIN32 > if (d->egl.enabled) { > + const SpiceGlScanout *so = > + spice_display_get_gl_scanout(SPICE_DISPLAY_CHANNEL(d->display)); > + g_return_if_fail(so != NULL); > primary = (GdkRectangle) { > - .width = d->egl.scanout.width, > - .height = d->egl.scanout.height > + .width = so->width, > + .height = so->height > }; > } else > #endif > @@ -2617,15 +2620,15 @@ void spice_display_widget_gl_scanout(SpiceDisplay > *display) > SPICE_DEBUG("%s: got scanout", __FUNCTION__); > set_egl_enabled(display, true); > > - g_return_if_fail(d->egl.context_ready); > - > - scanout = spice_display_get_gl_scanout(SPICE_DISPLAY_CHANNEL(d- > >display)); > - /* should only be called when the display has a scanout */ > - g_return_if_fail(scanout != NULL); > + if (d->egl.context_ready) { you can even move declaration of scanout and err to this block Ack, Pavel > + scanout = spice_display_get_gl_scanout(SPICE_DISPLAY_CHANNEL(d- > >display)); > + /* should only be called when the display has a scanout */ > + g_return_if_fail(scanout != NULL); > > - if (!spice_egl_update_scanout(display, scanout, &err)) { > - g_critical("update scanout failed: %s", err->message); > - g_clear_error(&err); > + if (!spice_egl_update_scanout(display, scanout, &err)) { > + g_critical("update scanout failed: %s", err->message); > + g_clear_error(&err); > + } > } > } > _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel