]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - glsdk/omapdrmtest.git/blobdiff - util/display-wayland.c
display-wayland: Add frame-listener and dispatch
[glsdk/omapdrmtest.git] / util / display-wayland.c
index 2f5618ad08180cdb691009d5a702020d2ac955d4..cdd96773affa7d188aa851c09cfb80b9da114d00 100644 (file)
@@ -39,6 +39,7 @@ struct display_wl {
        struct wl_surface *surface;
        struct wl_shell *shell;
        struct wl_drm *drm;
+       struct wl_callback *callback;
        struct wl_viewport *viewport;
        struct wl_scaler *scaler;
 };
@@ -222,6 +223,14 @@ post_buffer(struct display *disp, struct buffer *buf)
 
        return -1;
 }
+static void redraw(void *data, struct wl_callback *callback, uint32_t time) {
+       struct display_wl *disp_wl = (struct display_wl *) data;
+
+       wl_callback_destroy(disp_wl->callback);
+       disp_wl->callback = NULL;
+}
+
+static const struct wl_callback_listener frame_listener = { redraw };
 
 static int
 post_vid_buffer(struct display *disp, struct buffer *buf,
@@ -232,9 +241,19 @@ post_vid_buffer(struct display *disp, struct buffer *buf,
        int ret = 0;
 
        wl_surface_attach(disp_wl->surface, buf_wl->wl_buf, 0, 0);
+
+       if (disp_wl->callback)
+               wl_callback_destroy(disp_wl->callback);
+       disp_wl->callback = wl_surface_frame(disp_wl->surface);
+
+       wl_callback_add_listener(disp_wl->callback, &frame_listener, disp_wl);
+
        wl_surface_commit(disp_wl->surface);
        wl_display_flush(disp_wl->display);
 
+       while (disp_wl->callback) {
+               wl_display_dispatch(disp_wl->display);
+       }
        return ret;
 }