diff options
Diffstat (limited to 'src/graphics/util.rs')
| -rw-r--r-- | src/graphics/util.rs | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/graphics/util.rs b/src/graphics/util.rs index 2debc4e..6190542 100644 --- a/src/graphics/util.rs +++ b/src/graphics/util.rs @@ -8,6 +8,33 @@ use vulkanalia::{ Device, Instance }; use vulkanalia::vk::{ self, Handle, HasBuilder, InstanceV1_0, DeviceV1_0 }; +#[allow(unsafe_code)] +pub fn init_buffer<T>(instance: &Instance, + physical_device: &vk::PhysicalDevice, device: &Device, + queue: &vk::Queue, command_pool: &vk::CommandPool, + usage: vk::BufferUsageFlags, contents: &[T]) + -> Result<(vk::Buffer, vk::DeviceMemory)> +{ + let (staging_buffer, staging_memory, size) + = stage_in_buffer(instance, physical_device, device, contents)?; + + let final_usage = vk::BufferUsageFlags::TRANSFER_DST | usage; + let final_memory_flags = vk::MemoryPropertyFlags::DEVICE_LOCAL; + let (final_buffer, device_memory) + = allocate_buffer(instance, physical_device, device, + size as vk::DeviceSize, final_usage, + final_memory_flags)?; + + copy_buffer(device, queue, command_pool, &staging_buffer, &final_buffer, + size as vk::DeviceSize)?; + + unsafe { device.destroy_buffer(staging_buffer, None) }; + unsafe { device.free_memory(staging_memory, None) }; + + Ok((final_buffer, device_memory)) +} + + pub fn stage_in_buffer<T>(instance: &Instance, physical_device: &vk::PhysicalDevice, device: &Device, contents: &[T]) |