use {Context, Device, Error, ErrorKind, ExtensionPackage, Result};
use std::marker::Unsize;
use super::OpenCLDevice;
use super::super::high;
use utility::Uninitialized;
#[derive(Debug)]
pub struct OpenCLContext<X> {
pub(super) context: high::Context,
pub(super) package: X,
pub(super) selection: Vec<OpenCLDevice>,
pub(super) active: usize,
}
impl<X> OpenCLContext<X> {
pub fn package(&self) -> &X {
&self.package
}
pub fn device(&self) -> &OpenCLDevice {
&self.selection[self.active]
}
}
impl OpenCLContext<Uninitialized> {
pub fn create_program<I>(&mut self, src: &[I]) -> Result<high::Program> where I: AsRef<str> {
let program = self.context.create_program_with_source(src)?;
let raw_devices: Vec<_> = self.selection.iter().map(|d| d.device.clone()).collect();
program.build(&raw_devices, None )?;
Ok(program)
}
}
impl<X> Context for OpenCLContext<X>
where X: ExtensionPackage,
OpenCLContext<X>: Unsize<X::Extension> {
type Package = X;
fn active_device(&self) -> &Device {
&self.selection[self.active]
}
fn set_active(&mut self, idx: usize) -> Result {
if idx >= self.selection.len() {
return Err(Error::new(ErrorKind::Other, "device index out of range"));
}
self.active = idx;
Ok(())
}
fn extension(&self) -> &X::Extension {
self
}
}