[PATCH weston 2/2 v2] gl-renderer: Make dummy surface current after all outputs are gone

Armin Krezović krezovic.armin at gmail.com
Fri Aug 5 13:28:30 UTC 2016


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.

v2:

- Remove unnecessary objects

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

diff --git a/libweston/gl-renderer.c b/libweston/gl-renderer.c
index ed44c6d..d624453 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");
-- 
2.9.2



More information about the wayland-devel mailing list