Fix another padding error in cycles, to complete the previous bugfix.
[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 #define __PASSES__
74 #define __BACKGROUND_MIS__
75 #endif
76
77 //#define __MULTI_LIGHT__
78 //#define __OSL__
79 //#define __SOBOL_FULL_SCREEN__
80 //#define __MODIFY_TP__
81 //#define __QBVH__
82
83 /* Shader Evaluation */
84
85 enum ShaderEvalType {
86         SHADER_EVAL_DISPLACE,
87         SHADER_EVAL_BACKGROUND
88 };
89
90 /* Path Tracing */
91
92 enum PathTraceDimension {
93         PRNG_FILTER_U = 0,
94         PRNG_FILTER_V = 1,
95         PRNG_LENS_U = 2,
96         PRNG_LENS_V = 3,
97         PRNG_BASE_NUM = 4,
98
99         PRNG_BSDF_U = 0,
100         PRNG_BSDF_V = 1,
101         PRNG_BSDF = 2,
102         PRNG_LIGHT = 3,
103         PRNG_LIGHT_U = 4,
104         PRNG_LIGHT_V = 5,
105         PRNG_LIGHT_F = 6,
106         PRNG_TERMINATE = 7,
107         PRNG_BOUNCE_NUM = 8
108 };
109
110 /* these flag values correspond exactly to OSL defaults, so be careful not to
111  * change this, or if you do, set the "raytypes" shading system attribute with
112  * your own new ray types and bitflag values.
113  *
114  * for ray visibility tests in BVH traversal, the upper 20 bits are used for
115  * layer visibility tests. */
116
117 enum PathRayFlag {
118         PATH_RAY_CAMERA = 1,
119         PATH_RAY_REFLECT = 2,
120         PATH_RAY_TRANSMIT = 4,
121         PATH_RAY_DIFFUSE = 8,
122         PATH_RAY_GLOSSY = 16,
123         PATH_RAY_SINGULAR = 32,
124         PATH_RAY_TRANSPARENT = 64,
125
126         PATH_RAY_SHADOW_OPAQUE = 128,
127         PATH_RAY_SHADOW_TRANSPARENT = 256,
128         PATH_RAY_SHADOW = (PATH_RAY_SHADOW_OPAQUE|PATH_RAY_SHADOW_TRANSPARENT),
129
130         PATH_RAY_MIS_SKIP = 512,
131
132         PATH_RAY_ALL = (1|2|4|8|16|32|64|128|256|512),
133
134         PATH_RAY_LAYER_SHIFT = (32-20)
135 };
136
137 /* Closure Label */
138
139 typedef enum ClosureLabel {
140         LABEL_NONE = 0,
141         LABEL_CAMERA = 1,
142         LABEL_LIGHT = 2,
143         LABEL_BACKGROUND = 4,
144         LABEL_TRANSMIT = 8,
145         LABEL_REFLECT = 16,
146         LABEL_VOLUME = 32,
147         LABEL_OBJECT = 64,
148         LABEL_DIFFUSE = 128,
149         LABEL_GLOSSY = 256,
150         LABEL_SINGULAR = 512,
151         LABEL_TRANSPARENT = 1024,
152         LABEL_STOP = 2048
153 } ClosureLabel;
154
155 /* Render Passes */
156
157 typedef enum PassType {
158         PASS_NONE = 0,
159         PASS_COMBINED = 1,
160         PASS_DEPTH = 2,
161         PASS_NORMAL = 8,
162         PASS_UV = 16,
163         PASS_OBJECT_ID = 32,
164         PASS_MATERIAL_ID = 64,
165         PASS_DIFFUSE_COLOR = 128,
166         PASS_GLOSSY_COLOR = 256,
167         PASS_TRANSMISSION_COLOR = 512,
168         PASS_DIFFUSE_INDIRECT = 1024,
169         PASS_GLOSSY_INDIRECT = 2048,
170         PASS_TRANSMISSION_INDIRECT = 4096,
171         PASS_DIFFUSE_DIRECT = 8192,
172         PASS_GLOSSY_DIRECT = 16384,
173         PASS_TRANSMISSION_DIRECT = 32768,
174         PASS_EMISSION = 65536,
175         PASS_BACKGROUND = 131072
176 } PassType;
177
178 #define PASS_ALL (~0)
179
180 #ifdef __PASSES__
181
182 typedef float3 PathThroughput;
183
184 struct PathRadiance {
185         int use_light_pass;
186
187         float3 emission;
188         float3 background;
189
190         float3 indirect;
191         float3 direct_throughput;
192         float3 direct_emission;
193
194         float3 color_diffuse;
195         float3 color_glossy;
196         float3 color_transmission;
197
198         float3 direct_diffuse;
199         float3 direct_glossy;
200         float3 direct_transmission;
201
202         float3 indirect_diffuse;
203         float3 indirect_glossy;
204         float3 indirect_transmission;
205 };
206
207 struct BsdfEval {
208         int use_light_pass;
209
210         float3 diffuse;
211         float3 glossy;
212         float3 transmission;
213         float3 transparent;
214 };
215
216 #else
217
218 typedef float3 PathThroughput;
219 typedef float3 PathRadiance;
220 typedef float3 BsdfEval;
221
222 #endif
223
224 /* Shader Flag */
225
226 typedef enum ShaderFlag {
227         SHADER_SMOOTH_NORMAL = (1 << 31),
228         SHADER_CAST_SHADOW = (1 << 30),
229         SHADER_AREA_LIGHT = (1 << 29),
230
231         SHADER_MASK = ~(SHADER_SMOOTH_NORMAL|SHADER_CAST_SHADOW|SHADER_AREA_LIGHT)
232 } ShaderFlag;
233
234 /* Light Type */
235
236 typedef enum LightType {
237         LIGHT_POINT,
238         LIGHT_DISTANT,
239         LIGHT_BACKGROUND,
240         LIGHT_AREA
241 } LightType;
242
243 /* Differential */
244
245 typedef struct differential3 {
246         float3 dx;
247         float3 dy;
248 } differential3;
249
250 typedef struct differential {
251         float dx;
252         float dy;
253 } differential;
254
255 /* Ray */
256
257 typedef struct Ray {
258         float3 P;
259         float3 D;
260         float t;
261
262 #ifdef __RAY_DIFFERENTIALS__
263         differential3 dP;
264         differential3 dD;
265 #endif
266 } Ray;
267
268 /* Intersection */
269
270 typedef struct Intersection {
271         float t, u, v;
272         int prim;
273         int object;
274 } Intersection;
275
276 /* Attributes */
277
278 typedef enum AttributeElement {
279         ATTR_ELEMENT_FACE,
280         ATTR_ELEMENT_VERTEX,
281         ATTR_ELEMENT_CORNER,
282         ATTR_ELEMENT_VALUE,
283         ATTR_ELEMENT_NONE
284 } AttributeElement;
285
286 /* Closure data */
287
288 #define MAX_CLOSURE 8
289
290 typedef struct ShaderClosure {
291         ClosureType type;
292         float3 weight;
293
294 #ifdef __MULTI_CLOSURE__
295         float sample_weight;
296 #endif
297
298 #ifdef __OSL__
299         void *prim;
300 #else
301         float data0;
302         float data1;
303 #endif
304
305 } ShaderClosure;
306
307 /* Shader Data
308  *
309  * Main shader state at a point on the surface or in a volume. All coordinates
310  * are in world space. */
311
312 enum ShaderDataFlag {
313         /* runtime flags */
314         SD_BACKFACING = 1,              /* backside of surface? */
315         SD_EMISSION = 2,                /* have emissive closure? */
316         SD_BSDF = 4,                    /* have bsdf closure? */
317         SD_BSDF_HAS_EVAL = 8,   /* have non-singular bsdf closure? */
318         SD_BSDF_GLOSSY = 16,    /* have glossy bsdf */
319         SD_HOLDOUT = 32,                /* have holdout closure? */
320         SD_VOLUME = 64,                 /* have volume closure? */
321
322         /* shader flags */
323         SD_SAMPLE_AS_LIGHT = 128,                       /* direct light sample */
324         SD_HAS_SURFACE_TRANSPARENT = 256,       /* has surface transparency */
325         SD_HAS_VOLUME = 512,                            /* has volume shader */
326         SD_HOMOGENEOUS_VOLUME = 1024            /* has homogeneous volume */
327 };
328
329 typedef struct ShaderData {
330         /* position */
331         float3 P;
332         /* smooth normal for shading */
333         float3 N;
334         /* true geometric normal */
335         float3 Ng;
336         /* view/incoming direction */
337         float3 I;
338         /* shader id */
339         int shader;     
340         /* booleans describing shader, see ShaderDataFlag */
341         int flag;
342
343         /* primitive id if there is one, ~0 otherwise */
344         int prim;
345         /* parametric coordinates
346          * - barycentric weights for triangles */
347         float u, v;
348         /* object id if there is one, ~0 otherwise */
349         int object;
350
351 #ifdef __RAY_DIFFERENTIALS__
352         /* differential of P. these are orthogonal to Ng, not N */
353         differential3 dP;
354         /* differential of I */
355         differential3 dI;
356         /* differential of u, v */
357         differential du;
358         differential dv;
359 #endif
360 #ifdef __DPDU__
361         /* differential of P w.r.t. parametric coordinates. note that dPdu is
362          * not readily suitable as a tangent for shading on triangles. */
363         float3 dPdu, dPdv;
364 #endif
365
366 #ifdef __MULTI_CLOSURE__
367         /* Closure data, we store a fixed array of closures */
368         ShaderClosure closure[MAX_CLOSURE];
369         int num_closure;
370         float randb_closure;
371 #else
372         /* Closure data, with a single sampled closure for low memory usage */
373         ShaderClosure closure;
374 #endif
375
376 #ifdef __OSL__
377         /* OSL context */
378         void *osl_ctx;
379 #endif
380 } ShaderData;
381
382 /* Constrant Kernel Data
383  *
384  * These structs are passed from CPU to various devices, and the struct layout
385  * must match exactly. Structs are padded to ensure 16 byte alignment, and we
386  * do not use float3 because its size may not be the same on all devices. */
387
388 typedef struct KernelCamera {
389         /* type */
390         int ortho;
391         int pad1, pad2, pad3;
392
393         /* matrices */
394         Transform cameratoworld;
395         Transform rastertocamera;
396
397         /* differentials */
398         float4 dx;
399         float4 dy;
400
401         /* depth of field */
402         float aperturesize;
403         float blades;
404         float bladesrotation;
405         float focaldistance;
406
407         /* motion blur */
408         float shutteropen;
409         float shutterclose;
410
411         /* clipping */
412         float nearclip;
413         float cliplength;
414
415         /* more matrices */
416         Transform screentoworld;
417         Transform rastertoworld;
418         Transform ndctoworld;
419         Transform worldtoscreen;
420         Transform worldtoraster;
421         Transform worldtondc;
422         Transform worldtocamera;
423 } KernelCamera;
424
425 typedef struct KernelFilm {
426         float exposure;
427         int pass_flag;
428         int pass_stride;
429         int use_light_pass;
430
431         int pass_combined;
432         int pass_depth;
433         int pass_normal;
434         int pass_pad;
435
436         int pass_uv;
437         int pass_object_id;
438         int pass_material_id;
439         int pass_diffuse_color;
440
441         int pass_glossy_color;
442         int pass_transmission_color;
443         int pass_diffuse_indirect;
444         int pass_glossy_indirect;
445
446         int pass_transmission_indirect;
447         int pass_diffuse_direct;
448         int pass_glossy_direct;
449         int pass_transmission_direct;
450
451         int pass_emission;
452         int pass_background;
453         int pass_pad1;
454         int pass_pad2;
455 } KernelFilm;
456
457 typedef struct KernelBackground {
458         /* only shader index */
459         int shader;
460         int transparent;
461         int pad1, pad2;
462 } KernelBackground;
463
464 typedef struct KernelSunSky {
465         /* sun direction in spherical and cartesian */
466         float theta, phi, pad3, pad4;
467
468         /* perez function parameters */
469         float zenith_Y, zenith_x, zenith_y, pad2;
470         float perez_Y[5], perez_x[5], perez_y[5];
471         float pad5;
472 } KernelSunSky;
473
474 typedef struct KernelIntegrator {
475         /* emission */
476         int use_direct_light;
477         int num_distribution;
478         int num_all_lights;
479         float pdf_triangles;
480         float pdf_lights;
481         int pdf_background_res;
482
483         /* bounces */
484         int min_bounce;
485         int max_bounce;
486
487         int max_diffuse_bounce;
488         int max_glossy_bounce;
489         int max_transmission_bounce;
490
491         /* transparent */
492         int transparent_min_bounce;
493         int transparent_max_bounce;
494         int transparent_shadows;
495
496         /* caustics */
497         int no_caustics;
498
499         /* seed */
500         int seed;
501
502         /* render layer */
503         int layer_flag;
504         int pad1, pad2, pad3;
505 } KernelIntegrator;
506
507 typedef struct KernelBVH {
508         /* root node */
509         int root;
510         int attributes_map_stride;
511         int pad1, pad2;
512 } KernelBVH;
513
514 typedef struct KernelData {
515         KernelCamera cam;
516         KernelFilm film;
517         KernelBackground background;
518         KernelSunSky sunsky;
519         KernelIntegrator integrator;
520         KernelBVH bvh;
521 } KernelData;
522
523 CCL_NAMESPACE_END
524
525 #endif /*  __KERNEL_TYPES_H__ */
526