display-wayland: Add frame-listener and dispatch
authorRamprasad N <x0038811@ti.com>
Mon, 24 Apr 2017 11:38:49 +0000 (17:08 +0530)
committerKarthik Ramanan <a0393906@ti.com>
Fri, 5 May 2017 11:20:11 +0000 (16:50 +0530)
When dmabuftest or viddec3test with wayland-backend is run infinitely, after few minutes
application halts and prints "Broken pipe" error.
The reason for this issue is when client draws and sends events much faster
than server,it results in even queue overflows and when this happens
connection between client and server closes.
With dispatch and frame_listener makes sure synchronization between client and server.
Client can render next frame only after previous frame is displayed
and main queue will never overflow.

Signed-off-by: Ramprasad N <x0038811@ti.com>
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_surface *surface;
        struct wl_shell *shell;
        struct wl_drm *drm;
+       struct wl_callback *callback;
        struct wl_viewport *viewport;
        struct wl_scaler *scaler;
 };
        struct wl_viewport *viewport;
        struct wl_scaler *scaler;
 };
@@ -222,6 +223,14 @@ post_buffer(struct display *disp, struct buffer *buf)
 
        return -1;
 }
 
        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,
 
 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);
        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);
 
        wl_surface_commit(disp_wl->surface);
        wl_display_flush(disp_wl->display);
 
+       while (disp_wl->callback) {
+               wl_display_dispatch(disp_wl->display);
+       }
        return ret;
 }
 
        return ret;
 }