1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
use crate::{device, format, Backend, IndexType};
pub type Offset = u64;
pub type State = Access;
#[derive(Fail, Debug, Clone, PartialEq, Eq)]
pub enum CreationError {
#[fail(display = "{}", _0)]
OutOfMemory(device::OutOfMemory),
#[fail(display = "Buffer usage unsupported ({:?}).", usage)]
UnsupportedUsage {
usage: Usage,
},
}
impl From<device::OutOfMemory> for CreationError {
fn from(error: device::OutOfMemory) -> Self {
CreationError::OutOfMemory(error)
}
}
#[derive(Fail, Debug, Clone, PartialEq, Eq)]
pub enum ViewCreationError {
#[fail(display = "{}", _0)]
OutOfMemory(device::OutOfMemory),
#[fail(display = "Buffer view format unsupported ({:?}).", format)]
UnsupportedFormat {
format: Option<format::Format>,
},
}
impl From<device::OutOfMemory> for ViewCreationError {
fn from(error: device::OutOfMemory) -> Self {
ViewCreationError::OutOfMemory(error)
}
}
bitflags!(
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Usage: u32 {
const TRANSFER_SRC = 0x1;
const TRANSFER_DST = 0x2;
const UNIFORM_TEXEL = 0x4;
const STORAGE_TEXEL = 0x8;
const UNIFORM = 0x10;
const STORAGE = 0x20;
const INDEX = 0x40;
const VERTEX = 0x80;
const INDIRECT = 0x100;
}
);
impl Usage {
pub fn can_transfer(&self) -> bool {
self.intersects(Usage::TRANSFER_SRC | Usage::TRANSFER_DST)
}
}
bitflags!(
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Access: u32 {
const INDIRECT_COMMAND_READ = 0x1;
const INDEX_BUFFER_READ = 0x2;
const VERTEX_BUFFER_READ = 0x4;
const CONSTANT_BUFFER_READ = 0x8;
const SHADER_READ = 0x20;
const SHADER_WRITE = 0x40;
const TRANSFER_READ = 0x800;
const TRANSFER_WRITE = 0x1000;
const HOST_READ = 0x2000;
const HOST_WRITE = 0x4000;
const MEMORY_READ = 0x8000;
const MEMORY_WRITE = 0x10000;
}
);
#[derive(Debug)]
pub struct IndexBufferView<'a, B: Backend> {
pub buffer: &'a B::Buffer,
pub offset: u64,
pub index_type: IndexType,
}