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( .request_device(
&wgpu::DeviceDescriptor { &wgpu::DeviceDescriptor {
label: None, 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 { required_limits: wgpu::Limits {
max_push_constant_size: 16, max_push_constant_size: 16,
..wgpu::Limits::default() ..wgpu::Limits::default()

View File

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