Skip to content

Commit

Permalink
Include 2x/8x sample counts for Msaa (bevyengine#7684)
Browse files Browse the repository at this point in the history
# Objective
Fixes bevyengine#7295 

Should we maybe default to 4x if 2x/8x is selected but not supported?

---

## Changelog
- Added 2x and 8x sample counts for MSAA.
  • Loading branch information
Aceeri authored and myreprise1 committed Feb 18, 2023
1 parent b1e47f0 commit d89849c
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 29 deletions.
8 changes: 4 additions & 4 deletions crates/bevy_render/src/view/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,9 @@ impl Plugin for ViewPlugin {
///
/// The number of samples to run for Multi-Sample Anti-Aliasing. Higher numbers result in
/// smoother edges.
/// Defaults to 4.
/// Defaults to 4 samples.
///
/// 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>
/// Note that web currently only supports 1 or 4 samples.
///
/// # Example
/// ```
Expand All @@ -84,8 +82,10 @@ impl Plugin for ViewPlugin {
#[reflect(Resource)]
pub enum Msaa {
Off = 1,
Sample2 = 2,
#[default]
Sample4 = 4,
Sample8 = 8,
}

impl Msaa {
Expand Down
30 changes: 20 additions & 10 deletions crates/bevy_render/src/view/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -237,16 +237,26 @@ pub fn prepare_windows(
let sample_flags = render_adapter
.get_texture_format_features(surface_configuration.format)
.flags;
match *msaa {
Msaa::Off => (),
Msaa::Sample4 => {
if !sample_flags.contains(wgpu::TextureFormatFeatureFlags::MULTISAMPLE_X4) {
bevy_log::warn!(
"MSAA 4x is not supported on this device. Falling back to disabling MSAA."
);
*msaa = Msaa::Off;
}
}

if !sample_flags.sample_count_supported(msaa.samples()) {
let fallback = if sample_flags.sample_count_supported(Msaa::default().samples()) {
Msaa::default()
} else {
Msaa::Off
};

let fallback_str = if fallback == Msaa::Off {
"disabling MSAA".to_owned()
} else {
format!("MSAA {}x", fallback.samples())
};

bevy_log::warn!(
"MSAA {}x is not supported on this device. Falling back to {}.",
msaa.samples(),
fallback_str,
);
*msaa = fallback;
}

// A recurring issue is hitting `wgpu::SurfaceError::Timeout` on certain Linux
Expand Down
35 changes: 20 additions & 15 deletions examples/3d/msaa.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@
//! will result in smoother edges, but it will also increase the cost to render those edges. The
//! range should generally be somewhere between 1 (no multi sampling, but cheap) to 8 (crisp but
//! expensive).
//! 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](https://github.com/gfx-rs/wgpu/issues/1832) for more info.
//! Note that web currently only supports 1 or 4 samples.

use bevy::prelude::*;

Expand All @@ -23,7 +21,7 @@ fn setup(
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
info!("Press 'm' to toggle MSAA");
info!("Press '1/2/4/8' respectively to set MSAA sample count");
info!("Using 4x MSAA");

// cube
Expand All @@ -45,16 +43,23 @@ fn setup(
}

fn cycle_msaa(input: Res<Input<KeyCode>>, mut msaa: ResMut<Msaa>) {
if input.just_pressed(KeyCode::M) {
match *msaa {
Msaa::Sample4 => {
info!("Not using MSAA");
*msaa = Msaa::Off;
}
Msaa::Off => {
info!("Using 4x MSAA");
*msaa = Msaa::Sample4;
}
}
if input.just_pressed(KeyCode::Key1) {
info!("Not using MSAA");
*msaa = Msaa::Off;
}

if input.just_pressed(KeyCode::Key2) {
info!("Using 2x MSAA");
*msaa = Msaa::Sample2;
}

if input.just_pressed(KeyCode::Key4) {
info!("Using 4x MSAA");
*msaa = Msaa::Sample4;
}

if input.just_pressed(KeyCode::Key8) {
info!("Using 8x MSAA");
*msaa = Msaa::Sample8;
}
}

0 comments on commit d89849c

Please sign in to comment.