Changed Msaa to Enum (#7292)

# Objective

Fixes #6931 

Continues #6954 by squashing `Msaa` to a flat enum

Helps out  #7215 

# Solution
```
pub enum Msaa {
    Off = 1,
    #[default]
    Sample4 = 4,
}
```

# Changelog

- Modified
    - `Msaa` is now enum
    - Defaults to 4 samples
    - Uses `.samples()` method to get the sample number as `u32`

# Migration Guide
```
let multi = Msaa { samples: 4 } 
// is now
let multi = Msaa::Sample4

multi.samples
// is now
multi.samples()
```



Co-authored-by: Sjael <jakeobrien44@gmail.com>
This commit is contained in:
Sjael 2023-01-20 14:25:21 +00:00
parent 5d5a504685
commit 06ada2e93d
13 changed files with 52 additions and 44 deletions

View File

@ -303,7 +303,7 @@ pub fn prepare_core_3d_depth_textures(
label: Some("view_depth_texture"), label: Some("view_depth_texture"),
size, size,
mip_level_count: 1, mip_level_count: 1,
sample_count: msaa.samples, sample_count: msaa.samples(),
dimension: TextureDimension::D2, dimension: TextureDimension::D2,
// PERF: vulkan docs recommend using 24 bit depth for better performance // PERF: vulkan docs recommend using 24 bit depth for better performance
format: TextureFormat::Depth32Float, format: TextureFormat::Depth32Float,

View File

@ -391,8 +391,8 @@ pub fn queue_material_meshes<M: Material>(
let draw_alpha_mask_pbr = alpha_mask_draw_functions.read().id::<DrawMaterial<M>>(); let draw_alpha_mask_pbr = alpha_mask_draw_functions.read().id::<DrawMaterial<M>>();
let draw_transparent_pbr = transparent_draw_functions.read().id::<DrawMaterial<M>>(); let draw_transparent_pbr = transparent_draw_functions.read().id::<DrawMaterial<M>>();
let mut view_key = let mut view_key = MeshPipelineKey::from_msaa_samples(msaa.samples())
MeshPipelineKey::from_msaa_samples(msaa.samples) | MeshPipelineKey::from_hdr(view.hdr); | MeshPipelineKey::from_hdr(view.hdr);
if let Some(Tonemapping::Enabled { deband_dither }) = tonemapping { if let Some(Tonemapping::Enabled { deband_dither }) = tonemapping {
if !view.hdr { if !view.hdr {

View File

@ -395,7 +395,7 @@ pub fn prepare_prepass_textures(
label: Some("prepass_depth_texture"), label: Some("prepass_depth_texture"),
size, size,
mip_level_count: 1, mip_level_count: 1,
sample_count: msaa.samples, sample_count: msaa.samples(),
dimension: TextureDimension::D2, dimension: TextureDimension::D2,
format: DEPTH_PREPASS_FORMAT, format: DEPTH_PREPASS_FORMAT,
usage: TextureUsages::COPY_DST usage: TextureUsages::COPY_DST
@ -417,7 +417,7 @@ pub fn prepare_prepass_textures(
label: Some("prepass_normal_texture"), label: Some("prepass_normal_texture"),
size, size,
mip_level_count: 1, mip_level_count: 1,
sample_count: msaa.samples, sample_count: msaa.samples(),
dimension: TextureDimension::D2, dimension: TextureDimension::D2,
format: NORMAL_PREPASS_FORMAT, format: NORMAL_PREPASS_FORMAT,
usage: TextureUsages::RENDER_ATTACHMENT usage: TextureUsages::RENDER_ATTACHMENT
@ -499,7 +499,7 @@ pub fn queue_prepass_material_meshes<M: Material>(
normal_prepass, normal_prepass,
) in &mut views ) 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() { if depth_prepass.is_some() {
view_key |= MeshPipelineKey::DEPTH_PREPASS; view_key |= MeshPipelineKey::DEPTH_PREPASS;
} }

View File

@ -877,7 +877,7 @@ pub fn queue_mesh_view_bind_groups(
globals_buffer.buffer.binding(), globals_buffer.buffer.binding(),
) { ) {
for (entity, view_shadow_bindings, view_cluster_bindings, prepass_textures) in &views { 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 &mesh_pipeline.view_layout_multisampled
} else { } else {
&mesh_pipeline.view_layout &mesh_pipeline.view_layout
@ -937,7 +937,7 @@ pub fn queue_mesh_view_bind_groups(
Some(texture) => &texture.default_view, Some(texture) => &texture.default_view,
None => { None => {
&fallback_depths &fallback_depths
.image_for_samplecount(msaa.samples) .image_for_samplecount(msaa.samples())
.texture_view .texture_view
} }
}; };
@ -950,7 +950,7 @@ pub fn queue_mesh_view_bind_groups(
Some(texture) => &texture.default_view, Some(texture) => &texture.default_view,
None => { None => {
&fallback_images &fallback_images
.image_for_samplecount(msaa.samples) .image_for_samplecount(msaa.samples())
.texture_view .texture_view
} }
}; };

View File

@ -117,7 +117,7 @@ fn queue_wireframes(
mut views: Query<(&ExtractedView, &VisibleEntities, &mut RenderPhase<Opaque3d>)>, mut views: Query<(&ExtractedView, &VisibleEntities, &mut RenderPhase<Opaque3d>)>,
) { ) {
let draw_custom = opaque_3d_draw_functions.read().id::<DrawWireframes>(); let draw_custom = opaque_3d_draw_functions.read().id::<DrawWireframes>();
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 { for (view, visible_entities, mut opaque_phase) in &mut views {
let rangefinder = view.rangefinder3d(); let rangefinder = view.rangefinder3d();

View File

@ -56,30 +56,34 @@ impl Plugin for ViewPlugin {
/// Configuration resource for [Multi-Sample Anti-Aliasing](https://en.wikipedia.org/wiki/Multisample_anti-aliasing). /// 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: <https://github.com/gfx-rs/wgpu/issues/1832>
///
/// # Example /// # Example
/// ``` /// ```
/// # use bevy_app::prelude::App; /// # use bevy_app::prelude::App;
/// # use bevy_render::prelude::Msaa; /// # use bevy_render::prelude::Msaa;
/// App::new() /// App::new()
/// .insert_resource(Msaa { samples: 4 }) /// .insert_resource(Msaa::default())
/// .run(); /// .run();
/// ``` /// ```
#[derive(Resource, Clone, ExtractResource, Reflect)] #[derive(Resource, Default, Clone, Copy, ExtractResource, Reflect, PartialEq, PartialOrd)]
#[reflect(Resource)] #[reflect(Resource)]
pub struct Msaa { pub enum Msaa {
/// The number of samples to run for Multi-Sample Anti-Aliasing. Higher numbers result in Off = 1,
/// smoother edges. #[default]
/// Defaults to 4. Sample4 = 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: <https://github.com/gfx-rs/wgpu/issues/1832>
pub samples: u32,
} }
impl Default for Msaa { impl Msaa {
fn default() -> Self { #[inline]
Self { samples: 4 } pub fn samples(&self) -> u32 {
*self as u32
} }
} }
@ -334,7 +338,7 @@ fn prepare_view_targets(
}, },
) )
.default_view, .default_view,
sampled: (msaa.samples > 1).then(|| { sampled: (msaa.samples() > 1).then(|| {
texture_cache texture_cache
.get( .get(
&render_device, &render_device,
@ -342,7 +346,7 @@ fn prepare_view_targets(
label: Some("main_texture_sampled"), label: Some("main_texture_sampled"),
size, size,
mip_level_count: 1, mip_level_count: 1,
sample_count: msaa.samples, sample_count: msaa.samples(),
dimension: TextureDimension::D2, dimension: TextureDimension::D2,
format: main_texture_format, format: main_texture_format,
usage: TextureUsages::RENDER_ATTACHMENT, usage: TextureUsages::RENDER_ATTACHMENT,

View File

@ -340,7 +340,7 @@ pub fn queue_material2d_meshes<M: Material2d>(
for (view, visible_entities, tonemapping, mut transparent_phase) in &mut views { for (view, visible_entities, tonemapping, mut transparent_phase) in &mut views {
let draw_transparent_pbr = transparent_draw_functions.read().id::<DrawMaterial2d<M>>(); let draw_transparent_pbr = transparent_draw_functions.read().id::<DrawMaterial2d<M>>();
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); | Mesh2dPipelineKey::from_hdr(view.hdr);
if let Some(Tonemapping::Enabled { deband_dither }) = tonemapping { if let Some(Tonemapping::Enabled { deband_dither }) = tonemapping {

View File

@ -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() { if let Some(view_binding) = view_uniforms.uniforms.binding() {
let sprite_meta = &mut sprite_meta; let sprite_meta = &mut sprite_meta;

View File

@ -329,7 +329,7 @@ pub fn queue_colored_mesh2d(
for (visible_entities, mut transparent_phase, view) in &mut views { for (visible_entities, mut transparent_phase, view) in &mut views {
let draw_colored_mesh2d = transparent_draw_functions.read().id::<DrawColoredMesh2d>(); let draw_colored_mesh2d = transparent_draw_functions.read().id::<DrawColoredMesh2d>();
let mesh_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples) let mesh_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples())
| Mesh2dPipelineKey::from_hdr(view.hdr); | Mesh2dPipelineKey::from_hdr(view.hdr);
// Queue all entities visible to that view // Queue all entities visible to that view

View File

@ -13,8 +13,8 @@ use bevy::{
fn main() { fn main() {
App::new() App::new()
// Disable MSAA be default // Disable MSAA by default
.insert_resource(Msaa { samples: 1 }) .insert_resource(Msaa::Off)
.add_plugins(DefaultPlugins) .add_plugins(DefaultPlugins)
.add_startup_system(setup) .add_startup_system(setup)
.add_system(toggle_fxaa) .add_system(toggle_fxaa)
@ -118,19 +118,20 @@ fn toggle_fxaa(keys: Res<Input<KeyCode>>, mut query: Query<&mut Fxaa>, mut msaa:
let fxaa_ultra = keys.just_pressed(KeyCode::Key9); let fxaa_ultra = keys.just_pressed(KeyCode::Key9);
let fxaa_extreme = keys.just_pressed(KeyCode::Key0); let fxaa_extreme = keys.just_pressed(KeyCode::Key0);
let set_fxaa = set_fxaa | fxaa_low | fxaa_med | fxaa_high | fxaa_ultra | fxaa_extreme; let set_fxaa = set_fxaa | fxaa_low | fxaa_med | fxaa_high | fxaa_ultra | fxaa_extreme;
for mut fxaa in &mut query { for mut fxaa in &mut query {
if set_msaa { if set_msaa {
fxaa.enabled = false; fxaa.enabled = false;
msaa.samples = 4; *msaa = Msaa::Sample4;
info!("MSAA 4x"); info!("MSAA 4x");
} }
if set_no_aa { if set_no_aa {
fxaa.enabled = false; fxaa.enabled = false;
msaa.samples = 1; *msaa = Msaa::Off;
info!("NO AA"); info!("NO AA");
} }
if set_no_aa | set_fxaa { if set_no_aa | set_fxaa {
msaa.samples = 1; *msaa = Msaa::Off;
} }
if fxaa_low { if fxaa_low {
fxaa.edge_threshold = Sensitivity::Low; fxaa.edge_threshold = Sensitivity::Low;
@ -150,7 +151,7 @@ fn toggle_fxaa(keys: Res<Input<KeyCode>>, mut query: Query<&mut Fxaa>, mut msaa:
} }
if set_fxaa { if set_fxaa {
fxaa.enabled = true; fxaa.enabled = true;
msaa.samples = 1; *msaa = Msaa::Off;
info!("FXAA {}", fxaa.edge_threshold.get_str()); info!("FXAA {}", fxaa.edge_threshold.get_str());
} }
} }

View File

@ -10,7 +10,7 @@ use bevy::prelude::*;
fn main() { fn main() {
App::new() App::new()
.insert_resource(Msaa { samples: 4 }) .insert_resource(Msaa::default())
.add_plugins(DefaultPlugins) .add_plugins(DefaultPlugins)
.add_startup_system(setup) .add_startup_system(setup)
.add_system(cycle_msaa) .add_system(cycle_msaa)
@ -46,12 +46,15 @@ fn setup(
fn cycle_msaa(input: Res<Input<KeyCode>>, mut msaa: ResMut<Msaa>) { fn cycle_msaa(input: Res<Input<KeyCode>>, mut msaa: ResMut<Msaa>) {
if input.just_pressed(KeyCode::M) { if input.just_pressed(KeyCode::M) {
if msaa.samples == 4 { match *msaa {
Msaa::Sample4 => {
info!("Not using MSAA"); info!("Not using MSAA");
msaa.samples = 1; *msaa = Msaa::Off;
} else { }
Msaa::Off => {
info!("Using 4x MSAA"); info!("Using 4x MSAA");
msaa.samples = 4; *msaa = Msaa::Sample4;
}
} }
} }
} }

View File

@ -6,7 +6,7 @@ use bevy::prelude::*;
fn main() { fn main() {
App::new() App::new()
.insert_resource(Msaa { samples: 4 }) .insert_resource(Msaa::default())
.add_plugins(DefaultPlugins) .add_plugins(DefaultPlugins)
.add_startup_system(setup) .add_startup_system(setup)
.add_system(fade_transparency) .add_system(fade_transparency)

View File

@ -111,7 +111,7 @@ fn queue_custom(
) { ) {
let draw_custom = transparent_3d_draw_functions.read().id::<DrawCustom>(); let draw_custom = transparent_3d_draw_functions.read().id::<DrawCustom>();
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 { for (view, mut transparent_phase) in &mut views {
let view_key = msaa_key | MeshPipelineKey::from_hdr(view.hdr); let view_key = msaa_key | MeshPipelineKey::from_hdr(view.hdr);