Cycles: OpenCL tweaks
[blender.git] / intern / cycles / kernel / kernel_types.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 __KERNEL_TYPES_H__
20 #define __KERNEL_TYPES_H__
21
22 #include "kernel_math.h"
23
24 #include "svm/svm_types.h"
25
26 CCL_NAMESPACE_BEGIN
27
28 /* constants */
29 #define OBJECT_SIZE             16
30 #define LIGHT_SIZE                      4
31 #define FILTER_TABLE_SIZE       256
32
33 /* device capabilities */
34 #ifdef __KERNEL_CPU__
35 #define __KERNEL_SHADING__
36 #define __KERNEL_ADV_SHADING__
37 #endif
38
39 #ifdef __KERNEL_CUDA__
40 #define __KERNEL_SHADING__
41 #if __CUDA_ARCH__ >= 200
42 #define __KERNEL_ADV_SHADING__
43 #endif
44 #endif
45
46 #ifdef __KERNEL_OPENCL__
47 //#define __KERNEL_SHADING__
48 //#define __KERNEL_ADV_SHADING__
49 #endif
50
51 /* kernel features */
52 #define __SOBOL__
53 #define __INSTANCING__
54 #define __DPDU__
55 #define __UV__
56 #define __BACKGROUND__
57 #define __CAUSTICS_TRICKS__
58 #define __VISIBILITY_FLAG__
59 #define __RAY_DIFFERENTIALS__
60 #define __CAMERA_CLIPPING__
61 #define __INTERSECTION_REFINE__
62
63 #ifdef __KERNEL_SHADING__
64 #define __SVM__
65 #define __EMISSION__
66 #define __TEXTURES__
67 #define __HOLDOUT__
68 #endif
69
70 #ifdef __KERNEL_ADV_SHADING__
71 #define __MULTI_CLOSURE__
72 #define __TRANSPARENT_SHADOWS__
73 #endif
74
75 //#define __MULTI_LIGHT__
76 //#define __OSL__
77 //#define __SOBOL_FULL_SCREEN__
78 //#define __MODIFY_TP__
79 //#define __QBVH__
80
81 /* Path Tracing */
82
83 enum PathTraceDimension {
84         PRNG_FILTER_U = 0,
85         PRNG_FILTER_V = 1,
86         PRNG_LENS_U = 2,
87         PRNG_LENS_V = 3,
88         PRNG_BASE_NUM = 4,
89
90         PRNG_BSDF_U = 0,
91         PRNG_BSDF_V = 1,
92         PRNG_BSDF = 2,
93         PRNG_LIGHT = 3,
94         PRNG_LIGHT_U = 4,
95         PRNG_LIGHT_V = 5,
96         PRNG_LIGHT_F = 6,
97         PRNG_TERMINATE = 7,
98         PRNG_BOUNCE_NUM = 8
99 };
100
101 /* these flag values correspond exactly to OSL defaults, so be careful not to
102  * change this, or if you do, set the "raytypes" shading system attribute with
103  * your own new ray types and bitflag values */
104
105 enum PathRayFlag {
106         PATH_RAY_CAMERA = 1,
107         PATH_RAY_REFLECT = 2,
108         PATH_RAY_TRANSMIT = 4,
109         PATH_RAY_DIFFUSE = 8,
110         PATH_RAY_GLOSSY = 16,
111         PATH_RAY_SINGULAR = 32,
112         PATH_RAY_TRANSPARENT = 64,
113
114         PATH_RAY_SHADOW_OPAQUE = 128,
115         PATH_RAY_SHADOW_TRANSPARENT = 256,
116         PATH_RAY_SHADOW = (PATH_RAY_SHADOW_OPAQUE|PATH_RAY_SHADOW_TRANSPARENT),
117
118         PATH_RAY_MIS_SKIP = 512,
119
120         PATH_RAY_ALL = (1|2|4|8|16|32|64|128|256|512)
121 };
122
123 /* Closure Label */
124
125 typedef enum ClosureLabel {
126         LABEL_NONE = 0,
127         LABEL_CAMERA = 1,
128         LABEL_LIGHT = 2,
129         LABEL_BACKGROUND = 4,
130         LABEL_TRANSMIT = 8,
131         LABEL_REFLECT = 16,
132         LABEL_VOLUME = 32,
133         LABEL_OBJECT = 64,
134         LABEL_DIFFUSE = 128,
135         LABEL_GLOSSY = 256,
136         LABEL_SINGULAR = 512,
137         LABEL_TRANSPARENT = 1024,
138         LABEL_STOP = 2048
139 } ClosureLabel;
140
141 /* Shader Flag */
142
143 typedef enum ShaderFlag {
144         SHADER_SMOOTH_NORMAL = (1 << 31),
145         SHADER_CAST_SHADOW = (1 << 30),
146         SHADER_AREA_LIGHT = (1 << 29),
147
148         SHADER_MASK = ~(SHADER_SMOOTH_NORMAL|SHADER_CAST_SHADOW|SHADER_AREA_LIGHT)
149 } ShaderFlag;
150
151 /* Light Type */
152
153 typedef enum LightType {
154         LIGHT_POINT,
155         LIGHT_DISTANT,
156         LIGHT_AREA
157 } LightType;
158
159 /* Differential */
160
161 typedef struct differential3 {
162         float3 dx;
163         float3 dy;
164 } differential3;
165
166 typedef struct differential {
167         float dx;
168         float dy;
169 } differential;
170
171 /* Ray */
172
173 typedef struct Ray {
174         float3 P;
175         float3 D;
176         float t;
177
178 #ifdef __RAY_DIFFERENTIALS__
179         differential3 dP;
180         differential3 dD;
181 #endif
182 } Ray;
183
184 /* Intersection */
185
186 typedef struct Intersection {
187         float t, u, v;
188         int prim;
189         int object;
190 } Intersection;
191
192 /* Attributes */
193
194 typedef enum AttributeElement {
195         ATTR_ELEMENT_FACE,
196         ATTR_ELEMENT_VERTEX,
197         ATTR_ELEMENT_CORNER,
198         ATTR_ELEMENT_VALUE,
199         ATTR_ELEMENT_NONE
200 } AttributeElement;
201
202 /* Closure data */
203
204 #define MAX_CLOSURE 8
205
206 typedef struct ShaderClosure {
207         ClosureType type;
208         float3 weight;
209
210 #ifdef __MULTI_CLOSURE__
211         float sample_weight;
212 #endif
213
214 #ifdef __OSL__
215         void *prim;
216 #else
217         float data0;
218         float data1;
219 #endif
220
221 } ShaderClosure;
222
223 /* Shader Data
224  *
225  * Main shader state at a point on the surface or in a volume. All coordinates
226  * are in world space. */
227
228 enum ShaderDataFlag {
229         /* runtime flags */
230         SD_BACKFACING = 1,              /* backside of surface? */
231         SD_EMISSION = 2,                /* have emissive closure? */
232         SD_BSDF = 4,                    /* have bsdf closure? */
233         SD_BSDF_HAS_EVAL = 8,   /* have non-singular bsdf closure? */
234         SD_BSDF_GLOSSY = 16,    /* have glossy bsdf */
235         SD_HOLDOUT = 32,                /* have holdout closure? */
236         SD_VOLUME = 64,                 /* have volume closure? */
237
238         /* shader flags */
239         SD_SAMPLE_AS_LIGHT = 128,                       /* direct light sample */
240         SD_HAS_SURFACE_TRANSPARENT = 256,       /* has surface transparency */
241         SD_HAS_VOLUME = 512,                            /* has volume shader */
242         SD_HOMOGENEOUS_VOLUME = 1024            /* has homogeneous volume */
243 };
244
245 typedef struct ShaderData {
246         /* position */
247         float3 P;
248         /* smooth normal for shading */
249         float3 N;
250         /* true geometric normal */
251         float3 Ng;
252         /* view/incoming direction */
253         float3 I;
254         /* shader id */
255         int shader;     
256         /* booleans describing shader, see ShaderDataFlag */
257         int flag;
258
259         /* primitive id if there is one, ~0 otherwise */
260         int prim;
261         /* parametric coordinates
262          * - barycentric weights for triangles */
263         float u, v;
264         /* object id if there is one, ~0 otherwise */
265         int object;
266
267 #ifdef __RAY_DIFFERENTIALS__
268         /* differential of P. these are orthogonal to Ng, not N */
269         differential3 dP;
270         /* differential of I */
271         differential3 dI;
272         /* differential of u, v */
273         differential du;
274         differential dv;
275 #endif
276 #ifdef __DPDU__
277         /* differential of P w.r.t. parametric coordinates. note that dPdu is
278          * not readily suitable as a tangent for shading on triangles. */
279         float3 dPdu, dPdv;
280 #endif
281
282 #ifdef __MULTI_CLOSURE__
283         /* Closure data, we store a fixed array of closures */
284         ShaderClosure closure[MAX_CLOSURE];
285         int num_closure;
286         float randb_closure;
287 #else
288         /* Closure data, with a single sampled closure for low memory usage */
289         ShaderClosure closure;
290 #endif
291
292 #ifdef __OSL__
293         /* OSL context */
294         void *osl_ctx;
295 #endif
296 } ShaderData;
297
298 /* Constrant Kernel Data */
299
300 typedef struct KernelCamera {
301         /* type */
302         int ortho;
303         int pad;
304
305         /* size */
306         int width, height;
307
308         /* matrices */
309         Transform cameratoworld;
310         Transform rastertocamera;
311
312         /* differentials */
313         float3 dx;
314 #ifndef WITH_OPENCL
315         float pad1;
316 #endif
317         float3 dy;
318 #ifndef WITH_OPENCL
319         float pad2;
320 #endif
321
322         /* depth of field */
323         float aperturesize;
324         float blades;
325         float bladesrotation;
326         float focaldistance;
327
328         /* motion blur */
329         float shutteropen;
330         float shutterclose;
331
332         /* clipping */
333         float nearclip;
334         float cliplength;
335
336         /* more matrices */
337         Transform screentoworld;
338         Transform rastertoworld;
339         Transform ndctoworld;
340         Transform worldtoscreen;
341         Transform worldtoraster;
342         Transform worldtondc;
343         Transform worldtocamera;
344 } KernelCamera;
345
346 typedef struct KernelFilm {
347         float exposure;
348         int pad1, pad2, pad3;
349 } KernelFilm;
350
351 typedef struct KernelBackground {
352         /* only shader index */
353         int shader;
354         int transparent;
355         int pad1, pad2;
356 } KernelBackground;
357
358 typedef struct KernelSunSky {
359         /* sun direction in spherical and cartesian */
360         float theta, phi, pad3, pad4;
361         float3 dir;
362 #ifndef WITH_OPENCL
363         float pad;
364 #endif
365
366         /* perez function parameters */
367         float zenith_Y, zenith_x, zenith_y, pad2;
368         float perez_Y[5], perez_x[5], perez_y[5];
369         float pad5;
370 } KernelSunSky;
371
372 typedef struct KernelIntegrator {
373         /* emission */
374         int use_direct_light;
375         int num_distribution;
376         int num_all_lights;
377         float pdf_triangles;
378         float pdf_lights;
379
380         /* bounces */
381         int min_bounce;
382         int max_bounce;
383
384     int max_diffuse_bounce;
385     int max_glossy_bounce;
386     int max_transmission_bounce;
387
388         /* transparent */
389     int transparent_min_bounce;
390     int transparent_max_bounce;
391         int transparent_shadows;
392
393         /* caustics */
394         int no_caustics;
395         float blur_caustics;
396
397         /* seed */
398         int seed;
399 } KernelIntegrator;
400
401 typedef struct KernelBVH {
402         /* root node */
403         int root;
404         int attributes_map_stride;
405         int pad1, pad2;
406 } KernelBVH;
407
408 typedef struct KernelData {
409         KernelCamera cam;
410         KernelFilm film;
411         KernelBackground background;
412         KernelSunSky sunsky;
413         KernelIntegrator integrator;
414         KernelBVH bvh;
415 } KernelData;
416
417 CCL_NAMESPACE_END
418
419 #endif /*  __KERNEL_TYPES_H__ */
420