[Spice-devel] [PATCHv2 4/4] egl: fix delayed widget realize
Pavel Grunt
pgrunt at redhat.com
Wed May 25 10:35:41 UTC 2016
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 at gmail.com>
> ---
> 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);
> + }
> }
> }
>
More information about the Spice-devel
mailing list