bevy_render/render_resource/
buffer.rs

1use crate::define_atomic_id;
2use crate::renderer::WgpuWrapper;
3use core::ops::{Deref, RangeBounds};
4
5define_atomic_id!(BufferId);
6
7#[derive(Clone, Debug)]
8pub struct Buffer {
9    id: BufferId,
10    value: WgpuWrapper<wgpu::Buffer>,
11}
12
13impl Buffer {
14    #[inline]
15    pub fn id(&self) -> BufferId {
16        self.id
17    }
18
19    pub fn slice(&self, bounds: impl RangeBounds<wgpu::BufferAddress>) -> BufferSlice<'_> {
20        BufferSlice {
21            id: self.id,
22            value: self.value.slice(bounds),
23        }
24    }
25
26    #[inline]
27    pub fn unmap(&self) {
28        self.value.unmap();
29    }
30}
31
32impl From<wgpu::Buffer> for Buffer {
33    fn from(value: wgpu::Buffer) -> Self {
34        Buffer {
35            id: BufferId::new(),
36            value: WgpuWrapper::new(value),
37        }
38    }
39}
40
41impl Deref for Buffer {
42    type Target = wgpu::Buffer;
43
44    #[inline]
45    fn deref(&self) -> &Self::Target {
46        &self.value
47    }
48}
49
50#[derive(Clone, Debug)]
51pub struct BufferSlice<'a> {
52    id: BufferId,
53    value: wgpu::BufferSlice<'a>,
54}
55
56impl<'a> BufferSlice<'a> {
57    #[inline]
58    pub fn id(&self) -> BufferId {
59        self.id
60    }
61}
62
63impl<'a> Deref for BufferSlice<'a> {
64    type Target = wgpu::BufferSlice<'a>;
65
66    #[inline]
67    fn deref(&self) -> &Self::Target {
68        &self.value
69    }
70}