123 lines
4.4 KiB
Rust
123 lines
4.4 KiB
Rust
#![cfg_attr(
|
|
target_arch = "spirv",
|
|
feature(register_attr),
|
|
register_attr(spirv),
|
|
no_std
|
|
)]
|
|
#![feature(const_fn_floating_point_arithmetic)]
|
|
|
|
extern crate spirv_std;
|
|
|
|
pub use spirv_std::glam;
|
|
#[cfg(not(target_arch = "spirv"))]
|
|
use spirv_std::macros::spirv;
|
|
|
|
pub mod mat;
|
|
pub mod sim;
|
|
pub mod support;
|
|
|
|
pub use sim::{SerializedSimMeta, SerializedStepE, SerializedStepH};
|
|
pub use support::{Optional, UnsizedArray};
|
|
|
|
use mat::{IsoConductorOr, Ferroxcube3R1MH, FullyGenericMaterial, Material};
|
|
|
|
use coremem_types::vecu::Vec3u;
|
|
use coremem_types::vec::Vec3;
|
|
|
|
type Iso3R1 = IsoConductorOr<Ferroxcube3R1MH>;
|
|
|
|
fn glam_vec_to_internal(v: glam::UVec3) -> Vec3u {
|
|
Vec3u::new(v.x, v.y, v.z)
|
|
}
|
|
|
|
fn step_h<M: Material>(
|
|
id: Vec3u,
|
|
meta: &SerializedSimMeta,
|
|
stimulus_h: &UnsizedArray<Vec3<f32>>,
|
|
material: &UnsizedArray<M>,
|
|
e: &UnsizedArray<Vec3<f32>>,
|
|
h: &mut UnsizedArray<Vec3<f32>>,
|
|
m: &mut UnsizedArray<Vec3<f32>>,
|
|
) {
|
|
if id.x() < meta.dim.x() && id.y() < meta.dim.y() && id.z() < meta.dim.z() {
|
|
let sim_state = SerializedStepH::new(meta, stimulus_h, material, e, h, m);
|
|
let update_state = sim_state.index(id);
|
|
update_state.step_h();
|
|
}
|
|
}
|
|
|
|
fn step_e<M: Material>(
|
|
id: Vec3u,
|
|
meta: &SerializedSimMeta,
|
|
stimulus_e: &UnsizedArray<Vec3<f32>>,
|
|
material: &UnsizedArray<M>,
|
|
e: &mut UnsizedArray<Vec3<f32>>,
|
|
h: &UnsizedArray<Vec3<f32>>,
|
|
) {
|
|
if id.x() < meta.dim.x() && id.y() < meta.dim.y() && id.z() < meta.dim.z() {
|
|
let sim_state = SerializedStepE::new(meta, stimulus_e, material, e, h);
|
|
|
|
let update_state = sim_state.index(id);
|
|
update_state.step_e();
|
|
}
|
|
}
|
|
|
|
/// Return the step_h/step_e entry point names for the provided material
|
|
pub fn entry_points<M: 'static>() -> Optional<(&'static str, &'static str)> {
|
|
use core::any::TypeId;
|
|
let mappings = [
|
|
(TypeId::of::<FullyGenericMaterial>(),
|
|
("step_h_generic_material", "step_e_generic_material")
|
|
),
|
|
(TypeId::of::<Iso3R1>(),
|
|
("step_h_iso_3r1", "step_e_iso_3r1")
|
|
),
|
|
];
|
|
|
|
for (id, names) in mappings {
|
|
if id == TypeId::of::<M>() {
|
|
return Optional::some(names);
|
|
}
|
|
}
|
|
Optional::none()
|
|
}
|
|
|
|
macro_rules! steps {
|
|
($mat:ty, $step_h:ident, $step_e:ident) => {
|
|
// LocalSize/numthreads
|
|
#[spirv(compute(threads(4, 4, 4)))]
|
|
pub fn $step_h(
|
|
#[spirv(global_invocation_id)] id: glam::UVec3,
|
|
#[spirv(storage_buffer, descriptor_set = 0, binding = 0)] meta: &SerializedSimMeta,
|
|
// XXX: delete this input?
|
|
#[spirv(storage_buffer, descriptor_set = 0, binding = 1)] _unused_stimulus_e: &UnsizedArray<Vec3<f32>>,
|
|
#[spirv(storage_buffer, descriptor_set = 0, binding = 2)] stimulus_h: &UnsizedArray<Vec3<f32>>,
|
|
#[spirv(storage_buffer, descriptor_set = 0, binding = 3)] material: &UnsizedArray<$mat>,
|
|
#[spirv(storage_buffer, descriptor_set = 0, binding = 4)] e: &UnsizedArray<Vec3<f32>>,
|
|
#[spirv(storage_buffer, descriptor_set = 0, binding = 5)] h: &mut UnsizedArray<Vec3<f32>>,
|
|
#[spirv(storage_buffer, descriptor_set = 0, binding = 6)] m: &mut UnsizedArray<Vec3<f32>>,
|
|
) {
|
|
step_h(glam_vec_to_internal(id), meta, stimulus_h, material, e, h, m)
|
|
}
|
|
|
|
#[spirv(compute(threads(4, 4, 4)))]
|
|
pub fn $step_e(
|
|
#[spirv(global_invocation_id)] id: glam::UVec3,
|
|
#[spirv(storage_buffer, descriptor_set = 0, binding = 0)] meta: &SerializedSimMeta,
|
|
#[spirv(storage_buffer, descriptor_set = 0, binding = 1)] stimulus_e: &UnsizedArray<Vec3<f32>>,
|
|
// XXX: delete this input?
|
|
#[spirv(storage_buffer, descriptor_set = 0, binding = 2)] _unused_stimulus_h: &UnsizedArray<Vec3<f32>>,
|
|
#[spirv(storage_buffer, descriptor_set = 0, binding = 3)] material: &UnsizedArray<$mat>,
|
|
#[spirv(storage_buffer, descriptor_set = 0, binding = 4)] e: &mut UnsizedArray<Vec3<f32>>,
|
|
#[spirv(storage_buffer, descriptor_set = 0, binding = 5)] h: &UnsizedArray<Vec3<f32>>,
|
|
// XXX: can/should this m input be deleted?
|
|
#[spirv(storage_buffer, descriptor_set = 0, binding = 6)] _unused_m: &UnsizedArray<Vec3<f32>>,
|
|
) {
|
|
step_e(glam_vec_to_internal(id), meta, stimulus_e, material, e, h)
|
|
}
|
|
};
|
|
}
|
|
|
|
steps!(FullyGenericMaterial, step_h_generic_material, step_e_generic_material);
|
|
steps!(Iso3R1, step_h_iso_3r1, step_e_iso_3r1);
|