From 26decb0119af540a849eb618528c52fadbf1340c Mon Sep 17 00:00:00 2001 From: Irene Knapp Date: Sat, 11 Jul 2026 16:39:14 -0700 Subject: abstract buffer management Force-Push: yes Change-Id: I3276e65f2ef29199b57a748a321998747b607b22 --- src/graphics_window_dressing.rs | 57 ++++++++++++++++++++++++++--------------- 1 file 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::>() * VERTICES.len()) as u64) - .usage(vk::BufferUsageFlags::VERTEX_BUFFER) - .sharing_mode(vk::SharingMode::EXCLUSIVE); + let size = (size_of::>() * 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() }) } + -- cgit 1.4.1