clay_core/buffer/
render_buffer.rs

1use ocl;
2use rand::{Rng, thread_rng};
3use crate::Context;
4
5
6/// Buffer that stores necessary data for rendering (e.g. collected statistics, rng seeds, etc).
7pub 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}