kms thread plans
With !3828 (merged) now have a thread per output that does atomic commits as close to the vblank deadline as possible, which already reduces cursor latency. There's still a lot to do though:
-
track buffers per atomic commit, so that we can have multiple buffers / commits pending at the same time (!4262 (merged)) -
add a list of commits, and at commit time, choose the newest one where all buffers are done rendering. This ensures that we never commit a cursor update that ends up delaying the whole frame (!4268 (merged)) -
if no commit is ready at commit time, delay the commit to the next vblank, so that cursor updates can be added for that next frame (!4268 (merged)) -
make it possible to add cursor update commits without having a primary plane commit first (!4350 (merged)). !4207 (merged) kinda does this already, but it would be better if the backend could schedule commits independently of scene rendering too -
split cursor and primary plane commits better, so that we can commit either only the cursor update or only the primary plane update (!4370 (merged)) -
with drm commits being more decoupled from the scene, implement #124 (closed) by triggering the scene to render once per vblank instead of once per pageflip (!4833 (merged))
For VRR there's also
-
always keep VRR_ENABLED
set to 1 with vrr policy != never, to fix issues like https://gitlab.freedesktop.org/drm/amd/-/issues/2200, which apparently can't easily be fixed on the driver side -
allow rescheduling atomic commits with vrr, so that #85 (closed) can be fixed by delaying cursor commits and rescheduling them to be sooner if a primary plane commit comes in -
implement a maximum refresh rate change for vrr, to reduce brightness flicker -
implement LFC for VRR, so that the kms thread always keeps the refresh rate above the minimum of the screen, instead of having the kernel do that (which sometimes does refresh rate jumps that we don't want)
We could also still improve latency more:
-
figure out of deadline scheduling could make the commit thread scheduling more predictable -
allow the compositor to push multiple primary plane updates per frame, so that we can update which buffer is used for direct scanout
Edited by Xaver Hugl