mirror of
https://github.com/DeeJanuz/frametop.git
synced 2026-10-06 05:00:08 +02:00
Eye tracker: ft-eyegrab checks only the slot each camera writes next
While copying, ft-eyegrab woke every 300 us (about 1,500 to 3,000 times a second) and fingerprinted all eight slots each time: 8 x 256 strided reads from DMA-BUF memory. - Each look now checks only the slot each camera writes next. The order is known (camera 0 3,0,1,2; camera 1 7,5,4,6,5,7,6,4), and the next slot follows from the last two; the table starts from those orders and learns from every frame, so a SteamVR update that changes them costs a few seconds of full scans, not frames. - A camera with nothing in its expected slot 1.5 frames after its last one, or with no order yet, gets all four slots checked, as before. A frame that turns up in an unexpected slot means full scans for that camera for 2 s. - A slot's fingerprint is taken again when it stops being one of the two in use, so a later check sees only a new frame. A frame is still passed on when its camera starts the frame after next. - Between frames it sleeps until 2.5 ms before the next is due, then looks every 1 ms, with 0.5 ms of timer slack (PR_SET_TIMERSLACK, --share only). With no frames from either camera for 0.5 s (headset off) it looks every 4 ms. - --rec keeps its 0.3 ms polls (and the expected-slot checks), for its timestamps. Tested offline by building poll_frames against simulated cameras that write each frame in four bursts, the last after the next frame starts (6 s, both cameras): 1,076 frames passed on, none torn or skipped, with the known orders and with camera 1 in a different order. Wakeups 1,486/s -> 207/s, the poller's CPU 3.6% -> 0.8% of a core (in plain memory; the real DMA-BUF reads cost more), and a frame's start is seen 1.35 ms after it begins on average instead of 0.76. With a camera stalling 15 ms every 2 s, the old poller passed on 22 torn frames and the new one 8 or fewer. Built (glibc 2.38 symbols at most, the host has 2.39), not installed: it runs as root from /etc/frametop, so it takes effect only after gaze/tracker/install.sh (sudo). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
7851ce90cc
commit
060b4957f8
2 files changed
+80
-16
No files matched your search
@@ -63,6 +63,13 @@ reading only.
|
||||
frame when its camera starts the frame after next (no slot is rewritten sooner than three
|
||||
frames), ignores late writes to the frame just finished, and saves from a separate
|
||||
thread. fit1 may hold a few percent of torn frames.
|
||||
- `--share` (2026-10-03) checks only the slot each camera writes next, from the two before
|
||||
(the orders above, learned again if they change; all four slots for 2 s after a frame turns
|
||||
up elsewhere), sleeps until 2.5 ms before the next frame is due, then looks every 1 ms with
|
||||
0.5 ms of timer slack. Against the 0.3 ms poll of all eight slots, on simulated cameras:
|
||||
207 wakeups a second instead of 1,486, 0.8% of a core instead of 3.6% (more on the real
|
||||
DMA-BUF memory), no torn or skipped frames, and a frame's start seen 1.35 ms late on
|
||||
average instead of 0.76. `--rec` still polls all slots every 0.3 ms, for its times.
|
||||
- Eye tracking stops when the headset is off ("HMD off, stopping eye tracking"), so
|
||||
recordings are empty then.
|
||||
- **Which camera is which eye** (capture fit1, 2026-09-29, closing one eye at a time):
|
||||
|
||||
Reference in new issue
Block a user