1*4882a593SmuzhiyunFrom b727c545a985640aecaf07c3e3e5100e57914bd2 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 30/95] 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         | 5 +++--
12*4882a593Smuzhiyun clients/simple-dmabuf-v4l.c         | 2 +-
13*4882a593Smuzhiyun libweston/backend-drm/drm-gbm.c     | 3 ++-
14*4882a593Smuzhiyun libweston/backend-drm/fb.c          | 6 ++++--
15*4882a593Smuzhiyun libweston/linux-dmabuf.c            | 3 +--
16*4882a593Smuzhiyun libweston/pixel-formats.c           | 2 +-
17*4882a593Smuzhiyun libweston/pixman-renderer.c         | 3 +--
18*4882a593Smuzhiyun libweston/renderer-gl/gl-renderer.c | 6 +++---
19*4882a593Smuzhiyun shared/weston-drm-fourcc.h          | 4 ++++
20*4882a593Smuzhiyun 9 files changed, 20 insertions(+), 14 deletions(-)
21*4882a593Smuzhiyun
22*4882a593Smuzhiyundiff --git a/clients/simple-dmabuf-egl.c b/clients/simple-dmabuf-egl.c
23*4882a593Smuzhiyunindex 16d47ba..a03058b 100644
24*4882a593Smuzhiyun--- a/clients/simple-dmabuf-egl.c
25*4882a593Smuzhiyun+++ b/clients/simple-dmabuf-egl.c
26*4882a593Smuzhiyun@@ -265,7 +265,8 @@ create_fbo_for_buffer(struct display *display, struct buffer *buffer)
27*4882a593Smuzhiyun 	attribs[atti++] = (int) buffer->offsets[plane_idx]; \
28*4882a593Smuzhiyun 	attribs[atti++] = EGL_DMA_BUF_PLANE ## plane_idx ## _PITCH_EXT; \
29*4882a593Smuzhiyun 	attribs[atti++] = (int) buffer->strides[plane_idx]; \
30*4882a593Smuzhiyun-	if (display->egl.has_dma_buf_import_modifiers) { \
31*4882a593Smuzhiyun+	if (DRM_MOD_VALID(buffer->modifier) && \
32*4882a593Smuzhiyun+	    display->egl.has_dma_buf_import_modifiers) { \
33*4882a593Smuzhiyun 		attribs[atti++] = EGL_DMA_BUF_PLANE ## plane_idx ## _MODIFIER_LO_EXT; \
34*4882a593Smuzhiyun 		attribs[atti++] = buffer->modifier & 0xFFFFFFFF; \
35*4882a593Smuzhiyun 		attribs[atti++] = EGL_DMA_BUF_PLANE ## plane_idx ## _MODIFIER_HI_EXT; \
36*4882a593Smuzhiyun@@ -1018,7 +1019,7 @@ dmabuf_modifiers(void *data, struct zwp_linux_dmabuf_v1 *zwp_linux_dmabuf,
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun 	d->format_supported = true;
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun-	if (modifier != DRM_FORMAT_MOD_INVALID) {
41*4882a593Smuzhiyun+	if (DRM_MOD_VALID(modifier)) {
42*4882a593Smuzhiyun 		++d->modifiers_count;
43*4882a593Smuzhiyun 		d->modifiers = realloc(d->modifiers,
44*4882a593Smuzhiyun 				       d->modifiers_count * sizeof(*d->modifiers));
45*4882a593Smuzhiyundiff --git a/clients/simple-dmabuf-v4l.c b/clients/simple-dmabuf-v4l.c
46*4882a593Smuzhiyunindex a19570f..5ac340e 100644
47*4882a593Smuzhiyun--- a/clients/simple-dmabuf-v4l.c
48*4882a593Smuzhiyun+++ b/clients/simple-dmabuf-v4l.c
49*4882a593Smuzhiyun@@ -732,7 +732,7 @@ dmabuf_modifier(void *data, struct zwp_linux_dmabuf_v1 *zwp_linux_dmabuf,
50*4882a593Smuzhiyun 	struct display *d = data;
51*4882a593Smuzhiyun 	uint64_t modifier = ((uint64_t) modifier_hi << 32 ) | modifier_lo;
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun-	if (format == d->drm_format && modifier == DRM_FORMAT_MOD_LINEAR)
54*4882a593Smuzhiyun+	if (format == d->drm_format && !DRM_MOD_VALID(modifier))
55*4882a593Smuzhiyun 		d->requested_format_found = true;
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun
58*4882a593Smuzhiyundiff --git a/libweston/backend-drm/drm-gbm.c b/libweston/backend-drm/drm-gbm.c
59*4882a593Smuzhiyunindex d10cc40..f998178 100644
60*4882a593Smuzhiyun--- a/libweston/backend-drm/drm-gbm.c
61*4882a593Smuzhiyun+++ b/libweston/backend-drm/drm-gbm.c
62*4882a593Smuzhiyun@@ -206,7 +206,8 @@ create_gbm_surface(struct gbm_device *gbm, struct drm_output *output)
63*4882a593Smuzhiyun 	}
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun #ifdef HAVE_GBM_MODIFIERS
66*4882a593Smuzhiyun-	if (!weston_drm_format_has_modifier(fmt, DRM_FORMAT_MOD_INVALID)) {
67*4882a593Smuzhiyun+	if (!weston_drm_format_has_modifier(fmt, DRM_FORMAT_MOD_INVALID) &&
68*4882a593Smuzhiyun+	    !weston_drm_format_has_modifier(fmt, DRM_FORMAT_MOD_LINEAR)) {
69*4882a593Smuzhiyun 		modifiers = weston_drm_format_get_modifiers(fmt, &num_modifiers);
70*4882a593Smuzhiyun 		output->gbm_surface =
71*4882a593Smuzhiyun 			gbm_surface_create_with_modifiers(gbm,
72*4882a593Smuzhiyundiff --git a/libweston/backend-drm/fb.c b/libweston/backend-drm/fb.c
73*4882a593Smuzhiyunindex 05b4988..4cb2cbe 100644
74*4882a593Smuzhiyun--- a/libweston/backend-drm/fb.c
75*4882a593Smuzhiyun+++ b/libweston/backend-drm/fb.c
76*4882a593Smuzhiyun@@ -77,7 +77,7 @@ drm_fb_addfb(struct drm_device *device, struct drm_fb *fb)
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun 	/* If we have a modifier set, we must only use the WithModifiers
79*4882a593Smuzhiyun 	 * entrypoint; we cannot import it through legacy ioctls. */
80*4882a593Smuzhiyun-	if (device->fb_modifiers && fb->modifier != DRM_FORMAT_MOD_INVALID) {
81*4882a593Smuzhiyun+	if (device->fb_modifiers && DRM_MOD_VALID(fb->modifier)) {
82*4882a593Smuzhiyun 		/* KMS demands that if a modifier is set, it must be the same
83*4882a593Smuzhiyun 		 * for all planes. */
84*4882a593Smuzhiyun 		for (i = 0; i < ARRAY_LENGTH(mods) && fb->handles[i]; i++)
85*4882a593Smuzhiyun@@ -238,6 +238,7 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
86*4882a593Smuzhiyun 		.modifier = dmabuf->attributes.modifier[0],
87*4882a593Smuzhiyun 	};
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun+#if 0
90*4882a593Smuzhiyun 	/* We should not import to KMS a buffer that has been allocated using no
91*4882a593Smuzhiyun 	 * modifiers. Usually drivers use linear layouts to allocate with no
92*4882a593Smuzhiyun 	 * modifiers, but this is not a rule. The driver could use, for
93*4882a593Smuzhiyun@@ -251,6 +252,7 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
94*4882a593Smuzhiyun 				FAILURE_REASONS_DMABUF_MODIFIER_INVALID;
95*4882a593Smuzhiyun 		return NULL;
96*4882a593Smuzhiyun 	}
97*4882a593Smuzhiyun+#endif
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun 	/* XXX: TODO:
100*4882a593Smuzhiyun 	 *
101*4882a593Smuzhiyun@@ -489,7 +491,7 @@ drm_fb_compatible_with_plane(struct drm_fb *fb, struct drm_plane *plane)
102*4882a593Smuzhiyun 		 * wl_drm is being used for scanout. Mesa is the only user we
103*4882a593Smuzhiyun 		 * care in this case (even though recent versions are also using
104*4882a593Smuzhiyun 		 * dmabufs), and it should know better what works or not. */
105*4882a593Smuzhiyun-		if (fb->modifier == DRM_FORMAT_MOD_INVALID)
106*4882a593Smuzhiyun+		if (!DRM_MOD_VALID(fb->modifier))
107*4882a593Smuzhiyun 			return true;
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun 		if (weston_drm_format_has_modifier(fmt, fb->modifier))
110*4882a593Smuzhiyundiff --git a/libweston/linux-dmabuf.c b/libweston/linux-dmabuf.c
111*4882a593Smuzhiyunindex b73508e..a4dee8b 100644
112*4882a593Smuzhiyun--- a/libweston/linux-dmabuf.c
113*4882a593Smuzhiyun+++ b/libweston/linux-dmabuf.c
114*4882a593Smuzhiyun@@ -1057,8 +1057,7 @@ bind_linux_dmabuf(struct wl_client *client,
115*4882a593Smuzhiyun 								  fmt->format,
116*4882a593Smuzhiyun 								  modifier_hi,
117*4882a593Smuzhiyun 								  modifier_lo);
118*4882a593Smuzhiyun-			} else if (modifiers[i] == DRM_FORMAT_MOD_LINEAR ||
119*4882a593Smuzhiyun-				   modifiers[i] == DRM_FORMAT_MOD_INVALID) {
120*4882a593Smuzhiyun+			} else if (!DRM_MOD_VALID(modifiers[i])) {
121*4882a593Smuzhiyun 				zwp_linux_dmabuf_v1_send_format(resource,
122*4882a593Smuzhiyun 								fmt->format);
123*4882a593Smuzhiyun 			}
124*4882a593Smuzhiyundiff --git a/libweston/pixel-formats.c b/libweston/pixel-formats.c
125*4882a593Smuzhiyunindex 7590171..10b3ed9 100644
126*4882a593Smuzhiyun--- a/libweston/pixel-formats.c
127*4882a593Smuzhiyun+++ b/libweston/pixel-formats.c
128*4882a593Smuzhiyun@@ -755,7 +755,7 @@ pixel_format_get_modifier(uint64_t modifier)
129*4882a593Smuzhiyun 		return mod_str;
130*4882a593Smuzhiyun 	}
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun-	if (modifier == DRM_FORMAT_MOD_LINEAR) {
133*4882a593Smuzhiyun+	if (!DRM_MOD_VALID(modifier)) {
134*4882a593Smuzhiyun 		str_printf(&mod_str, "%s (0x%llx)", modifier_name,
135*4882a593Smuzhiyun 			   (unsigned long long) modifier);
136*4882a593Smuzhiyun 		free(modifier_name);
137*4882a593Smuzhiyundiff --git a/libweston/pixman-renderer.c b/libweston/pixman-renderer.c
138*4882a593Smuzhiyunindex 7339541..c8b7b88 100644
139*4882a593Smuzhiyun--- a/libweston/pixman-renderer.c
140*4882a593Smuzhiyun+++ b/libweston/pixman-renderer.c
141*4882a593Smuzhiyun@@ -734,8 +734,7 @@ pixman_renderer_prepare_dmabuf(struct linux_dmabuf_buffer *dmabuf)
142*4882a593Smuzhiyun 	total_size = lseek(attributes->fd[0], 0, SEEK_END);
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun 	for (i = 0; i < attributes->n_planes; i++) {
145*4882a593Smuzhiyun-		if (attributes->modifier[i] != DRM_FORMAT_MOD_INVALID &&
146*4882a593Smuzhiyun-		    attributes->modifier[i] != DRM_FORMAT_MOD_LINEAR)
147*4882a593Smuzhiyun+		if (DRM_MOD_VALID(attributes->modifier[i]))
148*4882a593Smuzhiyun 			return false;
149*4882a593Smuzhiyun 	}
150*4882a593Smuzhiyun
151*4882a593Smuzhiyundiff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c
152*4882a593Smuzhiyunindex bbd1cd4..4eedb94 100644
153*4882a593Smuzhiyun--- a/libweston/renderer-gl/gl-renderer.c
154*4882a593Smuzhiyun+++ b/libweston/renderer-gl/gl-renderer.c
155*4882a593Smuzhiyun@@ -2397,7 +2397,7 @@ import_simple_dmabuf(struct gl_renderer *gr,
156*4882a593Smuzhiyun 		attribs[atti++] = EGL_YUV_NARROW_RANGE_EXT;
157*4882a593Smuzhiyun 	}
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun-	if (attributes->modifier[0] != DRM_FORMAT_MOD_INVALID) {
160*4882a593Smuzhiyun+	if (DRM_MOD_VALID(attributes->modifier[0])) {
161*4882a593Smuzhiyun 		if (!gr->has_dmabuf_import_modifiers)
162*4882a593Smuzhiyun 			return NULL;
163*4882a593Smuzhiyun 		has_modifier = true;
164*4882a593Smuzhiyun@@ -2806,7 +2806,7 @@ gl_renderer_import_dmabuf(struct weston_compositor *ec,
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun 	for (i = 0; i < dmabuf->attributes.n_planes; i++) {
167*4882a593Smuzhiyun 		/* return if EGL doesn't support import modifiers */
168*4882a593Smuzhiyun-		if (dmabuf->attributes.modifier[i] != DRM_FORMAT_MOD_INVALID)
169*4882a593Smuzhiyun+		if (DRM_MOD_VALID(dmabuf->attributes.modifier[i]))
170*4882a593Smuzhiyun 			if (!gr->has_dmabuf_import_modifiers)
171*4882a593Smuzhiyun 				return false;
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun@@ -2970,7 +2970,7 @@ populate_supported_formats(struct weston_compositor *ec,
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun 		for (j = 0; j < num_modifiers; j++) {
176*4882a593Smuzhiyun 			/* Skip MOD_INVALID, as it has already been added. */
177*4882a593Smuzhiyun-			if (modifiers[j] == DRM_FORMAT_MOD_INVALID)
178*4882a593Smuzhiyun+			if (!DRM_MOD_VALID(modifiers[j]))
179*4882a593Smuzhiyun 				continue;
180*4882a593Smuzhiyun 			ret = weston_drm_format_add_modifier(fmt, modifiers[j]);
181*4882a593Smuzhiyun 			if (ret < 0) {
182*4882a593Smuzhiyundiff --git a/shared/weston-drm-fourcc.h b/shared/weston-drm-fourcc.h
183*4882a593Smuzhiyunindex 0a013f7..31d8039 100644
184*4882a593Smuzhiyun--- a/shared/weston-drm-fourcc.h
185*4882a593Smuzhiyun+++ b/shared/weston-drm-fourcc.h
186*4882a593Smuzhiyun@@ -30,6 +30,10 @@
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun #include <drm_fourcc.h>
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun+/* modifier is not linear or invalid */
191*4882a593Smuzhiyun+#define DRM_MOD_VALID(mod) \
192*4882a593Smuzhiyun+	((mod) != DRM_FORMAT_MOD_LINEAR && (mod) != DRM_FORMAT_MOD_INVALID)
193*4882a593Smuzhiyun+
194*4882a593Smuzhiyun /* The kernel header drm_fourcc.h defines the DRM formats below.  We duplicate
195*4882a593Smuzhiyun  * some of the definitions here so that building Weston won't require
196*4882a593Smuzhiyun  * bleeding-edge kernel headers.
197*4882a593Smuzhiyun--
198*4882a593Smuzhiyun2.20.1
199*4882a593Smuzhiyun
200