gpu-allocator 0.9.0

Memory allocator for GPU memory in Vulkan and in the future DirectX 12
Documentation

This crate provides a fully written in Rust memory allocator for Vulkan and DirectX 12.

Setting up the Vulkan memory allocator

# #[cfg(feature = "vulkan")]
# fn main() {
use gpu_allocator::vulkan::*;
# use ash::vk;
# let device = todo!();
# let instance = todo!();
# let physical_device = todo!();

let mut allocator = Allocator::new(&AllocatorCreateDesc {
instance,
device,
physical_device,
debug_settings: Default::default(),
buffer_device_address: true,  // Ideally, check the BufferDeviceAddressFeatures struct.
});
# }
# #[cfg(not(feature = "vulkan"))]
# fn main() {}

Simple Vulkan allocation example

# #[cfg(feature = "vulkan")]
# fn main() {
use gpu_allocator::vulkan::*;
use gpu_allocator::MemoryLocation;
# use ash::vk;
# let device = todo!();
# let instance = todo!();
# let physical_device = todo!();

# let mut allocator = Allocator::new(&AllocatorCreateDesc {
#     instance,
#     device,
#     physical_device,
#     debug_settings: Default::default(),
#     buffer_device_address: true,  // Ideally, check the BufferDeviceAddressFeatures struct.
# }).unwrap();

// Setup vulkan info
let vk_info = vk::BufferCreateInfo::builder()
.size(512)
.usage(vk::BufferUsageFlags::STORAGE_BUFFER);

let buffer = unsafe { device.create_buffer(&vk_info, None) }.unwrap();
let requirements = unsafe { device.get_buffer_memory_requirements(buffer) };

let allocation = allocator
.allocate(&AllocationCreateDesc {
name: "Example allocation",
requirements,
location: MemoryLocation::CpuToGpu,
linear: true, // Buffers are always linear
}).unwrap();

// Bind memory to the buffer
unsafe { device.bind_buffer_memory(buffer, allocation.memory(), allocation.offset()).unwrap() };

// Cleanup
allocator.free(allocation).unwrap();
unsafe { device.destroy_buffer(buffer, None) };
# }
# #[cfg(not(feature = "vulkan"))]
# fn main() {}

Setting up the D3D12 memory allocator

# #[cfg(feature = "d3d12")]
# fn main() {
use gpu_allocator::d3d12::*;
# use winapi::um::d3d12;
# let device = todo!();

let mut allocator = Allocator::new(&AllocatorCreateDesc {
device,
debug_settings: Default::default(),
});
# }
# #[cfg(not(feature = "d3d12"))]
# fn main() {}

Simple d3d12 allocation example

# #[cfg(all(feature = "d3d12", feature = "public-winapi"))]
# fn main() {
use gpu_allocator::d3d12::*;
use gpu_allocator::MemoryLocation;
# use winapi::um::d3d12;
# use winapi::shared::{dxgiformat, dxgitype, winerror};
# let device = todo!();

# let mut allocator = Allocator::new(&AllocatorCreateDesc {
#     device: Dx12DevicePtr(device as *const _),
#     debug_settings: Default::default(),
# }).unwrap();

let buffer_desc = d3d12::D3D12_RESOURCE_DESC {
Dimension: d3d12::D3D12_RESOURCE_DIMENSION_BUFFER,
Alignment: 0,
Width: 512,
Height: 1,
DepthOrArraySize: 1,
MipLevels: 1,
Format: dxgiformat::DXGI_FORMAT_UNKNOWN,
SampleDesc: dxgitype::DXGI_SAMPLE_DESC {
Count: 1,
Quality: 0,
},
Layout: d3d12::D3D12_TEXTURE_LAYOUT_ROW_MAJOR,
Flags: d3d12::D3D12_RESOURCE_FLAG_NONE,
};
let allocation_desc = AllocationCreateDesc::from_d3d12_resource_desc(
allocator.device(),
&buffer_desc,
"Example allocation",
MemoryLocation::GpuOnly,
);
let allocation = allocator.allocate(&allocation_desc).unwrap();
let mut resource: *mut d3d12::ID3D12Resource = std::ptr::null_mut();
let hr = unsafe {
device.as_ref().unwrap().CreatePlacedResource(
allocation.heap().as_winapi(),
allocation.offset(),
&buffer_desc,
d3d12::D3D12_RESOURCE_STATE_COMMON,
std::ptr::null(),
&d3d12::IID_ID3D12Resource,
&mut resource as *mut _ as *mut _,
)
};
if hr != winerror::S_OK {
panic!("Failed to create placed resource.");
}

// Cleanup
unsafe { resource.as_ref().unwrap().Release() };
allocator.free(allocation).unwrap();
# }
# #[cfg(not(all(feature = "d3d12", feature="public-winapi")))]
# fn main() {}