From 9194ccf53ac7813d104dfa0128d4553444ea34eb Mon Sep 17 00:00:00 2001 From: Jeffy Chen 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 --- 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