When all outputs are gone, there are no current read/write
surfaces associated with a context. This makes the previously
created dummy surface current until an output gets attached
to avoid any potential crashes.

Signed-off-by: Armin Krezović <krezovic.ar...@gmail.com>
---
 libweston/gl-renderer.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/libweston/gl-renderer.c b/libweston/gl-renderer.c
index be6b11e..56eb344 100644
--- a/libweston/gl-renderer.c
+++ b/libweston/gl-renderer.c
@@ -167,6 +167,7 @@ struct gl_surface_state {
 
 struct gl_renderer {
        struct weston_renderer base;
+       struct weston_compositor *compositor;
        int fragment_shader_debug;
        int fan_debug;
        struct weston_binding *fragment_binding;
@@ -216,6 +217,9 @@ struct gl_renderer {
        struct gl_shader *current_shader;
 
        struct wl_signal destroy_signal;
+
+       struct wl_signal output_destroy_signal;
+       struct wl_listener output_destroy_listener;
 };
 
 static PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = NULL;
@@ -2642,6 +2646,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);
 
@@ -2827,6 +2833,21 @@ platform_to_extension(EGLenum platform)
        }
 }
 
+static void
+output_handle_destroy(struct wl_listener *listener, void *data)
+{
+       struct gl_renderer *gr;
+       struct weston_compositor *ec;
+
+       gr = container_of(listener, struct gl_renderer,
+                         output_destroy_listener);
+       ec = gr->compositor;
+
+       if (wl_list_empty(&ec->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;
@@ -2884,6 +2905,7 @@ gl_renderer_create(struct weston_compositor *ec, EGLenum 
platform,
        if (gr == NULL)
                return -1;
 
+       gr->compositor = ec;
        gr->base.read_pixels = gl_renderer_read_pixels;
        gr->base.repaint_output = gl_renderer_repaint_output;
        gr->base.flush_damage = gl_renderer_flush_damage;
@@ -2962,6 +2984,7 @@ gl_renderer_create(struct weston_compositor *ec, EGLenum 
platform,
        wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_RGB565);
 
        wl_signal_init(&gr->destroy_signal);
+       wl_signal_init(&gr->output_destroy_signal);
 
        if (gl_renderer_setup(ec, gr->dummy_surface) < 0) {
                if (gr->dummy_surface != EGL_NO_SURFACE)
@@ -3136,6 +3159,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");
-- 
2.9.2

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to