Re: [Spice-devel] [PATCHv2 4/4] egl: fix delayed widget realize

2016-05-25 Thread Pavel Grunt
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 
> ---
>  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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/spice-devel


[Spice-devel] [PATCHv2 4/4] egl: fix delayed widget realize

2016-05-25 Thread Marc-André Lureau
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 
---
 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) {
+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);
+}
 }
 }
 
-- 
2.7.4

___
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/spice-devel