spirv_cross2/reflect/
mod.rs

1mod buffers;
2mod combined_image_samplers;
3mod constants;
4mod decorations;
5mod entry_points;
6mod execution_modes;
7mod names;
8mod resources;
9mod types;
10
11use crate::{error, SpirvCrossError};
12pub use buffers::*;
13pub use combined_image_samplers::*;
14pub use constants::*;
15pub use decorations::*;
16pub use entry_points::*;
17pub use execution_modes::*;
18pub use resources::*;
19pub use types::*;
20
21/// Check if an enum slice contains u32 max.
22#[inline(always)]
23fn enum_slice_is_not_max<T>(enum_slice: &[i32]) -> bool {
24    #[cfg(target_endian = "big")]
25    let memchr = memchr::memmem::find(
26        bytemuck::must_cast_slice(enum_slice),
27        &*i32::MAX.to_be_bytes(),
28    );
29
30    #[cfg(target_endian = "little")]
31    let memchr = memchr::memmem::find(
32        bytemuck::must_cast_slice(enum_slice),
33        i32::MAX.to_le_bytes().as_slice(),
34    );
35
36    // memchr is only a heuristic, but if it doesn't find the bit pattern we're good.
37    if memchr.is_none() {
38        true
39    } else {
40        !enum_slice.contains(&i32::MAX)
41    }
42}
43
44// SAFETY: ensure size is u32 first!
45// won't need it after 1.79.
46unsafe fn try_valid_slice<'a, T>(ptr: *const T, size: usize) -> error::Result<&'a [T]> {
47    unsafe {
48        let int_slice = std::slice::from_raw_parts(ptr.cast::<i32>(), size);
49        if !enum_slice_is_not_max::<T>(int_slice) {
50            Err(SpirvCrossError::InvalidEnum)
51        } else {
52            Ok(std::slice::from_raw_parts(ptr, size))
53        }
54    }
55}