truck_platform/
buffer_handler.rs1use crate::*;
2
3impl BufferHandler {
4 #[inline(always)]
6 pub fn from_slice<T: Sized + Pod + Zeroable, A: AsRef<[T]>>(
7 vec: &A,
8 device: &Device,
9 usage: BufferUsages,
10 ) -> Self {
11 let buffer = device.create_buffer_init(&BufferInitDescriptor {
12 contents: bytemuck::cast_slice(vec.as_ref()),
13 usage,
14 label: None,
15 });
16 let stride = size_of::<T>() as u64;
17 let size = vec.as_ref().len() as u64 * stride;
18 BufferHandler {
19 buffer,
20 size,
21 stride,
22 }
23 }
24 #[inline(always)]
26 pub const fn buffer(&self) -> &Buffer { &self.buffer }
27
28 #[inline(always)]
30 pub const fn size(&self) -> u64 { self.size }
31
32 #[inline(always)]
34 pub const fn binding_resource(&self) -> BindingResource<'_> {
35 BindingResource::Buffer(BufferBinding {
36 buffer: &self.buffer,
37 offset: 0,
38 size: None,
39 })
40 }
41
42 #[inline(always)]
46 pub fn copy_buffer(&self, encoder: &mut CommandEncoder, dest: &BufferHandler) {
47 assert!(
48 self.size < dest.size,
49 "The destination buffer size must be shorter than the source buffer size."
50 );
51 encoder.copy_buffer_to_buffer(&self.buffer, 0, &dest.buffer, 0, self.size);
52 }
53}