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

Ander Conselvan de Oliveira ander.conselvan.de.oliveira at intel.com
Tue Jul 16 04:24:04 PDT 2013

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)
 	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,
 						    width, height);
-	glBindTexture(GL_TEXTURE_2D, surface->texture);
-	image_target_texture_2d(GL_TEXTURE_2D, surface->image);

More information about the wayland-devel mailing list