mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-04 07:15:59 -04:00
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
This commit is contained in:
parent
c9c9dd6a5b
commit
3b53d1cbf1
6 changed files with 76 additions and 47 deletions
|
|
@ -301,8 +301,8 @@ static void update_layer_feedback(struct wlr_drm_backend *drm,
|
|||
}
|
||||
|
||||
static bool 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;
|
||||
|
|
@ -455,7 +455,7 @@ static bool crtc_commit(struct wlr_drm_connector *conn,
|
|||
goto out;
|
||||
}
|
||||
|
||||
ret = drmModeAtomicCommit(drm->fd, req, flags, drm);
|
||||
ret = drmModeAtomicCommit(drm->fd, req, flags, page_flip);
|
||||
if (ret != 0) {
|
||||
wlr_drm_conn_log_errno(conn, test_only ? WLR_DEBUG : WLR_ERROR,
|
||||
"Atomic commit failed");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue