Support per surface frame events
This fixes tearing with multi head.
diff --git a/compositor/compositor-x11.c b/compositor/compositor-x11.c
index ba593c1..f837a6a 100644
--- a/compositor/compositor-x11.c
+++ b/compositor/compositor-x11.c
@@ -171,24 +171,24 @@
return 0;
}
-static void
-x11_compositor_present(struct wlsc_compositor *base)
+static int
+x11_output_present(struct wlsc_output *output_base)
{
- struct x11_compositor *c = (struct x11_compositor *) base;
- struct x11_output *output;
+ struct x11_output *output = (struct x11_output *) output_base;
+ struct wlsc_compositor *ec = output->base.compositor;
struct timeval tv;
uint32_t msec;
- wl_list_for_each(output, &c->base.output_list, base.link) {
- if (x11_output_prepare_render(&output->base))
- continue;
+ if (x11_output_prepare_render(&output->base))
+ return -1;
- eglSwapBuffers(c->base.display, output->egl_surface);
- }
+ eglSwapBuffers(ec->display, output->egl_surface);
gettimeofday(&tv, NULL);
msec = tv.tv_sec * 1000 + tv.tv_usec / 1000;
- wlsc_compositor_finish_frame(&c->base, msec);
+ wlsc_output_finish_frame(&output->base, msec);
+
+ return 0;
}
static void
@@ -338,6 +338,7 @@
}
output->base.prepare_render = x11_output_prepare_render;
+ output->base.present = x11_output_present;
wl_list_insert(c->base.output_list.prev, &output->base.link);
@@ -569,7 +570,6 @@
return NULL;
c->base.destroy = x11_destroy;
- c->base.present = x11_compositor_present;
c->base.create_buffer = wlsc_shm_buffer_create;
/* Can't init base class until we have a current egl context */