Include 2x/8x sample counts for Msaa (#7684)

# Objective
Fixes #7295 

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

---

## Changelog
- Added 2x and 8x sample counts for MSAA.
This commit is contained in:
Aceeri 2023-02-17 06:04:01 +00:00
parent 1f6bbc6b7a
commit c5d2d1a5ff
3 changed files with 44 additions and 29 deletions

View file

@ -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
/// ```
@ -84,8 +82,10 @@ impl Plugin for ViewPlugin {
#[reflect(Resource)]
pub enum Msaa {
Off = 1,
Sample2 = 2,
#[default]
Sample4 = 4,
Sample8 = 8,
}
impl Msaa {

View file

@ -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

View file

@ -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::*;
@ -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
@ -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;
}
}