diff options
-rw-r--r-- | simple-yuv.c | 81 |
1 files changed, 56 insertions, 25 deletions
diff --git a/simple-yuv.c b/simple-yuv.c index 28a1bcc..f21e26f 100644 --- a/simple-yuv.c +++ b/simple-yuv.c @@ -51,6 +51,7 @@ struct display { drm_intel_bufmgr *bufmgr; int fd; int authenticated; + int has_prime; uint32_t formats[10]; int format_count; uint32_t mask; @@ -285,7 +286,7 @@ create_buffer(struct window *window, uint32_t format) struct display *display = window->display; struct buffer *buffer; uint32_t name; - int total; + int total, fd; buffer = malloc(sizeof *buffer); if (format == WL_DRM_FORMAT_YUYV) @@ -318,30 +319,44 @@ create_buffer(struct window *window, uint32_t format) drm_intel_bo_alloc(display->bufmgr, "simple-yuv", total, 0); drm_intel_gem_bo_map_gtt(buffer->bo); - drm_intel_bo_flink(buffer->bo, &name); - switch (format) { - case WL_DRM_FORMAT_YUV420: - case WL_DRM_FORMAT_NV12: - buffer->buffer = - wl_drm_create_planar_buffer(display->drm, name, - window->width, - window->height, - format, - buffer->offset0, - buffer->stride0, - buffer->offset1, - buffer->stride1, - buffer->offset2, - buffer->stride2); - break; - case WL_DRM_FORMAT_YUYV: + if (display->has_prime) { + drm_intel_bo_gem_export_to_prime(buffer->bo, &fd); buffer->buffer = - wl_drm_create_buffer(display->drm, name, - window->width, window->height, - buffer->stride0, - WL_DRM_FORMAT_YUYV); - break; + wl_drm_create_prime_buffer(display->drm, fd, + window->width, + window->height, + format, + buffer->offset0, + buffer->stride0, + buffer->offset1, + buffer->stride1, + buffer->offset2, + buffer->stride2); + close(fd); + } else { + drm_intel_bo_flink(buffer->bo, &name); + + if (format == WL_DRM_FORMAT_YUYV) { + buffer->buffer = + wl_drm_create_buffer(display->drm, name, + window->width, + window->height, + buffer->stride0, + WL_DRM_FORMAT_YUYV); + } else { + buffer->buffer = + wl_drm_create_planar_buffer(display->drm, name, + window->width, + window->height, + format, + buffer->offset0, + buffer->stride0, + buffer->offset1, + buffer->stride1, + buffer->offset2, + buffer->stride2); + } } return buffer; @@ -448,10 +463,23 @@ drm_handle_authenticated(void *data, struct wl_drm *drm) d->bufmgr = drm_intel_bufmgr_gem_init(d->fd, 4096); } +static void +drm_handle_capabilities(void *data, struct wl_drm *drm, uint32_t value) +{ + struct display *d = data; + + switch (value) { + case WL_DRM_CAPABILITY_PRIME: + d->has_prime = 1; + break; + } +} + static const struct wl_drm_listener drm_listener = { drm_handle_device, drm_handle_format, - drm_handle_authenticated + drm_handle_authenticated, + drm_handle_capabilities }; static void @@ -552,7 +580,7 @@ registry_handle_global(void *data, struct wl_registry *registry, uint32_t id, &wl_shell_interface, 1); } else if (strcmp(interface, "wl_drm") == 0) { d->drm = wl_registry_bind(d->registry, id, - &wl_drm_interface, 1); + &wl_drm_interface, 2); wl_drm_add_listener(d->drm, &drm_listener, d); } else if (strcmp(interface, "wl_seat") == 0) { d->seat = wl_registry_bind(d->registry, @@ -709,6 +737,9 @@ main(int argc, char **argv) while (!display->authenticated) wl_display_roundtrip(display->display); + if (display->has_prime) + printf("compositor supports prime (dma_buf) buffers\n"); + if (source) { window = parse_header(display, format, source); } else { |