1use crate::ffi;
2use ash::prelude::VkResult;
3use std::mem;
4
5use crate::definitions::*;
6
7pub struct VirtualBlock {
11 internal: ffi::VmaVirtualBlock,
12}
13
14#[derive(Debug)]
16pub struct VirtualAllocation(ffi::VmaVirtualAllocation);
17unsafe impl Send for VirtualAllocation {}
18unsafe impl Sync for VirtualAllocation {}
19
20impl VirtualBlock {
21 pub fn new(create_info: VirtualBlockCreateInfo) -> VkResult<Self> {
23 unsafe {
24 let mut internal: ffi::VmaVirtualBlock = mem::zeroed();
25 let raw_info = ffi::VmaVirtualBlockCreateInfo {
26 size: create_info.size,
27 flags: create_info.flags.bits(),
28 pAllocationCallbacks: create_info
29 .allocation_callbacks
30 .map(|a| std::mem::transmute(a))
31 .unwrap_or(std::ptr::null()),
32 };
33 ffi::vmaCreateVirtualBlock(&raw_info, &mut internal).result()?;
34
35 Ok(VirtualBlock { internal })
36 }
37 }
38
39 pub unsafe fn allocate(
46 &mut self,
47 allocation_info: VirtualAllocationCreateInfo,
48 ) -> VkResult<(VirtualAllocation, u64)> {
49 let create_info: ffi::VmaVirtualAllocationCreateInfo = allocation_info.into();
50 let mut allocation: ffi::VmaVirtualAllocation = std::mem::zeroed();
51 let mut offset = 0;
52 ffi::vmaVirtualAllocate(self.internal, &create_info, &mut allocation, &mut offset)
53 .result()?;
54 Ok((VirtualAllocation(allocation), offset))
55 }
56
57 pub unsafe fn free(&mut self, allocation: &mut VirtualAllocation) {
61 ffi::vmaVirtualFree(self.internal, allocation.0);
62 }
63
64 pub unsafe fn clear(&mut self) {
74 ffi::vmaClearVirtualBlock(self.internal);
75 }
76
77 pub unsafe fn get_allocation_info(
79 &self,
80 allocation: &VirtualAllocation,
81 ) -> VkResult<VirtualAllocationInfo> {
82 let mut allocation_info: ffi::VmaVirtualAllocationInfo = mem::zeroed();
83 ffi::vmaGetVirtualAllocationInfo(self.internal, allocation.0, &mut allocation_info);
84 Ok(allocation_info.into())
85 }
86
87 pub unsafe fn set_allocation_user_data(
89 &self,
90 allocation: &mut VirtualAllocation,
91 user_data: *mut ::std::os::raw::c_void,
92 ) {
93 ffi::vmaSetVirtualAllocationUserData(self.internal, allocation.0, user_data);
94 }
95}
96
97impl Drop for VirtualBlock {
99 fn drop(&mut self) {
100 unsafe {
101 ffi::vmaDestroyVirtualBlock(self.internal);
102 self.internal = std::ptr::null_mut();
103 }
104 }
105}