Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_render/src/render_resource/buffer.rs
6596 views
1
use crate::define_atomic_id;
2
use crate::renderer::WgpuWrapper;
3
use core::ops::{Bound, Deref, RangeBounds};
4
5
define_atomic_id!(BufferId);
6
7
#[derive(Clone, Debug)]
8
pub struct Buffer {
9
id: BufferId,
10
value: WgpuWrapper<wgpu::Buffer>,
11
}
12
13
impl 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
// need to compute and store this manually because wgpu doesn't export offset and size on wgpu::BufferSlice
21
let offset = match bounds.start_bound() {
22
Bound::Included(&bound) => bound,
23
Bound::Excluded(&bound) => bound + 1,
24
Bound::Unbounded => 0,
25
};
26
let size = match bounds.end_bound() {
27
Bound::Included(&bound) => bound + 1,
28
Bound::Excluded(&bound) => bound,
29
Bound::Unbounded => self.value.size(),
30
} - offset;
31
BufferSlice {
32
id: self.id,
33
offset,
34
size,
35
value: self.value.slice(bounds),
36
}
37
}
38
39
#[inline]
40
pub fn unmap(&self) {
41
self.value.unmap();
42
}
43
}
44
45
impl From<wgpu::Buffer> for Buffer {
46
fn from(value: wgpu::Buffer) -> Self {
47
Buffer {
48
id: BufferId::new(),
49
value: WgpuWrapper::new(value),
50
}
51
}
52
}
53
54
impl Deref for Buffer {
55
type Target = wgpu::Buffer;
56
57
#[inline]
58
fn deref(&self) -> &Self::Target {
59
&self.value
60
}
61
}
62
63
#[derive(Clone, Debug)]
64
pub struct BufferSlice<'a> {
65
id: BufferId,
66
offset: wgpu::BufferAddress,
67
value: wgpu::BufferSlice<'a>,
68
size: wgpu::BufferAddress,
69
}
70
71
impl<'a> BufferSlice<'a> {
72
#[inline]
73
pub fn id(&self) -> BufferId {
74
self.id
75
}
76
77
#[inline]
78
pub fn offset(&self) -> wgpu::BufferAddress {
79
self.offset
80
}
81
82
#[inline]
83
pub fn size(&self) -> wgpu::BufferAddress {
84
self.size
85
}
86
}
87
88
impl<'a> Deref for BufferSlice<'a> {
89
type Target = wgpu::BufferSlice<'a>;
90
91
#[inline]
92
fn deref(&self) -> &Self::Target {
93
&self.value
94
}
95
}
96
97