UiRenderNode::new used to let a wgpu validation error reach the default
uncaptured-error handler and panic, which is what aborted the P0 bench APK
on Iris's phone in AndroidRenderer::new with only "wgpu error: Validation
Error" surviving into the truncated crash report. It now wraps creation in
wgpu error scopes and returns Result<Self, String>; the Android backend
turns a failure into the adapter's identity, the limits/downlevel flags a
layout validates against, and wgpu's own error chain, logged as one logcat
line and shown on screen (IrisView.showRendererError) instead of crashing.
Auditing every bind-group-layout entry against wgpu-core's own validation
source names the likely cause: masks_layout's move_offsets storage buffer
is visible to the vertex stage, which Vulkan grants unconditionally but
GLES gates on the driver's own vertex-stage SSBO support -- and the
delivered APK was built with force-gles, a flag meant only to force the
*emulator* onto GLES for one frame-time measurement, that build-apk.sh's
default feature list applied to every arm64 build regardless of target.
Its default no longer includes force-gles.
Testing the diagnostic (by inducing an artificial validation error) also
found and fixed a real reentrancy bug: calling Activity.setContentView
synchronously from inside a ViewPeer callback re-enters the same peer's
RefCell borrow through onFocusChanged, aborting with "RefCell already
borrowed". Deferred through the same push_dynamic_deferred_callback
mechanism raise_if_enabled already uses.
Full audit, verification, and the named hypothesis are in RUST.md's P0
box ("iris bench crash on the phone, 2026-09-06"); the API change is in
IRIS.md. Nobody on this session has the phone, so this is unconfirmed
against real hardware -- the point of (1) is that the next run says so
either way.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
20 lines
702 B
TOML
20 lines
702 B
TOML
[package]
|
|
name = "iris-core"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
|
|
[dependencies]
|
|
wgpu = { workspace = true }
|
|
# Only for `UiRenderNode::new`'s `push_error_scope`/`pop_error_scope` pair
|
|
# (renderer-creation error reporting, RUST.md's P0 phone-crash box) --
|
|
# `block_on` turns that one async pop into the same synchronous call shape
|
|
# `device_limits()`'s two callers already use for `request_adapter`/
|
|
# `request_device`, rather than making this crate's one entry point async.
|
|
pollster = { workspace = true }
|
|
bytemuck ={ workspace = true }
|
|
image = { workspace = true }
|
|
parley = { workspace = true }
|
|
swash = { workspace = true }
|
|
fxhash = { workspace = true }
|
|
accesskit = { workspace = true }
|