Support per surface frame events
This fixes tearing with multi head.
diff --git a/compositor/compositor-wayland.c b/compositor/compositor-wayland.c
index 524a25c..097b23e 100644
--- a/compositor/compositor-wayland.c
+++ b/compositor/compositor-wayland.c
@@ -156,11 +156,11 @@
}
static void
-frame_callback(void *data, uint32_t time)
+frame_callback(struct wl_surface *surface, void *data, uint32_t time)
{
- struct wayland_compositor *c = (struct wayland_compositor *) data;
+ struct wlsc_output *output = data;
- wlsc_compositor_finish_frame(&c->base, time);
+ wlsc_output_finish_frame(output, time);
}
static int
@@ -178,20 +178,22 @@
return 0;
}
-static void
-wayland_compositor_present(struct wlsc_compositor *base)
+static int
+wayland_output_present(struct wlsc_output *output_base)
{
- struct wayland_compositor *c = (struct wayland_compositor *) base;
- struct wayland_output *output;
+ struct wayland_output *output = (struct wayland_output *) output_base;
+ struct wayland_compositor *c =
+ (struct wayland_compositor *) output->base.compositor;
- wl_list_for_each(output, &base->output_list, base.link) {
- if (wayland_output_prepare_render(&output->base))
- continue;
+ if (wayland_output_prepare_render(&output->base))
+ return -1;
- eglSwapBuffers(c->base.display, output->egl_surface);
- }
+ eglSwapBuffers(c->base.display, output->egl_surface);
+ wl_display_frame_callback(c->parent.display,
+ output->parent.surface,
+ frame_callback, &output->base);
- wl_display_frame_callback(c->parent.display, frame_callback, c);
+ return 0;
}
static int
@@ -243,6 +245,7 @@
glClearColor(0, 0, 0, 0.5);
output->base.prepare_render = wayland_output_prepare_render;
+ output->base.present = wayland_output_present;
wl_list_insert(c->base.output_list.prev, &output->base.link);
@@ -477,7 +480,6 @@
return NULL;
c->base.destroy = wayland_destroy;
- c->base.present = wayland_compositor_present;
c->base.create_buffer = wlsc_shm_buffer_create;
/* Can't init base class until we have a current egl context */