[PATCH 3/7 v2] gl-renderer: Make dummy surface current after all outputs are gone
Armin Krezović
krezovic.armin at gmail.com
Sun Jul 31 10:28:17 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 wl_signal
Signed-off-by: Armin Krezović <krezovic.armin at gmail.com>
---
libweston/gl-renderer.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/libweston/gl-renderer.c b/libweston/gl-renderer.c
index ed44c6d..cb457aa 100644
--- a/libweston/gl-renderer.c
+++ b/libweston/gl-renderer.c
@@ -168,6 +168,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;
@@ -217,6 +218,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 +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);
@@ -2828,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;
@@ -2885,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;
@@ -3137,6 +3158,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