linuxOS_AP06/buildroot/package/weston/0073-HACK-gl-renderer-Fallback-to-GBM-when-surfaceless-pl.patch
2025-06-03 12:28:32 +08:00

168 lines
5.1 KiB
Diff

From b33da20bdbfd7af25dbbbf36be62de9589505e79 Mon Sep 17 00:00:00 2001
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Date: Wed, 20 Dec 2023 09:24:31 +0800
Subject: [PATCH 73/95] HACK: gl-renderer: Fallback to GBM when surfaceless
platform not supported
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
libweston/renderer-gl/egl-glue.c | 8 ++++
libweston/renderer-gl/gl-renderer-internal.h | 4 ++
libweston/renderer-gl/gl-renderer.c | 41 ++++++++++++++++++--
libweston/renderer-gl/meson.build | 3 +-
4 files changed, 52 insertions(+), 4 deletions(-)
diff --git a/libweston/renderer-gl/egl-glue.c b/libweston/renderer-gl/egl-glue.c
index f6d7c48..b89e1ca 100644
--- a/libweston/renderer-gl/egl-glue.c
+++ b/libweston/renderer-gl/egl-glue.c
@@ -604,6 +604,14 @@ gl_renderer_setup_egl_client_extensions(struct gl_renderer *gr)
if (weston_check_egl_extension(extensions, s))
return 0;
+ /* HACK: Fallback to GBM platform */
+ if (gr->platform == EGL_PLATFORM_SURFACELESS_MESA) {
+ gr->platform = EGL_PLATFORM_GBM_KHR;
+ weston_log("Warn: EGL does not support %s platform, try GBM\n",
+ extension_suffix);
+ return gl_renderer_setup_egl_client_extensions(gr);
+ }
+
/* at this point we definitely have some platform extensions but
* haven't found the supplied platform, so chances are it's
* not supported. */
diff --git a/libweston/renderer-gl/gl-renderer-internal.h b/libweston/renderer-gl/gl-renderer-internal.h
index 703f88b..49c490a 100644
--- a/libweston/renderer-gl/gl-renderer-internal.h
+++ b/libweston/renderer-gl/gl-renderer-internal.h
@@ -46,6 +46,7 @@
#include <time.h>
#include <wayland-util.h>
+#include <gbm.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include "shared/weston-egl-ext.h" /* for PFN* stuff */
@@ -307,6 +308,9 @@ struct gl_renderer {
struct dmabuf_allocator *allocator;
bool is_mali_egl;
+
+ int drm_fd;
+ struct gbm_device *gbm;
};
static inline struct gl_renderer *
diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c
index 1216557..e1704ac 100644
--- a/libweston/renderer-gl/gl-renderer.c
+++ b/libweston/renderer-gl/gl-renderer.c
@@ -45,6 +45,8 @@
#include <gbm.h>
+#include <xf86drm.h>
+
#include "linux-sync-file.h"
#include "timeline.h"
@@ -4429,6 +4431,11 @@ gl_renderer_destroy(struct weston_compositor *ec)
if (gr->debug_mode_binding)
weston_binding_destroy(gr->debug_mode_binding);
+ if (gr->gbm) {
+ gbm_device_destroy(gr->gbm);
+ close(gr->drm_fd);
+ }
+
weston_log_scope_destroy(gr->shader_scope);
weston_log_scope_destroy(gr->renderer_scope);
free(gr);
@@ -4472,6 +4479,8 @@ gl_renderer_display_create(struct weston_compositor *ec,
const struct gl_renderer_display_options *options)
{
struct gl_renderer *gr;
+ EGLint egl_surface_type = options->egl_surface_type;
+ void *egl_native_display = options->egl_native_display;
int ret;
gr = zalloc(sizeof *gr);
@@ -4494,6 +4503,29 @@ gl_renderer_display_create(struct weston_compositor *ec,
if (gl_renderer_setup_egl_client_extensions(gr) < 0)
goto fail;
+ /* HACK: Fixup options for GBM platform */
+ if (gr->platform == EGL_PLATFORM_GBM_KHR) {
+ if (!egl_surface_type)
+ egl_surface_type = EGL_WINDOW_BIT;
+
+ if (!egl_native_display) {
+ gr->drm_fd = drmOpen("rockchip", NULL);
+ if (gr->drm_fd < 0)
+ gr->drm_fd = open("/dev/dri/card0",
+ O_RDWR | O_CLOEXEC);
+ if (gr->drm_fd < 0)
+ goto fail;
+
+ gr->gbm = gbm_create_device(gr->drm_fd);
+ if (!gr->gbm) {
+ close(gr->drm_fd);
+ goto fail;
+ }
+
+ egl_native_display = gr->gbm;
+ }
+ }
+
gr->base.read_pixels = gl_renderer_read_pixels;
gr->base.repaint_output = gl_renderer_repaint_output;
gr->base.resize_output = gl_renderer_resize_output;
@@ -4505,7 +4537,7 @@ gl_renderer_display_create(struct weston_compositor *ec,
gr->base.buffer_init = gl_renderer_buffer_init;
gr->base.type = WESTON_RENDERER_GL;
- if (gl_renderer_setup_egl_display(gr, options->egl_native_display) < 0)
+ if (gl_renderer_setup_egl_display(gr, egl_native_display) < 0)
goto fail;
gr->allocator = gl_renderer_allocator_create(gr, options);
@@ -4525,8 +4557,6 @@ gl_renderer_display_create(struct weston_compositor *ec,
goto fail_terminate;
if (!gr->has_configless_context) {
- EGLint egl_surface_type = options->egl_surface_type;
-
if (!gr->has_surfaceless_context)
egl_surface_type |= EGL_PBUFFER_BIT;
@@ -4628,6 +4658,11 @@ fail_terminate:
weston_drm_format_array_fini(&gr->supported_formats);
eglTerminate(gr->egl_display);
fail:
+ if (gr->gbm) {
+ gbm_device_destroy(gr->gbm);
+ close(gr->drm_fd);
+ }
+
weston_log_scope_destroy(gr->shader_scope);
weston_log_scope_destroy(gr->renderer_scope);
free(gr);
diff --git a/libweston/renderer-gl/meson.build b/libweston/renderer-gl/meson.build
index 274a296..93ae313 100644
--- a/libweston/renderer-gl/meson.build
+++ b/libweston/renderer-gl/meson.build
@@ -33,8 +33,9 @@ deps_renderer_gl = [
dep_gbm,
dep_libm,
dep_pixman,
+ dep_gbm,
+ dep_libdrm,
dep_libweston_private,
- dep_libdrm_headers,
dep_vertex_clipping
]
--
2.20.1