summary refs log tree commit diff
path: root/src/graphics_window_dressing.rs
diff options
context:
space:
mode:
authorIrene Knapp <ireneista@irenes.space>2026-07-11 16:39:14 -0700
committerIrene Knapp <ireneista@irenes.space>2026-07-11 16:39:14 -0700
commit26decb0119af540a849eb618528c52fadbf1340c (patch)
treec6ce6b95ce7230763e245702623144052bfbed21 /src/graphics_window_dressing.rs
parentcd3b77fea9307d9c15718a9e5e17035f7e71ac25 (diff)
abstract buffer management
Force-Push: yes
Change-Id: I3276e65f2ef29199b57a748a321998747b607b22
Diffstat (limited to 'src/graphics_window_dressing.rs')
-rw-r--r--src/graphics_window_dressing.rs57
1 files changed, 37 insertions, 20 deletions
diff --git a/src/graphics_window_dressing.rs b/src/graphics_window_dressing.rs
index 7fa25cf..eb08d53 100644
--- a/src/graphics_window_dressing.rs
+++ b/src/graphics_window_dressing.rs
@@ -531,11 +531,39 @@ fn init_vertex_buffer(instance: &Instance,
                       physical_device: &vk::PhysicalDevice, device: &Device)
     -> Result<(vk::Buffer, vk::DeviceMemory)>
 {
-  let buffer_info
-          = vk::BufferCreateInfo::builder()
-                .size((size_of::<Vertex<f32>>() * VERTICES.len()) as u64)
-                .usage(vk::BufferUsageFlags::VERTEX_BUFFER)
-                .sharing_mode(vk::SharingMode::EXCLUSIVE);
+  let size = (size_of::<Vertex<f32>>() * VERTICES.len()) as u64;
+  let usage = vk::BufferUsageFlags::VERTEX_BUFFER;
+  let memory_flags = vk::MemoryPropertyFlags::HOST_COHERENT
+                     | vk::MemoryPropertyFlags::HOST_VISIBLE;
+  let (buffer, device_memory) = init_buffer(instance, physical_device, device,
+                                            size, usage, memory_flags)?;
+
+  let host_memory = unsafe {
+    device.map_memory(device_memory, 0, size, vk::MemoryMapFlags::empty())
+  }?;
+
+  unsafe {
+    ptr::copy_nonoverlapping(VERTICES.as_ptr(), host_memory.cast(),
+                             VERTICES.len())
+  };
+
+  unsafe { device.unmap_memory(device_memory) };
+
+  Ok((buffer, device_memory))
+}
+
+
+#[allow(unsafe_code)]
+fn init_buffer(instance: &Instance,
+               physical_device: &vk::PhysicalDevice, device: &Device,
+               size: vk::DeviceSize, usage: vk::BufferUsageFlags,
+               memory_flags: vk::MemoryPropertyFlags)
+    -> Result<(vk::Buffer, vk::DeviceMemory)>
+{
+  let buffer_info = vk::BufferCreateInfo::builder()
+                        .size(size)
+                        .usage(usage)
+                        .sharing_mode(vk::SharingMode::EXCLUSIVE);
 
   let buffer = unsafe { device.create_buffer(&buffer_info, None) }?;
 
@@ -545,10 +573,10 @@ fn init_vertex_buffer(instance: &Instance,
   // one to tell us about it, and we let it.
   let requirements = unsafe { device.get_buffer_memory_requirements(buffer) };
 
-  let flags = vk::MemoryPropertyFlags::HOST_COHERENT
-              | vk::MemoryPropertyFlags::HOST_VISIBLE;
   let type_index = pick_memory_type(instance, physical_device,
-                                    &flags, &requirements)?;
+                                    &memory_flags, &requirements)?;
+
+
   let memory_info = vk::MemoryAllocateInfo::builder()
                         .allocation_size(requirements.size)
                         .memory_type_index(type_index);
@@ -557,18 +585,6 @@ fn init_vertex_buffer(instance: &Instance,
 
   unsafe { device.bind_buffer_memory(buffer, device_memory, 0) }?;
 
-  let host_memory = unsafe {
-    device.map_memory(device_memory, 0, buffer_info.size,
-                      vk::MemoryMapFlags::empty())
-  }?;
-
-  unsafe {
-    ptr::copy_nonoverlapping(VERTICES.as_ptr(), host_memory.cast(),
-                             VERTICES.len())
-  };
-
-  unsafe { device.unmap_memory(device_memory) };
-
   Ok((buffer, device_memory))
 }
 
@@ -784,3 +800,4 @@ fn pick_memory_type(instance: &Instance,
     message: "The system has no suitable memory for a buffer.".to_string()
   })
 }
+