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
use std::mem;
use std::os::raw::c_void;
use std::slice;
use vk;
pub use self::device_memory::CpuAccess;
pub use self::device_memory::DeviceMemory;
pub use self::device_memory::MappedDeviceMemory;
pub use self::pool::MemoryPool;
mod device_memory;
pub mod pool;
#[derive(Debug, Copy, Clone)]
pub struct MemoryRequirements {
pub size: usize,
pub alignment: usize,
pub memory_type_bits: u32,
}
#[doc(hidden)]
impl From<vk::MemoryRequirements> for MemoryRequirements {
#[inline]
fn from(reqs: vk::MemoryRequirements) -> MemoryRequirements {
MemoryRequirements {
size: reqs.size as usize,
alignment: reqs.alignment as usize,
memory_type_bits: reqs.memoryTypeBits,
}
}
}
pub unsafe trait Content {
fn ref_from_ptr<'a>(ptr: *mut c_void, size: usize) -> Option<*mut Self>;
fn is_size_suitable(usize) -> bool;
fn indiv_size() -> usize;
}
unsafe impl<T> Content for T {
#[inline]
fn ref_from_ptr<'a>(ptr: *mut c_void, size: usize) -> Option<*mut T> {
if size < mem::size_of::<T>() {
return None;
}
Some(ptr as *mut T)
}
#[inline]
fn is_size_suitable(size: usize) -> bool {
size == mem::size_of::<T>()
}
#[inline]
fn indiv_size() -> usize {
mem::size_of::<T>()
}
}
unsafe impl<T> Content for [T] {
#[inline]
fn ref_from_ptr<'a>(ptr: *mut c_void, size: usize) -> Option<*mut [T]> {
let ptr = ptr as *mut T;
let size = size / mem::size_of::<T>();
Some(unsafe { slice::from_raw_parts_mut(&mut *ptr, size) as *mut [T] })
}
#[inline]
fn is_size_suitable(size: usize) -> bool {
size % mem::size_of::<T>() == 0
}
#[inline]
fn indiv_size() -> usize {
mem::size_of::<T>()
}
}