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