diff --git a/Cargo.toml b/Cargo.toml index b993cbb7d1dce..84560e8b3ddfa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -742,6 +742,10 @@ tracing = { version = "0.1", default-features = false, optional = true } [target.'cfg(not(target_family = "wasm"))'.dependencies] bevy_dylib = { path = "crates/bevy_dylib", version = "0.20.0-dev", default-features = false, optional = true } +[patch.crates-io] +naga_oil = { git = "https://github.com/christopherbiscardi/naga_oil", branch = "wgpu-30" } +dlss_wgpu = { git = "https://github.com/christopherbiscardi/dlss_wgpu", branch = "wgpu-30" } + [dev-dependencies] rand = "0.10.0" chacha20 = { version = "0.10.0", default-features = false, features = ["rng"] } diff --git a/assets/shaders/texture_binding_array.wgsl b/assets/shaders/texture_binding_array.wgsl index 98ffce0f65bf1..e93df3fdd07f4 100644 --- a/assets/shaders/texture_binding_array.wgsl +++ b/assets/shaders/texture_binding_array.wgsl @@ -1,3 +1,5 @@ +enable wgpu_binding_array; + #import bevy_pbr::forward_io::VertexOutput @group(#{MATERIAL_BIND_GROUP}) @binding(0) var textures: binding_array>; diff --git a/crates/bevy_anti_alias/Cargo.toml b/crates/bevy_anti_alias/Cargo.toml index 27cca95bcc95d..20f0e619a20c4 100644 --- a/crates/bevy_anti_alias/Cargo.toml +++ b/crates/bevy_anti_alias/Cargo.toml @@ -34,7 +34,7 @@ bevy_diagnostic = { path = "../bevy_diagnostic", version = "0.20.0-dev" } # other tracing = { version = "0.1", default-features = false, features = ["std"] } -dlss_wgpu = { version = "4.0.0", optional = true } +dlss_wgpu = { version = "5.0.0", optional = true } uuid = { version = "1.21.0", optional = true } [lints] diff --git a/crates/bevy_camera/Cargo.toml b/crates/bevy_camera/Cargo.toml index 13ecbf11d5e01..49b23d6aeda07 100644 --- a/crates/bevy_camera/Cargo.toml +++ b/crates/bevy_camera/Cargo.toml @@ -28,7 +28,7 @@ bevy_color = { path = "../bevy_color", version = "0.20.0-dev", features = [ bevy_window = { path = "../bevy_window", version = "0.20.0-dev" } # other -wgpu-types = { version = "29.0.3", default-features = false } +wgpu-types = { version = "30", default-features = false } serde = { version = "1", default-features = false, features = ["derive"] } thiserror = { version = "2", default-features = false } downcast-rs = { version = "2", default-features = false, features = ["std"] } diff --git a/crates/bevy_clipboard/Cargo.toml b/crates/bevy_clipboard/Cargo.toml index a11c228742b3d..2c23a3fc77290 100644 --- a/crates/bevy_clipboard/Cargo.toml +++ b/crates/bevy_clipboard/Cargo.toml @@ -29,7 +29,7 @@ bevy_platform = { path = "../bevy_platform", version = "0.20.0-dev", default-fea [target.'cfg(any(windows, unix))'.dependencies] bevy_asset = { path = "../bevy_asset", version = "0.20.0-dev", default-features = false, optional = true } bevy_image = { path = "../bevy_image", version = "0.20.0-dev", default-features = false, optional = true } -wgpu-types = { version = "29.0.3", default-features = false, optional = true } +wgpu-types = { version = "30", default-features = false, optional = true } arboard = { version = "3.6.1", default-features = false, optional = true } [target.'cfg(target_arch = "wasm32")'.dependencies] diff --git a/crates/bevy_color/Cargo.toml b/crates/bevy_color/Cargo.toml index 21252129fc3d3..432e13e6debf0 100644 --- a/crates/bevy_color/Cargo.toml +++ b/crates/bevy_color/Cargo.toml @@ -20,7 +20,7 @@ serde = { version = "1.0", features = [ ], default-features = false, optional = true } thiserror = { version = "2", default-features = false } derive_more = { version = "2", default-features = false, features = ["from"] } -wgpu-types = { version = "29.0.3", default-features = false, optional = true } +wgpu-types = { version = "30", default-features = false, optional = true } encase = { version = "0.12", default-features = false, optional = true } [features] diff --git a/crates/bevy_gltf/Cargo.toml b/crates/bevy_gltf/Cargo.toml index 7fca84bc3cc96..aa4873180ea4a 100644 --- a/crates/bevy_gltf/Cargo.toml +++ b/crates/bevy_gltf/Cargo.toml @@ -67,7 +67,7 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.140" smallvec = { version = "1", default-features = false } tracing = { version = "0.1", default-features = false, features = ["std"] } -wgpu-types = { version = "29.0.3", default-features = false } +wgpu-types = { version = "30", default-features = false } [dev-dependencies] bevy_log = { path = "../bevy_log", version = "0.20.0-dev" } diff --git a/crates/bevy_image/Cargo.toml b/crates/bevy_image/Cargo.toml index f35e0bdd36e2d..b513eb37c3151 100644 --- a/crates/bevy_image/Cargo.toml +++ b/crates/bevy_image/Cargo.toml @@ -70,9 +70,7 @@ image = { version = "0.25.2", default-features = false } # misc bitflags = { version = "2.3", features = ["serde"] } bytemuck = { version = "1.5" } -wgpu-types = { version = "29.0.3", default-features = false, features = [ - "serde", -] } +wgpu-types = { version = "30", default-features = false, features = ["serde"] } serde = { version = "1", features = ["derive"] } thiserror = { version = "2", default-features = false } futures-lite = "2.0.1" diff --git a/crates/bevy_light/Cargo.toml b/crates/bevy_light/Cargo.toml index f9e85c8b99dfd..f27b5d7b70a8e 100644 --- a/crates/bevy_light/Cargo.toml +++ b/crates/bevy_light/Cargo.toml @@ -29,7 +29,7 @@ bevy_log = { path = "../bevy_log", version = "0.20.0-dev" } # other tracing = { version = "0.1", default-features = false } -wgpu-types = { version = "29.0.3", default-features = false } +wgpu-types = { version = "30", default-features = false } half = "2.7.1" smallvec = { version = "1", default-features = false } diff --git a/crates/bevy_material/Cargo.toml b/crates/bevy_material/Cargo.toml index 36b227ae9b945..6fb633d106b58 100644 --- a/crates/bevy_material/Cargo.toml +++ b/crates/bevy_material/Cargo.toml @@ -23,7 +23,7 @@ bevy_platform = { path = "../bevy_platform", version = "0.20.0-dev" } encase = "0.12" tracing = { version = "0.1", default-features = false, features = ["std"] } thiserror = { version = "2", default-features = false } -wgpu-types = { version = "29.0.3", default-features = false } +wgpu-types = { version = "30", default-features = false } variadics_please = "2.0" smallvec = { version = "1", default-features = false } diff --git a/crates/bevy_mesh/Cargo.toml b/crates/bevy_mesh/Cargo.toml index dfd4a1a54d950..cf04eea0c4f8b 100644 --- a/crates/bevy_mesh/Cargo.toml +++ b/crates/bevy_mesh/Cargo.toml @@ -27,7 +27,7 @@ bevy_platform = { path = "../bevy_platform", version = "0.20.0-dev", default-fea # other bitflags = { version = "2.3", features = ["serde"] } bytemuck = { version = "1.5" } -wgpu-types = { version = "29.0.3", default-features = false } +wgpu-types = { version = "30", default-features = false } serde = { version = "1", default-features = false, features = [ "derive", ], optional = true } diff --git a/crates/bevy_pbr/Cargo.toml b/crates/bevy_pbr/Cargo.toml index 88c97062321ab..e7479f3e372d5 100644 --- a/crates/bevy_pbr/Cargo.toml +++ b/crates/bevy_pbr/Cargo.toml @@ -91,7 +91,7 @@ tracing = { version = "0.1", default-features = false, features = ["std"] } offset-allocator = "0.2" arrayvec = { version = "0.7", default-features = false } indexmap = { version = "2" } -wgpu-types = "29.0.3" +wgpu-types = "30" [lints] workspace = true diff --git a/crates/bevy_pbr/src/cluster/gpu.rs b/crates/bevy_pbr/src/cluster/gpu.rs index e1417312d9387..bb3e9d33c39f0 100644 --- a/crates/bevy_pbr/src/cluster/gpu.rs +++ b/crates/bevy_pbr/src/cluster/gpu.rs @@ -1159,7 +1159,10 @@ fn cluster_on_gpu( { // Use `encase` to populate a `ClusterMetadata`. - let buffer_view = captured_staging_buffer.slice(..).get_mapped_range(); + let buffer_view = captured_staging_buffer + .slice(..) + .get_mapped_range() + .unwrap(); let Ok(mut buffer_reader) = Reader::new::(buffer_view[..].to_vec(), 0) else { diff --git a/crates/bevy_pbr/src/lightmap/lightmap.wgsl b/crates/bevy_pbr/src/lightmap/lightmap.wgsl index 4ba6f51bc9a4b..44b42d828f8b5 100644 --- a/crates/bevy_pbr/src/lightmap/lightmap.wgsl +++ b/crates/bevy_pbr/src/lightmap/lightmap.wgsl @@ -1,3 +1,5 @@ +enable wgpu_binding_array; + #define_import_path bevy_pbr::lightmap #import bevy_pbr::mesh_bindings::mesh diff --git a/crates/bevy_pbr/src/prepass/prepass_io.wgsl b/crates/bevy_pbr/src/prepass/prepass_io.wgsl index bf01e84d45c4e..7340db443b1f3 100644 --- a/crates/bevy_pbr/src/prepass/prepass_io.wgsl +++ b/crates/bevy_pbr/src/prepass/prepass_io.wgsl @@ -175,7 +175,7 @@ struct VertexOutput { @location(6) unclipped_depth: f32, #endif // UNCLIPPED_DEPTH_ORTHO_EMULATION #ifdef VERTEX_OUTPUT_INSTANCE_INDEX - @location(7) instance_index: u32, + @location(7) @interpolate(flat) instance_index: u32, #endif #ifdef VERTEX_COLORS diff --git a/crates/bevy_pbr/src/render/mesh_view_bindings.wgsl b/crates/bevy_pbr/src/render/mesh_view_bindings.wgsl index 4d3f16fb0ca13..8f2a10a387b42 100644 --- a/crates/bevy_pbr/src/render/mesh_view_bindings.wgsl +++ b/crates/bevy_pbr/src/render/mesh_view_bindings.wgsl @@ -1,3 +1,5 @@ +enable wgpu_binding_array; + #define_import_path bevy_pbr::mesh_view_bindings #import bevy_pbr::mesh_view_types as types diff --git a/crates/bevy_post_process/src/auto_exposure/auto_exposure.wgsl b/crates/bevy_post_process/src/auto_exposure/auto_exposure.wgsl index 6434b7e2081b4..5febcf06ed209 100644 --- a/crates/bevy_post_process/src/auto_exposure/auto_exposure.wgsl +++ b/crates/bevy_post_process/src/auto_exposure/auto_exposure.wgsl @@ -120,7 +120,8 @@ fn compute_histogram( // Accumulate the workgroup histogram into the global histogram. // Note that the global histogram was not cleared at the beginning, // as it will be cleared in compute_average. - atomicAdd(&histogram[local_invocation_index], histogram_shared[local_invocation_index]); + var histogram_value = atomicLoad(&histogram_shared[local_invocation_index]); + atomicAdd(&histogram[local_invocation_index], histogram_value); } @compute @workgroup_size(1, 1, 1) @@ -132,7 +133,7 @@ fn compute_average(@builtin(local_invocation_index) local_index: u32) { // This way we can quickly exclude the portion of lowest and highest samples as required by // the low_percent and high_percent settings. for (var i=0u; i<64u; i+=1u) { - histogram_sum += histogram[i]; + histogram_sum += atomicLoad(&histogram[i]); histogram_shared[i] = histogram_sum; // Clear the histogram bin for the next frame @@ -148,8 +149,8 @@ fn compute_average(@builtin(local_invocation_index) local_index: u32) { // The number of pixels in the bin. The histogram values are clamped to // first_index and last_index to exclude the lowest and highest samples. let bin_count = - clamp(histogram_shared[i], first_index, last_index) - - clamp(histogram_shared[i - 1u], first_index, last_index); + clamp(atomicLoad(&histogram_shared[i]), first_index, last_index) - + clamp(atomicLoad(&histogram_shared[i - 1u]), first_index, last_index); sum += f32(bin_count) * f32(i); count += bin_count; diff --git a/crates/bevy_reflect/Cargo.toml b/crates/bevy_reflect/Cargo.toml index f705ec52bed63..d903c850f95a1 100644 --- a/crates/bevy_reflect/Cargo.toml +++ b/crates/bevy_reflect/Cargo.toml @@ -129,7 +129,7 @@ uuid = { version = "1.21.0", default-features = false, optional = true, features "serde", ] } variadics_please = "2.0" -wgpu-types = { version = "29.0.3", features = [ +wgpu-types = { version = "30", features = [ "serde", ], optional = true, default-features = false } diff --git a/crates/bevy_render/Cargo.toml b/crates/bevy_render/Cargo.toml index 177cd762a022d..87b76c86efe2b 100644 --- a/crates/bevy_render/Cargo.toml +++ b/crates/bevy_render/Cargo.toml @@ -95,7 +95,7 @@ image = { version = "0.25.2", default-features = false } # It is enabled for now to avoid having to do a significant overhaul of the renderer just for wasm. # When the 'atomics' feature is enabled `fragile-send-sync-non-atomic` does nothing # and Bevy instead wraps `wgpu` types to verify they are not used off their origin thread. -wgpu = { version = "29.0.3", default-features = false, features = [ +wgpu = { version = "30", default-features = false, features = [ "wgsl", "dx12", "metal", @@ -103,8 +103,8 @@ wgpu = { version = "29.0.3", default-features = false, features = [ "naga-ir", "fragile-send-sync-non-atomic-wasm", ] } -wgpu-types = { version = "29.0.3", default-features = false } -naga = { version = "29.0.3", features = ["wgsl-in"] } +wgpu-types = { version = "30", default-features = false } +naga = { version = "30", features = ["wgsl-in"] } bytemuck = { version = "1.5", features = ["derive", "must_cast"] } downcast-rs = { version = "2", default-features = false, features = ["std"] } thiserror = { version = "2", default-features = false } diff --git a/crates/bevy_render/src/bindless.wgsl b/crates/bevy_render/src/bindless.wgsl index 6c8eff1a29aed..8da7bafc790f5 100644 --- a/crates/bevy_render/src/bindless.wgsl +++ b/crates/bevy_render/src/bindless.wgsl @@ -1,3 +1,5 @@ +enable wgpu_binding_array; + // Defines the common arrays used to access bindless resources. // // This need to be kept up to date with the `BINDING_NUMBERS` table in diff --git a/crates/bevy_render/src/diagnostic/internal.rs b/crates/bevy_render/src/diagnostic/internal.rs index a0573d3d753b4..a753e1aada3aa 100644 --- a/crates/bevy_render/src/diagnostic/internal.rs +++ b/crates/bevy_render/src/diagnostic/internal.rs @@ -151,7 +151,7 @@ impl RecordDiagnostics for DiagnosticsRecorder { { assert_eq!( buffer.size(), - BufferSize::new(4).unwrap(), + BufferSize::new(4).unwrap().get(), "DiagnosticsRecorder::record_f32 buffer slice must be 4 bytes long" ); assert!( @@ -169,7 +169,7 @@ impl RecordDiagnostics for DiagnosticsRecorder { { assert_eq!( buffer.size(), - BufferSize::new(4).unwrap(), + BufferSize::new(4).unwrap().get(), "DiagnosticsRecorder::record_u32 buffer slice must be 4 bytes long" ); assert!( @@ -427,7 +427,7 @@ impl FrameData { buffer.offset(), &dest_buffer, 0, - Some(buffer.size().into()), + Some(buffer.size()), ); command_encoder.map_buffer_on_submit(&dest_buffer, MapMode::Read, .., |_| {}); @@ -533,7 +533,7 @@ impl FrameData { } for (buffer, diagnostic_path, is_f32) in self.value_buffers.drain(..) { - let buffer = buffer.get_mapped_range(..); + let buffer = buffer.get_mapped_range(..).unwrap(); diagnostics.push(RenderDiagnostic { path: DiagnosticPath::from_components( core::iter::once("render") @@ -578,7 +578,7 @@ impl FrameData { return true; }; - let data = read_buffer.slice(..).get_mapped_range(); + let data = read_buffer.slice(..).get_mapped_range().unwrap(); let timestamps = data[..(self.num_timestamps * 8) as usize] .as_chunks() @@ -675,7 +675,7 @@ impl FrameData { } for (buffer, diagnostic_path, is_f32) in self.value_buffers.drain(..) { - let buffer = buffer.get_mapped_range(..); + let buffer = buffer.get_mapped_range(..).unwrap(); diagnostics.push(RenderDiagnostic { path: DiagnosticPath::from_components( core::iter::once("render").chain(core::iter::once(diagnostic_path.as_ref())), diff --git a/crates/bevy_render/src/diagnostic/tracy_gpu.rs b/crates/bevy_render/src/diagnostic/tracy_gpu.rs index 6ae50b434222c..57b067ba12b24 100644 --- a/crates/bevy_render/src/diagnostic/tracy_gpu.rs +++ b/crates/bevy_render/src/diagnostic/tracy_gpu.rs @@ -74,6 +74,6 @@ fn initial_timestamp(device: &RenderDevice, queue: &RenderQueue) -> i64 { .poll(PollType::wait_indefinitely()) .expect("Failed to poll device for map async"); - let view = map_buffer.slice(..).get_mapped_range(); + let view = map_buffer.slice(..).get_mapped_range().unwrap(); i64::from_le_bytes((*view).try_into().unwrap()) } diff --git a/crates/bevy_render/src/gpu_readback.rs b/crates/bevy_render/src/gpu_readback.rs index e609093f47505..b807234be6cac 100644 --- a/crates/bevy_render/src/gpu_readback.rs +++ b/crates/bevy_render/src/gpu_readback.rs @@ -403,7 +403,7 @@ fn map_buffers(mut readbacks: ResMut) { slice.map_async(wgpu::MapMode::Read, move |res| { res.expect("Failed to map buffer"); let buffer_slice = buffer.slice(..); - let data = buffer_slice.get_mapped_range(); + let data = buffer_slice.get_mapped_range().unwrap(); let result = Vec::from(&*data); drop(data); buffer.unmap(); diff --git a/crates/bevy_render/src/render_phase/draw_state.rs b/crates/bevy_render/src/render_phase/draw_state.rs index 610e21685a21e..828ca6ce05209 100644 --- a/crates/bevy_render/src/render_phase/draw_state.rs +++ b/crates/bevy_render/src/render_phase/draw_state.rs @@ -14,7 +14,7 @@ use wgpu::{IndexFormat, QuerySet, RenderPass}; #[cfg(feature = "detailed_trace")] use bevy_log::trace; -type BufferSliceKey = (BufferId, wgpu::BufferAddress, wgpu::BufferSize); +type BufferSliceKey = (BufferId, wgpu::BufferAddress, wgpu::BufferAddress); /// Tracks the state of a [`TrackedRenderPass`]. /// diff --git a/crates/bevy_render/src/render_resource/pipeline_cache.rs b/crates/bevy_render/src/render_resource/pipeline_cache.rs index 6b98633646a61..399846d01626e 100644 --- a/crates/bevy_render/src/render_resource/pipeline_cache.rs +++ b/crates/bevy_render/src/render_resource/pipeline_cache.rs @@ -528,10 +528,12 @@ impl PipelineCache { .vertex .buffers .iter() - .map(|layout| RawVertexBufferLayout { - array_stride: layout.array_stride, - attributes: &layout.attributes, - step_mode: layout.step_mode, + .map(|layout| { + Some(RawVertexBufferLayout { + array_stride: layout.array_stride, + attributes: &layout.attributes, + step_mode: layout.step_mode, + }) }) .collect::>(); diff --git a/crates/bevy_render/src/render_resource/texture.rs b/crates/bevy_render/src/render_resource/texture.rs index 6e869ef382329..bec6b9bcba8df 100644 --- a/crates/bevy_render/src/render_resource/texture.rs +++ b/crates/bevy_render/src/render_resource/texture.rs @@ -1,4 +1,4 @@ -use crate::renderer::{RenderDevice, WgpuWrapper}; +use crate::renderer::{RenderDevice, RenderQueue, WgpuWrapper}; use bevy_derive::{Deref, DerefMut}; use bevy_ecs::{ resource::Resource, @@ -74,8 +74,8 @@ pub struct SurfaceTexture { } impl SurfaceTexture { - pub fn present(self) { - self.value.into_inner().present(); + pub fn present(self, render_queue: &RenderQueue) { + render_queue.present(self.value.into_inner()); } } diff --git a/crates/bevy_render/src/renderer/mod.rs b/crates/bevy_render/src/renderer/mod.rs index 733252f05095d..5bd53b01155c5 100644 --- a/crates/bevy_render/src/renderer/mod.rs +++ b/crates/bevy_render/src/renderer/mod.rs @@ -103,7 +103,7 @@ pub fn render_system( }); if view_needs_present || window.needs_initial_present { - window.present(); + window.present(world.resource::()); window.needs_initial_present = false; } } @@ -204,7 +204,10 @@ pub async fn initialize_renderer( force_shader_model: ForceShaderModelToken::default(), agility_sdk: None, }, - noop: wgpu::NoopBackendOptions { enable: false }, + noop: wgpu::NoopBackendOptions { + enable: false, + ..Default::default() + }, }, }; @@ -250,6 +253,7 @@ pub async fn initialize_renderer( power_preference: options.power_preference, compatible_surface: surface.as_ref(), force_fallback_adapter, + apply_limit_buckets: false, }; #[cfg(not(target_family = "wasm"))] diff --git a/crates/bevy_render/src/settings.rs b/crates/bevy_render/src/settings.rs index 07eff236f5f7d..bac9296550df7 100644 --- a/crates/bevy_render/src/settings.rs +++ b/crates/bevy_render/src/settings.rs @@ -222,7 +222,7 @@ impl RenderResources { /// An enum describing how the renderer will initialize resources. This is used when creating the [`RenderPlugin`](crate::RenderPlugin). pub enum RenderCreation { /// Allows renderer resource initialization to happen outside of the rendering plugin. - Manual(RenderResources), + Manual(Box), /// Lets the rendering plugin create resources itself. Automatic(Box), } @@ -265,7 +265,7 @@ impl RenderCreation { ) -> bool { match self { RenderCreation::Manual(resources) => { - *future_resources.lock().unwrap() = Some(resources.clone()); + *future_resources.lock().unwrap() = Some(*resources.clone()); } RenderCreation::Automatic(render_creation) => { let Some(backends) = render_creation.backends else { @@ -302,7 +302,7 @@ impl RenderCreation { impl From for RenderCreation { fn from(value: RenderResources) -> Self { - Self::Manual(value) + Self::Manual(Box::new(value)) } } diff --git a/crates/bevy_render/src/slab_allocator.rs b/crates/bevy_render/src/slab_allocator.rs index a015054fed270..dee5b7ec2a471 100644 --- a/crates/bevy_render/src/slab_allocator.rs +++ b/crates/bevy_render/src/slab_allocator.rs @@ -994,7 +994,7 @@ where mapped_at_creation: true, }); { - let mut slice = buffer.slice(..).get_mapped_range_mut(); + let mut slice = buffer.slice(..).get_mapped_range_mut().unwrap(); fill_data(slice.slice(..len)); } diff --git a/crates/bevy_render/src/view/window/mod.rs b/crates/bevy_render/src/view/window/mod.rs index 18adfd0c7d8fd..b9f532186fbd4 100644 --- a/crates/bevy_render/src/view/window/mod.rs +++ b/crates/bevy_render/src/view/window/mod.rs @@ -1,5 +1,5 @@ -use crate::camera::extract_cameras; use crate::renderer::WgpuWrapper; +use crate::{camera::extract_cameras, renderer::RenderQueue}; use crate::{ render_resource::{SurfaceTexture, TextureView}, renderer::{RenderAdapter, RenderDevice, RenderInstance}, @@ -91,13 +91,13 @@ impl ExtractedWindow { self.swap_chain_texture_view.is_some() && self.swap_chain_texture.is_some() } - pub fn present(&mut self) { + pub fn present(&mut self, queue: &RenderQueue) { if let Some(surface_texture) = self.swap_chain_texture.take() { // TODO(clean): winit docs recommends calling pre_present_notify before this. // though `present()` doesn't present the frame, it schedules it to be presented // by wgpu. // https://docs.rs/winit/0.29.9/wasm32-unknown-unknown/winit/window/struct.Window.html#method.pre_present_notify - surface_texture.present(); + surface_texture.present(queue); } } } @@ -433,6 +433,7 @@ pub fn create_surfaces( Some(format) => vec![format], None => vec![], }, + color_space: wgpu::SurfaceColorSpace::Auto, }; render_device.configure_surface(&surface, &configuration); diff --git a/crates/bevy_render/src/view/window/screenshot.rs b/crates/bevy_render/src/view/window/screenshot.rs index 6037e7ce068e2..c125fa3ca1b48 100644 --- a/crates/bevy_render/src/view/window/screenshot.rs +++ b/crates/bevy_render/src/view/window/screenshot.rs @@ -657,7 +657,7 @@ pub(crate) fn collect_screenshots(world: &mut World) { tx.try_send(()).unwrap(); }); rx.recv().await.unwrap(); - let data = buffer_slice.get_mapped_range(); + let data = buffer_slice.get_mapped_range().unwrap(); // we immediately move the data to CPU memory to avoid holding the mapped view for long let mut result = Vec::from(&*data); drop(data); diff --git a/crates/bevy_shader/Cargo.toml b/crates/bevy_shader/Cargo.toml index 43f1e83443996..1084b2a475738 100644 --- a/crates/bevy_shader/Cargo.toml +++ b/crates/bevy_shader/Cargo.toml @@ -16,9 +16,9 @@ bevy_platform = { path = "../bevy_platform", version = "0.20.0-dev" } bevy_utils = { path = "../bevy_utils", version = "0.20.0-dev" } # other -wgpu-types = { version = "29.0.3", default-features = false } -naga = { version = "29.0.3", features = ["wgsl-in"] } -wgpu-naga-bridge = { version = "29.0.3", default-features = false } +wgpu-types = { version = "30", default-features = false } +naga = { version = "30", features = ["wgsl-in"] } +wgpu-naga-bridge = { version = "30", default-features = false } serde = { version = "1", features = ["derive"] } thiserror = { version = "2", default-features = false } wesl = { version = "0.3.1", optional = true } @@ -27,12 +27,12 @@ tracing = { version = "0.1", default-features = false, features = ["std"] } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] # Omit the `glsl` feature in non-WebAssembly by default. -naga_oil = { version = "0.22", default-features = false, features = [ +naga_oil = { version = "0.23", default-features = false, features = [ "test_shader", ] } [target.'cfg(target_arch = "wasm32")'.dependencies] -naga_oil = { version = "0.22" } +naga_oil = { version = "0.23" } [features] shader_format_glsl = ["naga/glsl-in", "naga/wgsl-out", "naga_oil/glsl"] @@ -51,6 +51,7 @@ shader_format_wesl = ["wesl"] # wgpu-types = { git = "https://github.com/gfx-rs/wgpu", rev = "..." } decoupled_naga = [] + [lints] workspace = true diff --git a/crates/bevy_solari/src/realtime/world_cache_compact.wgsl b/crates/bevy_solari/src/realtime/world_cache_compact.wgsl index eaa31490b9578..abe08695966d7 100644 --- a/crates/bevy_solari/src/realtime/world_cache_compact.wgsl +++ b/crates/bevy_solari/src/realtime/world_cache_compact.wgsl @@ -19,10 +19,19 @@ var w2: array; @compute @workgroup_size(1024, 1, 1) fn decay_world_cache(@builtin(global_invocation_id) global_id: vec3) { - var life = world_cache_life[global_id.x]; + #ifdef WORLD_CACHE_NON_ATOMIC_LIFE_BUFFER + var life = world_cache_life[global_id.x]; + #else + var life = atomicLoad(&world_cache_life[global_id.x]); + #endif + if life > 0u { life -= 1u; - world_cache_life[global_id.x] = life; + #ifdef WORLD_CACHE_NON_ATOMIC_LIFE_BUFFER + world_cache_life[global_id.x] = life; + #else + atomicStore(&world_cache_life[global_id.x], life); + #endif if life == 0u { world_cache_checksums[global_id.x] = WORLD_CACHE_EMPTY_CELL; @@ -37,7 +46,12 @@ fn compact_world_cache_single_block( @builtin(global_invocation_id) cell_id: vec3, @builtin(local_invocation_index) t: u32, ) { - if t == 0u { w1[0u] = 0u; } else { w1[t] = u32(world_cache_life[cell_id.x - 1u] != 0u); }; workgroupBarrier(); + #ifdef WORLD_CACHE_NON_ATOMIC_LIFE_BUFFER + var life_cache = world_cache_life[cell_id.x - 1u]; + #else + var life_cache = atomicLoad(&world_cache_life[cell_id.x - 1u]); + #endif + if t == 0u { w1[0u] = 0u; } else { w1[t] = u32(life_cache != 0u); }; workgroupBarrier(); if t < 1u { w2[t] = w1[t]; } else { w2[t] = w1[t] + w1[t - 1u]; } workgroupBarrier(); if t < 2u { w1[t] = w2[t]; } else { w1[t] = w2[t] + w2[t - 2u]; } workgroupBarrier(); if t < 4u { w2[t] = w1[t]; } else { w2[t] = w1[t] + w1[t - 4u]; } workgroupBarrier(); @@ -72,7 +86,12 @@ fn compact_world_cache_write_active_cells( @builtin(local_invocation_index) thread_index: u32, ) { let compacted_index = world_cache_a[cell_id.x] + world_cache_b[workgroup_id.x]; - let cell_active = world_cache_life[cell_id.x] != 0u; + #ifdef WORLD_CACHE_NON_ATOMIC_LIFE_BUFFER + var life_cache = world_cache_life[cell_id.x]; + #else + var life_cache = atomicLoad(&world_cache_life[cell_id.x]); + #endif + let cell_active = life_cache != 0u; if cell_active { world_cache_active_cell_indices[compacted_index] = cell_id.x; diff --git a/crates/bevy_solari/src/scene/raytracing_scene_bindings.wgsl b/crates/bevy_solari/src/scene/raytracing_scene_bindings.wgsl index 0e7f7a977b73a..1ed71e9fb49f9 100644 --- a/crates/bevy_solari/src/scene/raytracing_scene_bindings.wgsl +++ b/crates/bevy_solari/src/scene/raytracing_scene_bindings.wgsl @@ -1,4 +1,5 @@ enable wgpu_ray_query; +enable wgpu_binding_array; #define_import_path bevy_solari::scene_bindings diff --git a/crates/bevy_sprite/Cargo.toml b/crates/bevy_sprite/Cargo.toml index 0b6b5210624b8..d7ce502f1ec5e 100644 --- a/crates/bevy_sprite/Cargo.toml +++ b/crates/bevy_sprite/Cargo.toml @@ -33,7 +33,7 @@ bevy_log = { path = "../bevy_log", version = "0.20.0-dev" } # other radsort = "0.1" tracing = { version = "0.1", default-features = false, features = ["std"] } -wgpu-types = { version = "29.0.3", default-features = false } +wgpu-types = { version = "30", default-features = false } [dev-dependencies] approx = "0.5.1" diff --git a/crates/bevy_text/Cargo.toml b/crates/bevy_text/Cargo.toml index f3690164087c9..9f32d77ca3314 100644 --- a/crates/bevy_text/Cargo.toml +++ b/crates/bevy_text/Cargo.toml @@ -34,7 +34,7 @@ bevy_platform = { path = "../bevy_platform", version = "0.20.0-dev", default-fea ] } # other -wgpu-types = { version = "29.0.3", default-features = false } +wgpu-types = { version = "30", default-features = false } thiserror = { version = "2", default-features = false } serde = { version = "1", features = ["derive"] } smallvec = { version = "1", default-features = false } diff --git a/crates/bevy_winit/Cargo.toml b/crates/bevy_winit/Cargo.toml index c6dc2be22b376..7eaf5ead6ebe1 100644 --- a/crates/bevy_winit/Cargo.toml +++ b/crates/bevy_winit/Cargo.toml @@ -57,7 +57,7 @@ bevy_asset = { path = "../bevy_asset", version = "0.20.0-dev", optional = true } ## used by custom_cursor bevy_image = { path = "../bevy_image", version = "0.20.0-dev", optional = true } ## used by custom_cursor -wgpu-types = { version = "29.0.3", optional = true } +wgpu-types = { version = "30", optional = true } ## used by custom_cursor bytemuck = { version = "1.5", optional = true } diff --git a/examples/3d/occlusion_culling.rs b/examples/3d/occlusion_culling.rs index c9b9fd9cfa2d9..7f39f18071ebe 100644 --- a/examples/3d/occlusion_culling.rs +++ b/examples/3d/occlusion_culling.rs @@ -618,7 +618,7 @@ where { // Cast the raw bytes in the GPU buffer to the appropriate type. - let buffer_view = buffer.slice(..).get_mapped_range(); + let buffer_view = buffer.slice(..).get_mapped_range().unwrap(); let indirect_parameters: &[T] = bytemuck::cast_slice( &buffer_view[0..(buffer_view.len() / size_of::() * size_of::())], ); diff --git a/examples/app/headless_renderer.rs b/examples/app/headless_renderer.rs index 6941f64f243c7..0df4722fbe94d 100644 --- a/examples/app/headless_renderer.rs +++ b/examples/app/headless_renderer.rs @@ -433,7 +433,7 @@ fn receive_image_from_buffer( r.recv().expect("Failed to receive the map_async message"); // This could fail on app exit, if Main world clears resources (including receiver) while Render world still renders - let _ = sender.send(buffer_slice.get_mapped_range().to_vec()); + let _ = sender.send(buffer_slice.get_mapped_range().unwrap().to_vec()); // We need to make sure all `BufferView`'s are dropped before we do what we're about // to do.