MaikKlein / rlsl

Rust to SPIR-V compiler
Apache License 2.0
557 stars 14 forks source link

Implement intrinsic types through traits #50

Open MaikKlein opened 6 years ago

MaikKlein commented 6 years ago
pub trait SpirvVector {
    type Intrinsic: Intrinsic;
}

unsafe trait Intrinsic {}

// This type has the metainformation
#[spirv(Vector3)]
struct SpirvVec3;

unsafe impl Intrinsic for SpirvVec3{}

impl SpirvVector for SomeExternalMathVec3 {
    type Intrinsic = SpirvVec3;
}

// Check if a given type implements SpirvVector, if it does then access the Intrinsic type which
// has the metainformation to generate a specific OpVector type.

// Some pseudo code

let trait_impl: Option<TraitImpl> = tcx.get_impl_of_trait(ty, def_id);
let associated_ty: Option<Ty> = trait_impl.and_then(|trait_impl| trait_impl.associated_types_iter().first());

fn type_moves_by_default should be enough to figure out how trait system works in rustc