vulkanalia-vma 0.9.0

An integration of Vulkan Memory Allocator with vulkanalia.
Documentation
// SPDX-License-Identifier: Apache-2.0

use core::mem;

use vulkanalia::ResultExt;
use vulkanalia::prelude::v1_0::*;

use crate::flags::{VirtualAllocationCreateFlags, VirtualBlockCreateFlags};
use crate::vma::*;

#[derive(Copy, Clone, Debug)]
pub struct VirtualBlockOptions {
    pub size: vk::DeviceSize,
    pub flags: VirtualBlockCreateFlags,
}

#[repr(transparent)]
#[derive(Debug)]
pub struct VirtualBlock(pub(crate) VmaVirtualBlock);

impl VirtualBlock {
    pub fn new(options: &VirtualBlockOptions) -> VkResult<Self> {
        let info = VmaVirtualBlockCreateInfo {
            size: options.size,
            flags: options.flags.bits(),
            pAllocationCallbacks: core::ptr::null(),
        };

        unsafe {
            let mut block: VmaVirtualBlock = mem::zeroed();
            vmaCreateVirtualBlock(&info, &mut block).result()?;
            Ok(Self(block))
        }
    }

    pub fn allocate(
        &self,
        options: &VirtualAllocationOptions,
    ) -> VkResult<(VirtualAllocation, vk::DeviceSize)> {
        let info = VmaVirtualAllocationCreateInfo {
            size: options.size,
            alignment: options.alignment,
            flags: options.flags.bits(),
            pUserData: core::ptr::null_mut(),
        };

        unsafe {
            let mut allocation: VmaVirtualAllocation = mem::zeroed();
            let mut offset = 0;
            vmaVirtualAllocate(self.0, &info, &mut allocation, &mut offset).result()?;
            Ok((VirtualAllocation(allocation), offset))
        }
    }

    pub fn free(&self, allocation: VirtualAllocation) {
        unsafe { vmaVirtualFree(self.0, allocation.0) };
    }

    pub fn clear(&self) {
        unsafe { vmaClearVirtualBlock(self.0) };
    }

    pub fn get_allocation_info(&self, allocation: VirtualAllocation) -> VmaVirtualAllocationInfo {
        unsafe {
            let mut info: VmaVirtualAllocationInfo = mem::zeroed();
            vmaGetVirtualAllocationInfo(self.0, allocation.0, &mut info);
            info
        }
    }
}

impl Drop for VirtualBlock {
    fn drop(&mut self) {
        unsafe { vmaDestroyVirtualBlock(self.0) };
        self.0 = core::ptr::null_mut();
    }
}

unsafe impl Send for VirtualBlock {}
unsafe impl Sync for VirtualBlock {}

#[derive(Copy, Clone, Debug)]
pub struct VirtualAllocationOptions {
    pub size: vk::DeviceSize,
    pub alignment: vk::DeviceSize,
    pub flags: VirtualAllocationCreateFlags,
}

#[repr(transparent)]
#[derive(Debug)]
pub struct VirtualAllocation(pub(crate) VmaVirtualAllocation);

unsafe impl Send for VirtualAllocation {}
unsafe impl Sync for VirtualAllocation {}