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
use crate::ffi;
use crate::{DecodePosition, VertexDataAdapter};
use std::mem;
pub type VertexCacheStatistics = ffi::meshopt_VertexCacheStatistics;
pub type VertexFetchStatistics = ffi::meshopt_VertexFetchStatistics;
pub type OverdrawStatistics = ffi::meshopt_OverdrawStatistics;
pub fn analyze_vertex_cache(
indices: &[u32],
vertex_count: usize,
cache_size: u32,
warp_size: u32,
prim_group_size: u32,
) -> VertexCacheStatistics {
unsafe {
ffi::meshopt_analyzeVertexCache(
indices.as_ptr() as *mut ::std::os::raw::c_uint,
indices.len(),
vertex_count,
cache_size,
warp_size,
prim_group_size,
)
}
}
pub fn analyze_vertex_fetch(
indices: &[u32],
vertex_count: usize,
vertex_size: usize,
) -> VertexFetchStatistics {
unsafe {
ffi::meshopt_analyzeVertexFetch(
indices.as_ptr() as *const ::std::os::raw::c_uint,
indices.len(),
vertex_count,
vertex_size,
)
}
}
pub fn analyze_overdraw_decoder<T: DecodePosition>(
indices: &[u32],
vertices: &[T],
) -> OverdrawStatistics {
let positions = vertices
.iter()
.map(|vertex| vertex.decode_position())
.collect::<Vec<[f32; 3]>>();
unsafe {
ffi::meshopt_analyzeOverdraw(
indices.as_ptr() as *const ::std::os::raw::c_uint,
indices.len(),
positions.as_ptr() as *const f32,
positions.len(),
mem::size_of::<f32>() * 3,
)
}
}
pub fn analyze_overdraw(indices: &[u32], vertices: &VertexDataAdapter) -> OverdrawStatistics {
unsafe {
ffi::meshopt_analyzeOverdraw(
indices.as_ptr() as *const ::std::os::raw::c_uint,
indices.len(),
vertices.pos_ptr(),
vertices.vertex_count,
vertices.vertex_stride,
)
}
}