Skip to main content

rotex_vulkan/backend/vulkan/
buffer.rs

1use ash::vk;
2
3use super::device::Device;
4use crate::core::Instance;
5use crate::error::{Error, ErrorKind};
6
7pub struct RotexBuffer {
8    handle: vk::Buffer,
9    device_memory: vk::DeviceMemory,
10    size: vk::DeviceSize,
11}
12
13impl RotexBuffer {
14    pub fn new(
15        instance: &Instance,
16        device: &Device,
17        size: vk::DeviceSize,
18        usage: vk::BufferUsageFlags,
19        properties: vk::MemoryPropertyFlags,
20    ) -> Result<Self, Error> {
21        let buffer_info = vk::BufferCreateInfo::default()
22            .size(size)
23            .usage(usage)
24            .sharing_mode(vk::SharingMode::EXCLUSIVE);
25
26        let handle = unsafe { device.logical_device().create_buffer(&buffer_info, None) }
27            .map_err(ErrorKind::Vulkan)
28            .map_err(Error::fatal)?;
29
30        let requirements = unsafe { device.logical_device().get_buffer_memory_requirements(handle) };
31        let memory_type =
32            device.find_memory_type(instance, requirements.memory_type_bits, properties)?;
33
34        let alloc_info = vk::MemoryAllocateInfo::default()
35            .allocation_size(requirements.size)
36            .memory_type_index(memory_type);
37
38        let device_memory = unsafe { device.logical_device().allocate_memory(&alloc_info, None) }
39            .map_err(ErrorKind::Vulkan)
40            .map_err(Error::fatal)?;
41
42        unsafe {
43            device
44                .logical_device()
45                .bind_buffer_memory(handle, device_memory, 0)
46        }
47        .map_err(ErrorKind::Vulkan)
48        .map_err(Error::fatal)?;
49
50        Ok(Self {
51            handle,
52            device_memory,
53            size,
54        })
55    }
56
57    pub fn map(&self, device: &Device) -> Result<*mut std::ffi::c_void, Error> {
58        unsafe {
59            device.logical_device().map_memory(
60                self.device_memory,
61                0,
62                self.size,
63                vk::MemoryMapFlags::empty(),
64            )
65        }
66        .map_err(ErrorKind::Vulkan)
67        .map_err(Error::fatal)
68    }
69
70    pub fn unmap(&self, device: &Device) {
71        unsafe { device.logical_device().unmap_memory(self.device_memory) };
72    }
73
74    pub fn handle(&self) -> vk::Buffer {
75        self.handle
76    }
77
78    pub fn size(&self) -> vk::DeviceSize {
79        self.size
80    }
81
82    pub fn destroy(&self, device: &Device) {
83        unsafe {
84            device.logical_device().destroy_buffer(self.handle, None);
85            device
86                .logical_device()
87                .free_memory(self.device_memory, None);
88        }
89    }
90}