diff --git a/crates/bevy_core_pipeline/src/core_3d/mod.rs b/crates/bevy_core_pipeline/src/core_3d/mod.rs index d829f2b929d4d..1da08fc83193c 100644 --- a/crates/bevy_core_pipeline/src/core_3d/mod.rs +++ b/crates/bevy_core_pipeline/src/core_3d/mod.rs @@ -303,7 +303,7 @@ pub fn prepare_core_3d_depth_textures( label: Some("view_depth_texture"), size, mip_level_count: 1, - sample_count: msaa.samples, + sample_count: msaa.samples(), dimension: TextureDimension::D2, // PERF: vulkan docs recommend using 24 bit depth for better performance format: TextureFormat::Depth32Float, diff --git a/crates/bevy_pbr/src/material.rs b/crates/bevy_pbr/src/material.rs index ec6b6680a753d..379058b52adff 100644 --- a/crates/bevy_pbr/src/material.rs +++ b/crates/bevy_pbr/src/material.rs @@ -391,8 +391,8 @@ pub fn queue_material_meshes( let draw_alpha_mask_pbr = alpha_mask_draw_functions.read().id::>(); let draw_transparent_pbr = transparent_draw_functions.read().id::>(); - let mut view_key = - MeshPipelineKey::from_msaa_samples(msaa.samples) | MeshPipelineKey::from_hdr(view.hdr); + let mut view_key = MeshPipelineKey::from_msaa_samples(msaa.samples()) + | MeshPipelineKey::from_hdr(view.hdr); if let Some(Tonemapping::Enabled { deband_dither }) = tonemapping { if !view.hdr { diff --git a/crates/bevy_pbr/src/prepass/mod.rs b/crates/bevy_pbr/src/prepass/mod.rs index 0a368da0ec94c..8c0af74df1c86 100644 --- a/crates/bevy_pbr/src/prepass/mod.rs +++ b/crates/bevy_pbr/src/prepass/mod.rs @@ -395,7 +395,7 @@ pub fn prepare_prepass_textures( label: Some("prepass_depth_texture"), size, mip_level_count: 1, - sample_count: msaa.samples, + sample_count: msaa.samples(), dimension: TextureDimension::D2, format: DEPTH_PREPASS_FORMAT, usage: TextureUsages::COPY_DST @@ -417,7 +417,7 @@ pub fn prepare_prepass_textures( label: Some("prepass_normal_texture"), size, mip_level_count: 1, - sample_count: msaa.samples, + sample_count: msaa.samples(), dimension: TextureDimension::D2, format: NORMAL_PREPASS_FORMAT, usage: TextureUsages::RENDER_ATTACHMENT @@ -499,7 +499,7 @@ pub fn queue_prepass_material_meshes( normal_prepass, ) in &mut views { - let mut view_key = MeshPipelineKey::from_msaa_samples(msaa.samples); + let mut view_key = MeshPipelineKey::from_msaa_samples(msaa.samples()); if depth_prepass.is_some() { view_key |= MeshPipelineKey::DEPTH_PREPASS; } diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index dc4d78876d9e5..bb828137ffa9c 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -877,7 +877,7 @@ pub fn queue_mesh_view_bind_groups( globals_buffer.buffer.binding(), ) { for (entity, view_shadow_bindings, view_cluster_bindings, prepass_textures) in &views { - let layout = if msaa.samples > 1 { + let layout = if msaa.samples() > 1 { &mesh_pipeline.view_layout_multisampled } else { &mesh_pipeline.view_layout @@ -937,7 +937,7 @@ pub fn queue_mesh_view_bind_groups( Some(texture) => &texture.default_view, None => { &fallback_depths - .image_for_samplecount(msaa.samples) + .image_for_samplecount(msaa.samples()) .texture_view } }; @@ -950,7 +950,7 @@ pub fn queue_mesh_view_bind_groups( Some(texture) => &texture.default_view, None => { &fallback_images - .image_for_samplecount(msaa.samples) + .image_for_samplecount(msaa.samples()) .texture_view } }; diff --git a/crates/bevy_pbr/src/wireframe.rs b/crates/bevy_pbr/src/wireframe.rs index 5339043913454..a680a079058ad 100644 --- a/crates/bevy_pbr/src/wireframe.rs +++ b/crates/bevy_pbr/src/wireframe.rs @@ -117,7 +117,7 @@ fn queue_wireframes( mut views: Query<(&ExtractedView, &VisibleEntities, &mut RenderPhase)>, ) { let draw_custom = opaque_3d_draw_functions.read().id::(); - let msaa_key = MeshPipelineKey::from_msaa_samples(msaa.samples); + let msaa_key = MeshPipelineKey::from_msaa_samples(msaa.samples()); for (view, visible_entities, mut opaque_phase) in &mut views { let rangefinder = view.rangefinder3d(); diff --git a/crates/bevy_render/src/view/mod.rs b/crates/bevy_render/src/view/mod.rs index 1caac7c5b26db..92bf7d0eb0f69 100644 --- a/crates/bevy_render/src/view/mod.rs +++ b/crates/bevy_render/src/view/mod.rs @@ -55,30 +55,34 @@ impl Plugin for ViewPlugin { /// Configuration resource for [Multi-Sample Anti-Aliasing](https://en.wikipedia.org/wiki/Multisample_anti-aliasing). /// +/// The number of samples to run for Multi-Sample Anti-Aliasing. Higher numbers result in +/// smoother edges. +/// Defaults to 4. +/// +/// Note that WGPU currently only supports 1 or 4 samples. +/// Ultimately we plan on supporting whatever is natively supported on a given device. +/// Check out this issue for more info: +/// /// # Example /// ``` /// # use bevy_app::prelude::App; /// # use bevy_render::prelude::Msaa; /// App::new() -/// .insert_resource(Msaa { samples: 4 }) +/// .insert_resource(Msaa::default()) /// .run(); /// ``` -#[derive(Resource, Clone, ExtractResource, Reflect)] +#[derive(Resource, Default, Clone, Copy, ExtractResource, Reflect, PartialEq, PartialOrd)] #[reflect(Resource)] -pub struct Msaa { - /// The number of samples to run for Multi-Sample Anti-Aliasing. Higher numbers result in - /// smoother edges. - /// Defaults to 4. - /// - /// Note that WGPU currently only supports 1 or 4 samples. - /// Ultimately we plan on supporting whatever is natively supported on a given device. - /// Check out this issue for more info: - pub samples: u32, +pub enum Msaa { + Off = 1, + #[default] + Sample4 = 4, } -impl Default for Msaa { - fn default() -> Self { - Self { samples: 4 } +impl Msaa { + #[inline] + pub fn samples(&self) -> u32 { + *self as u32 } } @@ -333,7 +337,7 @@ fn prepare_view_targets( }, ) .default_view, - sampled: (msaa.samples > 1).then(|| { + sampled: (msaa.samples() > 1).then(|| { texture_cache .get( &render_device, @@ -341,7 +345,7 @@ fn prepare_view_targets( label: Some("main_texture_sampled"), size, mip_level_count: 1, - sample_count: msaa.samples, + sample_count: msaa.samples(), dimension: TextureDimension::D2, format: main_texture_format, usage: TextureUsages::RENDER_ATTACHMENT, diff --git a/crates/bevy_sprite/src/mesh2d/material.rs b/crates/bevy_sprite/src/mesh2d/material.rs index b636e8b2fb782..c5f0e0fb5d72b 100644 --- a/crates/bevy_sprite/src/mesh2d/material.rs +++ b/crates/bevy_sprite/src/mesh2d/material.rs @@ -340,7 +340,7 @@ pub fn queue_material2d_meshes( for (view, visible_entities, tonemapping, mut transparent_phase) in &mut views { let draw_transparent_pbr = transparent_draw_functions.read().id::>(); - let mut view_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples) + let mut view_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples()) | Mesh2dPipelineKey::from_hdr(view.hdr); if let Some(Tonemapping::Enabled { deband_dither }) = tonemapping { diff --git a/crates/bevy_sprite/src/render/mod.rs b/crates/bevy_sprite/src/render/mod.rs index 95fa7cb3f5800..112c066605bc0 100644 --- a/crates/bevy_sprite/src/render/mod.rs +++ b/crates/bevy_sprite/src/render/mod.rs @@ -474,7 +474,7 @@ pub fn queue_sprites( }; } - let msaa_key = SpritePipelineKey::from_msaa_samples(msaa.samples); + let msaa_key = SpritePipelineKey::from_msaa_samples(msaa.samples()); if let Some(view_binding) = view_uniforms.uniforms.binding() { let sprite_meta = &mut sprite_meta; diff --git a/examples/2d/mesh2d_manual.rs b/examples/2d/mesh2d_manual.rs index 560cffa2568e5..3fff2d26c637f 100644 --- a/examples/2d/mesh2d_manual.rs +++ b/examples/2d/mesh2d_manual.rs @@ -329,7 +329,7 @@ pub fn queue_colored_mesh2d( for (visible_entities, mut transparent_phase, view) in &mut views { let draw_colored_mesh2d = transparent_draw_functions.read().id::(); - let mesh_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples) + let mesh_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples()) | Mesh2dPipelineKey::from_hdr(view.hdr); // Queue all entities visible to that view diff --git a/examples/3d/fxaa.rs b/examples/3d/fxaa.rs index 9a51145badb35..fd1ca6be2e327 100644 --- a/examples/3d/fxaa.rs +++ b/examples/3d/fxaa.rs @@ -13,8 +13,8 @@ use bevy::{ fn main() { App::new() - // Disable MSAA be default - .insert_resource(Msaa { samples: 1 }) + // Disable MSAA by default + .insert_resource(Msaa::Off) .add_plugins(DefaultPlugins) .add_startup_system(setup) .add_system(toggle_fxaa) @@ -118,19 +118,20 @@ fn toggle_fxaa(keys: Res>, mut query: Query<&mut Fxaa>, mut msaa: let fxaa_ultra = keys.just_pressed(KeyCode::Key9); let fxaa_extreme = keys.just_pressed(KeyCode::Key0); let set_fxaa = set_fxaa | fxaa_low | fxaa_med | fxaa_high | fxaa_ultra | fxaa_extreme; + for mut fxaa in &mut query { if set_msaa { fxaa.enabled = false; - msaa.samples = 4; + *msaa = Msaa::Sample4; info!("MSAA 4x"); } if set_no_aa { fxaa.enabled = false; - msaa.samples = 1; + *msaa = Msaa::Off; info!("NO AA"); } if set_no_aa | set_fxaa { - msaa.samples = 1; + *msaa = Msaa::Off; } if fxaa_low { fxaa.edge_threshold = Sensitivity::Low; @@ -150,7 +151,7 @@ fn toggle_fxaa(keys: Res>, mut query: Query<&mut Fxaa>, mut msaa: } if set_fxaa { fxaa.enabled = true; - msaa.samples = 1; + *msaa = Msaa::Off; info!("FXAA {}", fxaa.edge_threshold.get_str()); } } diff --git a/examples/3d/msaa.rs b/examples/3d/msaa.rs index b59c1ba566c6f..1e3da8e8ea919 100644 --- a/examples/3d/msaa.rs +++ b/examples/3d/msaa.rs @@ -10,7 +10,7 @@ use bevy::prelude::*; fn main() { App::new() - .insert_resource(Msaa { samples: 4 }) + .insert_resource(Msaa::default()) .add_plugins(DefaultPlugins) .add_startup_system(setup) .add_system(cycle_msaa) @@ -46,12 +46,15 @@ fn setup( fn cycle_msaa(input: Res>, mut msaa: ResMut) { if input.just_pressed(KeyCode::M) { - if msaa.samples == 4 { - info!("Not using MSAA"); - msaa.samples = 1; - } else { - info!("Using 4x MSAA"); - msaa.samples = 4; + match *msaa { + Msaa::Sample4 => { + info!("Not using MSAA"); + *msaa = Msaa::Off; + } + Msaa::Off => { + info!("Using 4x MSAA"); + *msaa = Msaa::Sample4; + } } } } diff --git a/examples/3d/transparency_3d.rs b/examples/3d/transparency_3d.rs index 437c291589f2d..4ac093c82dbff 100644 --- a/examples/3d/transparency_3d.rs +++ b/examples/3d/transparency_3d.rs @@ -6,7 +6,7 @@ use bevy::prelude::*; fn main() { App::new() - .insert_resource(Msaa { samples: 4 }) + .insert_resource(Msaa::default()) .add_plugins(DefaultPlugins) .add_startup_system(setup) .add_system(fade_transparency) diff --git a/examples/shader/shader_instancing.rs b/examples/shader/shader_instancing.rs index 711f0d2293c8c..6f3a9914fb704 100644 --- a/examples/shader/shader_instancing.rs +++ b/examples/shader/shader_instancing.rs @@ -111,7 +111,7 @@ fn queue_custom( ) { let draw_custom = transparent_3d_draw_functions.read().id::(); - let msaa_key = MeshPipelineKey::from_msaa_samples(msaa.samples); + let msaa_key = MeshPipelineKey::from_msaa_samples(msaa.samples()); for (view, mut transparent_phase) in &mut views { let view_key = msaa_key | MeshPipelineKey::from_hdr(view.hdr);