#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum SamplerPreset {
Nearest,
Linear,
Anisotropic,
Comparison,
}
#[must_use]
pub fn create_sampler(device: &wgpu::Device, preset: SamplerPreset) -> wgpu::Sampler {
match preset {
SamplerPreset::Nearest => device.create_sampler(&wgpu::SamplerDescriptor {
label: Some("sampler_nearest"),
address_mode_u: wgpu::AddressMode::ClampToEdge,
address_mode_v: wgpu::AddressMode::ClampToEdge,
address_mode_w: wgpu::AddressMode::ClampToEdge,
mag_filter: wgpu::FilterMode::Nearest,
min_filter: wgpu::FilterMode::Nearest,
mipmap_filter: wgpu::MipmapFilterMode::Nearest,
..Default::default()
}),
SamplerPreset::Linear => device.create_sampler(&wgpu::SamplerDescriptor {
label: Some("sampler_linear"),
address_mode_u: wgpu::AddressMode::ClampToEdge,
address_mode_v: wgpu::AddressMode::ClampToEdge,
address_mode_w: wgpu::AddressMode::ClampToEdge,
mag_filter: wgpu::FilterMode::Linear,
min_filter: wgpu::FilterMode::Linear,
mipmap_filter: wgpu::MipmapFilterMode::Linear,
..Default::default()
}),
SamplerPreset::Anisotropic => device.create_sampler(&wgpu::SamplerDescriptor {
label: Some("sampler_anisotropic"),
address_mode_u: wgpu::AddressMode::ClampToEdge,
address_mode_v: wgpu::AddressMode::ClampToEdge,
address_mode_w: wgpu::AddressMode::ClampToEdge,
mag_filter: wgpu::FilterMode::Linear,
min_filter: wgpu::FilterMode::Linear,
mipmap_filter: wgpu::MipmapFilterMode::Linear,
anisotropy_clamp: 16,
..Default::default()
}),
SamplerPreset::Comparison => device.create_sampler(&wgpu::SamplerDescriptor {
label: Some("sampler_comparison"),
address_mode_u: wgpu::AddressMode::ClampToEdge,
address_mode_v: wgpu::AddressMode::ClampToEdge,
address_mode_w: wgpu::AddressMode::ClampToEdge,
mag_filter: wgpu::FilterMode::Linear,
min_filter: wgpu::FilterMode::Linear,
mipmap_filter: wgpu::MipmapFilterMode::Nearest,
compare: Some(wgpu::CompareFunction::LessEqual),
..Default::default()
}),
}
}
#[must_use]
pub fn create_sampler_custom(
device: &wgpu::Device,
desc: &wgpu::SamplerDescriptor<'_>,
) -> wgpu::Sampler {
device.create_sampler(desc)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sampler_preset_variants() {
let presets = [
SamplerPreset::Nearest,
SamplerPreset::Linear,
SamplerPreset::Anisotropic,
SamplerPreset::Comparison,
];
assert_eq!(presets.len(), 4);
}
#[test]
fn sampler_preset_equality() {
assert_eq!(SamplerPreset::Nearest, SamplerPreset::Nearest);
assert_ne!(SamplerPreset::Nearest, SamplerPreset::Linear);
}
#[test]
fn sampler_preset_debug() {
let s = format!("{:?}", SamplerPreset::Comparison);
assert_eq!(s, "Comparison");
}
fn try_gpu() -> Option<wgpu::Device> {
let ctx = pollster::block_on(crate::context::GpuContext::new()).ok()?;
Some(ctx.device)
}
#[test]
fn gpu_create_all_presets() {
let Some(device) = try_gpu() else { return };
let _nearest = create_sampler(&device, SamplerPreset::Nearest);
let _linear = create_sampler(&device, SamplerPreset::Linear);
let _aniso = create_sampler(&device, SamplerPreset::Anisotropic);
let _comp = create_sampler(&device, SamplerPreset::Comparison);
}
#[test]
fn gpu_create_custom_sampler() {
let Some(device) = try_gpu() else { return };
let _sampler = create_sampler_custom(
&device,
&wgpu::SamplerDescriptor {
label: Some("custom"),
address_mode_u: wgpu::AddressMode::Repeat,
..Default::default()
},
);
}
}