diff --git a/include/wlr/render/interface.h b/include/wlr/render/interface.h index 7e923353e..a361597a1 100644 --- a/include/wlr/render/interface.h +++ b/include/wlr/render/interface.h @@ -48,6 +48,10 @@ struct wlr_renderer_impl { uint32_t (*get_render_buffer_caps)(struct wlr_renderer *renderer); struct wlr_texture *(*texture_from_buffer)(struct wlr_renderer *renderer, struct wlr_buffer *buffer); + bool (*wait_timeline)(struct wlr_renderer *renderer, + struct wlr_render_timeline *timeline, uint64_t src_point); + bool (*signal_timeline)(struct wlr_renderer *renderer, + struct wlr_render_timeline *timeline, uint64_t dst_point); }; void wlr_renderer_init(struct wlr_renderer *renderer, diff --git a/include/wlr/render/wlr_renderer.h b/include/wlr/render/wlr_renderer.h index 50ba6b215..19233ec6c 100644 --- a/include/wlr/render/wlr_renderer.h +++ b/include/wlr/render/wlr_renderer.h @@ -23,6 +23,7 @@ struct wlr_drm_format_set; struct wlr_buffer; struct wlr_box; struct wlr_fbox; +struct wlr_render_timeline; struct wlr_renderer { const struct wlr_renderer_impl *impl; @@ -119,6 +120,34 @@ bool wlr_renderer_init_wl_shm(struct wlr_renderer *r, */ int wlr_renderer_get_drm_fd(struct wlr_renderer *r); +/** + * Wait for a timeline synchronization point before continuing rendering + * operations. + * + * The renderer implementation is allowed to wait sooner, e.g. wait before + * executing any rendering operation since the previous wlr_renderer_begin() + * call. + * + * When a compositor calls wlr_renderer_wait_timeline(), the renderer is + * allowed to skip implicit wait synchronization. Compositors are not allowed + * to mix implicit and explicit wait synchronization usage. + */ +bool wlr_renderer_wait_timeline(struct wlr_renderer *renderer, + struct wlr_render_timeline *timeline, uint64_t src_point); +/** + * Signal a timeline synchronization point when all previous rendering + * operations have finished. + * + * The renderer implementation is allowed to signal later, e.g. signal when all + * rendering operations up to wlr_renderer_end() have finished. + * + * When a compositor calls wlr_renderer_signal_timeline(), the renderer is + * allowed to skip implicit signal synchronization. Compositors are not allowed + * to mix implicit and explicit signal synchronization usage. + */ +bool wlr_renderer_signal_timeline(struct wlr_renderer *renderer, + struct wlr_render_timeline *timeline, uint64_t dst_point); + /** * Destroys the renderer. * diff --git a/render/wlr_renderer.c b/render/wlr_renderer.c index 478db7453..d01e6e051 100644 --- a/render/wlr_renderer.c +++ b/render/wlr_renderer.c @@ -414,3 +414,19 @@ int wlr_renderer_get_drm_fd(struct wlr_renderer *r) { } return r->impl->get_drm_fd(r); } + +bool wlr_renderer_wait_timeline(struct wlr_renderer *r, + struct wlr_render_timeline *timeline, uint64_t src_point) { + if (!r->impl->wait_timeline) { + return false; + } + return r->impl->wait_timeline(r, timeline, src_point); +} + +bool wlr_renderer_signal_timeline(struct wlr_renderer *r, + struct wlr_render_timeline *timeline, uint64_t dst_point) { + if (!r->impl->signal_timeline) { + return false; + } + return r->impl->signal_timeline(r, timeline, dst_point); +}