hc
2023-05-26 a23f51ed7a39e452c1037343a84d7db1ca2c5bd7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
From 9194ccf53ac7813d104dfa0128d4553444ea34eb Mon Sep 17 00:00:00 2001
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Date: Thu, 6 Dec 2018 18:53:05 +0800
Subject: [PATCH 1/2] gl-renderer: Workaround dmabuf import/attach for mali
 
Tested on px3se with libmali-utgard-400-r7p0-r3p0-wayland.so, the
mpp + waylandsink works.
 
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
 libweston/renderer-gl/gl-renderer-internal.h |  2 ++
 libweston/renderer-gl/gl-renderer.c          | 36 ++++++++++++++++----
 2 files changed, 31 insertions(+), 7 deletions(-)
 
diff --git a/libweston/renderer-gl/gl-renderer-internal.h b/libweston/renderer-gl/gl-renderer-internal.h
index 529cb2f..1e389ef 100644
--- a/libweston/renderer-gl/gl-renderer-internal.h
+++ b/libweston/renderer-gl/gl-renderer-internal.h
@@ -119,6 +119,8 @@ struct gl_renderer {
 
     bool has_wait_sync;
     PFNEGLWAITSYNCKHRPROC wait_sync;
+
+    bool is_mali_egl;
 };
 
 static inline struct gl_renderer *
diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c
index d5bfe83..2d283ff 100644
--- a/libweston/renderer-gl/gl-renderer.c
+++ b/libweston/renderer-gl/gl-renderer.c
@@ -1950,6 +1950,14 @@ import_simple_dmabuf(struct gl_renderer *gr,
     attribs[atti++] = EGL_LINUX_DRM_FOURCC_EXT;
     attribs[atti++] = attributes->format;
 
+    /* Old mali needs extra attributes */
+    if (gr->is_mali_egl) {
+        attribs[atti++] = EGL_YUV_COLOR_SPACE_HINT_EXT;
+        attribs[atti++] = EGL_ITU_REC601_EXT;
+        attribs[atti++] = EGL_SAMPLE_RANGE_HINT_EXT;
+        attribs[atti++] = EGL_YUV_NARROW_RANGE_EXT;
+    }
+
     if (attributes->modifier[0] != DRM_FORMAT_MOD_INVALID) {
         if (!gr->has_dmabuf_import_modifiers)
             return NULL;
@@ -2370,7 +2378,7 @@ gl_renderer_query_dmabuf_formats(struct weston_compositor *wc,
 
     if (!gr->has_dmabuf_import_modifiers ||
         !gr->query_dmabuf_formats(gr->egl_display, 0, NULL, &num)) {
-        num = gr->has_gl_texture_rg ? ARRAY_LENGTH(fallback_formats) : 2;
+        num = (gr->has_gl_texture_rg || gr->is_mali_egl) ? ARRAY_LENGTH(fallback_formats) : 2;
         fallback = true;
     }
 
@@ -2525,7 +2533,7 @@ dmabuf_is_opaque(struct linux_dmabuf_buffer *dmabuf)
     return pixel_format_is_opaque(info);
 }
 
-static void
+static int
 gl_renderer_attach_dmabuf(struct weston_surface *surface,
               struct weston_buffer *buffer,
               struct linux_dmabuf_buffer *dmabuf)
@@ -2538,7 +2546,7 @@ gl_renderer_attach_dmabuf(struct weston_surface *surface,
     if (!gr->has_dmabuf_import) {
         linux_dmabuf_buffer_send_server_error(dmabuf,
                 "EGL dmabuf import not supported");
-        return;
+        return -1;
     }
 
     buffer->width = dmabuf->attributes.width;
@@ -2572,7 +2580,7 @@ gl_renderer_attach_dmabuf(struct weston_surface *surface,
      * Here we release the cache reference which has to be final.
      */
     if (dmabuf->direct_display)
-        return;
+        return -1;
 
     image = linux_dmabuf_buffer_get_user_data(dmabuf);
 
@@ -2584,7 +2592,7 @@ gl_renderer_attach_dmabuf(struct weston_surface *surface,
 
     if (!import_known_dmabuf(gr, image)) {
         linux_dmabuf_buffer_send_server_error(dmabuf, "EGL dmabuf import failed");
-        return;
+        return -1;
     }
 
     gs->num_images = image->num_images;
@@ -2600,6 +2608,8 @@ gl_renderer_attach_dmabuf(struct weston_surface *surface,
     }
 
     gs->shader = image->shader;
+
+    return 0;
 }
 
 static void
@@ -2639,7 +2649,16 @@ gl_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer)
     else if (gr->has_bind_display &&
          gr->query_buffer(gr->egl_display, (void *)buffer->resource,
                   EGL_TEXTURE_FORMAT, &format))
+    {
+        /* Prefer attaching as dmabuf for old mali */
+        dmabuf = linux_dmabuf_buffer_get(buffer->resource);
+        if (dmabuf && gr->is_mali_egl) {
+            if (!gl_renderer_attach_dmabuf(es, buffer, dmabuf))
+                return;
+        }
+
         gl_renderer_attach_egl(es, buffer, format);
+    }
     else if ((dmabuf = linux_dmabuf_buffer_get(buffer->resource)))
         gl_renderer_attach_dmabuf(es, buffer, dmabuf);
     else {
@@ -3159,7 +3178,7 @@ log_egl_info(EGLDisplay egldpy)
 }
 
 static void
-log_gl_info(void)
+log_gl_info(struct gl_renderer *gr)
 {
     const char *str;
 
@@ -3175,6 +3194,9 @@ log_gl_info(void)
     str = (char *)glGetString(GL_RENDERER);
     weston_log("GL renderer: %s\n", str ? str : "(null)");
 
+    if (strstr(str, "mali") || strstr(str, "Mali"))
+        gr->is_mali_egl = 1;
+
     str = (char *)glGetString(GL_EXTENSIONS);
     gl_renderer_log_extensions("GL extensions", str ? str : "(null)");
 }
@@ -3742,7 +3764,7 @@ gl_renderer_setup(struct weston_compositor *ec, EGLSurface egl_surface)
         gr->gl_version = GR_GL_VERSION(2, 0);
     }
 
-    log_gl_info();
+    log_gl_info(gr);
 
     gr->image_target_texture_2d =
         (void *) eglGetProcAddress("glEGLImageTargetTexture2DOES");
-- 
2.20.1