use crate::backend::BackendError;
pub struct HoneycrispDevice {
pub gpu: aruminium::Gpu,
pub queue: aruminium::Queue,
pub dispatch: aruminium::Dispatch,
}
unsafe impl Send for HoneycrispDevice {}
unsafe impl Sync for HoneycrispDevice {}
impl HoneycrispDevice {
pub fn new() -> Result<Self, BackendError> {
let gpu = aruminium::Gpu::open().map_err(|e| BackendError::BackendInit {
backend: "honeycrisp",
reason: format!("{e}"),
})?;
let queue = gpu.new_command_queue().map_err(|e| BackendError::BackendInit {
backend: "honeycrisp",
reason: format!("{e}"),
})?;
let dispatch = aruminium::Dispatch::new(&queue);
Ok(Self {
gpu,
queue,
dispatch,
})
}
pub fn pipeline(&self, source: &str) -> Result<aruminium::Pipeline, BackendError> {
let lib = self.gpu.compile(source).map_err(|e| BackendError::BackendInit {
backend: "honeycrisp",
reason: format!("compile: {e}"),
})?;
let shader = lib.function("kmain").map_err(|e| BackendError::BackendInit {
backend: "honeycrisp",
reason: format!("function lookup: {e}"),
})?;
self.gpu.pipeline(&shader).map_err(|e| BackendError::BackendInit {
backend: "honeycrisp",
reason: format!("pipeline: {e}"),
})
}
pub fn alloc(&self, size: usize) -> Result<aruminium::Buffer, BackendError> {
self.gpu
.buffer(size.max(4))
.map_err(|_| BackendError::OutOfMemory {
backend: "honeycrisp",
requested_bytes: size,
})
}
}