1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use crate::error::{Error, Result};
use volcanic::loader::CmdsDevice;
use volcanic::*;
macro_rules! commands {
($($field:ident: $pfn:ident = $name:ident,)*) => {
/// The device commands the allocator calls, resolved once so hot paths skip `Option` checks.
#[derive(Clone, Copy)]
pub(crate) struct DeviceFns {
$(pub $field: $pfn,)*
}
impl DeviceFns {
pub fn load(cmds: &CmdsDevice) -> Result<Self> {
Ok(Self {
$($field: cmds.$name.ok_or(Error::MissingCommand(stringify!($name)))?,)*
})
}
}
};
}
commands! {
allocate_memory: PFN_vkAllocateMemory = vkAllocateMemory,
free_memory: PFN_vkFreeMemory = vkFreeMemory,
map_memory: PFN_vkMapMemory = vkMapMemory,
flush_mapped_memory_ranges: PFN_vkFlushMappedMemoryRanges = vkFlushMappedMemoryRanges,
invalidate_mapped_memory_ranges: PFN_vkInvalidateMappedMemoryRanges = vkInvalidateMappedMemoryRanges,
create_buffer: PFN_vkCreateBuffer = vkCreateBuffer,
destroy_buffer: PFN_vkDestroyBuffer = vkDestroyBuffer,
bind_buffer_memory: PFN_vkBindBufferMemory = vkBindBufferMemory,
get_buffer_memory_requirements2: PFN_vkGetBufferMemoryRequirements2 = vkGetBufferMemoryRequirements2,
get_buffer_device_address: PFN_vkGetBufferDeviceAddress = vkGetBufferDeviceAddress,
create_image: PFN_vkCreateImage = vkCreateImage,
destroy_image: PFN_vkDestroyImage = vkDestroyImage,
bind_image_memory: PFN_vkBindImageMemory = vkBindImageMemory,
get_image_memory_requirements2: PFN_vkGetImageMemoryRequirements2 = vkGetImageMemoryRequirements2,
}