truck_platform/
buffer_handler.rs

1use crate::*;
2
3impl BufferHandler {
4    /// Creates a buffer handler from a slice.
5    #[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    /// Returns the reference of the buffer.
25    #[inline(always)]
26    pub const fn buffer(&self) -> &Buffer { &self.buffer }
27
28    /// Returns the size of the buffer.
29    #[inline(always)]
30    pub const fn size(&self) -> u64 { self.size }
31
32    /// Creates a binding resource from buffer slice.
33    #[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    /// Copy the values of buffer to `dest`.
43    /// # Panic
44    /// Panic occurs if the size of `dest` is smaller than the one of `self`.
45    #[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}