use silvic_core::Result;
pub enum Arg<'a, B> {
Buffer(&'a B),
Bytes(&'a [u8]),
}
pub trait GpuDevice {
type Buffer;
const PRELUDE: &'static str;
fn name(&self) -> String;
fn max_threads_per_group(&self) -> u32;
fn alloc(&self, bytes: usize) -> Result<Self::Buffer>;
fn upload(&self, buffer: &Self::Buffer, offset: usize, data: &[u8]) -> Result<()>;
fn download(&self, buffer: &Self::Buffer, offset: usize, out: &mut [u8]) -> Result<()>;
fn compile(&mut self, source: &str, kernels: &[&str]) -> Result<()>;
fn launch(&self, kernel: usize, grid: [u32; 3], block: [u32; 3], args: &[Arg<'_, Self::Buffer>]) -> Result<()>;
fn sync(&self) -> Result<()>;
fn flush(&self) -> Result<()> {
Ok(())
}
}