By default, `rustfmt` persists the import granularity. In practice, most
Rust code has import granularity "Module" due to LSP's actions.
"Item" gets rid of import groupings and achieves cleaner diffs and
better conflict resolution. Better greppability is a positive side
effect.
Note: it's an unstable rustfmt feature. `cargo +nightly fmt` must be
used instead of `cargo fmt`.
This keeps our Rust crates on the same allocator in shared builds.
This fixes the same ELF debug crash as #9026, where mimalloc detects
heap corruption as soon as liblagom-regex.so starts using the first
allocator it finds.
When generating liblagom-regex.so during shared-library linkage, the
normal linker sees that those allocator symbols are already provided by
liblagom-unicode.so, which it depends on, so the corresponding object
file is not pulled in from libregex_rust.a.
Fast forward to runtime, if liblagom-gfx.so is loaded first, as seems
to happen in debug builds, then its exported allocator is picked up by
liblagom-regex.so instead.
Using the Rust yuv crate, eagerly convert from YUV to RGBA on the CPU
when a GPU context is unavailable.
Time spent converting an 8-bit YUV frame with this crate is better than
libyuv on ARM by about 20%, and on x86 with AVX2, it achieves similar
numbers to libyuv.