1From 9129426e8b99ebfcdf3849683b3aed3ebd351f7f Mon Sep 17 00:00:00 2001
2From: Jeffy Chen <jeffy.chen@rock-chips.com>
3Date: Thu, 6 Dec 2018 18:53:05 +0800
4Subject: [PATCH 09/79] HACK: gl-renderer: Workaround dmabuf import/attach for
5 old mali
6
7Tested on px3se with libmali-utgard-400-r7p0-r3p0-wayland.so, the
8mpp + waylandsink works.
9
10Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
11---
12 libweston/renderer-gl/gl-renderer-internal.h |  2 ++
13 libweston/renderer-gl/gl-renderer.c          | 34 ++++++++++++++++----
14 2 files changed, 30 insertions(+), 6 deletions(-)
15
16diff --git a/libweston/renderer-gl/gl-renderer-internal.h b/libweston/renderer-gl/gl-renderer-internal.h
17index 72101b4..e7e1693 100644
18--- a/libweston/renderer-gl/gl-renderer-internal.h
19+++ b/libweston/renderer-gl/gl-renderer-internal.h
20@@ -186,6 +186,8 @@ struct gl_renderer {
21 	 */
22 	struct wl_list shader_list;
23 	struct weston_log_scope *shader_scope;
24+
25+	bool is_mali_egl;
26 };
27
28 static inline struct gl_renderer *
29diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c
30index 7231f73..053fd52 100644
31--- a/libweston/renderer-gl/gl-renderer.c
32+++ b/libweston/renderer-gl/gl-renderer.c
33@@ -2257,6 +2257,14 @@ import_simple_dmabuf(struct gl_renderer *gr,
34 	attribs[atti++] = EGL_IMAGE_PRESERVED_KHR;
35 	attribs[atti++] = EGL_TRUE;
36
37+	/* Old mali needs extra attributes */
38+	if (gr->is_mali_egl) {
39+		attribs[atti++] = EGL_YUV_COLOR_SPACE_HINT_EXT;
40+		attribs[atti++] = EGL_ITU_REC601_EXT;
41+		attribs[atti++] = EGL_SAMPLE_RANGE_HINT_EXT;
42+		attribs[atti++] = EGL_YUV_NARROW_RANGE_EXT;
43+	}
44+
45 	if (attributes->modifier[0] != DRM_FORMAT_MOD_INVALID) {
46 		if (!gr->has_dmabuf_import_modifiers)
47 			return NULL;
48@@ -2661,7 +2669,7 @@ gl_renderer_query_dmabuf_formats(struct weston_compositor *wc,
49
50 	if (!gr->has_dmabuf_import_modifiers ||
51 	    !gr->query_dmabuf_formats(gr->egl_display, 0, NULL, &num)) {
52-		num = gr->has_gl_texture_rg ? ARRAY_LENGTH(fallback_formats) : 2;
53+		num = (gr->has_gl_texture_rg || gr->is_mali_egl) ? ARRAY_LENGTH(fallback_formats) : 2;
54 		fallback = true;
55 	}
56
57@@ -2791,7 +2799,7 @@ dmabuf_is_opaque(struct linux_dmabuf_buffer *dmabuf)
58 	return pixel_format_is_opaque(info);
59 }
60
61-static void
62+static int
63 gl_renderer_attach_dmabuf(struct weston_surface *surface,
64 			  struct weston_buffer *buffer,
65 			  struct linux_dmabuf_buffer *dmabuf)
66@@ -2805,7 +2813,7 @@ gl_renderer_attach_dmabuf(struct weston_surface *surface,
67 	if (!gr->has_dmabuf_import) {
68 		linux_dmabuf_buffer_send_server_error(dmabuf,
69 				"EGL dmabuf import not supported");
70-		return;
71+		return -1;
72 	}
73
74 	buffer->width = dmabuf->attributes.width;
75@@ -2839,7 +2847,7 @@ gl_renderer_attach_dmabuf(struct weston_surface *surface,
76 	 * Here we release the cache reference which has to be final.
77 	 */
78 	if (dmabuf->direct_display)
79-		return;
80+		return -1;
81
82 	image = linux_dmabuf_buffer_get_user_data(dmabuf);
83
84@@ -2859,6 +2867,8 @@ gl_renderer_attach_dmabuf(struct weston_surface *surface,
85 	}
86
87 	gs->shader_variant = image->shader_variant;
88+
89+	return 0;
90 }
91
92 static const struct weston_drm_format_array *
93@@ -2960,7 +2970,16 @@ gl_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer)
94 	else if (gr->has_bind_display &&
95 		 gr->query_buffer(gr->egl_display, (void *)buffer->resource,
96 				  EGL_TEXTURE_FORMAT, &format))
97+	{
98+		/* Prefer attaching as dmabuf for old mali */
99+		dmabuf = linux_dmabuf_buffer_get(buffer->resource);
100+		if (dmabuf && gr->is_mali_egl) {
101+			if (!gl_renderer_attach_dmabuf(es, buffer, dmabuf))
102+				return;
103+		}
104+
105 		gl_renderer_attach_egl(es, buffer, format);
106+	}
107 	else if ((dmabuf = linux_dmabuf_buffer_get(buffer->resource)))
108 		gl_renderer_attach_dmabuf(es, buffer, dmabuf);
109 	else {
110@@ -3253,7 +3272,7 @@ gl_renderer_log_extensions(const char *name, const char *extensions)
111 }
112
113 static void
114-log_egl_info(EGLDisplay egldpy)
115+log_egl_info(struct gl_renderer *gr, EGLDisplay egldpy)
116 {
117 	const char *str;
118
119@@ -3263,6 +3282,9 @@ log_egl_info(EGLDisplay egldpy)
120 	str = eglQueryString(egldpy, EGL_VENDOR);
121 	weston_log("EGL vendor: %s\n", str ? str : "(null)");
122
123+	if (!strcmp(str, "ARM"))
124+		gr->is_mali_egl = 1;
125+
126 	str = eglQueryString(egldpy, EGL_CLIENT_APIS);
127 	weston_log("EGL client APIs: %s\n", str ? str : "(null)");
128
129@@ -3681,7 +3703,7 @@ gl_renderer_display_create(struct weston_compositor *ec,
130
131 	weston_drm_format_array_init(&gr->supported_formats);
132
133-	log_egl_info(gr->egl_display);
134+	log_egl_info(gr, gr->egl_display);
135
136 	ec->renderer = &gr->base;
137
138--
1392.20.1
140
141