diff options
author | emersion <contact@emersion.fr> | 2018-10-02 12:11:09 +0200 |
---|---|---|
committer | emersion <contact@emersion.fr> | 2018-10-04 22:00:24 +0200 |
commit | eac7c2ad2faf49084342d9f805cf06b773723fdd (patch) | |
tree | 6fbd71fd0fe6f06183a7ee94b03727f69341328b /backend | |
parent | abd3e995ab446b5487f4d2ff16d9e2c3f1baade1 (diff) |
output: add presentation refresh prediction
Diffstat (limited to 'backend')
-rw-r--r-- | backend/drm/drm.c | 15 | ||||
-rw-r--r-- | backend/headless/output.c | 5 | ||||
-rw-r--r-- | backend/wayland/output.c | 2 | ||||
-rw-r--r-- | backend/x11/output.c | 2 |
4 files changed, 17 insertions, 7 deletions
diff --git a/backend/drm/drm.c b/backend/drm/drm.c index 753b6ab8..0187e5d0 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -1154,6 +1154,10 @@ void scan_drm_connectors(struct wlr_drm_backend *drm) { attempt_enable_needs_modeset(drm); } +static int mhz_to_nsec(int mhz) { + return 1000000000000LL / mhz; +} + static void page_flip_handler(int fd, unsigned seq, unsigned tv_sec, unsigned tv_usec, void *data) { struct wlr_drm_connector *conn = data; @@ -1180,9 +1184,14 @@ static void page_flip_handler(int fd, unsigned seq, .tv_sec = tv_sec, .tv_nsec = tv_usec * 1000, }; - uint32_t present_flags = WLR_OUTPUT_PRESENT_VSYNC | - WLR_OUTPUT_PRESENT_HW_CLOCK | WLR_OUTPUT_PRESENT_HW_COMPLETION; - wlr_output_send_present(&conn->output, &present_time, seq, present_flags); + struct wlr_output_event_present present_event = { + .when = &present_time, + .seq = seq, + .refresh = mhz_to_nsec(conn->output.refresh), + .flags = WLR_OUTPUT_PRESENT_VSYNC | WLR_OUTPUT_PRESENT_HW_CLOCK | + WLR_OUTPUT_PRESENT_HW_COMPLETION, + }; + wlr_output_send_present(&conn->output, &present_event); if (drm->session->active) { wlr_output_send_frame(&conn->output); diff --git a/backend/headless/output.c b/backend/headless/output.c index ad0050d8..3cb35dce 100644 --- a/backend/headless/output.c +++ b/backend/headless/output.c @@ -67,8 +67,9 @@ static bool output_make_current(struct wlr_output *wlr_output, int *buffer_age) static bool output_swap_buffers(struct wlr_output *wlr_output, pixman_region32_t *damage) { - wlr_output_send_present(wlr_output, NULL, 0, 0); - return true; // No-op + // Nothing needs to be done for pbuffers + wlr_output_send_present(wlr_output, NULL); + return true; } static void output_destroy(struct wlr_output *wlr_output) { diff --git a/backend/wayland/output.c b/backend/wayland/output.c index 4fbfe9d2..bc7a9f05 100644 --- a/backend/wayland/output.c +++ b/backend/wayland/output.c @@ -72,7 +72,7 @@ static bool output_swap_buffers(struct wlr_output *wlr_output, } // TODO: if available, use the presentation-time protocol - wlr_output_send_present(wlr_output, NULL, 0, 0); + wlr_output_send_present(wlr_output, NULL); return true; } diff --git a/backend/x11/output.c b/backend/x11/output.c index 8cd8ee33..1ac12a8d 100644 --- a/backend/x11/output.c +++ b/backend/x11/output.c @@ -106,7 +106,7 @@ static bool output_swap_buffers(struct wlr_output *wlr_output, return false; } - wlr_output_send_present(wlr_output, NULL, 0, 0); + wlr_output_send_present(wlr_output, NULL); return true; } |