clay_core/buffer/
render_buffer.rs1use ocl;
2use rand::{Rng, thread_rng};
3use crate::Context;
4
5
6pub struct RenderBuffer {
8 context: Context,
9 random: ocl::Buffer<u32>,
10 color: ocl::Buffer<f32>,
11 n_passes: usize,
12 dims: (usize, usize),
13}
14
15impl RenderBuffer {
16 pub fn new(context: &Context, dims: (usize, usize)) -> crate::Result<Self> {
17 let len = dims.0*dims.1;
18
19 let random = ocl::Buffer::<u32>::builder()
20 .queue(context.queue().clone())
21 .flags(ocl::flags::MEM_READ_WRITE)
22 .len(len)
23 .fill_val(0 as u32)
24 .build()?;
25
26 let mut seed = vec![0u32; len];
27 thread_rng().fill(&mut seed[..]);
28
29 random.cmd()
30 .offset(0)
31 .write(&seed)
32 .enq()?;
33
34 let color = ocl::Buffer::<f32>::builder()
35 .queue(context.queue().clone())
36 .flags(ocl::flags::MEM_READ_WRITE)
37 .len(3*len)
38 .fill_val(0 as f32)
39 .build()?;
40
41 Ok(Self {
42 context: context.clone(),
43 random, color,
44 n_passes: 0,
45 dims,
46 })
47 }
48
49 pub fn pass(&mut self) {
50 self.n_passes += 1;
51 }
52 pub fn clear(&mut self) -> crate::Result<()> {
53 self.color.cmd()
54 .offset(0)
55 .fill(0f32, None)
56 .enq()?;
57
58 self.n_passes = 0;
59 Ok(())
60 }
61
62 pub fn context(&self) -> &Context {
63 &self.context
64 }
65
66 pub fn random(&self) -> &ocl::Buffer<u32> {
67 &self.random
68 }
69 pub fn random_mut(&mut self) -> &mut ocl::Buffer<u32> {
70 &mut self.random
71 }
72 pub fn color(&self) -> &ocl::Buffer<f32> {
73 &self.color
74 }
75 pub fn color_mut(&mut self) -> &mut ocl::Buffer<f32> {
76 &mut self.color
77 }
78 pub fn n_passes(&self) -> usize {
79 self.n_passes
80 }
81
82 pub fn dims(&self) -> (usize, usize) {
83 self.dims
84 }
85 pub fn len(&self) -> usize {
86 self.dims.0*self.dims.1
87 }
88}