]> git.nega.tv - josh/narcissus/commitdiff
narcissus-gpu: Expose buffer device addresses
authorJosh Simmons <josh@nega.tv>
Sun, 9 Jun 2024 21:04:17 +0000 (23:04 +0200)
committerJosh Simmons <josh@nega.tv>
Sun, 9 Jun 2024 21:04:17 +0000 (23:04 +0200)
engine/narcissus-gpu/src/backend/vulkan/mod.rs
engine/narcissus-gpu/src/lib.rs
engine/narcissus-gpu/src/mapped_buffer.rs

index f0944c6106df3decbcffc17aab7d1d65ca4c50ec..01df29afb27e9fad7432dcc741204de72127f60c 100644 (file)
@@ -184,7 +184,7 @@ fn vulkan_shader_module(
 struct VulkanBuffer {
     memory: VulkanMemory,
     buffer: vk::Buffer,
-    _address: vk::DeviceAddress,
+    address: vk::DeviceAddress,
     map_count: u64,
 }
 
@@ -260,6 +260,7 @@ struct VulkanBoundPipeline {
 #[derive(Clone)]
 struct VulkanTransientBuffer {
     buffer: vk::Buffer,
+    address: u64,
     memory: VulkanMemory,
 }
 
@@ -986,7 +987,7 @@ impl Device for VulkanDevice {
         let handle = self.buffer_pool.lock().insert(VulkanBuffer {
             memory,
             buffer,
-            _address: address,
+            address,
             map_count: 0,
         });
 
@@ -2693,6 +2694,17 @@ impl Device for VulkanDevice {
         self.wsi_end_frame(self.frame_mut(&mut frame));
         self.frame_counter.release(frame);
     }
+
+    fn get_buffer_address(&self, buffer: BufferArg) -> u64 {
+        let buffer = match buffer {
+            BufferArg::Unmanaged(buffer) => buffer.0,
+            BufferArg::Persistent(buffer) => buffer.buffer.0,
+            BufferArg::Transient(buffer) => return buffer.address,
+        };
+        let buffer_pool = self.buffer_pool.lock();
+        let buffer = buffer_pool.get(buffer).unwrap();
+        buffer.address
+    }
 }
 
 impl VulkanDevice {
@@ -2740,6 +2752,16 @@ impl VulkanDevice {
                 )
             };
 
+            let address = unsafe {
+                self.device_fn.get_buffer_device_address(
+                    self.device,
+                    &vk::BufferDeviceAddressInfo {
+                        buffer,
+                        ..default()
+                    },
+                )
+            };
+
             let ptr = NonNull::new(memory.mapped_ptr()).unwrap();
 
             frame.destroyed_buffers.lock().push_back(buffer);
@@ -2749,6 +2771,7 @@ impl VulkanDevice {
                 ptr,
                 len: size as usize,
                 buffer: buffer.as_raw(),
+                address,
                 offset: 0,
                 phantom: PhantomData,
             };
@@ -2816,6 +2839,7 @@ impl VulkanDevice {
             .unwrap(),
             len: size as usize,
             buffer: current.buffer.as_raw(),
+            address: current.address + allocator.offset,
             offset: allocator.offset,
             phantom: PhantomData,
         }
@@ -2874,7 +2898,21 @@ impl VulkanDevice {
             )
         };
 
-        VulkanTransientBuffer { buffer, memory }
+        let address = unsafe {
+            self.device_fn.get_buffer_device_address(
+                self.device,
+                &vk::BufferDeviceAddressInfo {
+                    buffer,
+                    ..default()
+                },
+            )
+        };
+
+        VulkanTransientBuffer {
+            buffer,
+            address,
+            memory,
+        }
     }
 
     fn unwrap_buffer_arg(&self, buffer_arg: &BufferArg) -> (vk::Buffer, u64, u64) {
index cc73295f9c81f15f77d35bd14f29e9b2eb7877bc..9b0d2ee8ac5882fe2b80adcd81ad1af3d37abf8e 100644 (file)
@@ -788,6 +788,9 @@ pub trait Device {
     fn debug_name_buffer(&self, buffer: BufferArg, label_name: &str);
     fn debug_name_image(&self, image: Image, label_name: &str);
 
+    // Danger Zone
+    fn get_buffer_address(&self, buffer: BufferArg) -> u64;
+
     fn destroy_buffer(&self, frame: &Frame, buffer: Buffer);
     fn destroy_persistent_buffer(&self, frame: &Frame, buffer: PersistentBuffer);
     fn destroy_image(&self, frame: &Frame, image: Image);
index 21ba0d7f36e2f17d36fefefd92514982071000d1..e3e8e849f742b4f54e2ae3b5a4946fc9a2896ef3 100644 (file)
@@ -85,6 +85,7 @@ pub struct TransientBuffer<'a> {
     pub(crate) offset: u64,
     pub(crate) len: usize,
     pub(crate) buffer: u64,
+    pub(crate) address: u64,
     pub(crate) phantom: PhantomData<&'a u8>,
 }