use crate::ffi;
use ash::prelude::VkResult;
use std::mem;
use crate::definitions::*;
pub struct VirtualBlock {
internal: ffi::VmaVirtualBlock,
}
#[derive(Debug)]
pub struct VirtualAllocation(ffi::VmaVirtualAllocation);
unsafe impl Send for VirtualAllocation {}
unsafe impl Sync for VirtualAllocation {}
impl VirtualBlock {
pub fn new(create_info: VirtualBlockCreateInfo) -> VkResult<Self> {
unsafe {
let mut internal: ffi::VmaVirtualBlock = mem::zeroed();
let raw_info = ffi::VmaVirtualBlockCreateInfo {
size: create_info.size,
flags: create_info.flags.bits(),
pAllocationCallbacks: create_info
.allocation_callbacks
.map(|a| std::mem::transmute(a))
.unwrap_or(std::ptr::null()),
};
ffi::vmaCreateVirtualBlock(&raw_info, &mut internal).result()?;
Ok(VirtualBlock { internal })
}
}
pub unsafe fn allocate(
&mut self,
allocation_info: VirtualAllocationCreateInfo,
) -> VkResult<(VirtualAllocation, u64)> {
let create_info: ffi::VmaVirtualAllocationCreateInfo = allocation_info.into();
let mut allocation: ffi::VmaVirtualAllocation = std::mem::zeroed();
let mut offset = 0;
ffi::vmaVirtualAllocate(self.internal, &create_info, &mut allocation, &mut offset)
.result()?;
Ok((VirtualAllocation(allocation), offset))
}
pub unsafe fn free(&mut self, allocation: &mut VirtualAllocation) {
ffi::vmaVirtualFree(self.internal, allocation.0);
}
pub unsafe fn clear(&mut self) {
ffi::vmaClearVirtualBlock(self.internal);
}
pub unsafe fn get_allocation_info(
&self,
allocation: &VirtualAllocation,
) -> VkResult<VirtualAllocationInfo> {
let mut allocation_info: ffi::VmaVirtualAllocationInfo = mem::zeroed();
ffi::vmaGetVirtualAllocationInfo(self.internal, allocation.0, &mut allocation_info);
Ok(allocation_info.into())
}
pub unsafe fn set_allocation_user_data(
&self,
allocation: &mut VirtualAllocation,
user_data: *mut ::std::os::raw::c_void,
) {
ffi::vmaSetVirtualAllocationUserData(self.internal, allocation.0, user_data);
}
}
impl Drop for VirtualBlock {
fn drop(&mut self) {
unsafe {
ffi::vmaDestroyVirtualBlock(self.internal);
self.internal = std::ptr::null_mut();
}
}
}