rotex_vulkan/backend/vulkan/
buffer.rs1use 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}