cobra_rhi/
lib.rs

1pub mod slang;
2pub mod traits;
3pub use traits::*;
4
5#[cfg(feature="vulkan")]
6pub mod vulkan;
7#[cfg(feature="directx")]
8pub mod directx;
9
10pub use anyhow::{Result, Error};
11pub use glam::*;
12
13use paste::paste;
14
15#[cfg(feature="vulkan")]
16pub struct Vulkan;
17#[cfg(feature="directx")]
18pub struct Directx;
19
20macro_rules! create_primitive {
21    ($name:ident) => {
22        paste! {
23            pub trait [<$name Primitive>]<T>
24                where Self::Inner: [<I $name>]<T>, T: CobraType<T> {
25                type Inner;
26            }
27
28            #[cfg(feature="vulkan")]
29            impl [<$name Primitive>]<Vulkan> for Vulkan { type Inner = vulkan::mappings::[<$name Vulkan>]; }
30            #[cfg(feature="directx")]
31            impl [<$name Primitive>]<Directx> for Directx { type Inner = directx::mappings::[<$name Directx>]; }
32            pub type $name<T> = <T as [<$name Primitive>]<T>>::Inner;
33        }
34    };
35}
36
37pub trait CobraType<T>: CobraPrimitive<T> + 
38    BufferPrimitive<T> + ImagePrimitive<T> + SamplerPrimitive<T> +
39    CommandListPrimitive<T> + QueuePrimitive<T> + FencePrimitive<T> + 
40    SwapchainPrimitive<T>
41    where T: CobraType<T> { }
42#[cfg(feature="vulkan")]
43impl CobraType<Vulkan> for Vulkan { }
44#[cfg(feature="directx")]
45impl CobraType<Directx> for Directx { }
46
47create_primitive!(Cobra);
48
49create_primitive!(Buffer);
50create_primitive!(Image);
51create_primitive!(Sampler);
52
53create_primitive!(CommandList);
54create_primitive!(Queue);
55create_primitive!(Fence);
56
57create_primitive!(Swapchain);