aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authoremersion <contact@emersion.fr>2018-10-02 12:11:09 +0200
committeremersion <contact@emersion.fr>2018-10-04 22:00:24 +0200
commiteac7c2ad2faf49084342d9f805cf06b773723fdd (patch)
tree6fbd71fd0fe6f06183a7ee94b03727f69341328b /backend
parentabd3e995ab446b5487f4d2ff16d9e2c3f1baade1 (diff)
output: add presentation refresh prediction
Diffstat (limited to 'backend')
-rw-r--r--backend/drm/drm.c15
-rw-r--r--backend/headless/output.c5
-rw-r--r--backend/wayland/output.c2
-rw-r--r--backend/x11/output.c2
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;
}