Skip to main content

enki/enki_api/resources/vec/
mod.rs

1pub mod core;
2pub mod dispatch;
3pub mod format;
4pub mod lifecycle;
5pub mod ops;
6pub mod state;
7pub mod transfer;
8
9pub use self::core::GpuVec;
10pub use self::state::{BufferPhase, PhaseViolationError};
11
12impl<T: Copy + Send + Sync + 'static> From<GpuVec<T>> for Vec<T> {
13    #[inline(always)]
14    fn from(gpu_vec: GpuVec<T>) -> Self {
15        gpu_vec.to_vec()
16    }
17}
18
19impl<T: Copy + Send + Sync + 'static> From<&[T]> for GpuVec<T> {
20    #[inline(always)]
21    fn from(slice: &[T]) -> Self {
22        GpuVec::from_slice(slice)
23    }
24}
25
26impl<T: Copy + Send + Sync + 'static> From<Vec<T>> for GpuVec<T> {
27    #[inline(always)]
28    fn from(vec: Vec<T>) -> Self {
29        GpuVec::from_slice(&vec)
30    }
31}
32
33/// Creates a [`GpuVec`] containing the provided arguments.
34///
35/// Matches standard Rust `vec!` syntax:
36/// ```rust
37/// use enki::gpu_vec;
38///
39/// // Explicit elements
40/// let v1 = gpu_vec![1u32, 2, 3, 4];
41///
42/// // Repeating elements
43/// let v2 = gpu_vec![0.0f32; 1024];
44/// ```
45#[macro_export]
46macro_rules! gpu_vec {
47    () => {
48        $crate::enki_api::resources::GpuVec::new()
49    };
50    ($elem:expr; $n:expr) => {
51        $crate::enki_api::resources::GpuVec::from_elem($elem, $n)
52    };
53    ($($x:expr),* $(,)?) => {
54        $crate::enki_api::resources::GpuVec::from_slice(&[$($x),*])
55    };
56}