]> git.nega.tv - josh/narcissus/commitdiff
narcissus-gpu: Hook up buffer device address
authorJosh Simmons <josh@nega.tv>
Mon, 3 Jun 2024 20:40:42 +0000 (22:40 +0200)
committerJosh Simmons <josh@nega.tv>
Mon, 3 Jun 2024 20:40:42 +0000 (22:40 +0200)
engine/narcissus-gpu/src/backend/vulkan/allocator.rs
engine/narcissus-gpu/src/backend/vulkan/mod.rs

index 72bdc148def31b2af693753cf608b8e51f0bd151..bd717f808583b6055fb2096e255ebc5ff3210467 100644 (file)
@@ -1,5 +1,6 @@
 use std::{
     collections::HashSet,
+    ffi::c_void,
     sync::atomic::{AtomicU32, AtomicU64, Ordering},
 };
 
@@ -252,7 +253,13 @@ impl VulkanDevice {
             return None;
         }
 
+        let flags_info = vk::MemoryAllocateFlagsInfo {
+            flags: vk::MemoryAllocateFlags::DEVICE_ADDRESS_BIT,
+            ..default()
+        };
+
         let mut allocate_info = vk::MemoryAllocateInfo {
+            _next: &flags_info as *const _ as *const c_void,
             allocation_size: size,
             memory_type_index,
             ..default()
index 4b89dc6c56cc83f1ab34b48585087e9957c3601a..09b14bba98dea29e4606744844d00274cfd7e776 100644 (file)
@@ -183,6 +183,7 @@ fn vulkan_shader_module(
 struct VulkanBuffer {
     memory: VulkanMemory,
     buffer: vk::Buffer,
+    _address: vk::DeviceAddress,
     map_count: u64,
 }
 
@@ -624,6 +625,7 @@ impl VulkanDevice {
             };
             let enabled_features_12 = vk::PhysicalDeviceVulkan12Features {
                 _next: &enabled_features_13 as *const vk::PhysicalDeviceVulkan13Features as *mut _,
+                buffer_device_address: vk::Bool32::True,
                 timeline_semaphore: vk::Bool32::True,
                 descriptor_indexing: vk::Bool32::True,
                 descriptor_binding_partially_bound: vk::Bool32::True,
@@ -911,7 +913,8 @@ impl Device for VulkanDevice {
 
         let create_info = vk::BufferCreateInfo {
             size: desc.size as u64,
-            usage: vulkan_buffer_usage_flags(desc.usage),
+            usage: vulkan_buffer_usage_flags(desc.usage)
+                | vk::BufferUsageFlags::SHADER_DEVICE_ADDRESS,
             queue_family_indices: queue_family_indices.into(),
             sharing_mode: vk::SharingMode::Exclusive,
             ..default()
@@ -940,9 +943,20 @@ impl Device for VulkanDevice {
             )
         };
 
+        let address = unsafe {
+            self.device_fn.get_buffer_device_address(
+                self.device,
+                &vk::BufferDeviceAddressInfo {
+                    buffer,
+                    ..default()
+                },
+            )
+        };
+
         let handle = self.buffer_pool.lock().insert(VulkanBuffer {
             memory,
             buffer,
+            _address: address,
             map_count: 0,
         });
 
@@ -2619,7 +2633,8 @@ impl VulkanDevice {
                 | vk::BufferUsageFlags::TRANSFER_SRC
                 | vk::BufferUsageFlags::INDEX_BUFFER
                 | vk::BufferUsageFlags::STORAGE_BUFFER
-                | vk::BufferUsageFlags::UNIFORM_BUFFER,
+                | vk::BufferUsageFlags::UNIFORM_BUFFER
+                | vk::BufferUsageFlags::SHADER_DEVICE_ADDRESS,
             queue_family_indices: queue_family_indices.into(),
             sharing_mode: vk::SharingMode::Exclusive,
             ..default()