From: Varad Gautam <varad.gau...@collabora.com> request immediate dmabuf import when run with "immed" arg.
Signed-off-by: Varad Gautam <varad.gau...@collabora.com> --- clients/simple-dmabuf-intel.c | 59 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/clients/simple-dmabuf-intel.c b/clients/simple-dmabuf-intel.c index ec5f1cb..fad420a 100644 --- a/clients/simple-dmabuf-intel.c +++ b/clients/simple-dmabuf-intel.c @@ -54,6 +54,7 @@ struct display { struct zwp_fullscreen_shell_v1 *fshell; struct zwp_linux_dmabuf_v1 *dmabuf; int xrgb8888_format_found; + int req_dmabuf_immediate; }; struct buffer { @@ -221,9 +222,30 @@ create_failed(void *data, struct zwp_linux_buffer_params_v1 *params) fprintf(stderr, "Error: zwp_linux_buffer_params.create failed.\n"); } +static void +create_immed_succeeded(void *data, + struct zwp_linux_buffer_params_v1 *params) +{ + /* XXX: keep track of successfully created wl_buffers*/ + + zwp_linux_buffer_params_v1_destroy(params); +} + +static void +create_immed_failed(void *data, + struct zwp_linux_buffer_params_v1 *params) +{ + /* XXX: sad trombone sound */ + + zwp_linux_buffer_params_v1_destroy(params); + fprintf(stderr, "Error: zwp_linux_buffer_params.create_immed failed.\n"); +} + static const struct zwp_linux_buffer_params_v1_listener params_listener = { create_succeeded, - create_failed + create_failed, + create_immed_succeeded, + create_immed_failed }; static int @@ -279,7 +301,16 @@ create_dmabuf_buffer(struct display *display, struct buffer *buffer, modifier >> 32, modifier & 0xffffffff); zwp_linux_buffer_params_v1_add_listener(params, ¶ms_listener, buffer); - zwp_linux_buffer_params_v1_create(params, + if (display->req_dmabuf_immediate) { + buffer->buffer = zwp_linux_buffer_params_v1_create_immed(params, + buffer->width, + buffer->height, + DRM_FORMAT_XRGB8888, + flags); + wl_buffer_add_listener(buffer->buffer, &buffer_listener, buffer); + } + else + zwp_linux_buffer_params_v1_create(params, buffer->width, buffer->height, DRM_FORMAT_XRGB8888, @@ -503,7 +534,8 @@ registry_handle_global(void *data, struct wl_registry *registry, id, &zwp_fullscreen_shell_v1_interface, 1); } else if (strcmp(interface, "zwp_linux_dmabuf_v1") == 0) { d->dmabuf = wl_registry_bind(registry, - id, &zwp_linux_dmabuf_v1_interface, 1); + id, &zwp_linux_dmabuf_v1_interface, + d->req_dmabuf_immediate ? 2 : 1); zwp_linux_dmabuf_v1_add_listener(d->dmabuf, &dmabuf_listener, d); } } @@ -520,7 +552,7 @@ static const struct wl_registry_listener registry_listener = { }; static struct display * -create_display(void) +create_display(int is_immediate) { struct display *display; @@ -534,6 +566,7 @@ create_display(void) /* XXX: fake, because the compositor does not yet advertise anything */ display->xrgb8888_format_found = 1; + display->req_dmabuf_immediate = is_immediate; display->registry = wl_display_get_registry(display->display); wl_registry_add_listener(display->registry, @@ -587,9 +620,22 @@ main(int argc, char **argv) struct sigaction sigint; struct display *display; struct window *window; + int is_immediate = 0; int ret = 0; - display = create_display(); + if (argc > 1) { + if (!strcmp(argv[1], "immed")) { + is_immediate = 1; + } + else { + fprintf(stderr, "usage:\n\tsimple-dmabuf-intel [options]\n" + "available options:\n\timmed: avoid dmabuf " + "creation roundtrip and import immediately\n"); + return 1; + } + } + + display = create_display(is_immediate); window = create_window(display, 250, 250); if (!window) return 1; @@ -599,7 +645,8 @@ main(int argc, char **argv) sigint.sa_flags = SA_RESETHAND; sigaction(SIGINT, &sigint, NULL); - /* Here we retrieve the linux-dmabuf objects, or error */ + /* Here we retrieve the linux-dmabuf objects if executed without immed, + * or error */ wl_display_roundtrip(display->display); if (!running) -- 2.6.2 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel