mew/
sampler.rs

1#[macro_export]
2macro_rules! sampler {
3    { $struct:ident as $filtering:ident } => {
4        $crate::sampler! { $struct as $filtering {} }
5    };
6    { $struct:ident as $filtering:ident {
7        $( $field:ident : $value:expr ),* $(,)?
8    } } => {
9        pub struct $struct {
10            sampler: $crate::wgpu::Sampler,
11        }
12
13        impl ::std::ops::Deref for $struct {
14            type Target = $crate::wgpu::Sampler;
15            fn deref(&self) -> &Self::Target {
16                &self.sampler
17            }
18        }
19
20        impl $crate::MewSampler for $struct {
21            fn new(sampler: $crate::wgpu::Sampler) -> Self {
22                Self {
23                    sampler,
24                }
25            }
26
27            fn binding_type() -> $crate::wgpu::BindingType {
28                $crate::wgpu::BindingType::Sampler(
29                    $crate::wgpu::SamplerBindingType::$filtering
30                )
31            }
32
33            fn buffer_desc() -> $crate::wgpu::SamplerDescriptor<'static> {
34                use $crate::wgpu::{
35                    AddressMode::*,
36                    FilterMode::*,
37                    CompareFunction::*,
38                    SamplerBorderColor::*,
39                };
40                $crate::wgpu::SamplerDescriptor {
41                    label: Some(concat!(stringify!($struct), " Sampler")),
42                    $( $field : $value, )*
43                    ..Default::default()
44                }
45            }
46
47            fn as_binding<'a>(&'a self) -> $crate::wgpu::BindingResource<'a> {
48                $crate::wgpu::BindingResource::Sampler(&self.sampler)
49            }
50        }
51    }
52}
53
54
55pub trait MewSampler {
56    fn new(buffer: wgpu::Sampler) -> Self;
57    fn binding_type() -> wgpu::BindingType;
58    fn buffer_desc() -> wgpu::SamplerDescriptor<'static>;
59    fn as_binding<'a>(&'a self) -> wgpu::BindingResource<'a>;
60}