1From 451240bd3bf00ca2319c0625bcdba76ccc3d7e22 Mon Sep 17 00:00:00 2001 2From: Jeffy Chen <jeffy.chen@rock-chips.com> 3Date: Sat, 9 Oct 2021 12:33:33 +0800 4Subject: [PATCH 50/79] HACK: pixman-renderer: Support passing dma fd to pixman 5 6Usage: 7pixman_image_set_destroy_function(image, NULL, (void *)(ptrdiff_t)dma_fd) 8 9Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 10--- 11 libweston/backend-drm/drm-internal.h | 1 + 12 libweston/backend-drm/drm.c | 3 +++ 13 libweston/backend-drm/fb.c | 15 +++++++++++++++ 14 libweston/pixman-renderer.c | 2 ++ 15 libweston/pixman-renderer.h | 4 ++++ 16 5 files changed, 25 insertions(+) 17 18diff --git a/libweston/backend-drm/drm-internal.h b/libweston/backend-drm/drm-internal.h 19index 161c1ee..a2019ce 100644 20--- a/libweston/backend-drm/drm-internal.h 21+++ b/libweston/backend-drm/drm-internal.h 22@@ -388,6 +388,7 @@ struct drm_fb { 23 uint64_t modifier; 24 int width, height; 25 int fd; 26+ int dma_fd; 27 28 uint32_t plane_mask; 29 30diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c 31index 4979bf5..d9beca0 100644 32--- a/libweston/backend-drm/drm.c 33+++ b/libweston/backend-drm/drm.c 34@@ -1634,6 +1634,9 @@ drm_output_init_pixman(struct drm_output *output, struct drm_backend *b) 35 output->dumb[i]->strides[0]); 36 if (!output->image[i]) 37 goto err; 38+ 39+ pixman_image_set_dma_fd(output->image[i], 40+ output->dumb[i]->dma_fd); 41 } 42 43 if (pixman_renderer_output_create(&output->base, &options) < 0) 44diff --git a/libweston/backend-drm/fb.c b/libweston/backend-drm/fb.c 45index af31a8a..748c641 100644 46--- a/libweston/backend-drm/fb.c 47+++ b/libweston/backend-drm/fb.c 48@@ -58,6 +58,9 @@ drm_fb_destroy_dumb(struct drm_fb *fb) 49 50 assert(fb->type == BUFFER_PIXMAN_DUMB); 51 52+ if (fb->dma_fd >= 0) 53+ close(fb->dma_fd); 54+ 55 if (fb->map && fb->size > 0) 56 munmap(fb->map, fb->size); 57 58@@ -121,6 +124,7 @@ drm_fb_create_dumb(struct drm_backend *b, int width, int height, 59 struct drm_mode_create_dumb create_arg; 60 struct drm_mode_destroy_dumb destroy_arg; 61 struct drm_mode_map_dumb map_arg; 62+ struct drm_prime_handle prime_arg; 63 64 fb = zalloc(sizeof *fb); 65 if (!fb) 66@@ -175,8 +179,19 @@ drm_fb_create_dumb(struct drm_backend *b, int width, int height, 67 if (fb->map == MAP_FAILED) 68 goto err_add_fb; 69 70+ memset(&prime_arg, 0, sizeof(prime_arg)); 71+ prime_arg.fd = -1; 72+ prime_arg.handle = fb->handles[0]; 73+ ret = drmIoctl(fb->fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &prime_arg); 74+ if (ret) 75+ goto err_unmap_fb; 76+ 77+ fb->dma_fd = prime_arg.fd; 78+ 79 return fb; 80 81+err_unmap_fb: 82+ munmap(fb->map, fb->size); 83 err_add_fb: 84 drmModeRmFB(b->drm.fd, fb->fb_id); 85 err_bo: 86diff --git a/libweston/pixman-renderer.c b/libweston/pixman-renderer.c 87index c6d1cbb..b56e9b5 100644 88--- a/libweston/pixman-renderer.c 89+++ b/libweston/pixman-renderer.c 90@@ -821,6 +821,8 @@ pixman_renderer_attach_dmabuf(struct weston_surface *es, 91 data->ptr + attributes->offset[0], 92 attributes->stride[0]); 93 94+ pixman_image_set_dma_fd(ps->image, attributes->fd[0]); 95+ 96 ps->buffer_destroy_listener.notify = 97 buffer_state_handle_buffer_destroy; 98 wl_signal_add(&buffer->destroy_signal, 99diff --git a/libweston/pixman-renderer.h b/libweston/pixman-renderer.h 100index 2b81dde..bcd248f 100644 101--- a/libweston/pixman-renderer.h 102+++ b/libweston/pixman-renderer.h 103@@ -29,6 +29,10 @@ 104 #include "backend.h" 105 #include "libweston-internal.h" 106 107+/* HACK: Pass dma fd to pixman through destroy data */ 108+#define pixman_image_set_dma_fd(image, fd) \ 109+ pixman_image_set_destroy_function(image, NULL, (void *)(ptrdiff_t)fd) 110+ 111 int 112 pixman_renderer_init(struct weston_compositor *ec); 113 114-- 1152.20.1 116 117