1#[macro_export]
22macro_rules! buffer {
23 { @buffertype STORAGE } => {
24 $crate::wgpu::BufferBindingType::Storage { read_only: true, }
25 };
26 { @buffertype UNIFORM } => {
27 $crate::wgpu::BufferBindingType::Uniform
28 };
29
30 { $struct:ident as $( $usage:ident )|+ } => {
31 $crate::buffer! { $struct <u8> as $( $usage )|+ }
32 };
33 { $struct:ident < $inner:ty > as $storageuniform:ident $( | $usage:ident )* } => {
34 #[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
35 pub struct $struct {
36 buffer: $crate::wgpu::Buffer,
37 }
38
39 impl ::std::ops::Deref for $struct {
40 type Target = $crate::wgpu::Buffer;
41 fn deref(&self) -> &Self::Target {
42 &self.buffer
43 }
44 }
45
46 impl $crate::buffer::MewBuffer for $struct {
47 type Inner = $inner;
48
49 fn new(buffer: $crate::wgpu::Buffer) -> Self {
50 Self {
51 buffer,
52 }
53 }
54
55 fn binding_type() -> $crate::wgpu::BindingType {
56 $crate::wgpu::BindingType::Buffer {
57 ty: $crate::buffer! { @buffertype $storageuniform },
58 has_dynamic_offset: false,
59 min_binding_size: None,
60 }
61 }
62
63 fn buffer_desc(inner_size: u64) -> $crate::wgpu::BufferDescriptor<'static> {
64 $crate::wgpu::BufferDescriptor {
65 label: Some(concat!(stringify!($struct), "<", stringify!($inner), "> Buffer")),
66 size: inner_size * ::std::mem::size_of::<Self::Inner>() as u64,
67 usage: $crate::wgpu::BufferUsages::$storageuniform $( | $crate::wgpu::BufferUsages::$usage )*,
68 mapped_at_creation: false,
69 }
70 }
71
72 fn as_binding<'a>(&'a self) -> $crate::wgpu::BindingResource<'a> {
73 self.buffer.as_entire_binding()
74 }
75 }
76 }
77}
78pub use buffer;
79
80
81pub trait MewBuffer {
84 type Inner;
85
86 fn new(buffer: wgpu::Buffer) -> Self;
88 fn binding_type() -> wgpu::BindingType;
90 fn buffer_desc(inner_size: u64) -> wgpu::BufferDescriptor<'static>;
92 fn as_binding<'a>(&'a self) -> wgpu::BindingResource<'a>;
94}