use super::device::Device;
use std::sync::Arc;
use vulkano::buffer::{TypedBufferAccess};
use vulkano::command_buffer::AutoCommandBufferBuilder;
use vulkano::sync::GpuFuture;
use vulkano::memory::DeviceMemoryAllocError;
pub use vulkano::buffer::{BufferAccess, BufferSlice, BufferUsage, CpuAccessibleBuffer, CpuBufferPool, DeviceLocalBuffer, ImmutableBuffer};
pub fn create_immutable_buffer_from_data<T>(device: &Device, data: T, usage: BufferUsage) -> Result<Arc<ImmutableBuffer<T>>, DeviceMemoryAllocError>
where
T : Send + Sync + Sized + 'static,
{
let (buffer, future) = ImmutableBuffer::from_data(data, usage, device.transfer_queue.clone())?;
future.flush().unwrap();
Ok(buffer)
}
pub fn create_immutable_buffer_from_iter<T>(device: &Device, data_iterator: impl ExactSizeIterator<Item = T>, usage: BufferUsage) -> Result<Arc<ImmutableBuffer<[T]>>, DeviceMemoryAllocError>
where
T : Send + Sync + Sized + 'static,
{
let (buffer, future) = ImmutableBuffer::from_iter(data_iterator, usage, device.transfer_queue.clone())?;
future.flush().unwrap();
Ok(buffer)
}
#[inline]
pub fn create_device_local_buffer<T>(device: &Device, usage: BufferUsage) -> Result<Arc<DeviceLocalBuffer<T>>, DeviceMemoryAllocError> {
DeviceLocalBuffer::new(device.logical_device(), usage, device.device.active_queue_families())
}
#[inline]
pub fn create_device_local_array_buffer<T>(device: &Device, len: usize, usage: BufferUsage) -> Result<Arc<DeviceLocalBuffer<[T]>>, DeviceMemoryAllocError> {
DeviceLocalBuffer::array(device.logical_device(), len, usage, device.device.active_queue_families())
}
pub fn update<B, D>(device: &Device, buffer: B, data: D)
where
B : TypedBufferAccess<Content = D> + Send + Sync + 'static,
D : Send + Sync + 'static,
{
let command_buffer = AutoCommandBufferBuilder::primary_one_time_submit(device.logical_device(), device.transfer_queue.family()).unwrap()
.update_buffer(buffer, data).unwrap()
.build().unwrap();
vulkano::sync::now(device.logical_device())
.then_execute(device.transfer_queue.clone(), command_buffer).unwrap()
.flush().unwrap();
}
pub fn copy<S, D, T>(device: &Device, source: S, destination: D)
where
S : TypedBufferAccess<Content = T> + Send + Sync + 'static,
D : TypedBufferAccess<Content = T> + Send + Sync + 'static,
T : ?Sized,
{
let command_buffer = AutoCommandBufferBuilder::primary_one_time_submit(device.logical_device(), device.transfer_queue.family()).unwrap()
.copy_buffer(source, destination).unwrap()
.build().unwrap();
vulkano::sync::now(device.logical_device())
.then_execute(device.transfer_queue.clone(), command_buffer).unwrap()
.flush().unwrap();
}