bevy_render/render_resource/
buffer.rs1use 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}