RUST.md, IRIS.md, IRIS_TODO.md, DECISIONS.md: record I5's frame report and holddrag results
FrameReport gave a real, measured on-device number (frames=34, janky%=61.76, p50=26.5ms p90=48.0ms p99=98.1ms worst=98.1ms) and long-press-then-drag-to-select is now confirmed on-device (logcat plus a screenshot of the highlighted selection). Neither closes I5's box to [x] yet: the frame number is real but not the clean single 24-swipe loop comparable to Compose's, because gestures against this checkout's EMU_GPU=software emulator intermittently delivered zero touch input this session -- a new, separately named finding (candidate cause: the emulator's own software rasterisation measured at ~78% of a CPU core continuously), not yet root-caused. DECISIONS.md's DEFERRED item is updated with these numbers rather than a decision made here. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
470f8e5019
commit
1e7b1cddb7
4 files changed
+292
-89
No files matched your search
@@ -8,6 +8,49 @@ capability that moved. Small and trivial changes do not go here.
|
||||
An entry gives the date, what changed, why, and a short before/after where
|
||||
it helps judge the change without the session that made it. Newest first.
|
||||
|
||||
## 2026-09-05 (later the same day): `iris_core::FrameReport` (RUST.md's I5 box)
|
||||
|
||||
New public type, `iris_core::FrameReport` (re-exported from `iris_core`'s
|
||||
`render` module alongside `FrameStats` and `JANK_THRESHOLD`). Why: `dumpsys
|
||||
gfxinfo` cannot see a `SurfaceView`'s own GPU-drawn frames at all, so a
|
||||
`wgpu`-rendered iris screen had no way to ask "was this smooth" the way
|
||||
Compose's own in-app render report already can -- item 3 of RUST.md's
|
||||
recommendation was stuck on a one-sided number for exactly this reason.
|
||||
|
||||
`FrameReport::record(elapsed: Duration)` is called once per frame (wired
|
||||
into `android/view.rs`'s `render()`, wrapping the same span from redraw
|
||||
start to after `queue.submit`+`present()` that Compose's report and
|
||||
`gfxinfo` both count) and writes into a fixed 4096-entry ring -- no
|
||||
allocation on the hot path. `FrameReport::report() -> Option<FrameStats>`
|
||||
gives total frames, janky % (over `JANK_THRESHOLD`, the same 16.7ms 60Hz
|
||||
budget `gfxinfo` uses), P50/P90/P99 and the worst; `None` if nothing has
|
||||
been recorded since the last `reset()`, not a zeroed report that would
|
||||
read as a real measurement. `FrameStats`'s `Display` line says plainly
|
||||
that it measures up to `present()` being called, not GPU/compositor
|
||||
completion, since wgpu's `present()` isn't fenced against either.
|
||||
|
||||
`AndroidUiState` gained a `pub frame_report: FrameReport` field --
|
||||
anything with `HasAndroidUiState` can now read or reset it. Before this,
|
||||
there was no way to ask iris's own render path how long a frame took at
|
||||
all, on any backend.
|
||||
|
||||
Before/after, for a caller that already has `ui_state: &AndroidUiState`:
|
||||
|
||||
```rust
|
||||
// before: no such question could be asked
|
||||
// after:
|
||||
match ui_state.frame_report.report() {
|
||||
Some(stats) => log::info!("iris frame report: {stats}"),
|
||||
None => log::info!("iris frame report: no frames recorded yet"),
|
||||
}
|
||||
ui_state.frame_report.reset(); // via android_state_mut()
|
||||
```
|
||||
|
||||
`iris-android-app`'s transcript screen exposes this as two named,
|
||||
tappable controls ("Frame report", "Reset frame report") rather than
|
||||
requiring a caller to wire its own UI -- see `transcript_client.rs`'s
|
||||
`frame_report_controls`.
|
||||
|
||||
## 2026-09-05: `Tasks::redraw_handle` (RUST.md's I5 Android integration)
|
||||
|
||||
New public method on `iris::task::Tasks`, `redraw_handle(&self) ->
|
||||
|
||||
Reference in new issue
Block a user