bevyengine/bevy · Monthly · Jul 01, 2026 - Jul 31, 2026

bevyengine/bevy Monthly Update — July 2026: GPU-Driven Mesh Allocation, Solari Fixes, and Extraction Refactoring

Commits summarized
173
Period
Jul 01 - Jul 31, 2026
Published
Aug 01, 2026

Period: 2026-07-01 to 2026-07-31

Total commits in period: 173

This report highlights selected changes from the available commit summaries; it does not cover every commit.

Who should care

If you're building with Bevy, this month's highlights affect you whether you ship a small game or a large GPU-driven scene. Core contributors landed a major step toward zero-CPU-per-mesh rendering, squashed several rendering and input bugs, and laid groundwork for extracting data into sub-apps beyond the render world.

GPU-Driven Rendering

Move MeshUniform allocation from the CPU to the GPU (#23662, e50bf09)

Patrick Walton contributed a major step forward for GPU-driven rendering. Previously, every unique mesh in a batch set required a CPU-side sequential pass to lay out MeshUniforms in memory. This PR eliminates that loop by introducing a prefix-sum uniform allocation step on the GPU. For static meshes without skins or morph targets, per-mesh CPU overhead is now eliminated except for change detection and buffer re-upload. The implementation uses a three-step scan-and-fan algorithm (Hillis-Steele prefix sum) that typically runs only a single workgroup step when a batch set holds fewer than 256 meshes — the common case.

Rendering & PBR Fixes

Solari: Fix normal maps and support two-channel maps (#24880, f55cb21)

JMS55 fixed the missing * 2.0 - 1.0 decode for normal maps in the Solari renderer and added Z-reconstruction so two-channel normal maps (e.g. from the texture compressor plugin) work correctly.

Solari: Fix removed RaytracingMesh3d component (#24764, cd0f5f6)

Fixes a long-standing issue (#24042) where removing the RaytracingMesh3d component from an entity could cause a crash.

Prevent panic in check_dir_light_mesh_visibility (#24807, 306aaed)

Dylan Sechet fixed an edge-case panic when directional light cascade counts change and some worker threads remain idle, causing out-of-bounds access on persistent per-thread buffers.

CompressedImageSaver revamp (#24223, 0539e4d)

JMS55 reworked the compressed image saver with better normal-map handling, improved mipmap generation, web asset support, and fixed documentation.

Clear stale atmosphere components on removal (#24884, 0b90662)

Victor El Hajj fixed a bug where removing AtmosphereSettings or Atmosphere components left stale rendering data on cameras, causing the sky to render incorrectly.

Increase MaterialProperties::draw_functions inline capacity (#24844, 81127b3)

Luo Zhihao increased the SmallVec inline capacity from 4 to 11 to match the actual number of draw functions, eliminating unnecessary heap allocation for PreparedMaterial.

Expose bevy::pbr::gltf module (#24863, 717d527)

Ed Swartz made the gltf module public, allowing users to call standard_material_from_gltf_material when manually instantiating materials from GltfMaterial.

UI & Text

Text measurement min-content fix (#24859, e50c69d)

ickshonpe fixed a bug where TextMeasure returned cached min-content height even when a width was supplied, causing incorrect layout.

Update parley to version 0.11 (#24781, 5272a89)

Also from ickshonpe, the text layout library was updated to parley 0.11.

Tab navigation skips non-visible entities (#24769, 4ff6565)

Cyannide changed tab cycling to skip entities whose InheritedVisibility is hidden.

Use observer in multiple_text_inputs example (#24758, 05c5c44)

Cyannide replaced a per-frame changed-detection system with an observer on On<TextEditChange>, reducing unnecessary work.

Input & Audio

Fix bevy_gilrs weak rumble motor never being driven (#24829, 9bc5b6e)

Francis De Brabandere fixed a bug where the high-frequency (weak) rumble motor was mapped to BaseEffectType::Strong instead of BaseEffectType::Weak, causing both motors to always drive the strong one. A regression test (motors_map_to_their_own_effects) was added.

Fix MP4 audio playback failure (#24879, 90a0c2f)

nyfair refactored the audio decoder to use the rodio builder pattern, fixing MP4 audio playback that was broken in Bevy 0.19.0.

Fix ScrollArea scroll speed (#24620, 3653e78)

Benno Straub fixed a unit mismatch where a line-count delta was added to a pixel-position value, making line-based scrolling extremely slow.

Core Framework & Architecture

Extraction infra now explicitly targets RenderApp (#24420, f6c6e6e)

Daniel Skates made ExtractComponent, ExtractResource, and SyncComponent generic over an AppLabel parameter, defaulting to RenderApp. This is a purely mechanical change that unblocks reusing extraction for non-render sub-apps. All existing derives and manual impls now specify RenderApp explicitly.

Fix HandleTemplate::Value not adding the asset directly (#24885, cc6177c)

andriyDev fixed a panic in asset templating where HandleTemplate::Value queued assets through AssetServer::add instead of inserting them directly into the Assets resource, causing a flush-order panic.

Documentation & CI

Document settings save location and TOML format (#24830, 0eac08a)

Akshit joshi added docs explaining where SettingsPlugin writes settings on each platform and that the format is TOML.

Fix archived RFCs repo link in README (#24852, e6f39cb)

Riaz Amlani fixed a broken link to the archived RFCs repository.

Ignore ttf-parser advisory (#24819, 5fe7a7e)

Kevin Chen added a new advisory to the ignore list to unblock CI while the team decides on a long-term fix.

Remove outdated WinitPlugin docs (#24838, 63a6ab2)

Christian Hughes cleaned up stale documentation referencing a removed generic parameter.

CI: Bump super-linter to 8.7.0 (#24761, abc9a70)

Dependabot updated the super-linter action used in CI.

This report was generated from 173 commits. Many smaller improvements, dependency bumps, and internal refactors were omitted for brevity. See the full commit log for details.

Repository updates

Follow future updates

Get generated bevyengine/bevy development summaries by email, or follow the weekly and monthly RSS feeds.

Sign in to subscribe by email. RSS feeds are public.

Sign in to subscribe