use super::api::types as cl;
use super::api::{Error, API};
use super::Context;
use super::Device;
use super::Event;
use super::Program;
#[derive(Debug, Clone)]
#[allow(missing_copy_implementations)]
pub struct Queue {
id: isize,
}
impl Queue {
pub fn new(
context: &Context,
device: &Device,
queue_flags: Option<&QueueFlags>,
) -> Result<Queue, Error> {
let default_flags = QueueFlags::default();
let flags = queue_flags.unwrap_or(&default_flags);
API::create_queue(context, device, flags)
}
pub fn from_isize(id: isize) -> Queue {
Queue { id: id }
}
pub fn from_c(id: cl::queue_id) -> Queue {
Queue { id: id as isize }
}
pub fn id(&self) -> isize {
self.id
}
pub fn id_c(&self) -> cl::queue_id {
self.id as cl::queue_id
}
pub fn enqueue_kernel(
&mut self,
kernel: &Program,
work_dim: u32,
global_work_offset: usize,
global_work_size: usize,
local_work_size: usize,
event_wait_list: &[Event],
) -> Result<Event, Error> {
API::enqueue_kernel(
self,
kernel,
work_dim,
global_work_offset,
global_work_size,
local_work_size,
event_wait_list,
)
}
}
bitflags! {
#[allow(missing_docs)]
pub struct QueueFlags: cl::bitfield {
#[allow(missing_docs)]
const CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE = 1 << 0;
#[allow(missing_docs)]
const CL_QUEUE_PROFILING_ENABLE = 1 << 1;
}
}
impl Default for QueueFlags {
fn default() -> QueueFlags {
QueueFlags::empty()
}
}