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
use std::error;
use std::fmt;
use std::sync::Arc;
use buffer::BufferAccess;
use format::Format;
use pipeline::vertex::VertexMemberTy;
use vk;
use SafeDeref;
pub unsafe trait VertexDefinition<I>:
VertexSource<Vec<Arc<dyn BufferAccess + Send + Sync>>>
{
type BuffersIter: ExactSizeIterator<Item = (u32, usize, InputRate)>;
type AttribsIter: ExactSizeIterator<Item = (u32, u32, AttributeInfo)>;
fn definition(
&self,
interface: &I,
) -> Result<(Self::BuffersIter, Self::AttribsIter), IncompatibleVertexDefinitionError>;
}
unsafe impl<I, T> VertexDefinition<I> for T
where
T: SafeDeref,
T::Target: VertexDefinition<I>,
{
type BuffersIter = <T::Target as VertexDefinition<I>>::BuffersIter;
type AttribsIter = <T::Target as VertexDefinition<I>>::AttribsIter;
#[inline]
fn definition(
&self,
interface: &I,
) -> Result<(Self::BuffersIter, Self::AttribsIter), IncompatibleVertexDefinitionError> {
(**self).definition(interface)
}
}
#[derive(Copy, Clone, Debug)]
#[repr(u32)]
pub enum InputRate {
Vertex = vk::VERTEX_INPUT_RATE_VERTEX,
Instance = vk::VERTEX_INPUT_RATE_INSTANCE,
}
#[derive(Copy, Clone, Debug)]
pub struct AttributeInfo {
pub offset: usize,
pub format: Format,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum IncompatibleVertexDefinitionError {
MissingAttribute {
attribute: String,
},
FormatMismatch {
attribute: String,
shader: (Format, usize),
definition: (VertexMemberTy, usize),
},
}
impl error::Error for IncompatibleVertexDefinitionError {}
impl fmt::Display for IncompatibleVertexDefinitionError {
#[inline]
fn fmt(&self, fmt: &mut fmt::Formatter) -> Result<(), fmt::Error> {
write!(fmt, "{}", match *self {
IncompatibleVertexDefinitionError::MissingAttribute { .. } => "an attribute is missing",
IncompatibleVertexDefinitionError::FormatMismatch { .. } => {
"the format of an attribute does not match"
}
})
}
}
pub unsafe trait VertexSource<L> {
fn decode(&self, L) -> (Vec<Box<dyn BufferAccess + Send + Sync>>, usize, usize);
}
unsafe impl<L, T> VertexSource<L> for T
where
T: SafeDeref,
T::Target: VertexSource<L>,
{
#[inline]
fn decode(&self, list: L) -> (Vec<Box<dyn BufferAccess + Send + Sync>>, usize, usize) {
(**self).decode(list)
}
}