diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c index 17452e9a..c512016e 100644 --- a/render/gles2/renderer.c +++ b/render/gles2/renderer.c @@ -245,10 +245,12 @@ static struct wlr_renderer_impl wlr_renderer_impl = { struct wlr_renderer *wlr_gles2_renderer_init(struct wlr_backend *backend) { init_globals(); - struct wlr_egl *egl = wlr_backend_get_egl(backend); struct wlr_gles2_renderer *renderer = calloc(1, sizeof(struct wlr_gles2_renderer)); wlr_renderer_init(&renderer->wlr_renderer, &wlr_renderer_impl); - renderer->egl = egl; + if (backend) { + struct wlr_egl *egl = wlr_backend_get_egl(backend); + renderer->egl = egl; + } return &renderer->wlr_renderer; } diff --git a/render/wlr_renderer.c b/render/wlr_renderer.c index 1afba6e3..15b8b999 100644 --- a/render/wlr_renderer.c +++ b/render/wlr_renderer.c @@ -8,7 +8,7 @@ void wlr_renderer_init(struct wlr_renderer *renderer, } void wlr_renderer_destroy(struct wlr_renderer *r) { - if (r->impl->destroy) { + if (r && r->impl->destroy) { r->impl->destroy(r); } } diff --git a/render/wlr_texture.c b/render/wlr_texture.c index d2bcca07..72d56c8f 100644 --- a/render/wlr_texture.c +++ b/render/wlr_texture.c @@ -9,7 +9,7 @@ void wlr_texture_init(struct wlr_texture *texture, } void wlr_texture_destroy(struct wlr_texture *texture) { - if (texture->impl->destroy) { + if (texture && texture->impl->destroy) { texture->impl->destroy(texture); } } diff --git a/types/wlr_output.c b/types/wlr_output.c index 26f7316e..04dcbfa5 100644 --- a/types/wlr_output.c +++ b/types/wlr_output.c @@ -130,7 +130,6 @@ bool wlr_output_set_cursor(struct wlr_output *output, return true; } - /* wlr_log(L_INFO, "Falling back to software cursor"); output->cursor.is_sw = true; @@ -138,18 +137,22 @@ bool wlr_output_set_cursor(struct wlr_output *output, output->cursor.height = height; if (!output->cursor.renderer) { - output->cursor.renderer = wlr_gles2_renderer_init(); + /* NULL egl is okay given that we are only using pixel buffers */ + output->cursor.renderer = wlr_gles2_renderer_init(NULL); + if (!output->cursor.renderer) { + return false; + } } if (!output->cursor.texture) { output->cursor.texture = wlr_render_texture_init(output->cursor.renderer); + if (!output->cursor.texture) { + return false; + } } - wlr_texture_upload_pixels(output->cursor.texture, WL_SHM_FORMAT_ARGB8888, - stride, width, height, buf); - */ - - return false; + return wlr_texture_upload_pixels(output->cursor.texture, + WL_SHM_FORMAT_ARGB8888, stride, width, height, buf); } bool wlr_output_move_cursor(struct wlr_output *output, int x, int y) { @@ -172,6 +175,9 @@ void wlr_output_destroy(struct wlr_output *output) { return; } + wlr_texture_destroy(output->cursor.texture); + wlr_renderer_destroy(output->cursor.renderer); + output->impl->destroy(output); for (size_t i = 0; output->modes && i < output->modes->length; ++i) { struct wlr_output_mode *mode = output->modes->items[i];