Skip to main content

bevy_render/render_resource/
buffer.rs

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