encase

Trait ShaderType

Source
pub trait ShaderType {
    // Provided methods
    fn min_size() -> NonZeroU64 { ... }
    fn size(&self) -> NonZeroU64 { ... }
    fn assert_uniform_compat() { ... }
}
Expand description

Base trait for all WGSL host-shareable types

Provided Methods§

Source

fn min_size() -> NonZeroU64

Represents the minimum size of Self (equivalent to GPUBufferBindingLayout.minBindingSize)

For WGSL fixed-footprint types it represents WGSL Size (equivalent to ShaderSize::SHADER_SIZE)

For WGSL runtime-sized arrays and WGSL structs containing runtime-sized arrays (non fixed-footprint types) this will be calculated by assuming the array has one element

Source

fn size(&self) -> NonZeroU64

Returns the size of Self at runtime

For WGSL fixed-footprint types it’s equivalent to Self::min_size and ShaderSize::SHADER_SIZE

Source

fn assert_uniform_compat()

Asserts that Self meets the requirements of the uniform address space restrictions on stored values and the uniform address space layout constraints

§Examples
§Array

Will panic since runtime-sized arrays are not compatible with the uniform address space restrictions on stored values

<Vec<mint::Vector4<f32>>>::assert_uniform_compat();

Will panic since the stride is 4 bytes

<[f32; 2]>::assert_uniform_compat();

Will not panic since the stride is 16 bytes

<[mint::Vector4<f32>; 2]>::assert_uniform_compat();
§Struct

Will panic since runtime-sized arrays are not compatible with the uniform address space restrictions on stored values

#[derive(ShaderType)]
struct Invalid {
    #[size(runtime)]
    vec: Vec<mint::Vector4<f32>>
}
Invalid::assert_uniform_compat();

Will panic since the inner struct’s size must be a multiple of 16

#[derive(ShaderType)]
struct S {
    x: f32,
}

#[derive(ShaderType)]
struct Invalid {
    a: f32,
    b: S, // offset between fields 'a' and 'b' must be at least 16 (currently: 4)
}
Invalid::assert_uniform_compat();

Will not panic (fixed via align attribute)

#[derive(ShaderType)]
struct Valid {
    a: f32,
    #[align(16)]
    b: S,
}
Valid::assert_uniform_compat();

Will not panic (fixed via size attribute)

#[derive(ShaderType)]
struct Valid {
    #[size(16)]
    a: f32,
    b: S,
}
Valid::assert_uniform_compat();

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl ShaderType for Option<NonZeroI32>

Source§

impl ShaderType for Option<NonZeroU32>

Source§

impl ShaderType for f32

Source§

impl ShaderType for i32

Source§

impl ShaderType for u32

Source§

impl ShaderType for Mat3
where f32: ShaderSize,

Available on crate feature glam only.
Source§

impl ShaderType for Mat2
where f32: ShaderSize,

Available on crate feature glam only.
Source§

impl ShaderType for Mat4
where f32: ShaderSize,

Available on crate feature glam only.
Source§

impl ShaderType for Vec4
where f32: ShaderSize,

Available on crate feature glam only.
Source§

impl ShaderType for Vec2
where f32: ShaderSize,

Available on crate feature glam only.
Source§

impl ShaderType for Vec3
where f32: ShaderSize,

Available on crate feature glam only.
Source§

impl ShaderType for IVec2
where i32: ShaderSize,

Available on crate feature glam only.
Source§

impl ShaderType for IVec3
where i32: ShaderSize,

Available on crate feature glam only.
Source§

impl ShaderType for IVec4
where i32: ShaderSize,

Available on crate feature glam only.
Source§

impl ShaderType for UVec2
where u32: ShaderSize,

Available on crate feature glam only.
Source§

impl ShaderType for UVec3
where u32: ShaderSize,

Available on crate feature glam only.
Source§

impl ShaderType for UVec4
where u32: ShaderSize,

Available on crate feature glam only.
Source§

impl ShaderType for Wrapping<i32>

Source§

impl ShaderType for Wrapping<u32>

Source§

impl ShaderType for AtomicI32

Source§

impl ShaderType for AtomicU32

Source§

impl<T> ShaderType for Cow<'_, T>
where T: ShaderType + ?Sized + ToOwned<Owned = T>,

Source§

impl<T> ShaderType for &T
where T: ShaderType + ?Sized,

Source§

impl<T> ShaderType for &mut T
where T: ShaderType + ?Sized,

Source§

impl<T> ShaderType for [T]
where T: ShaderType + ShaderSize, Self: Length,

Source§

impl<T> ShaderType for Box<T>
where T: ShaderType + ?Sized,

Source§

impl<T> ShaderType for LinkedList<T>
where T: ShaderType + ShaderSize, Self: Length,

Source§

impl<T> ShaderType for VecDeque<T>
where T: ShaderType + ShaderSize, Self: Length,

Source§

impl<T> ShaderType for Rc<T>
where T: ShaderType + ?Sized,

Source§

impl<T> ShaderType for Arc<T>
where T: ShaderType + ?Sized,

Source§

impl<T> ShaderType for Vec<T>
where T: ShaderType + ShaderSize, Self: Length,

Source§

impl<T> ShaderType for Cell<T>
where T: ShaderType + Copy,

Source§

impl<T: ShaderType + ShaderSize, const N: usize> ShaderType for [T; N]

Implementors§