[PATCH weston] nested: Fix skipping frames due to texture update without a context

Ander Conselvan de Oliveira conselvan2 at gmail.com
Thu Aug 15 10:00:05 PDT 2013


To clarify, what causes the wrong context to be bound is the call to
cairo_destroy_surface(). Some of the cairo-gl functions do a
cairo_gl_context_acquire() followed by some operation and finish by doing
cairo_gl_context_release(). That last call is basically
eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT), so
when the call to glBindTexture() is made there is no current context.

Cheers,
Ander


2013/7/16 Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com
>

> Calls into cairo-gles may change the current context, so it was only by
> chance that sometimes we had the proper one as current and updated the
> correct texture in surface_attach().
>
> In order to fix this, calling display_acquire_window_surface() before
> binding the texture for setup is necessary. However this call has the
> side effect of allocating a cairo surface for the window. At flush time,
> the existence of this surface will cause an eglSwapBuffers(), even
> if no rendering was done to it, leading to undefined contents on the
> screen. This happens when the idle redraw task runs while there is a
> pending frame callback.
>
> Workaround this by moving the texture setup from surface_attach() to the
> redraw handler, so that the cairo surface is only allocated when
> redering is done.
> ---
>  clients/nested.c |   12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/clients/nested.c b/clients/nested.c
> index a4e07f7..7137086 100644
> --- a/clients/nested.c
> +++ b/clients/nested.c
> @@ -136,6 +136,15 @@ redraw_handler(struct widget *widget, void *data)
>         cairo_fill(cr);
>
>         wl_list_for_each(s, &nested->surface_list, link) {
> +               display_acquire_window_surface(nested->display,
> +                                              nested->window, NULL);
> +
> +               glBindTexture(GL_TEXTURE_2D, s->texture);
> +               image_target_texture_2d(GL_TEXTURE_2D, s->image);
> +
> +               display_release_window_surface(nested->display,
> +                                              nested->window);
> +
>                 cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
>                 cairo_set_source_surface(cr, s->cairo_surface,
>                                          allocation.x + 10,
> @@ -313,9 +322,6 @@ surface_attach(struct wl_client *client,
>                                                     surface->texture,
>                                                     width, height);
>
> -       glBindTexture(GL_TEXTURE_2D, surface->texture);
> -       image_target_texture_2d(GL_TEXTURE_2D, surface->image);
> -
>         window_schedule_redraw(nested->window);
>  }
>
> --
> 1.7.10.4
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20130815/5e1ab133/attachment-0001.html>


More information about the wayland-devel mailing list