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
39
40
41
42
43
44
45
46
47
48
49
50
51
mod region;
mod suballocator;
use super::{Allocation, DeviceAllocator};
use self::region::Region;
use anyhow::Result;
use ash::vk;
#[derive(Debug)]
pub struct Suballocator {
block: Allocation,
free_regions: Vec<Region>,
}
impl DeviceAllocator for Suballocator {
unsafe fn allocate(
&mut self,
memory_allocate_info: vk::MemoryAllocateInfo,
) -> Result<Allocation> {
use anyhow::Context;
if self.block.memory_type_index
!= memory_allocate_info.memory_type_index
{
anyhow::bail!("Attempted to allocate incompatible memory!");
}
let region = self
.allocate_region(memory_allocate_info.allocation_size)
.with_context(|| {
"not enough memory for an allocation of the requested size"
})?;
Ok(Allocation {
memory_type_index: self.block.memory_type_index,
memory: self.block.memory,
offset: region.offset + self.block.offset,
byte_size: region.size,
})
}
unsafe fn free(&mut self, allocation: &Allocation) -> Result<()> {
self.free_region(Region::new(
allocation.offset - self.block.offset,
allocation.byte_size,
))
}
}