diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index f56bd1eb4..267e51ef0 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -582,6 +582,13 @@ void wlr_output_state_set_buffer(struct wlr_output_state *state, */ bool wlr_output_configure_primary_swapchain(struct wlr_output *output, const struct wlr_output_state *state, struct wlr_swapchain **swapchain); +/** + * Begin a render pass on this output. + * + * Same as wlr_output_attach_render(), but returns a struct wlr_render_pass. + */ +struct wlr_render_pass *wlr_output_begin_render_pass(struct wlr_output *output, + struct wlr_output_state *state, int *buffer_age); /** diff --git a/types/output/render.c b/types/output/render.c index 6e2848834..70d8005b7 100644 --- a/types/output/render.c +++ b/types/output/render.c @@ -247,3 +247,26 @@ uint32_t wlr_output_preferred_read_format(struct wlr_output *output) { return fmt; } + +struct wlr_render_pass *wlr_output_begin_render_pass(struct wlr_output *output, + struct wlr_output_state *state, int *buffer_age) { + if (!wlr_output_configure_primary_swapchain(output, state, &output->swapchain)) { + return NULL; + } + + struct wlr_buffer *buffer = wlr_swapchain_acquire(output->swapchain, buffer_age); + if (buffer == NULL) { + return NULL; + } + + struct wlr_renderer *renderer = output->renderer; + assert(renderer != NULL); + struct wlr_render_pass *pass = wlr_renderer_begin_buffer_pass(renderer, buffer); + if (pass == NULL) { + return NULL; + } + + wlr_output_state_set_buffer(state, buffer); + wlr_buffer_unlock(buffer); + return pass; +}