gallery/vendor/i-slint-core/Cargo.toml
Greg Pomerantz 2f4768f354 Fix 120Hz scroll jank end-to-end: render-ahead present + full-cache eviction off the UI thread
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).
2026-10-30 02:49:23 -04:00

503 lines
9.3 KiB
TOML

# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
#
# When uploading crates to the registry Cargo will automatically
# "normalize" Cargo.toml files for maximal compatibility
# with all versions of Cargo and also rewrite `path` dependencies
# to registry (e.g., crates.io) dependencies.
#
# If you are reading this file be aware that the original Cargo.toml
# will likely look very different (and much more reasonable).
# See Cargo.toml.orig for the original contents.
[package]
edition = "2024"
rust-version = "1.92"
name = "i-slint-core"
version = "1.18.1"
authors = ["Slint Developers <info@slint.dev>"]
build = false
autolib = false
autobins = false
autoexamples = false
autotests = false
autobenches = false
description = "Internal Slint Runtime Library."
homepage = "https://slint.dev"
documentation = "https://slint.dev/docs"
readme = "README.md"
keywords = [
"gui",
"toolkit",
"graphics",
"design",
"ui",
]
categories = [
"gui",
"development-tools",
"no-std",
]
license = "GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0"
repository = "https://github.com/slint-ui/slint"
[package.metadata.docs.rs]
rustdoc-args = ["--generate-link-to-definition"]
[features]
32-bit-color = []
accessibility-text = [
"std",
"shared-parley",
"dep:accesskit",
"parley?/accesskit",
]
box-shadow-cache = []
default = [
"std",
"unicode",
"shared-parley",
]
ffi = [
"dep:static_assertions",
"i-slint-core-macros/ffi",
]
image-decoders = [
"dep:image",
"dep:clru",
]
image-default-formats = ["image?/default-formats"]
libm = [
"num-traits/libm",
"euclid/libm",
]
log = ["dep:log"]
path = [
"dep:lyon_path",
"dep:lyon_geom",
"dep:lyon_algorithms",
"dep:lyon_extra",
]
raw-window-handle-06 = ["dep:raw-window-handle-06"]
rtti = []
shared-fontique = ["i-slint-common/shared-fontique"]
shared-parley = [
"shared-fontique",
"dep:parley",
"dep:skrifa",
"dep:icu_normalizer",
]
shared-swash = ["dep:swash"]
std = [
"euclid/std",
"once_cell/std",
"dep:web-time",
"path",
"raw-window-handle-06?/std",
"chrono/std",
"chrono/wasmbind",
"chrono/clock",
"dep:sys-locale",
"shared-fontique",
"i-slint-common/locale-decimal-separator",
"i-slint-common/color-parsing",
"i-slint-common/markdown",
"taffy/std",
]
svg = [
"dep:resvg",
"i-slint-common/svg-text",
]
system-tray = [
"dep:ksni",
"dep:async-channel",
"ksni/async-io",
"ksni/blocking",
]
testing = []
tr = ["dep:tr"]
unicode = [
"unicode-script",
"unicode-linebreak",
]
unsafe-single-threaded = []
unstable-wgpu-29 = ["wgpu-29"]
unstable-wgpu-30 = ["wgpu-30"]
wgpu-29 = ["dep:wgpu-29"]
wgpu-30 = ["dep:wgpu-30"]
[lib]
name = "i_slint_core"
path = "lib.rs"
[[bench]]
name = "string"
path = "benches/string.rs"
harness = false
[dependencies.accesskit]
version = "0.24"
optional = true
[dependencies.bitflags]
version = "2.4.2"
[dependencies.cfg-if]
version = "1"
[dependencies.chrono]
version = "0.4"
features = ["alloc"]
default-features = false
[dependencies.clru]
version = "0.6.0"
optional = true
[dependencies.const-field-offset]
version = "0.2.1"
[dependencies.derive_more]
version = "2.0.0"
features = [
"deref",
"deref_mut",
"into",
"from",
"add",
"add_assign",
"mul",
"not",
"display",
"error",
"deref",
"deref_mut",
]
default-features = false
[dependencies.euclid]
version = "0.22.1"
default-features = false
[dependencies.i-slint-common]
version = "=1.18.1"
features = ["default"]
default-features = false
[dependencies.i-slint-core-macros]
version = "=1.18.1"
features = ["default"]
default-features = false
[dependencies.icu_normalizer]
version = "2"
features = ["compiled_data"]
optional = true
default-features = false
[dependencies.image]
version = "0.25"
features = [
"png",
"jpeg",
]
optional = true
default-features = false
[dependencies.log]
version = "0.4.17"
optional = true
[dependencies.lyon_algorithms]
version = "1.0"
optional = true
default-features = false
[dependencies.lyon_extra]
version = "1.1"
optional = true
default-features = false
[dependencies.lyon_geom]
version = "1.0"
optional = true
default-features = false
[dependencies.lyon_path]
version = "1.0"
optional = true
default-features = false
[dependencies.num-traits]
version = "0.2"
default-features = false
[dependencies.once_cell]
version = "1.5"
features = ["critical-section"]
default-features = false
[dependencies.pin-project]
version = "1"
[dependencies.pin-weak]
version = "1.1"
default-features = false
[dependencies.portable-atomic]
version = "1"
features = ["critical-section"]
[dependencies.raw-window-handle-06]
version = "0.6"
features = ["alloc"]
optional = true
package = "raw-window-handle"
[dependencies.resvg]
version = "0.48.1"
features = [
"text",
"raster-images",
"svgz",
]
optional = true
default-features = false
[dependencies.rgb]
version = "0.8.27"
[dependencies.scopeguard]
version = "1.1.0"
default-features = false
[dependencies.serde]
version = "1.0.163"
features = ["derive"]
optional = true
default-features = false
[dependencies.skrifa]
version = "0.44"
optional = true
[dependencies.slab]
version = "0.4.3"
default-features = false
[dependencies.static_assertions]
version = "1.1"
optional = true
[dependencies.strum]
version = "0.28"
features = ["derive"]
default-features = false
[dependencies.swash]
version = "0.2.7"
features = ["scale"]
optional = true
default-features = false
[dependencies.sys-locale]
version = "0.3.2"
features = ["js"]
optional = true
[dependencies.taffy]
version = "0.10"
features = [
"flexbox",
"taffy_tree",
"alloc",
]
default-features = false
[dependencies.tr]
version = "0.1"
optional = true
default-features = false
[dependencies.unicode-linebreak]
version = "0.1.5"
optional = true
[dependencies.unicode-script]
version = "0.5.7"
optional = true
[dependencies.unicode-segmentation]
version = "1.12.0"
[dependencies.vtable]
version = "0.5"
[dependencies.wgpu-29]
version = "29.0.4"
optional = true
default-features = false
package = "wgpu"
[dependencies.wgpu-30]
version = "30"
optional = true
default-features = false
package = "wgpu"
[dev-dependencies.async-compat]
version = "0.2.4"
[dev-dependencies.criterion]
version = "0.8"
[dev-dependencies.fontique]
version = "0.11.1"
[dev-dependencies.rustybuzz]
version = "0.20.0"
[dev-dependencies.serde_json]
version = "1.0.96"
[dev-dependencies.tempfile]
version = "3.12.0"
[dev-dependencies.tiny-skia]
version = "0.12.0"
[dev-dependencies.tokio]
version = "1.35"
features = [
"rt-multi-thread",
"macros",
"time",
"net",
"io-util",
]
[dev-dependencies.ttf-parser]
version = "0.25"
[target.'cfg(all(target_family = "unix", not(target_vendor = "apple"), not(target_os = "android")))'.dependencies.async-channel]
version = "2"
optional = true
[target.'cfg(all(target_family = "unix", not(target_vendor = "apple"), not(target_os = "android")))'.dependencies.ksni]
version = "0.3.3"
optional = true
default-features = false
[target.'cfg(not(target_arch = "wasm32"))'.dependencies.parley]
version = "0.11.1"
features = ["complex-scripts"]
optional = true
[target.'cfg(target_arch = "wasm32")'.dependencies.clru]
version = "0.6.0"
[target.'cfg(target_arch = "wasm32")'.dependencies.js-sys]
version = "0.3"
features = ["std"]
default-features = false
[target.'cfg(target_arch = "wasm32")'.dependencies.parley]
version = "0.11.1"
optional = true
[target.'cfg(target_arch = "wasm32")'.dependencies.wasm-bindgen]
version = "0.2"
[target.'cfg(target_arch = "wasm32")'.dependencies.web-sys]
version = "0.3.72"
features = [
"HtmlImageElement",
"Navigator",
"Blob",
"BlobPropertyBag",
"Url",
"DomParser",
"SupportedType",
"Document",
"Element",
]
default-features = false
[target.'cfg(target_arch = "wasm32")'.dependencies.web-time]
version = "1.0"
optional = true
[target.'cfg(target_family = "unix")'.dependencies.gettext-rs]
version = "0.7.1"
features = ["gettext-system"]
optional = true
[target.'cfg(target_os = "macos")'.dependencies.image]
version = "0.25"
features = [
"png",
"jpeg",
"png",
]
default-features = false
[target.'cfg(target_os = "macos")'.dependencies.objc2]
version = "0.6.3"
[target.'cfg(target_os = "macos")'.dependencies.objc2-app-kit]
version = "0.3.2"
features = [
"std",
"NSStatusBar",
"NSStatusItem",
"NSStatusBarButton",
"NSButton",
"NSControl",
"NSResponder",
"NSView",
"NSImage",
"NSMenu",
"NSMenuItem",
"NSApplication",
"NSAppearance",
"objc2-core-foundation",
]
default-features = false
[target.'cfg(target_os = "macos")'.dependencies.objc2-foundation]
version = "0.3.2"
features = [
"std",
"NSArray",
"NSData",
"NSDictionary",
"NSKeyValueObserving",
"NSString",
"NSGeometry",
"NSObjCRuntime",
]
default-features = false
[target.'cfg(target_os = "windows")'.dependencies.windows]
version = "0.62"
features = [
"Win32_Foundation",
"Win32_Graphics_Gdi",
"Win32_System_LibraryLoader",
"Win32_UI_Shell",
"Win32_UI_WindowsAndMessaging",
]
[lints.clippy.unnecessary_cast]
level = "allow"
priority = 0
[lints.rust.unexpected_cfgs]
level = "warn"
priority = 0
check-cfg = [
"cfg(slint_debug_property)",
"cfg(cbindgen)",
"cfg(slint_int_coord)",
"cfg(slint_nightly_test)",
]