Three root causes, all fixed and verified on the Pixel 9 Pro: 1. Present phase (backend + renderer): VSYNC_LOCKED_RENDER defers the render to the vsync wake; RENDER_AHEAD presents the previous frame at the start of render() (phase = wake + ~1.1 ms) and holds the new frame one slot. Crash fix: a held wgpu frame must be PRESENTED, never merely dropped, before the next acquire (AlreadyAcquired panic at launch otherwise); discard_pending_frame presents too. 2. Full-res prefetch churn (src/lib.rs): the 8-slot full cache cycled through a ~20-cell viewport forever (137 decodes/20 s) and each eviction free()'d a 50 MB Vec on the UI thread (20-52 ms CPU spikes, ~7/s = the residual SLOWEV NonMain jank). Fix: 60 s tombstone cooldown on evicted paths (idle prefetch skips, urgent tap bypasses) + off-thread reaper for the freed blobs (insert: 21 ms -> 4 us). 3. (earlier) Skia final flush + Mailbox present mode (vendor, M3). Instrumentation (all behind --features perf): OTHR/INVK/INVK_TAG/FLCK lines for cross-thread closure timing and push-site tagging. Warm measured swipe, 8580-file grid: cadence median 8.33 ms (exact 120 Hz), p99 15.5 ms, 5/552 gaps >16.7 ms (0.9%, max 28.3 ms, zero >33 ms); PRES phase median ~994 us, zero late frames. Docs updated (docs/BUGS/scroll-jank-120hz.md, full scorecard + line reference). Also: vendored i-slint-core + wgpu-hal (vkshim interposition patch), vkshim profiling tooling, backend made a non-optional dep, debuggable flag for simpleperf (REMOVE before shipping).
37 lines
1.8 KiB
Rust
37 lines
1.8 KiB
Rust
fn main() {
|
|
cfg_aliases::cfg_aliases! {
|
|
native: { not(target_arch = "wasm32") },
|
|
send_sync: { any(
|
|
not(target_arch = "wasm32"),
|
|
all(feature = "fragile-send-sync-non-atomic-wasm", not(target_feature = "atomics"))
|
|
) },
|
|
webgl: { all(target_arch = "wasm32", not(target_os = "emscripten"), gles) },
|
|
Emscripten: { all(target_os = "emscripten", gles) },
|
|
dx12: { all(target_os = "windows", feature = "dx12") },
|
|
gles: { all(feature = "gles") },
|
|
// Within the GL ES backend, use `std` and be Send + Sync only if we are using a target
|
|
// that, among the ones where the GL ES backend is supported, has `std`.
|
|
gles_with_std: { all(
|
|
feature = "gles",
|
|
any(
|
|
not(target_arch = "wasm32"),
|
|
// Accept wasm32-unknown-unknown, which uniquely has a stub `std`
|
|
all(target_vendor = "unknown", target_os = "unknown"),
|
|
// Accept wasm32-unknown-emscripten and similar, which has a real `std`
|
|
target_os = "emscripten"
|
|
)
|
|
) },
|
|
metal: { all(target_vendor = "apple", feature = "metal") },
|
|
vulkan: { all(not(target_arch = "wasm32"), feature = "vulkan") },
|
|
drm: { all(
|
|
feature = "drm",
|
|
any(target_os = "linux", target_os = "freebsd", target_os = "netbsd", target_os = "openbsd")
|
|
) },
|
|
any_backend: { any(dx12, metal, vulkan, gles) },
|
|
// ⚠️ Keep in sync with target.cfg() definition in Cargo.toml and cfg_alias in `wgpu` crate ⚠️
|
|
static_dxc: { all(target_os = "windows", feature = "static-dxc", not(target_arch = "aarch64"), target_env = "msvc") },
|
|
supports_64bit_atomics: { target_has_atomic = "64" },
|
|
supports_ptr_atomics: { target_has_atomic = "ptr" }
|
|
}
|
|
}
|