ocl_macros/
buffer.rs

1use ocl::{flags, Buffer, MemFlags, Queue};
2
3#[allow(unused)]
4/// Creates a buffer of the specified size and flags. The type is inferred from the fill value.
5pub fn create_buffer<T: ocl::OclPrm, I: Into<ocl::SpatialDims> + Clone>(
6    queue: &Queue,
7    size: I,
8    fill_value: T,
9    flags: MemFlags,
10) -> Buffer<T> {
11    if (size.clone().into() as ocl::SpatialDims).to_len() >= 1 {
12        return Buffer::<T>::builder()
13            .queue(queue.clone())
14            .len(size)
15            .fill_val(fill_value)
16            .flags(flags::MEM_READ_WRITE)
17            .build()
18            .unwrap();
19    }
20    // use size of 1 if invalid
21    return Buffer::<T>::builder()
22        .queue(queue.clone())
23        .len([1])
24        .fill_val(fill_value)
25        .flags(flags::MEM_READ_WRITE)
26        .build()
27        .unwrap();
28}
29
30#[allow(unused)]
31/// Creates a vector from a buffer with the same size and type.
32pub fn create_vec_from_buffer<T: ocl::OclPrm>(buffer: &Buffer<T>) -> Vec<T> {
33    let s = buffer.len();
34    let v: Vec<T> = vec![T::default(); s];
35    v
36}
37
38#[macro_export]
39/// Creates a buffer of the specified size with MEM_READ_WRITE flags. The type is inferred from the fill value.
40///
41/// Syntax: `(queue: Queue, size: Into<ocl::SpatialDims>, fill: ocl::OclPrm)`
42macro_rules! buffer {
43    ($queue:expr, $size:expr, $fill:expr) => {{
44        buffer::create_buffer($queue, $size, $fill, ocl::flags::MEM_READ_WRITE)
45    }};
46}
47
48#[macro_export]
49/// Creates a buffer of the specified size and flags. The type is inferred from the fill value.
50///
51/// Syntax: `(queue: Queue, size: Into<ocl::SpatialDims>, fill: ocl::OclPrm, flags: ocl::MemFlags)`
52macro_rules! buffer_flags {
53    ($queue:expr, $size:expr, $fill:expr, $flags:expr) => {{
54        buffer::create_buffer($queue, $size, $fill, $flags)
55    }};
56}
57
58#[macro_export]
59/// Reads a buffer into a vector.
60///
61/// Syntax: `(buffer: Buffer<T>, vec: Vec<T>)`
62macro_rules! bread {
63    ($buffer:expr, $vec:expr) => {{
64        $buffer.read(&mut $vec).enq().unwrap();
65    }};
66}
67
68#[macro_export]
69/// Writes a vector into a buffer.
70///
71/// Syntax: `(buffer: Buffer<T>, vec: Vec<T>)`
72macro_rules! bwrite {
73    ($buffer:expr, $vec:expr) => {{
74        $buffer.write(&$vec).enq().unwrap();
75    }};
76}
77
78#[macro_export]
79/// Creates a new vector from a buffer.
80///
81/// Syntax: `(buffer: Buffer<T>)`
82macro_rules! bget {
83    ($buffer:expr) => {{
84        let mut vec = buffer::create_vec_from_buffer(&$buffer);
85        $buffer.read(&mut vec).enq().unwrap();
86        vec
87    }};
88}