add render timer API

Based on five calls:
wlr_render_timer_create - creates a timer which can be reused across
  frames on the same renderer
wlr_renderer_begin_buffer_pass - now takes a timer so that backends can
  record when the rendering starts and finishes
wlr_render_timer_get_time - should be called as late as possible so that
  queries can make their way back from the GPU
wlr_render_timer_destroy - self-explanatory

The timer is exposed as an opaque `struct wlr_render_timer` so that
backends can store whatever they want in there.
This commit is contained in:
Rose Hudson 2023-06-02 10:25:07 +01:00 committed by Simon Ser
parent bd834fe8d1
commit 9e8947e4d5
19 changed files with 87 additions and 23 deletions

View file

@ -318,7 +318,7 @@ static struct wlr_buffer *render_cursor_buffer(struct wlr_output_cursor *cursor)
wlr_box_transform(&dst_box, &dst_box, wlr_output_transform_invert(output->transform),
buffer->width, buffer->height);
struct wlr_render_pass *pass = wlr_renderer_begin_buffer_pass(renderer, buffer);
struct wlr_render_pass *pass = wlr_renderer_begin_buffer_pass(renderer, buffer, NULL);
if (pass == NULL) {
wlr_buffer_unlock(buffer);
return NULL;

View file

@ -249,7 +249,7 @@ uint32_t wlr_output_preferred_read_format(struct wlr_output *output) {
}
struct wlr_render_pass *wlr_output_begin_render_pass(struct wlr_output *output,
struct wlr_output_state *state, int *buffer_age) {
struct wlr_output_state *state, int *buffer_age, struct wlr_render_timer *timer) {
if (!wlr_output_configure_primary_swapchain(output, state, &output->swapchain)) {
return NULL;
}
@ -261,7 +261,10 @@ struct wlr_render_pass *wlr_output_begin_render_pass(struct wlr_output *output,
struct wlr_renderer *renderer = output->renderer;
assert(renderer != NULL);
struct wlr_render_pass *pass = wlr_renderer_begin_buffer_pass(renderer, buffer);
struct wlr_render_pass *pass = wlr_renderer_begin_buffer_pass(renderer, buffer,
&(struct wlr_buffer_pass_options){
.timer = timer,
});
if (pass == NULL) {
return NULL;
}

View file

@ -1673,7 +1673,7 @@ bool wlr_scene_output_commit(struct wlr_scene_output *scene_output) {
wlr_damage_ring_get_buffer_damage(&scene_output->damage_ring,
buffer_age, &damage);
struct wlr_render_pass *render_pass = wlr_renderer_begin_buffer_pass(renderer, buffer);
struct wlr_render_pass *render_pass = wlr_renderer_begin_buffer_pass(renderer, buffer, NULL);
if (render_pass == NULL) {
pixman_region32_fini(&damage);
wlr_buffer_unlock(buffer);