Use best multisampling available

This commit is contained in:
numzero 2024-09-26 20:08:59 +03:00
parent bf38462c78
commit eb1bbee3eb
2 changed files with 22 additions and 8 deletions

View File

@ -151,7 +151,8 @@ impl<'a> State<'a> {
.request_device(
&wgpu::DeviceDescriptor {
label: None,
required_features: wgpu::Features::PUSH_CONSTANTS,
required_features: wgpu::Features::PUSH_CONSTANTS
| wgpu::Features::TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES,
required_limits: wgpu::Limits {
max_push_constant_size: 16,
..wgpu::Limits::default()

View File

@ -3,6 +3,7 @@ use glam::{uvec2, UVec2};
pub struct Viewport<'a> {
surface: wgpu::Surface<'a>,
config: wgpu::SurfaceConfiguration,
sample_count: u32,
multisample: Multisample,
}
@ -15,6 +16,14 @@ impl<'a> Viewport<'a> {
) -> Self {
let caps = surface.get_capabilities(adapter);
let format = wgpu::TextureFormat::Bgra8Unorm;
let sample_count = adapter
.get_texture_format_features(format)
.flags
.supported_sample_counts()
.into_iter()
.max()
.unwrap();
eprintln!("Using x{sample_count} mutlisampling");
let config = wgpu::SurfaceConfiguration {
usage: wgpu::TextureUsages::RENDER_ATTACHMENT,
format,
@ -25,17 +34,18 @@ impl<'a> Viewport<'a> {
view_formats: vec![],
desired_maximum_frame_latency: 2,
};
let multisample = Multisample::new(device, format, size);
let multisample = Multisample::new(device, format, size, sample_count);
Self {
surface,
config,
sample_count,
multisample,
}
}
pub fn configure(&mut self, device: &wgpu::Device) {
self.surface.configure(&device, &self.config);
self.multisample = Multisample::new(device, self.format(), self.size());
self.multisample = Multisample::new(device, self.format(), self.size(), self.sample_count);
}
pub fn resize(&mut self, device: &wgpu::Device, size: UVec2) {
@ -53,7 +63,7 @@ impl<'a> Viewport<'a> {
}
pub fn sample_count(&self) -> u32 {
Multisample::SAMPLE_COUNT
self.sample_count
}
pub fn render_single_pass(
@ -100,9 +110,12 @@ struct Multisample {
}
impl Multisample {
const SAMPLE_COUNT: u32 = 4;
fn new(device: &wgpu::Device, format: wgpu::TextureFormat, size: UVec2) -> Multisample {
fn new(
device: &wgpu::Device,
format: wgpu::TextureFormat,
size: UVec2,
sample_count: u32,
) -> Multisample {
let tex = device.create_texture(&wgpu::TextureDescriptor {
label: Some("Multisample texture"),
size: wgpu::Extent3d {
@ -111,7 +124,7 @@ impl Multisample {
depth_or_array_layers: 1,
},
mip_level_count: 1,
sample_count: Self::SAMPLE_COUNT,
sample_count,
dimension: wgpu::TextureDimension::D2,
format,
usage: wgpu::TextureUsages::RENDER_ATTACHMENT,