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;