Skip to main content

dynamic_ocl/safe/queue/
mod.rs

1//! Command queues
2//!
3//! In OpenCL, command queues are used to perform operations that involve state,
4//! like interacting with buffers and executing kernels.
5
6mod types;
7
8use crate::buffer::flags::HostAccess;
9use crate::buffer::{AsBuffer, MemSafe};
10use crate::device::Device;
11use crate::kernel::{Kernel, KernelArgList};
12use crate::raw::*;
13use crate::util::sealed::OclInfoInternal;
14use crate::Result;
15use std::ffi::c_void;
16use std::fmt;
17use std::fmt::{Debug, Formatter};
18pub use types::*;
19
20/// An OpenCL command queue
21#[derive(PartialEq, Eq, Hash)]
22pub struct Queue(pub(crate) cl_command_queue);
23
24unsafe impl Send for Queue {}
25
26impl Drop for Queue {
27    fn drop(&mut self) {
28        unsafe {
29            if let Err(e) = wrap_result!("clReleaseCommandQueue" => clReleaseCommandQueue(self.0)) {
30                log::warn!("Error releasing OpenCL command queue {:?}: {:?}", self, e);
31            }
32        }
33    }
34}
35
36impl Debug for Queue {
37    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
38        self.info_fmt(f)
39    }
40}
41
42impl OclInfoInternal for Queue {
43    type Param = cl_command_queue_info;
44    const DEBUG_CONTEXT: &'static str = "clGetCommandQueueInfo";
45
46    unsafe fn raw_info_internal(
47        &self,
48        param_name: Self::Param,
49        param_value_size: usize,
50        param_value: *mut c_void,
51        param_value_size_ret: *mut usize,
52    ) -> i32 {
53        clGetCommandQueueInfo(
54            self.0,
55            param_name,
56            param_value_size,
57            param_value,
58            param_value_size_ret,
59        )
60    }
61}
62
63impl Queue {
64    pub fn try_clone(&self) -> Result<Self> {
65        unsafe {
66            wrap_result!("clRetainCommandQueue" => clRetainCommandQueue(self.0))?;
67            Ok(Self(self.0))
68        }
69    }
70
71    /// Get the raw handle for this queue. Note that this handle is only a raw
72    /// pointer and does not use RAII to ensure validity, so you must manually
73    /// make sure that it's not released while still in use.
74    pub fn raw(&self) -> cl_command_queue {
75        self.0
76    }
77
78    /// Wrap the given raw command queue handle
79    ///
80    /// # Safety
81    ///
82    /// If the given handle is not a valid OpenCL queue, behavior is undefined.
83    /// Additionally, the reference count must stay above zero until the wrapper
84    /// is dropped (which will implicitly release the handle and decrement the
85    /// reference count).
86    pub unsafe fn from_raw(handle: cl_command_queue) -> Self {
87        Self(handle)
88    }
89
90    info_funcs! {
91        pub fn context_raw(&self) -> cl_context = CL_QUEUE_CONTEXT;
92        pub fn device_raw(&self) -> cl_device_id = CL_QUEUE_DEVICE;
93        pub fn reference_count(&self) -> cl_uint = CL_QUEUE_REFERENCE_COUNT;
94        pub fn properties(&self) -> QueueProperties = CL_QUEUE_PROPERTIES;
95        pub fn size(&self) -> cl_uint = CL_QUEUE_SIZE;
96        pub fn device_default_raw(&self) -> cl_command_queue = CL_QUEUE_DEVICE_DEFAULT;
97    }
98
99    pub fn device(&self) -> Result<Device> {
100        self.device_raw().map(Device)
101    }
102
103    pub fn device_default(&self) -> Result<Queue> {
104        self.device_default_raw().map(Queue)
105    }
106
107    /// Begin a new buffer command
108    pub fn buffer_cmd<'q, 'a, H: HostAccess, T: MemSafe>(
109        &'q mut self,
110        buffer: &'q mut dyn AsBuffer<'a, H, T>,
111    ) -> BufferCmd<'q, 'a, H, T> {
112        BufferCmd {
113            queue: self,
114            buffer,
115            offset: None,
116        }
117    }
118
119    /// Begin a new kernel execution command
120    pub fn kernel_cmd<'q, T: KernelArgList, W: WorkDims>(
121        &'q mut self,
122        kernel: &'q mut Kernel<T>,
123    ) -> KernelCmd<'q, T, W> {
124        KernelCmd {
125            queue: self,
126            kernel,
127            global_work_offset: None,
128            local_work_size: None,
129        }
130    }
131}