]> git.nega.tv - josh/narcissus/commitdiff
Add `create_buffer_with_data` helper
authorJoshua Simmons <josh@nega.tv>
Fri, 2 Dec 2022 21:24:27 +0000 (22:24 +0100)
committerJoshua Simmons <josh@nega.tv>
Fri, 2 Dec 2022 21:33:56 +0000 (22:33 +0100)
narcissus-gpu/src/backend/vulkan/mod.rs
narcissus-gpu/src/lib.rs

index c7e553e89838708888ac0b21631b2a3161aaba6d..85cc1c6759f76e82ddea14c2998144a51989b104 100644 (file)
@@ -1490,6 +1490,22 @@ impl Device for VulkanDevice {
         Buffer(handle)
     }
 
+    fn create_buffer_with_data(&self, desc: &BufferDesc, initial_data: &[u8]) -> Buffer {
+        let len = initial_data.len();
+
+        assert!(len <= desc.size, "initial data larger than buffer");
+        assert!(desc.location == MemoryLocation::HostMapped);
+        let buffer = self.create_buffer(desc);
+
+        unsafe {
+            let dst = std::slice::from_raw_parts_mut(self.map_buffer(buffer), len);
+            dst.copy_from_slice(initial_data);
+            self.unmap_buffer(buffer);
+        }
+
+        buffer
+    }
+
     fn create_image(&self, desc: &ImageDesc) -> Image {
         debug_assert_ne!(desc.layer_count, 0, "layers must be at least one");
         debug_assert_ne!(desc.width, 0, "width must be at least one");
index bcd5df1495ce84aa86a52334ffe7e4875720ba76..574af5eb2b3a5d7256507006daa49ee8f0c3879b 100644 (file)
@@ -634,6 +634,7 @@ impl std::error::Error for SwapchainOutOfDateError {}
 
 pub trait Device {
     fn create_buffer(&self, desc: &BufferDesc) -> Buffer;
+    fn create_buffer_with_data(&self, desc: &BufferDesc, inital_data: &[u8]) -> Buffer;
     fn create_image(&self, desc: &ImageDesc) -> Image;
     fn create_image_view(&self, desc: &ImageViewDesc) -> Image;
     fn create_sampler(&self, desc: &SamplerDesc) -> Sampler;