clay_core/buffer/
image_buffer.rs1use ocl;
2use image;
3use crate::Context;
4
5pub struct Image {
7 bytes: ocl::Buffer<u8>,
8 dims: (usize, usize),
9}
10
11impl Image {
12 pub fn new(context: &Context, dims: (usize, usize)) -> crate::Result<Self> {
13 let len = 3*dims.0*dims.1;
14
15 let bytes = ocl::Buffer::<u8>::builder()
16 .queue(context.queue().clone())
17 .flags(ocl::flags::MEM_WRITE_ONLY)
18 .len(len)
19 .fill_val(0 as u8)
20 .build()?;
21
22 Ok(Image {
23 bytes, dims,
24 })
25 }
26
27 pub fn read(&self) -> crate::Result<Vec<u8>> {
28 let mut vec = vec![0 as u8; self.bytes.len()];
29
30 self.bytes.cmd()
31 .offset(0)
32 .read(&mut vec)
33 .enq()?;
34
35 Ok(vec)
36 }
37
38 pub fn bytes(&self) -> &ocl::Buffer<u8> {
39 &self.bytes
40 }
41 pub fn bytes_mut(&mut self) -> &mut ocl::Buffer<u8> {
42 &mut self.bytes
43 }
44
45 pub fn dims(&self) -> (usize, usize) {
46 self.dims
47 }
48 pub fn len(&self) -> usize {
49 3*self.dims.0*self.dims.1
50 }
51
52 pub fn save_to_file(&self, filename: &str) -> crate::Result<()> {
53 image::save_buffer(
54 &filename,
55 &self.read()?,
56 self.dims.0 as u32, self.dims.1 as u32,
57 image::RGB(8),
58 )?;
59 Ok(())
60 }
61}