#[derive(Copy, Clone, bytemuck::NoUninit)]
#[repr(C)]
pub struct ModelUniforms {
pub model: [[f32; 4]; 4],
}
#[derive(Copy, Clone, bytemuck::NoUninit)]
#[repr(C)]
pub struct CullUniforms {
pub planes: [[f32; 4]; 6],
pub cam_pos: [f32; 4],
pub prev_view_proj: [[f32; 4]; 4],
pub hiz_size: [f32; 2],
pub hiz_mip_count: u32,
pub hiz_enabled: u32,
pub object_count: u32,
pub skinned_base: u32,
pub cascade_base: u32,
pub bucket_count: u32,
}
#[derive(Copy, Clone, bytemuck::NoUninit)]
#[repr(C)]
pub struct EncodeParams {
pub object_count: u32,
pub region_count: u32,
pub region_mask: u32,
pub skinned_base: u32,
pub bucket_count: u32,
pub draw_status: u32,
pub _pad: [u32; 2],
}
#[derive(Copy, Clone)]
#[repr(C)]
pub struct VelocityUniforms {
pub jittered_vp: [[f32; 4]; 4],
pub cur_vp: [[f32; 4]; 4],
pub prev_vp: [[f32; 4]; 4],
}
#[cfg(test)]
mod tests {
use super::*;
use core::mem::{offset_of, size_of};
#[test]
fn cull_uniforms_layout_matches_the_shader() {
assert_eq!(size_of::<CullUniforms>(), 208);
assert_eq!(offset_of!(CullUniforms, planes), 0);
assert_eq!(offset_of!(CullUniforms, cam_pos), 96);
assert_eq!(offset_of!(CullUniforms, prev_view_proj), 112);
assert_eq!(offset_of!(CullUniforms, hiz_size), 176);
assert_eq!(offset_of!(CullUniforms, hiz_mip_count), 184);
assert_eq!(offset_of!(CullUniforms, hiz_enabled), 188);
assert_eq!(offset_of!(CullUniforms, object_count), 192);
assert_eq!(offset_of!(CullUniforms, skinned_base), 196);
assert_eq!(offset_of!(CullUniforms, cascade_base), 200);
assert_eq!(offset_of!(CullUniforms, bucket_count), 204);
assert_eq!(size_of::<CullUniforms>() % 16, 0);
}
#[test]
fn encode_params_layout_matches_msl() {
assert_eq!(size_of::<EncodeParams>(), 32);
assert_eq!(offset_of!(EncodeParams, object_count), 0);
assert_eq!(offset_of!(EncodeParams, region_count), 4);
assert_eq!(offset_of!(EncodeParams, region_mask), 8);
assert_eq!(offset_of!(EncodeParams, skinned_base), 12);
assert_eq!(offset_of!(EncodeParams, bucket_count), 16);
assert_eq!(offset_of!(EncodeParams, draw_status), 20);
assert_eq!(offset_of!(EncodeParams, _pad), 24);
}
#[test]
fn velocity_uniforms_layout_matches_msl() {
assert_eq!(size_of::<VelocityUniforms>(), 192);
assert_eq!(offset_of!(VelocityUniforms, jittered_vp), 0);
assert_eq!(offset_of!(VelocityUniforms, cur_vp), 64);
assert_eq!(offset_of!(VelocityUniforms, prev_vp), 128);
}
}