struct VulkanBuffer {
memory: VulkanMemory,
buffer: vk::Buffer,
- _address: vk::DeviceAddress,
+ address: vk::DeviceAddress,
map_count: u64,
}
#[derive(Clone)]
struct VulkanTransientBuffer {
buffer: vk::Buffer,
+ address: u64,
memory: VulkanMemory,
}
let handle = self.buffer_pool.lock().insert(VulkanBuffer {
memory,
buffer,
- _address: address,
+ address,
map_count: 0,
});
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 {
)
};
+ 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);
ptr,
len: size as usize,
buffer: buffer.as_raw(),
+ address,
offset: 0,
phantom: PhantomData,
};
.unwrap(),
len: size as usize,
buffer: current.buffer.as_raw(),
+ address: current.address + allocator.offset,
offset: allocator.offset,
phantom: PhantomData,
}
)
};
- 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) {
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);