1use crate::Result;
10use bytemuck::Pod;
11use sycl_rs_sys::{kernel_bundle::ffi, types};
12
13pub struct SourceKernelBundle(pub(crate) cxx::UniquePtr<types::ffi::SourceKernelBundle>);
15
16impl From<cxx::UniquePtr<types::ffi::SourceKernelBundle>> for SourceKernelBundle {
17 fn from(value: cxx::UniquePtr<types::ffi::SourceKernelBundle>) -> Self {
18 Self(value)
19 }
20}
21
22impl SourceKernelBundle {
23 pub fn build(&mut self) -> Result<ExecutableKernelBundle> {
24 ffi::build(&mut self.0).map(Into::into)
25 }
26}
27
28pub struct ExecutableKernelBundle(pub(crate) cxx::UniquePtr<types::ffi::ExecutableKernelBundle>);
30
31impl From<cxx::UniquePtr<types::ffi::ExecutableKernelBundle>> for ExecutableKernelBundle {
32 fn from(value: cxx::UniquePtr<types::ffi::ExecutableKernelBundle>) -> Self {
33 Self(value)
34 }
35}
36
37impl ExecutableKernelBundle {
38 pub fn get_kernel(&mut self, name: &str) -> Result<Kernel> {
39 ffi::get_kernel(&mut self.0, name).map(Into::into)
40 }
41}
42
43pub struct Kernel(pub(crate) cxx::UniquePtr<types::ffi::Kernel>);
45
46impl From<cxx::UniquePtr<types::ffi::Kernel>> for Kernel {
47 fn from(value: cxx::UniquePtr<types::ffi::Kernel>) -> Self {
48 Self(value)
49 }
50}
51
52pub unsafe trait KernelArgument {
57 unsafe fn as_raw_arg(&self) -> &[u8];
62}
63
64unsafe impl<T: Pod> KernelArgument for T {
65 unsafe fn as_raw_arg(&self) -> &[u8] {
66 bytemuck::bytes_of(self)
67 }
68}
69
70pub unsafe trait KernelArgumentList<const ARGC: usize> {
75 unsafe fn as_raw_arg_list(&self) -> [&[u8]; ARGC];
80}
81
82unsafe impl KernelArgumentList<0> for () {
83 unsafe fn as_raw_arg_list(&self) -> [&[u8]; 0] {
84 []
85 }
86}
87
88unsafe impl<T: KernelArgument> KernelArgumentList<1> for T {
89 unsafe fn as_raw_arg_list(&self) -> [&[u8]; 1] {
90 [unsafe { self.as_raw_arg() }]
91 }
92}
93
94pub use sycl_rs_derive::KernelArgumentList;
95
96use sycl_rs_derive::impl_arg_list_for_tuples;
97
98impl_arg_list_for_tuples! {16}