Cycles OSL minor optimizations: recycle shading context, don't do memory
[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 #include "svm/svm_types.h"
24
25 #ifndef __KERNEL_GPU__
26 #define __KERNEL_CPU__
27 #endif
28
29 CCL_NAMESPACE_BEGIN
30
31 /* constants */
32 #define OBJECT_SIZE             18
33 #define LIGHT_SIZE                      4
34 #define FILTER_TABLE_SIZE       256
35 #define RAMP_TABLE_SIZE         256
36 #define PARTICLE_SIZE           5
37 #define TIME_INVALID            FLT_MAX
38
39 #define TEX_NUM_FLOAT_IMAGES    5
40
41 /* device capabilities */
42 #ifdef __KERNEL_CPU__
43 #define __KERNEL_SHADING__
44 #define __KERNEL_ADV_SHADING__
45 #ifdef WITH_OSL
46 #define __OSL__
47 #endif
48 #define __NON_PROGRESSIVE__
49 #endif
50
51 #ifdef __KERNEL_CUDA__
52 #define __KERNEL_SHADING__
53 #if __CUDA_ARCH__ >= 200
54 #define __KERNEL_ADV_SHADING__
55 #endif
56 #endif
57
58 #ifdef __KERNEL_OPENCL__
59
60 #ifdef __KERNEL_OPENCL_NVIDIA__
61 #define __KERNEL_SHADING__
62 #define __MULTI_CLOSURE__
63 #endif
64
65 #ifdef __KERNEL_OPENCL_APPLE__
66 //#define __SVM__
67 //#define __EMISSION__
68 //#define __IMAGE_TEXTURES__
69 //#define __HOLDOUT__
70 //#define __PROCEDURAL_TEXTURES__
71 //#define __EXTRA_NODES__
72 #endif
73
74 #ifdef __KERNEL_OPENCL_AMD__
75 #define __SVM__
76 #define __EMISSION__
77 #define __IMAGE_TEXTURES__
78 #define __HOLDOUT__
79 #define __PROCEDURAL_TEXTURES__
80 #define __EXTRA_NODES__
81 #endif
82
83 #endif
84
85 /* kernel features */
86 #define __SOBOL__
87 #define __INSTANCING__
88 #define __DPDU__
89 #define __UV__
90 #define __BACKGROUND__
91 #define __CAUSTICS_TRICKS__
92 #define __VISIBILITY_FLAG__
93 #define __RAY_DIFFERENTIALS__
94 #define __CAMERA_CLIPPING__
95 #define __INTERSECTION_REFINE__
96 #define __CLAMP_SAMPLE__
97
98 #ifdef __KERNEL_SHADING__
99 #define __SVM__
100 #define __EMISSION__
101 #define __PROCEDURAL_TEXTURES__
102 #define __IMAGE_TEXTURES__
103 #define __EXTRA_NODES__
104 #define __HOLDOUT__
105 #define __NORMAL_MAP__
106 #endif
107
108 #ifdef __KERNEL_ADV_SHADING__
109 #define __MULTI_CLOSURE__
110 #define __TRANSPARENT_SHADOWS__
111 #define __PASSES__
112 #define __BACKGROUND_MIS__
113 #define __AO__
114 #define __CAMERA_MOTION__
115 #define __ANISOTROPIC__
116 #define __OBJECT_MOTION__
117 #endif
118
119 //#define __SOBOL_FULL_SCREEN__
120
121 /* Shader Evaluation */
122
123 enum ShaderEvalType {
124         SHADER_EVAL_DISPLACE,
125         SHADER_EVAL_BACKGROUND
126 };
127
128 /* Path Tracing
129  * note we need to keep the u/v pairs at even values */
130
131 enum PathTraceDimension {
132         PRNG_FILTER_U = 0,
133         PRNG_FILTER_V = 1,
134         PRNG_LENS_U = 2,
135         PRNG_LENS_V = 3,
136 #ifdef __CAMERA_MOTION__
137         PRNG_TIME = 4,
138         PRNG_UNUSED = 5,
139         PRNG_BASE_NUM = 6,
140 #else
141         PRNG_BASE_NUM = 4,
142 #endif
143
144         PRNG_BSDF_U = 0,
145         PRNG_BSDF_V = 1,
146         PRNG_BSDF = 2,
147         PRNG_LIGHT = 3,
148         PRNG_LIGHT_U = 4,
149         PRNG_LIGHT_V = 5,
150         PRNG_LIGHT_F = 6,
151         PRNG_TERMINATE = 7,
152         PRNG_BOUNCE_NUM = 8
153 };
154
155 /* these flags values correspond to raytypes in osl.cpp, so keep them in sync!
156  *
157  * for ray visibility tests in BVH traversal, the upper 20 bits are used for
158  * layer visibility tests. */
159
160 enum PathRayFlag {
161         PATH_RAY_CAMERA = 1,
162         PATH_RAY_REFLECT = 2,
163         PATH_RAY_TRANSMIT = 4,
164         PATH_RAY_DIFFUSE = 8,
165         PATH_RAY_GLOSSY = 16,
166         PATH_RAY_SINGULAR = 32,
167         PATH_RAY_TRANSPARENT = 64,
168
169         PATH_RAY_SHADOW_OPAQUE = 128,
170         PATH_RAY_SHADOW_TRANSPARENT = 256,
171         PATH_RAY_SHADOW = (PATH_RAY_SHADOW_OPAQUE|PATH_RAY_SHADOW_TRANSPARENT),
172
173         PATH_RAY_MIS_SKIP = 512,
174
175         PATH_RAY_ALL = (1|2|4|8|16|32|64|128|256|512),
176
177         /* this gives collisions with localview bits
178          * see: CYCLES_LOCAL_LAYER_HACK(), grr - Campbell */
179         PATH_RAY_LAYER_SHIFT = (32-20)
180 };
181
182 /* Closure Label */
183
184 typedef enum ClosureLabel {
185         LABEL_NONE = 0,
186         LABEL_CAMERA = 1,
187         LABEL_LIGHT = 2,
188         LABEL_BACKGROUND = 4,
189         LABEL_TRANSMIT = 8,
190         LABEL_REFLECT = 16,
191         LABEL_VOLUME = 32,
192         LABEL_OBJECT = 64,
193         LABEL_DIFFUSE = 128,
194         LABEL_GLOSSY = 256,
195         LABEL_SINGULAR = 512,
196         LABEL_TRANSPARENT = 1024,
197         LABEL_STOP = 2048
198 } ClosureLabel;
199
200 /* Render Passes */
201
202 typedef enum PassType {
203         PASS_NONE = 0,
204         PASS_COMBINED = 1,
205         PASS_DEPTH = 2,
206         PASS_NORMAL = 4,
207         PASS_UV = 8,
208         PASS_OBJECT_ID = 16,
209         PASS_MATERIAL_ID = 32,
210         PASS_DIFFUSE_COLOR = 64,
211         PASS_GLOSSY_COLOR = 128,
212         PASS_TRANSMISSION_COLOR = 256,
213         PASS_DIFFUSE_INDIRECT = 512,
214         PASS_GLOSSY_INDIRECT = 1024,
215         PASS_TRANSMISSION_INDIRECT = 2048,
216         PASS_DIFFUSE_DIRECT = 4096,
217         PASS_GLOSSY_DIRECT = 8192,
218         PASS_TRANSMISSION_DIRECT = 16384,
219         PASS_EMISSION = 32768,
220         PASS_BACKGROUND = 65536,
221         PASS_AO = 131072,
222         PASS_SHADOW = 262144,
223         PASS_MOTION = 524288,
224         PASS_MOTION_WEIGHT = 1048576
225 } PassType;
226
227 #define PASS_ALL (~0)
228
229 #ifdef __PASSES__
230
231 typedef float3 PathThroughput;
232
233 typedef struct PathRadiance {
234         int use_light_pass;
235
236         float3 emission;
237         float3 background;
238         float3 ao;
239
240         float3 indirect;
241         float3 direct_throughput;
242         float3 direct_emission;
243
244         float3 color_diffuse;
245         float3 color_glossy;
246         float3 color_transmission;
247
248         float3 direct_diffuse;
249         float3 direct_glossy;
250         float3 direct_transmission;
251
252         float3 indirect_diffuse;
253         float3 indirect_glossy;
254         float3 indirect_transmission;
255
256         float4 shadow;
257 } PathRadiance;
258
259 typedef struct BsdfEval {
260         int use_light_pass;
261
262         float3 diffuse;
263         float3 glossy;
264         float3 transmission;
265         float3 transparent;
266 } BsdfEval;
267
268 #else
269
270 typedef float3 PathThroughput;
271 typedef float3 PathRadiance;
272 typedef float3 BsdfEval;
273
274 #endif
275
276 /* Shader Flag */
277
278 typedef enum ShaderFlag {
279         SHADER_SMOOTH_NORMAL = (1 << 31),
280         SHADER_CAST_SHADOW = (1 << 30),
281         SHADER_AREA_LIGHT = (1 << 29),
282
283         SHADER_MASK = ~(SHADER_SMOOTH_NORMAL|SHADER_CAST_SHADOW|SHADER_AREA_LIGHT)
284 } ShaderFlag;
285
286 /* Light Type */
287
288 typedef enum LightType {
289         LIGHT_POINT,
290         LIGHT_DISTANT,
291         LIGHT_BACKGROUND,
292         LIGHT_AREA,
293         LIGHT_AO,
294         LIGHT_SPOT
295 } LightType;
296
297 /* Camera Type */
298
299 enum CameraType {
300         CAMERA_PERSPECTIVE,
301         CAMERA_ORTHOGRAPHIC,
302         CAMERA_PANORAMA
303 };
304
305 /* Panorama Type */
306
307 enum PanoramaType {
308         PANORAMA_EQUIRECTANGULAR,
309         PANORAMA_FISHEYE_EQUIDISTANT,
310         PANORAMA_FISHEYE_EQUISOLID
311 };
312
313 /* Differential */
314
315 typedef struct differential3 {
316         float3 dx;
317         float3 dy;
318 } differential3;
319
320 typedef struct differential {
321         float dx;
322         float dy;
323 } differential;
324
325 /* Ray */
326
327 typedef struct Ray {
328         float3 P;
329         float3 D;
330         float t;
331         float time;
332
333 #ifdef __RAY_DIFFERENTIALS__
334         differential3 dP;
335         differential3 dD;
336 #endif
337 } Ray;
338
339 /* Intersection */
340
341 typedef struct Intersection {
342         float t, u, v;
343         int prim;
344         int object;
345 } Intersection;
346
347 /* Attributes */
348
349 typedef enum AttributeElement {
350         ATTR_ELEMENT_FACE,
351         ATTR_ELEMENT_VERTEX,
352         ATTR_ELEMENT_CORNER,
353         ATTR_ELEMENT_VALUE,
354         ATTR_ELEMENT_NONE
355 } AttributeElement;
356
357 /* Closure data */
358
359 #define MAX_CLOSURE 8
360
361 typedef struct ShaderClosure {
362         ClosureType type;
363         float3 weight;
364
365 #ifdef __MULTI_CLOSURE__
366         float sample_weight;
367 #endif
368
369         float data0;
370         float data1;
371
372         float3 N;
373 #ifdef __ANISOTROPIC__
374         float3 T;
375 #endif
376
377 #ifdef __OSL__
378         void *prim;
379 #endif
380 } ShaderClosure;
381
382 /* Shader Context
383  *
384  * For OSL we recycle a fixed number of contexts for speed */
385
386 typedef enum ShaderContext {
387         SHADER_CONTEXT_MAIN = 0,
388         SHADER_CONTEXT_INDIRECT = 1,
389         SHADER_CONTEXT_EMISSION = 2,
390         SHADER_CONTEXT_SHADOW = 3,
391         SHADER_CONTEXT_NUM = 4
392 } ShaderContext;
393
394 /* Shader Data
395  *
396  * Main shader state at a point on the surface or in a volume. All coordinates
397  * are in world space. */
398
399 enum ShaderDataFlag {
400         /* runtime flags */
401         SD_BACKFACING = 1,              /* backside of surface? */
402         SD_EMISSION = 2,                /* have emissive closure? */
403         SD_BSDF = 4,                    /* have bsdf closure? */
404         SD_BSDF_HAS_EVAL = 8,   /* have non-singular bsdf closure? */
405         SD_BSDF_GLOSSY = 16,    /* have glossy bsdf */
406         SD_HOLDOUT = 32,                /* have holdout closure? */
407         SD_VOLUME = 64,                 /* have volume closure? */
408         SD_AO = 128,                    /* have ao closure? */
409
410         /* shader flags */
411         SD_SAMPLE_AS_LIGHT = 256,                       /* direct light sample */
412         SD_HAS_SURFACE_TRANSPARENT = 512,       /* has surface transparency */
413         SD_HAS_VOLUME = 1024,                           /* has volume shader */
414         SD_HOMOGENEOUS_VOLUME = 2048,           /* has homogeneous volume */
415
416         /* object flags */
417         SD_HOLDOUT_MASK = 4096,                         /* holdout for camera rays */
418         SD_OBJECT_MOTION = 8192,                        /* has object motion blur */
419         SD_TRANSFORM_APPLIED = 16384            /* vertices have transform applied */
420 };
421
422 typedef struct ShaderData {
423         /* position */
424         float3 P;
425         /* smooth normal for shading */
426         float3 N;
427         /* true geometric normal */
428         float3 Ng;
429         /* view/incoming direction */
430         float3 I;
431         /* shader id */
432         int shader;
433         /* booleans describing shader, see ShaderDataFlag */
434         int flag;
435
436         /* primitive id if there is one, ~0 otherwise */
437         int prim;
438         /* parametric coordinates
439          * - barycentric weights for triangles */
440         float u, v;
441         /* object id if there is one, ~0 otherwise */
442         int object;
443
444         /* motion blur sample time */
445         float time;
446         
447         /* length of the ray being shaded */
448         float ray_length;
449
450 #ifdef __RAY_DIFFERENTIALS__
451         /* differential of P. these are orthogonal to Ng, not N */
452         differential3 dP;
453         /* differential of I */
454         differential3 dI;
455         /* differential of u, v */
456         differential du;
457         differential dv;
458 #endif
459 #ifdef __DPDU__
460         /* differential of P w.r.t. parametric coordinates. note that dPdu is
461          * not readily suitable as a tangent for shading on triangles. */
462         float3 dPdu, dPdv;
463 #endif
464
465 #ifdef __OBJECT_MOTION__
466         /* object <-> world space transformations, cached to avoid
467          * re-interpolating them constantly for shading */
468         Transform ob_tfm;
469         Transform ob_itfm;
470 #endif
471
472 #ifdef __MULTI_CLOSURE__
473         /* Closure data, we store a fixed array of closures */
474         ShaderClosure closure[MAX_CLOSURE];
475         int num_closure;
476         float randb_closure;
477 #else
478         /* Closure data, with a single sampled closure for low memory usage */
479         ShaderClosure closure;
480 #endif
481 } ShaderData;
482
483 /* Constrant Kernel Data
484  *
485  * These structs are passed from CPU to various devices, and the struct layout
486  * must match exactly. Structs are padded to ensure 16 byte alignment, and we
487  * do not use float3 because its size may not be the same on all devices. */
488
489 typedef struct KernelCamera {
490         /* type */
491         int type;
492
493         /* panorama */
494         int panorama_type;
495         float fisheye_fov;
496         float fisheye_lens;
497
498         /* matrices */
499         Transform cameratoworld;
500         Transform rastertocamera;
501
502         /* differentials */
503         float4 dx;
504         float4 dy;
505
506         /* depth of field */
507         float aperturesize;
508         float blades;
509         float bladesrotation;
510         float focaldistance;
511
512         /* motion blur */
513         float shuttertime;
514         int have_motion;
515
516         /* clipping */
517         float nearclip;
518         float cliplength;
519
520         /* sensor size */
521         float sensorwidth;
522         float sensorheight;
523
524         /* render size */
525         float width, height;
526
527         /* more matrices */
528         Transform screentoworld;
529         Transform rastertoworld;
530         /* work around cuda sm 2.0 crash, this seems to
531          * cross some limit in combination with motion 
532          * Transform ndctoworld; */
533         Transform worldtoscreen;
534         Transform worldtoraster;
535         Transform worldtondc;
536         Transform worldtocamera;
537
538         MotionTransform motion;
539 } KernelCamera;
540
541 typedef struct KernelFilm {
542         float exposure;
543         int pass_flag;
544         int pass_stride;
545         int use_light_pass;
546
547         int pass_combined;
548         int pass_depth;
549         int pass_normal;
550         int pass_motion;
551
552         int pass_motion_weight;
553         int pass_uv;
554         int pass_object_id;
555         int pass_material_id;
556
557         int pass_diffuse_color;
558         int pass_glossy_color;
559         int pass_transmission_color;
560         int pass_diffuse_indirect;
561
562         int pass_glossy_indirect;
563         int pass_transmission_indirect;
564         int pass_diffuse_direct;
565         int pass_glossy_direct;
566
567         int pass_transmission_direct;
568         int pass_emission;
569         int pass_background;
570         int pass_ao;
571
572         int pass_shadow;
573         int pass_pad1;
574         int pass_pad2;
575         int pass_pad3;
576 } KernelFilm;
577
578 typedef struct KernelBackground {
579         /* only shader index */
580         int shader;
581         int transparent;
582
583         /* ambient occlusion */
584         float ao_factor;
585         float ao_distance;
586 } KernelBackground;
587
588 typedef struct KernelSunSky {
589         /* sun direction in spherical and cartesian */
590         float theta, phi, pad3, pad4;
591
592         /* perez function parameters */
593         float zenith_Y, zenith_x, zenith_y, pad2;
594         float perez_Y[5], perez_x[5], perez_y[5];
595         float pad5;
596 } KernelSunSky;
597
598 typedef struct KernelIntegrator {
599         /* emission */
600         int use_direct_light;
601         int use_ambient_occlusion;
602         int num_distribution;
603         int num_all_lights;
604         float pdf_triangles;
605         float pdf_lights;
606         int pdf_background_res;
607
608         /* bounces */
609         int min_bounce;
610         int max_bounce;
611
612         int max_diffuse_bounce;
613         int max_glossy_bounce;
614         int max_transmission_bounce;
615
616         /* transparent */
617         int transparent_min_bounce;
618         int transparent_max_bounce;
619         int transparent_shadows;
620
621         /* caustics */
622         int no_caustics;
623         float filter_glossy;
624
625         /* seed */
626         int seed;
627
628         /* render layer */
629         int layer_flag;
630
631         /* clamp */
632         float sample_clamp;
633
634         /* non-progressive */
635         int progressive;
636         int diffuse_samples;
637         int glossy_samples;
638         int transmission_samples;
639         int ao_samples;
640         int mesh_light_samples;
641         int pad1, pad2;
642 } KernelIntegrator;
643
644 typedef struct KernelBVH {
645         /* root node */
646         int root;
647         int attributes_map_stride;
648         int have_motion;
649         int pad2;
650 } KernelBVH;
651
652 typedef struct KernelData {
653         KernelCamera cam;
654         KernelFilm film;
655         KernelBackground background;
656         KernelSunSky sunsky;
657         KernelIntegrator integrator;
658         KernelBVH bvh;
659 } KernelData;
660
661 CCL_NAMESPACE_END
662
663 #endif /*  __KERNEL_TYPES_H__ */
664