aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Orzechowski <alex@ozal.ski>2022-12-01 04:57:53 -0500
committerSimon Ser <contact@emersion.fr>2022-12-01 10:01:35 +0000
commitfe891ebd4ea35f73286f84e374b71fc78e53e930 (patch)
treeb01e9e6d263975ea3c7c72418dae0759dff245dd
parentdb0e962368244c3171a8f93466eda231dccf2bc7 (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.h3
-rw-r--r--types/output/render.c10
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;