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