1*4882a593SmuzhiyunFrom 9ae9bc0f952538ee7abd79798f608b1bb433f604 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Tue, 1 Sep 2020 08:51:17 +0800
4*4882a593SmuzhiyunSubject: [PATCH 27/79] HACK: backend-drm: Consider linear and invalid modifier
5*4882a593Smuzhiyun are the same
6*4882a593Smuzhiyun
7*4882a593SmuzhiyunThat is true with Rockchip BSP drivers and packages.
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
10*4882a593Smuzhiyun---
11*4882a593Smuzhiyun clients/simple-dmabuf-egl.c         |  8 ++++++--
12*4882a593Smuzhiyun libweston/backend-drm/drm-gbm.c     |  3 ++-
13*4882a593Smuzhiyun libweston/backend-drm/drm-virtual.c |  8 +-------
14*4882a593Smuzhiyun libweston/backend-drm/fb.c          | 10 ++++++----
15*4882a593Smuzhiyun libweston/backend-drm/kms.c         |  2 +-
16*4882a593Smuzhiyun libweston/linux-dmabuf.h            |  4 ++++
17*4882a593Smuzhiyun libweston/pixman-renderer.c         |  4 ++--
18*4882a593Smuzhiyun libweston/renderer-gl/gl-renderer.c |  8 ++++----
19*4882a593Smuzhiyun 8 files changed, 26 insertions(+), 21 deletions(-)
20*4882a593Smuzhiyun
21*4882a593Smuzhiyundiff --git a/clients/simple-dmabuf-egl.c b/clients/simple-dmabuf-egl.c
22*4882a593Smuzhiyunindex ef0d9de..e984503 100644
23*4882a593Smuzhiyun--- a/clients/simple-dmabuf-egl.c
24*4882a593Smuzhiyun+++ b/clients/simple-dmabuf-egl.c
25*4882a593Smuzhiyun@@ -68,6 +68,9 @@
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun #define MAX_BUFFER_PLANES 4
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun+#define DRM_MOD_VALID(mod) \
30*4882a593Smuzhiyun+	((mod) != DRM_FORMAT_MOD_LINEAR && (mod) != DRM_FORMAT_MOD_INVALID)
31*4882a593Smuzhiyun+
32*4882a593Smuzhiyun struct display {
33*4882a593Smuzhiyun 	struct wl_display *display;
34*4882a593Smuzhiyun 	struct wl_registry *registry;
35*4882a593Smuzhiyun@@ -265,7 +268,8 @@ create_fbo_for_buffer(struct display *display, struct buffer *buffer)
36*4882a593Smuzhiyun 	attribs[atti++] = (int) buffer->offsets[plane_idx]; \
37*4882a593Smuzhiyun 	attribs[atti++] = EGL_DMA_BUF_PLANE ## plane_idx ## _PITCH_EXT; \
38*4882a593Smuzhiyun 	attribs[atti++] = (int) buffer->strides[plane_idx]; \
39*4882a593Smuzhiyun-	if (display->egl.has_dma_buf_import_modifiers) { \
40*4882a593Smuzhiyun+	if (DRM_MOD_VALID(buffer->modifier) && \
41*4882a593Smuzhiyun+	    display->egl.has_dma_buf_import_modifiers) { \
42*4882a593Smuzhiyun 		attribs[atti++] = EGL_DMA_BUF_PLANE ## plane_idx ## _MODIFIER_LO_EXT; \
43*4882a593Smuzhiyun 		attribs[atti++] = buffer->modifier & 0xFFFFFFFF; \
44*4882a593Smuzhiyun 		attribs[atti++] = EGL_DMA_BUF_PLANE ## plane_idx ## _MODIFIER_HI_EXT; \
45*4882a593Smuzhiyun@@ -1008,7 +1012,7 @@ dmabuf_modifiers(void *data, struct zwp_linux_dmabuf_v1 *zwp_linux_dmabuf,
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun 	d->format_supported = true;
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun-	if (modifier != DRM_FORMAT_MOD_INVALID) {
50*4882a593Smuzhiyun+	if (DRM_MOD_VALID(modifier)) {
51*4882a593Smuzhiyun 		++d->modifiers_count;
52*4882a593Smuzhiyun 		d->modifiers = realloc(d->modifiers,
53*4882a593Smuzhiyun 				       d->modifiers_count * sizeof(*d->modifiers));
54*4882a593Smuzhiyundiff --git a/libweston/backend-drm/drm-gbm.c b/libweston/backend-drm/drm-gbm.c
55*4882a593Smuzhiyunindex d7bd05f..ecc7a5f 100644
56*4882a593Smuzhiyun--- a/libweston/backend-drm/drm-gbm.c
57*4882a593Smuzhiyun+++ b/libweston/backend-drm/drm-gbm.c
58*4882a593Smuzhiyun@@ -196,7 +196,8 @@ create_gbm_surface(struct gbm_device *gbm, struct drm_output *output)
59*4882a593Smuzhiyun 	}
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun #ifdef HAVE_GBM_MODIFIERS
62*4882a593Smuzhiyun-	if (!weston_drm_format_has_modifier(fmt, DRM_FORMAT_MOD_INVALID)) {
63*4882a593Smuzhiyun+	if (!weston_drm_format_has_modifier(fmt, DRM_FORMAT_MOD_INVALID) &&
64*4882a593Smuzhiyun+	    !weston_drm_format_has_modifier(fmt, DRM_FORMAT_MOD_LINEAR)) {
65*4882a593Smuzhiyun 		modifiers = weston_drm_format_get_modifiers(fmt, &num_modifiers);
66*4882a593Smuzhiyun 		output->gbm_surface =
67*4882a593Smuzhiyun 			gbm_surface_create_with_modifiers(gbm,
68*4882a593Smuzhiyundiff --git a/libweston/backend-drm/drm-virtual.c b/libweston/backend-drm/drm-virtual.c
69*4882a593Smuzhiyunindex 597e71c..20f6809 100644
70*4882a593Smuzhiyun--- a/libweston/backend-drm/drm-virtual.c
71*4882a593Smuzhiyun+++ b/libweston/backend-drm/drm-virtual.c
72*4882a593Smuzhiyun@@ -112,13 +112,7 @@ drm_virtual_plane_create(struct drm_backend *b, struct drm_output *output)
73*4882a593Smuzhiyun 	if (!fmt)
74*4882a593Smuzhiyun 		goto err;
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun-	/* If output supports linear modifier, we add it to the plane.
77*4882a593Smuzhiyun-	 * Otherwise we add DRM_FORMAT_MOD_INVALID, as explicit modifiers
78*4882a593Smuzhiyun-	 * are not supported. */
79*4882a593Smuzhiyun-	if ((output->gbm_bo_flags & GBM_BO_USE_LINEAR) && b->fb_modifiers)
80*4882a593Smuzhiyun-		mod = DRM_FORMAT_MOD_LINEAR;
81*4882a593Smuzhiyun-	else
82*4882a593Smuzhiyun-		mod = DRM_FORMAT_MOD_INVALID;
83*4882a593Smuzhiyun+	mod = DRM_FORMAT_MOD_LINEAR;
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun 	if (weston_drm_format_add_modifier(fmt, mod) < 0)
86*4882a593Smuzhiyun 		goto err;
87*4882a593Smuzhiyundiff --git a/libweston/backend-drm/fb.c b/libweston/backend-drm/fb.c
88*4882a593Smuzhiyunindex ba0c177..af31a8a 100644
89*4882a593Smuzhiyun--- a/libweston/backend-drm/fb.c
90*4882a593Smuzhiyun+++ b/libweston/backend-drm/fb.c
91*4882a593Smuzhiyun@@ -77,7 +77,7 @@ drm_fb_addfb(struct drm_backend *b, struct drm_fb *fb)
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun 	/* If we have a modifier set, we must only use the WithModifiers
94*4882a593Smuzhiyun 	 * entrypoint; we cannot import it through legacy ioctls. */
95*4882a593Smuzhiyun-	if (b->fb_modifiers && fb->modifier != DRM_FORMAT_MOD_INVALID) {
96*4882a593Smuzhiyun+	if (b->fb_modifiers && DRM_MOD_VALID(fb->modifier)) {
97*4882a593Smuzhiyun 		/* KMS demands that if a modifier is set, it must be the same
98*4882a593Smuzhiyun 		 * for all planes. */
99*4882a593Smuzhiyun 		for (i = 0; i < ARRAY_LENGTH(mods) && fb->handles[i]; i++)
100*4882a593Smuzhiyun@@ -150,7 +150,7 @@ drm_fb_create_dumb(struct drm_backend *b, int width, int height,
101*4882a593Smuzhiyun 		goto err_fb;
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun 	fb->type = BUFFER_PIXMAN_DUMB;
104*4882a593Smuzhiyun-	fb->modifier = DRM_FORMAT_MOD_INVALID;
105*4882a593Smuzhiyun+	fb->modifier = DRM_FORMAT_MOD_LINEAR;
106*4882a593Smuzhiyun 	fb->handles[0] = create_arg.handle;
107*4882a593Smuzhiyun 	fb->strides[0] = create_arg.pitch;
108*4882a593Smuzhiyun 	fb->num_planes = 1;
109*4882a593Smuzhiyun@@ -237,6 +237,7 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
110*4882a593Smuzhiyun 		.modifier = dmabuf->attributes.modifier[0],
111*4882a593Smuzhiyun 	};
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun+#if 0
114*4882a593Smuzhiyun 	/* We should not import to KMS a buffer that has been allocated using no
115*4882a593Smuzhiyun 	 * modifiers. Usually drivers use linear layouts to allocate with no
116*4882a593Smuzhiyun 	 * modifiers, but this is not a rule. The driver could use, for
117*4882a593Smuzhiyun@@ -250,6 +251,7 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
118*4882a593Smuzhiyun 				FAILURE_REASONS_DMABUF_MODIFIER_INVALID;
119*4882a593Smuzhiyun 		return NULL;
120*4882a593Smuzhiyun 	}
121*4882a593Smuzhiyun+#endif
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun 	/* XXX: TODO:
124*4882a593Smuzhiyun 	 *
125*4882a593Smuzhiyun@@ -375,7 +377,7 @@ drm_fb_get_from_bo(struct gbm_bo *bo, struct drm_backend *backend,
126*4882a593Smuzhiyun 	fb->num_planes = 1;
127*4882a593Smuzhiyun 	fb->strides[0] = gbm_bo_get_stride(bo);
128*4882a593Smuzhiyun 	fb->handles[0] = gbm_bo_get_handle(bo).u32;
129*4882a593Smuzhiyun-	fb->modifier = DRM_FORMAT_MOD_INVALID;
130*4882a593Smuzhiyun+	fb->modifier = DRM_FORMAT_MOD_LINEAR;
131*4882a593Smuzhiyun #endif
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun 	if (!fb->format) {
134*4882a593Smuzhiyun@@ -482,7 +484,7 @@ drm_fb_compatible_with_plane(struct drm_fb *fb, struct drm_plane *plane)
135*4882a593Smuzhiyun 		 * wl_drm is being used for scanout. Mesa is the only user we
136*4882a593Smuzhiyun 		 * care in this case (even though recent versions are also using
137*4882a593Smuzhiyun 		 * dmabufs), and it should know better what works or not. */
138*4882a593Smuzhiyun-		if (fb->modifier == DRM_FORMAT_MOD_INVALID)
139*4882a593Smuzhiyun+		if (!DRM_MOD_VALID(fb->modifier))
140*4882a593Smuzhiyun 			return true;
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun 		if (weston_drm_format_has_modifier(fmt, fb->modifier))
143*4882a593Smuzhiyundiff --git a/libweston/backend-drm/kms.c b/libweston/backend-drm/kms.c
144*4882a593Smuzhiyunindex 1fcbdeb..4b5ba42 100644
145*4882a593Smuzhiyun--- a/libweston/backend-drm/kms.c
146*4882a593Smuzhiyun+++ b/libweston/backend-drm/kms.c
147*4882a593Smuzhiyun@@ -542,7 +542,7 @@ fallback:
148*4882a593Smuzhiyun 							 kplane->formats[i]);
149*4882a593Smuzhiyun 		if (!fmt)
150*4882a593Smuzhiyun 			return -1;
151*4882a593Smuzhiyun-		ret = weston_drm_format_add_modifier(fmt, DRM_FORMAT_MOD_INVALID);
152*4882a593Smuzhiyun+		ret = weston_drm_format_add_modifier(fmt, DRM_FORMAT_MOD_LINEAR);
153*4882a593Smuzhiyun 		if (ret < 0)
154*4882a593Smuzhiyun 			return -1;
155*4882a593Smuzhiyun 	}
156*4882a593Smuzhiyundiff --git a/libweston/linux-dmabuf.h b/libweston/linux-dmabuf.h
157*4882a593Smuzhiyunindex 7cae93c..cfbdc28 100644
158*4882a593Smuzhiyun--- a/libweston/linux-dmabuf.h
159*4882a593Smuzhiyun+++ b/libweston/linux-dmabuf.h
160*4882a593Smuzhiyun@@ -31,6 +31,10 @@
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun #define MAX_DMABUF_PLANES 4
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun+/* modifier is not linear or invalid */
165*4882a593Smuzhiyun+#define DRM_MOD_VALID(mod) \
166*4882a593Smuzhiyun+	((mod) != DRM_FORMAT_MOD_LINEAR && (mod) != DRM_FORMAT_MOD_INVALID)
167*4882a593Smuzhiyun+
168*4882a593Smuzhiyun struct linux_dmabuf_buffer;
169*4882a593Smuzhiyun typedef void (*dmabuf_user_data_destroy_func)(
170*4882a593Smuzhiyun 			struct linux_dmabuf_buffer *buffer);
171*4882a593Smuzhiyundiff --git a/libweston/pixman-renderer.c b/libweston/pixman-renderer.c
172*4882a593Smuzhiyunindex ece4d91..b245fd6 100644
173*4882a593Smuzhiyun--- a/libweston/pixman-renderer.c
174*4882a593Smuzhiyun+++ b/libweston/pixman-renderer.c
175*4882a593Smuzhiyun@@ -701,7 +701,7 @@ pixman_renderer_prepare_dmabuf(struct linux_dmabuf_buffer *dmabuf)
176*4882a593Smuzhiyun 	total_size = lseek(attributes->fd[0], 0, SEEK_END);
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun 	for (i = 0; i < attributes->n_planes; i++) {
179*4882a593Smuzhiyun-		if (attributes->modifier[i] != DRM_FORMAT_MOD_INVALID)
180*4882a593Smuzhiyun+		if (DRM_MOD_VALID(attributes->modifier[i]))
181*4882a593Smuzhiyun 			return false;
182*4882a593Smuzhiyun 	}
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun@@ -1197,7 +1197,7 @@ populate_supported_formats(struct weston_compositor *ec,
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun 		/* Always add DRM_FORMAT_MOD_INVALID, as EGL implementations
187*4882a593Smuzhiyun 		 * support implicit modifiers. */
188*4882a593Smuzhiyun-		ret = weston_drm_format_add_modifier(fmt, DRM_FORMAT_MOD_INVALID);
189*4882a593Smuzhiyun+		ret = weston_drm_format_add_modifier(fmt, DRM_FORMAT_MOD_LINEAR);
190*4882a593Smuzhiyun 		if (ret < 0)
191*4882a593Smuzhiyun 			goto out;
192*4882a593Smuzhiyun 	}
193*4882a593Smuzhiyundiff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c
194*4882a593Smuzhiyunindex 3c60f85..f891478 100644
195*4882a593Smuzhiyun--- a/libweston/renderer-gl/gl-renderer.c
196*4882a593Smuzhiyun+++ b/libweston/renderer-gl/gl-renderer.c
197*4882a593Smuzhiyun@@ -2359,7 +2359,7 @@ import_simple_dmabuf(struct gl_renderer *gr,
198*4882a593Smuzhiyun 		attribs[atti++] = EGL_YUV_NARROW_RANGE_EXT;
199*4882a593Smuzhiyun 	}
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun-	if (attributes->modifier[0] != DRM_FORMAT_MOD_INVALID) {
202*4882a593Smuzhiyun+	if (DRM_MOD_VALID(attributes->modifier[0])) {
203*4882a593Smuzhiyun 		if (!gr->has_dmabuf_import_modifiers)
204*4882a593Smuzhiyun 			return NULL;
205*4882a593Smuzhiyun 		has_modifier = true;
206*4882a593Smuzhiyun@@ -2871,7 +2871,7 @@ gl_renderer_import_dmabuf(struct weston_compositor *ec,
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun 	for (i = 0; i < dmabuf->attributes.n_planes; i++) {
209*4882a593Smuzhiyun 		/* return if EGL doesn't support import modifiers */
210*4882a593Smuzhiyun-		if (dmabuf->attributes.modifier[i] != DRM_FORMAT_MOD_INVALID)
211*4882a593Smuzhiyun+		if (DRM_MOD_VALID(dmabuf->attributes.modifier[i]))
212*4882a593Smuzhiyun 			if (!gr->has_dmabuf_import_modifiers)
213*4882a593Smuzhiyun 				return false;
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun@@ -3016,7 +3016,7 @@ populate_supported_formats(struct weston_compositor *ec,
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun 		/* Always add DRM_FORMAT_MOD_INVALID, as EGL implementations
218*4882a593Smuzhiyun 		 * support implicit modifiers. */
219*4882a593Smuzhiyun-		ret = weston_drm_format_add_modifier(fmt, DRM_FORMAT_MOD_INVALID);
220*4882a593Smuzhiyun+		ret = weston_drm_format_add_modifier(fmt, DRM_FORMAT_MOD_LINEAR);
221*4882a593Smuzhiyun 		if (ret < 0)
222*4882a593Smuzhiyun 			goto out;
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun@@ -3027,7 +3027,7 @@ populate_supported_formats(struct weston_compositor *ec,
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun 		for (j = 0; j < num_modifiers; j++) {
227*4882a593Smuzhiyun 			/* Skip MOD_INVALID, as it has already been added. */
228*4882a593Smuzhiyun-			if (modifiers[j] == DRM_FORMAT_MOD_INVALID)
229*4882a593Smuzhiyun+			if (!DRM_MOD_VALID(modifiers[j]))
230*4882a593Smuzhiyun 				continue;
231*4882a593Smuzhiyun 			ret = weston_drm_format_add_modifier(fmt, modifiers[j]);
232*4882a593Smuzhiyun 			if (ret < 0) {
233*4882a593Smuzhiyun--
234*4882a593Smuzhiyun2.20.1
235*4882a593Smuzhiyun
236