summary refs log tree commit diff
path: root/src/graphics/util.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/graphics/util.rs')
-rw-r--r--src/graphics/util.rs27
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])