Bevy Engine Weekly #X: Solari Fixes, GPU-Driven MeshUniforms, and Asset Pipeline Revamps (July 6–12, 2026)
- Commits summarized
- 57
- Period
- Jul 06 - Jul 12, 2026
- Published
- Jul 13, 2026
Bevy Engine Weekly — Highlights from July 6 to July 12, 2026
Who should read this: Bevy developers tracking rendering performance work, UI/Feathers widget fixes, asset pipeline changes, and the build-up to multi-app extraction. This period saw 57 commits — the update below covers all included commit summaries as a highlight report rather than exhaustive coverage.
🎨 Rendering & GPU-Driven Work
MeshUniform Allocation Moves to the GPU (#23662)
- Patrick Walton landed a major step toward GPU-driven rendering by porting the per-mesh
MeshUniformallocation pass from the CPU to the GPU. - Uses a three-step scan and fan prefix sum (Hillis-Steele scan) to lay out
MeshUniforms so that instances of the same mesh are adjacent — required for multi-draw indirect. - For batch sets with fewer than 256 meshes (common in practice), only the first (local) step runs.
- This eliminates the last per-mesh CPU loop for static meshes without skins/morphs, bringing zero-overhead static scene rendering closer.
AtomicSparseBufferVec: Per-Element Dirty Tracking (#24078)
- Patrick Walton replaced page-level dirty tracking with a two-level atomic bit vector (
dirty_bits+summary) to track individual element modifications. - Fixes a real-world problem where parallel mesh extraction scatters instances across the buffer, dirtying many pages even when only a few elements change. The new approach can skip up to 4096 elements at a time using bit manipulation.
- Includes
proptest-randomized testing of the bit-manipulation helpers.
Solari Bugfixes
- Normal map decoding and two-channel support (#24880) — Added the missing
* 2.0 - 1.0normalization and reconstructs Z for two-channel normal maps (e.g., from texture compressor plugins). - Removed
RaytracingMesh3dcomponent (#24764) — Fixes #24042 by properly handling removal of the raytracing component.
Atmosphere Component Cleanup (#24884)
- Victor El Hajj fixed #24808 by ensuring atmosphere bind groups and related components are cleared from cameras when either
AtmosphereSettingsorAtmospherecomponents are removed.
CompressedImageSaver Revamp (#24223)
- JMS55 delivered a reworked compressed image saver with better normal map handling, improved mipmap generation, web asset support, and fixed documentation.
🖥️ UI & Feathers
Text Measurement Fix — Min-Content Height (#24859)
- ickshonpe fixed #24858: when a width is supplied but height is unknown,
TextMeasurenow correctly recomputes the text layout size instead of returning the cached min-content height. - A new testbed scenario (
testbed_ui -- textmeasurement) is available for verification.
Parley Upgrade to v0.11 (#24781)
- Parley text layout library updated to version 0.11.
Tab Navigation Skips Non-Visible Entities (#24769)
- Cyannide changed tab cycling to skip entities with
InheritedVisibility::Hidden, making focus behavior more intuitive.
multiple_text_inputs Example Uses Observer (#24758)
- Replaced a per-frame
Changed<EditableText>system with anOn<TextEditChange>observer, avoiding unnecessary updates every frame.
Feathers Slider Fixes (#24905)
- Gagnus resolved several slider inconsistencies:
- Removed
valuefromFeathersSliderProps(useSliderValuecomponent instead) — breaking change. SliderPrecisionis now truly optional (was silently failing when absent).ValueChange<f32>is only emitted when the value actually changes, matching the behavior of other controls likeFeathersCheckbox.
Feathers Menu: Avoid Panic After Despawn (#24890)
- ByteBaker switched to
try_insertfor popup visibility updates inFeathersMenuto prevent panics when a menu/popup is despawned during deferred command execution. Includes a regression test.
ScrollArea Scroll Speed Fix (#24620)
- Benno Straub fixed a unit mismatch where scroll delta in lines was incorrectly added to the scroll position (in pixels), making line-based scrolling extremely slow.
FPS Overlay Graph Fix (commit 02f2320)
- Brian Misiak fixed an off-by-one read in the FPS overlay graph shader.
🔧 Asset Pipeline
Fix HandleTemplate::Value Not Adding Assets Directly (#24885)
- andriyDev fixed #24681 by using direct insertion into the
Assetsresource instead ofAssetServer::add(which queues assets and only flushes onhandle_internal_asset_events).
MP4 Audio Playback Fix (#24879)
- nyfair fixed #24878 by refactoring the audio decoder method to use the rodio builder pattern, enabling MP4 audio playback.
Expose bevy::pbr::gltf Module (#24863)
- Ed Swartz made
standard_material_from_gltf_materialaccessible again by exposingbevy::pbr::gltfas public, letting users manually instantiateGltfMaterialfrom glTF data (a capability that was present in 0.18).
🧩 Architecture & Infrastructure
Extraction Infrastructure Now Explicitly Targets RenderApp (#24420)
- Daniel Skates (with contributions from atlas and Kevin Chen) updated
ExtractComponent,ExtractResource, andSyncComponenttraits/derives to accept anAppLabelparameter — defaulting toRenderApp. - All 64 files changed are mechanical: adding
#[extract_app(RenderApp)]to derives andimpl ExtractComponent<RenderApp>for manual implementations. - No functional change yet; this paves the way for multi-app extraction (tracked in #24483).
WinitPlugin Docs Cleanup (#24838)
- Christian Hughes removed stale documentation referencing a removed
Mgeneric parameter.
Security Advisory Ignore for ttf-parser (#24819)
- Kevin Chen temporarily added a new advisory to the ignore list to unblock CI. The root-cause decision is tracked in #24818.
CI: Bump super-linter to v8.7.0 (#24761)
- Automated dependency bump for the CI linting action.
Next issue covers July 13–19 — see you then!