mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-09-05 23:51:04 +03:00
drm: key per-display state by connector identity, and end a stream whose index moved
The service binds a stream to (device, crtc_id), which survives a topology change. Everything on the consumer side addressed it by list index, which does not: drm_enumerate_all_displays concatenates per-card lists, so plugging or unplugging a monitor renumbers every display after it. Two consequences, one live and one remembered. Live: a running stream kept sending monitor A while the advertised list, and so the client layout and the injected-input rect, had come to mean monitor B. It only resolved if the stream happened to fail on its own. The stream now records what it was bound to and ends itself when its index stops meaning that, which routes the change through the rebuild the video service already does. Remembered: the zero-frame failure counts and the prefer-cpu verdicts were keyed by index too, so after a renumbering one monitor could inherit another's demotion or be forced onto the CPU convert path for a mismatch that was never its own. Both are now keyed by device plus connector name. The reasoning was already written down for one of these, in the comment above the prefer-cpu clear, and applied only there. That bulk clear is gone with it. It existed to limit the damage of index aliasing; with identity keys it would instead throw away a correct verdict, which costs a real convert failure to relearn, on every unrelated hotplug. Also fixes the drm workflow to skip the two tests the stock CI already skips. Both need a display server and fail on any headless runner, so the job would have gone red for a reason that has nothing to do with this feature. Verified by running the exact command: 88 tests, including the size_of::<Data>() assertion that the old name filter was hiding.
This commit is contained in:
6
.github/workflows/drm-capture.yml
vendored
6
.github/workflows/drm-capture.yml
vendored
@@ -94,9 +94,13 @@ jobs:
|
||||
# The whole rustdesk-crate test set with the feature ON, not just the `_drm` ones by name: a name
|
||||
# filter would skip the sibling asserts that also matter in this configuration, notably the one
|
||||
# bounding `size_of::<Data>()`, which the new DmabufDesc variant grows.
|
||||
# The two skips are the same ones the stock CI applies: both need a real display server and fail
|
||||
# on a headless runner regardless of this feature.
|
||||
- name: Run rustdesk crate tests with the drm feature
|
||||
shell: bash
|
||||
run: cargo test --locked --target x86_64-unknown-linux-gnu -p rustdesk --features drm
|
||||
run: |
|
||||
cargo test --locked --target x86_64-unknown-linux-gnu -p rustdesk --features drm \
|
||||
--no-fail-fast -- --skip test_get_cursor_pos --skip test_get_key_state
|
||||
|
||||
libdrmtap:
|
||||
name: libdrmtap pin, build and .so contract
|
||||
|
||||
Reference in New Issue
Block a user