macbook: aquamarine immediate legacy cursor moves (patch file)

This commit is contained in:
rope 2026-07-25 09:10:36 +01:00
parent 41cbc1dd6f
commit 93ec50fe9d
2 changed files with 29 additions and 9 deletions

View file

@ -54,17 +54,15 @@
# wait_prepare/wait_finish were removed from struct vb2_ops in Linux 6.8
nixpkgs.overlays = [
# Legacy DRM iface (AQ_NO_ATOMIC): every commit without cursor flags
# hits the else-branch and nulls the cursor plane → cursor vanishes
# whenever it isn't moving (vfr=false commits every frame). Only null
# it when the cursor is actually meant to be hidden. Bug present
# upstream as of aquamarine 0.11.0 / main (July 2026).
# Legacy DRM iface (AQ_NO_ATOMIC) cursor fixes, see patch:
# 1. moveCursor only scheduled a frame — cursor still waited for vblank.
# Issue the immediate drmModeMoveCursor ioctl like wlroots did.
# 2. Commits without cursor flags nulled the cursor plane → cursor
# vanished while idle. Only null when actually hidden.
# Both present upstream as of aquamarine 0.11.0 / main (July 2026).
(final: prev: {
aquamarine = prev.aquamarine.overrideAttrs (old: {
postPatch = (old.postPatch or "") + ''
sed -i 's|} else if (drmModeSetCursor(|} else if (!connector->output->cursorVisible \&\& drmModeSetCursor(|' \
src/backend/drm/impl/Legacy.cpp
'';
patches = (old.patches or [ ]) ++ [ ../../patches/aquamarine-legacy-cursor.patch ];
});
})
(final: prev: {

View file

@ -0,0 +1,22 @@
--- a/src/backend/drm/impl/Legacy.cpp
+++ b/src/backend/drm/impl/Legacy.cpp
@@ -18,6 +18,10 @@
if (!connector->output->cursorVisible || !connector->output->state->state().enabled || !connector->crtc || !connector->crtc->cursor)
return true;
+ // move the cursor plane immediately via the legacy ioctl instead of
+ // waiting for the next vblank-bound commit
+ drmModeMoveCursor(connector->backend->gpu->fd, connector->crtc->id, (int)connector->output->cursorPos.x, (int)connector->output->cursorPos.y);
+
if (!skipSchedule)
connector->output->scheduleFrame(IOutput::AQ_SCHEDULE_CURSOR_MOVE);
@@ -123,7 +127,7 @@
connector->backend->backend->log(AQ_LOG_ERROR, std::format("legacy drm: cursor drmIoctl failed: {}", strerror(errno)));
return false;
}
- } else if (drmModeSetCursor(connector->backend->gpu->fd, connector->crtc->id, 0, 0, 0))
+ } else if (!connector->output->cursorVisible && drmModeSetCursor(connector->backend->gpu->fd, connector->crtc->id, 0, 0, 0))
connector->backend->backend->log(AQ_LOG_ERROR, "legacy drm: cursor null failed");
if (!enable)