summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2013-10-10 14:29:03 -0700
committerKristian Høgsberg <krh@bitplanet.net>2013-10-10 14:31:22 -0700
commit6f2a29500a465ac4a284bbedecb520311dfc148e (patch)
tree438746ea3f7ecbff93e0a920aa0128c3cfaf43e8
parent259e92749acc504be0713c47928322e8a0c24a1b (diff)
Use prime buffers when availableHEADmaster
-rw-r--r--simple-yuv.c81
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 {