Repository navigation
Solari: Denoiser motion vector metal compat - #25787
Merged
Merged
Conversation
stuartparmenter
approved these changes
Sep 14, 2026
Contributor
|
Would like to land this in 0.20 so solari on metal isn't broken |
JMS55
suggested changes
Sep 15, 2026
JMS55
suggested changes
Sep 17, 2026
gregcsokas
pushed a commit
to gregcsokas/bevy
that referenced
this pull request
Sep 21, 2026
# Objective - bevyengine#25123 introduced Solari on Metal - bevyengine#25423 broke compatibility with Metal It changed Solari’s motion vectors from a sampled `texture_2d<f32>` to `texture_storage_2d<rg16float, read_write>`. Presently on main we get a crash on Metal: ``` 2026-09-14T18:43:13.274411Z ERROR bevy_render::error_handler: Caught rendering error: Validation Error Caused by: In Device::create_bind_group_layout, label = 'solari_lighting_bind_group_layout' Binding index 5: ReadWrite access to storage textures with format Rg16Float is not supported ``` `rg16float` can't be bound as a read-write storage texture on Metal. Vulkan and DX12 usually can. ## Solution ReSTIR only samples motion vectors to reproject last frame's reservoir. The only writer is DLSS Ray Reconstruction PSR, and only for perfect mirrors — everything else already goes to `specular_motion_vectors`. At pipeline init we check whether the adapter supports `STORAGE_READ_WRITE` on `rg16float`. If it does, we keep the storage binding and write PSR motion in place. If not, we sample a `texture_2d<f32>` and skip the write. DLSS RR doesn't run on those GPUs anyway. ## Testing - Ran the Solari example on Metal (Apple M5), no crash - Could not test the DLSS in-place path (no `DLSS_SDK` / NVIDIA GPU on this machine) - CI check for Metal + Solari is still missing (no available hw to test on?)
mockersf
pushed a commit
that referenced
this pull request
Sep 25, 2026
# Objective - #25123 introduced Solari on Metal - #25423 broke compatibility with Metal It changed Solari’s motion vectors from a sampled `texture_2d<f32>` to `texture_storage_2d<rg16float, read_write>`. Presently on main we get a crash on Metal: ``` 2026-09-14T18:43:13.274411Z ERROR bevy_render::error_handler: Caught rendering error: Validation Error Caused by: In Device::create_bind_group_layout, label = 'solari_lighting_bind_group_layout' Binding index 5: ReadWrite access to storage textures with format Rg16Float is not supported ``` `rg16float` can't be bound as a read-write storage texture on Metal. Vulkan and DX12 usually can. ## Solution ReSTIR only samples motion vectors to reproject last frame's reservoir. The only writer is DLSS Ray Reconstruction PSR, and only for perfect mirrors — everything else already goes to `specular_motion_vectors`. At pipeline init we check whether the adapter supports `STORAGE_READ_WRITE` on `rg16float`. If it does, we keep the storage binding and write PSR motion in place. If not, we sample a `texture_2d<f32>` and skip the write. DLSS RR doesn't run on those GPUs anyway. ## Testing - Ran the Solari example on Metal (Apple M5), no crash - Could not test the DLSS in-place path (no `DLSS_SDK` / NVIDIA GPU on this machine) - CI check for Metal + Solari is still missing (no available hw to test on?)
pull Bot
pushed a commit
to AsnZZZ/bevy
that referenced
this pull request
Sep 28, 2026
# Objective - Filtering always runs for the atmosphere - `bevy_solari` introduces a new use case where only mip 0 is sampled - We need a way to disable the filtering to save on the overhead ## Solution - Add a `bool` field called `filter` on the `AtmosphereEnvironmentMapLight` struct. - Add a system to `bevy_solari` that automatically sets this to `filter` field to `false` - Generally updated documentation throughout ## Testing - Applied the change set from the PR bevyengine#25704 (now also on main) - Created a new branch at https://github.com/mate-h/bevy/tree/m/solari-atmo-test - I had to fix compatibility with metal backend for `bevy_solari`. posted PR for this bevyengine#25787. - Ran the `bevy_solari` example with the `AtmosphereEnvironmentMapLight::default()` and verified with log statements that the filtering gets disabled and does not run the GPU pipeline. --- ## Showcase <img width="1280" height="750" alt="Screenshot 2026-09-14 at 12 45 25 AM" src="https://github.com/user-attachments/assets/23e35861-9a28-4552-a6ce-723bb5f320d9" /> --------- Co-authored-by: JMS55 <47158642+JMS55@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Objective
It changed Solari’s motion vectors from a sampled
texture_2d<f32>totexture_storage_2d<rg16float, read_write>.Presently on main we get a crash on Metal:
rg16floatcan't be bound as a read-write storage texture on Metal. Vulkan and DX12 usually can.Solution
ReSTIR only samples motion vectors to reproject last frame's reservoir. The only writer is DLSS Ray Reconstruction PSR, and only for perfect mirrors — everything else already goes to
specular_motion_vectors.At pipeline init we check whether the adapter supports
STORAGE_READ_WRITEonrg16float. If it does, we keep the storage binding and write PSR motion in place. If not, we sample atexture_2d<f32>and skip the write. DLSS RR doesn't run on those GPUs anyway.Testing
DLSS_SDK/ NVIDIA GPU on this machine)