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
use std::mem;
use std::ptr;
use std::sync::Arc;
use smallvec::SmallVec;
use check_errors;
use OomError;
use VulkanObject;
use VulkanPointers;
use SafeDeref;
use vk;
use descriptor::descriptor::DescriptorDesc;
use device::Device;
pub struct UnsafeDescriptorSetLayout<P = Arc<Device>> where P: SafeDeref<Target = Device> {
layout: vk::DescriptorSetLayout,
device: P,
}
impl<P> UnsafeDescriptorSetLayout<P> where P: SafeDeref<Target = Device> {
pub fn raw<I>(device: P, descriptors: I)
-> Result<UnsafeDescriptorSetLayout<P>, OomError>
where I: IntoIterator<Item = DescriptorDesc>
{
let bindings = descriptors.into_iter().map(|desc| {
vk::DescriptorSetLayoutBinding {
binding: desc.binding,
descriptorType: desc.ty.ty().unwrap() as u32,
descriptorCount: desc.array_count,
stageFlags: desc.stages.into(),
pImmutableSamplers: ptr::null(),
}
}).collect::<SmallVec<[_; 32]>>();
let layout = unsafe {
let infos = vk::DescriptorSetLayoutCreateInfo {
sType: vk::STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
pNext: ptr::null(),
flags: 0,
bindingCount: bindings.len() as u32,
pBindings: bindings.as_ptr(),
};
let mut output = mem::uninitialized();
let vk = device.pointers();
try!(check_errors(vk.CreateDescriptorSetLayout(device.internal_object(), &infos,
ptr::null(), &mut output)));
output
};
Ok(UnsafeDescriptorSetLayout {
layout: layout,
device: device,
})
}
#[inline]
pub fn new<I>(device: P, descriptors: I) -> Arc<UnsafeDescriptorSetLayout<P>>
where I: IntoIterator<Item = DescriptorDesc>
{
Arc::new(UnsafeDescriptorSetLayout::raw(device, descriptors).unwrap())
}
#[inline]
pub fn device(&self) -> &P {
&self.device
}
}
unsafe impl<P> VulkanObject for UnsafeDescriptorSetLayout<P> where P: SafeDeref<Target = Device> {
type Object = vk::DescriptorSetLayout;
#[inline]
fn internal_object(&self) -> vk::DescriptorSetLayout {
self.layout
}
}
impl<P> Drop for UnsafeDescriptorSetLayout<P> where P: SafeDeref<Target = Device> {
#[inline]
fn drop(&mut self) {
unsafe {
let vk = self.device.pointers();
vk.DestroyDescriptorSetLayout(self.device.internal_object(), self.layout,
ptr::null());
}
}
}
#[cfg(test)]
mod tests {
use std::iter;
use descriptor::descriptor_set::unsafe_layout::UnsafeDescriptorSetLayout;
#[test]
fn empty() {
let (device, _) = gfx_dev_and_queue!();
let _layout = UnsafeDescriptorSetLayout::new(device, iter::empty());
}
}