diff --git a/libweston/gl-renderer.c b/libweston/gl-renderer.c index ed44c6d4..d624453b 100644 --- a/libweston/gl-renderer.c +++ b/libweston/gl-renderer.c @@ -217,6 +217,8 @@ struct gl_renderer { struct gl_shader *current_shader; struct wl_signal destroy_signal; + + struct wl_listener output_destroy_listener; }; static PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = NULL; @@ -2643,6 +2645,8 @@ gl_renderer_destroy(struct weston_compositor *ec) eglTerminate(gr->egl_display); eglReleaseThread(); + wl_list_remove(&gr->output_destroy_listener.link); + wl_array_release(&gr->vertices); wl_array_release(&gr->vtxcnt); @@ -2828,6 +2832,20 @@ platform_to_extension(EGLenum platform) } } +static void +output_handle_destroy(struct wl_listener *listener, void *data) +{ + struct gl_renderer *gr; + struct weston_output *output = data; + + gr = container_of(listener, struct gl_renderer, + output_destroy_listener); + + if (wl_list_empty(&output->compositor->output_list)) + eglMakeCurrent(gr->egl_display, gr->dummy_surface, + gr->dummy_surface, gr->egl_context); +} + static int gl_renderer_create_pbuffer_surface(struct gl_renderer *gr) { EGLConfig pbuffer_config; @@ -3137,6 +3155,10 @@ gl_renderer_setup(struct weston_compositor *ec, EGLSurface egl_surface) fan_debug_repaint_binding, ec); + gr->output_destroy_listener.notify = output_handle_destroy; + wl_signal_add(&ec->output_destroyed_signal, + &gr->output_destroy_listener); + weston_log("GL ES 2 renderer features:\n"); weston_log_continue(STAMP_SPACE "read-back format: %s\n", ec->read_format == PIXMAN_a8r8g8b8 ? "BGRA" : "RGBA");