aboutsummaryrefslogtreecommitdiff
path: root/backend/drm/atomic.c
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2023-11-15 16:38:51 +0100
committerSimon Ser <contact@emersion.fr>2023-11-17 16:59:04 +0000
commit3b53d1cbf199aa5db0b1c81df92e43fc05670543 (patch)
treeca7b0a2a87911eaf7738e1a6fb5b7425958a31b6 /backend/drm/atomic.c
parentc9c9dd6a5b866055a6a39fd78e55f6d5797fec28 (diff)
backend/drm: introduce page-flip tracking struct
Introduce a per-page-flip tracking struct passed to the kernel when we request a page-flip event for an atomic commit. The kernel will pass us back this pointer when delivering the event. This eliminates any risk of mixing up events together. In particular, if two events are pending, or if the CRTC of a connector is swapped, we no longer blow up in the page-flip event handler. Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3753
Diffstat (limited to 'backend/drm/atomic.c')
-rw-r--r--backend/drm/atomic.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/backend/drm/atomic.c b/backend/drm/atomic.c
index 4715c6f0..47d4e585 100644
--- a/backend/drm/atomic.c
+++ b/backend/drm/atomic.c
@@ -61,13 +61,14 @@ static void atomic_begin(struct atomic *atom) {
}
static bool atomic_commit(struct atomic *atom,
- struct wlr_drm_connector *conn, uint32_t flags) {
+ struct wlr_drm_connector *conn, struct wlr_drm_page_flip *page_flip,
+ uint32_t flags) {
struct wlr_drm_backend *drm = conn->backend;
if (atom->failed) {
return false;
}
- int ret = drmModeAtomicCommit(drm->fd, atom->req, flags, drm);
+ int ret = drmModeAtomicCommit(drm->fd, atom->req, flags, page_flip);
if (ret != 0) {
wlr_drm_conn_log_errno(conn,
(flags & DRM_MODE_ATOMIC_TEST_ONLY) ? WLR_DEBUG : WLR_ERROR,
@@ -257,8 +258,8 @@ static void set_plane_props(struct atomic *atom, struct wlr_drm_backend *drm,
}
static bool atomic_crtc_commit(struct wlr_drm_connector *conn,
- const struct wlr_drm_connector_state *state, uint32_t flags,
- bool test_only) {
+ const struct wlr_drm_connector_state *state,
+ struct wlr_drm_page_flip *page_flip, uint32_t flags, bool test_only) {
struct wlr_drm_backend *drm = conn->backend;
struct wlr_output *output = &conn->output;
struct wlr_drm_crtc *crtc = conn->crtc;
@@ -367,7 +368,7 @@ static bool atomic_crtc_commit(struct wlr_drm_connector *conn,
}
}
- bool ok = atomic_commit(&atom, conn, flags);
+ bool ok = atomic_commit(&atom, conn, page_flip, flags);
atomic_finish(&atom);
if (ok && !test_only) {