From 64713ca283da689022e0bc567d63a2f0b5fc3555 Mon Sep 17 00:00:00 2001 From: Trigger Huang Date: Fri, 24 Apr 2026 12:01:06 +0800 Subject: [PATCH] renderer-gl: Change init/destroy step for recovery When recovering the renderer, skip non-GL steps in gl_renderer_destroy() and gl_renderer_display_create() Signed-off-by: Trigger Huang --- libweston/renderer-gl/gl-renderer.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index 39d0aa873..ad4506bea 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -5147,6 +5147,13 @@ gl_renderer_destroy_context(struct weston_compositor *ec) EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + if (gr->recovering && gr->drm_device) { + weston_dmabuf_feedback_destroy(ec->default_dmabuf_feedback); + ec->default_dmabuf_feedback = NULL; + weston_dmabuf_feedback_format_table_destroy(ec->dmabuf_feedback_format_table); + ec->dmabuf_feedback_format_table = NULL; + } + wl_list_for_each_safe(format, next_format, &gr->dmabuf_formats, link) dmabuf_format_destroy(format); @@ -5169,6 +5176,11 @@ gl_renderer_destroy(struct weston_compositor *ec) { struct gl_renderer *gr = get_renderer(ec); + if (gr->recovering) { + gl_renderer_destroy_context(ec); + return; + } + wl_signal_emit(&gr->destroy_signal, gr); gl_renderer_destroy_context(ec); @@ -5344,11 +5356,14 @@ static int gl_renderer_display_create(struct weston_compositor *ec, const struct gl_renderer_display_options *options) { - struct gl_renderer *gr; + struct gl_renderer *gr = get_renderer(ec); const struct pixel_format_info *info; int nformats, i, j; bool supported; + if (gr && gr->recovering) + return gl_renderer_init_context(ec, options); + gr = zalloc(sizeof *gr); if (gr == NULL) return -1;