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