aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/wlr/types/wlr_output.h7
-rw-r--r--types/output/render.c23
2 files changed, 30 insertions, 0 deletions
diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h
index f56bd1eb..267e51ef 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 6e284883..70d8005b 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;
+}