diff options
author | Alexander Orzechowski <alex@ozal.ski> | 2022-12-01 04:57:53 -0500 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2022-12-01 10:01:35 +0000 |
commit | fe891ebd4ea35f73286f84e374b71fc78e53e930 (patch) | |
tree | b01e9e6d263975ea3c7c72418dae0759dff245dd | |
parent | db0e962368244c3171a8f93466eda231dccf2bc7 (diff) |
output_init_render: Allow re-initialization
This lets the compositor call this function after the fact to replace
the renderer/allocator after a renderer context lost.
-rw-r--r-- | include/wlr/types/wlr_output.h | 3 | ||||
-rw-r--r-- | types/output/render.c | 10 |
2 files changed, 10 insertions, 3 deletions
diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index bb056b30..cf75d864 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -278,7 +278,8 @@ void wlr_output_create_global(struct wlr_output *output); void wlr_output_destroy_global(struct wlr_output *output); /** * Initialize the output's rendering subsystem with the provided allocator and - * renderer. Can only be called once. + * renderer. After initialization, this function may invoked again to reinitialize + * the allocator and renderer to different values. * * Call this function prior to any call to wlr_output_attach_render(), * wlr_output_commit() or wlr_output_cursor_create(). diff --git a/types/output/render.c b/types/output/render.c index b0322578..25468c13 100644 --- a/types/output/render.c +++ b/types/output/render.c @@ -15,8 +15,8 @@ bool wlr_output_init_render(struct wlr_output *output, struct wlr_allocator *allocator, struct wlr_renderer *renderer) { - assert(output->allocator == NULL && allocator != NULL); - assert(output->renderer == NULL && renderer != NULL); + assert(allocator != NULL && renderer != NULL); + assert(output->back_buffer == NULL); uint32_t backend_caps = backend_get_buffer_caps(output->backend); uint32_t renderer_caps = renderer_get_render_buffer_caps(renderer); @@ -31,6 +31,12 @@ bool wlr_output_init_render(struct wlr_output *output, return false; } + wlr_swapchain_destroy(output->swapchain); + output->swapchain = NULL; + + wlr_swapchain_destroy(output->cursor_swapchain); + output->cursor_swapchain = NULL; + output->allocator = allocator; output->renderer = renderer; |