Cycles: merge of changes from tomato branch.
[blender-staging.git] / intern / cycles / render / buffers.h
1 /*
2  * Copyright 2011, Blender Foundation.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18
19 #ifndef __BUFFERS_H__
20 #define __BUFFERS_H__
21
22 #include "device_memory.h"
23
24 #include "film.h"
25
26 #include "kernel_types.h"
27
28 #include "util_string.h"
29 #include "util_thread.h"
30 #include "util_types.h"
31
32 CCL_NAMESPACE_BEGIN
33
34 class Device;
35 struct float4;
36
37 /* Buffer Parameters
38  * Size of render buffer and how it fits in the full image (border render). */
39
40 class BufferParams {
41 public:
42         /* width/height of the physical buffer */
43         int width;
44         int height;
45
46         /* offset into and width/height of the full buffer */
47         int full_x;
48         int full_y;
49         int full_width;
50         int full_height;
51
52         /* passes */
53         vector<Pass> passes;
54
55         /* functions */
56         BufferParams();
57
58         void get_offset_stride(int& offset, int& stride);
59         bool modified(const BufferParams& params);
60         void add_pass(PassType type);
61         int get_passes_size();
62 };
63
64 /* Render Buffers */
65
66 class RenderBuffers {
67 public:
68         /* buffer parameters */
69         BufferParams params;
70
71         /* float buffer */
72         device_vector<float> buffer;
73         /* random number generator state */
74         device_vector<uint> rng_state;
75
76         RenderBuffers(Device *device);
77         ~RenderBuffers();
78
79         void reset(Device *device, BufferParams& params);
80
81         bool copy_from_device();
82         bool get_pass_rect(PassType type, float exposure, int sample, int components, float *pixels);
83
84 protected:
85         void device_free();
86
87         Device *device;
88 };
89
90 /* Display Buffer
91  *
92  * The buffer used for drawing during render, filled by tonemapping the render
93  * buffers and converting to uchar4 storage. */
94
95 class DisplayBuffer {
96 public:
97         /* buffer parameters */
98         BufferParams params;
99         /* dimensions for how much of the buffer is actually ready for display.
100          * with progressive render we can be using only a subset of the buffer.
101          * if these are zero, it means nothing can be drawn yet */
102         int draw_width, draw_height;
103         /* draw alpha channel? */
104         bool transparent;
105         /* byte buffer for tonemapped result */
106         device_vector<uchar4> rgba;
107
108         DisplayBuffer(Device *device);
109         ~DisplayBuffer();
110
111         void reset(Device *device, BufferParams& params);
112         void write(Device *device, const string& filename);
113
114         void draw_set(int width, int height);
115         void draw(Device *device);
116         bool draw_ready();
117
118 protected:
119         void device_free();
120
121         Device *device;
122 };
123
124 /* Render Tile
125  * Rendering task on a buffer */
126
127 class RenderTile {
128 public:
129         int x, y, w, h;
130         int start_sample;
131         int num_samples;
132         int sample;
133         int resolution;
134         int offset;
135         int stride;
136
137         device_ptr buffer;
138         device_ptr rng_state;
139         device_ptr rgba;
140
141         RenderBuffers *buffers;
142
143         RenderTile();
144 };
145
146 CCL_NAMESPACE_END
147
148 #endif /* __BUFFERS_H__ */
149