dynamic_ocl/safe/queue/
mod.rs1mod 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#[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 pub fn raw(&self) -> cl_command_queue {
75 self.0
76 }
77
78 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 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 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}