diff --git a/include/wlr/types/wlr_scene.h b/include/wlr/types/wlr_scene.h index 253de1695..0d6d97a31 100644 --- a/include/wlr/types/wlr_scene.h +++ b/include/wlr/types/wlr_scene.h @@ -468,6 +468,13 @@ void wlr_scene_output_set_position(struct wlr_scene_output *scene_output, struct wlr_scene_output_state_options { struct wlr_scene_timer *timer; + + /** + * Allows use of a custom swapchain. This can be useful when trying out an + * output configuration. The swapchain dimensions must match the respective + * wlr_output_state or output size if not specified. + */ + struct wlr_swapchain *swapchain; }; /** diff --git a/types/scene/wlr_scene.c b/types/scene/wlr_scene.c index 18ac3d486..252eed3f6 100644 --- a/types/scene/wlr_scene.c +++ b/types/scene/wlr_scene.c @@ -1803,11 +1803,16 @@ bool wlr_scene_output_build_state(struct wlr_scene_output *scene_output, wlr_damage_ring_set_bounds(&scene_output->damage_ring, render_data.trans_width, render_data.trans_height); - if (!wlr_output_configure_primary_swapchain(output, state, &output->swapchain)) { - return false; + struct wlr_swapchain *swapchain = options->swapchain; + if (!swapchain) { + if (!wlr_output_configure_primary_swapchain(output, state, &output->swapchain)) { + return false; + } + + swapchain = output->swapchain; } - struct wlr_buffer *buffer = wlr_swapchain_acquire(output->swapchain, NULL); + struct wlr_buffer *buffer = wlr_swapchain_acquire(swapchain, NULL); if (buffer == NULL) { return false; }