diff --git a/src/bin/wireframe/main.rs b/src/bin/wireframe/main.rs index 8a8136b..197fd41 100644 --- a/src/bin/wireframe/main.rs +++ b/src/bin/wireframe/main.rs @@ -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() diff --git a/src/bin/wireframe/viewport.rs b/src/bin/wireframe/viewport.rs index 6968322..99c6fbc 100644 --- a/src/bin/wireframe/viewport.rs +++ b/src/bin/wireframe/viewport.rs @@ -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,