Cycles: Replace __MAX_CLOSURE__ build option with runtime integrator variable
[blender.git] / intern / cycles / kernel / split / kernel_split_data_types.h
1 /*
2  * Copyright 2011-2016 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef __KERNEL_SPLIT_DATA_TYPES_H__
18 #define __KERNEL_SPLIT_DATA_TYPES_H__
19
20 CCL_NAMESPACE_BEGIN
21
22 /* parameters used by the split kernels, we use a single struct to avoid passing these to each kernel */
23
24 typedef struct SplitParams {
25         WorkTile tile;
26         uint total_work_size;
27
28         ccl_global unsigned int *work_pools;
29
30         ccl_global int *queue_index;
31         int queue_size;
32         ccl_global char *use_queues_flag;
33
34         /* Place for storing sd->flag. AMD GPU OpenCL compiler workaround */
35         int dummy_sd_flag;
36 } SplitParams;
37
38 /* Global memory variables [porting]; These memory is used for
39  * co-operation between different kernels; Data written by one
40  * kernel will be available to another kernel via this global
41  * memory.
42  */
43
44 /* SPLIT_DATA_ENTRY(type, name, num) */
45
46 #ifdef __BRANCHED_PATH__
47
48 typedef ccl_global struct SplitBranchedState {
49         /* various state that must be kept and restored after an indirect loop */
50         PathState path_state;
51         float3 throughput;
52         Ray ray;
53
54         Intersection isect;
55
56         char ray_state;
57
58         /* indirect loop state */
59         int next_closure;
60         int next_sample;
61
62 #ifdef __SUBSURFACE__
63         int ss_next_closure;
64         int ss_next_sample;
65         int next_hit;
66         int num_hits;
67
68         uint lcg_state;
69         LocalIntersection ss_isect;
70
71 #  ifdef __VOLUME__
72         VolumeStack volume_stack[VOLUME_STACK_SIZE];
73 #  endif  /* __VOLUME__ */
74 #endif  /*__SUBSURFACE__ */
75
76         int shared_sample_count; /* number of branched samples shared with other threads */
77         int original_ray; /* index of original ray when sharing branched samples */
78         bool waiting_on_shared_samples;
79
80         /* Must be last in to allow for dynamic size of closures */
81         struct ShaderData sd;
82 } SplitBranchedState;
83
84 #define SPLIT_DATA_BRANCHED_ENTRIES \
85         SPLIT_DATA_ENTRY( SplitBranchedState, branched_state, 1)
86 #else
87 #define SPLIT_DATA_BRANCHED_ENTRIES
88 #endif  /* __BRANCHED_PATH__ */
89
90 #ifdef __SUBSURFACE__
91 #  define SPLIT_DATA_SUBSURFACE_ENTRIES \
92         SPLIT_DATA_ENTRY(ccl_global SubsurfaceIndirectRays, ss_rays, 1)
93 #else
94 #  define SPLIT_DATA_SUBSURFACE_ENTRIES
95 #endif /* __SUBSURFACE__ */
96
97 #ifdef __VOLUME__
98 #  define SPLIT_DATA_VOLUME_ENTRIES \
99         SPLIT_DATA_ENTRY(ccl_global PathState, state_shadow, 1)
100 #else
101 #  define SPLIT_DATA_VOLUME_ENTRIES
102 #endif /* __VOLUME__ */
103
104 #define SPLIT_DATA_ENTRIES \
105         SPLIT_DATA_ENTRY(ccl_global float3, throughput, 1) \
106         SPLIT_DATA_ENTRY(PathRadiance, path_radiance, 1) \
107         SPLIT_DATA_ENTRY(ccl_global Ray, ray, 1) \
108         SPLIT_DATA_ENTRY(ccl_global PathState, path_state, 1) \
109         SPLIT_DATA_ENTRY(ccl_global Intersection, isect, 1) \
110         SPLIT_DATA_ENTRY(ccl_global BsdfEval, bsdf_eval, 1) \
111         SPLIT_DATA_ENTRY(ccl_global int, is_lamp, 1) \
112         SPLIT_DATA_ENTRY(ccl_global Ray, light_ray, 1) \
113         SPLIT_DATA_ENTRY(ccl_global int, queue_data, (NUM_QUEUES*2)) /* TODO(mai): this is too large? */ \
114         SPLIT_DATA_ENTRY(ccl_global uint, buffer_offset, 1) \
115         SPLIT_DATA_ENTRY(ShaderDataTinyStorage, sd_DL_shadow, 1) \
116         SPLIT_DATA_SUBSURFACE_ENTRIES \
117         SPLIT_DATA_VOLUME_ENTRIES \
118         SPLIT_DATA_BRANCHED_ENTRIES \
119         SPLIT_DATA_ENTRY(ShaderData, _sd, 0)
120
121 /* entries to be copied to inactive rays when sharing branched samples (TODO: which are actually needed?) */
122 #define SPLIT_DATA_ENTRIES_BRANCHED_SHARED \
123         SPLIT_DATA_ENTRY(ccl_global float3, throughput, 1) \
124         SPLIT_DATA_ENTRY(PathRadiance, path_radiance, 1) \
125         SPLIT_DATA_ENTRY(ccl_global Ray, ray, 1) \
126         SPLIT_DATA_ENTRY(ccl_global PathState, path_state, 1) \
127         SPLIT_DATA_ENTRY(ccl_global Intersection, isect, 1) \
128         SPLIT_DATA_ENTRY(ccl_global BsdfEval, bsdf_eval, 1) \
129         SPLIT_DATA_ENTRY(ccl_global int, is_lamp, 1) \
130         SPLIT_DATA_ENTRY(ccl_global Ray, light_ray, 1) \
131         SPLIT_DATA_ENTRY(ShaderDataTinyStorage, sd_DL_shadow, 1) \
132         SPLIT_DATA_SUBSURFACE_ENTRIES \
133         SPLIT_DATA_VOLUME_ENTRIES \
134         SPLIT_DATA_BRANCHED_ENTRIES \
135         SPLIT_DATA_ENTRY(ShaderData, _sd, 0)
136
137 /* struct that holds pointers to data in the shared state buffer */
138 typedef struct SplitData {
139 #define SPLIT_DATA_ENTRY(type, name, num) type *name;
140         SPLIT_DATA_ENTRIES
141 #undef SPLIT_DATA_ENTRY
142
143         /* this is actually in a separate buffer from the rest of the split state data (so it can be read back from
144          * the host easily) but is still used the same as the other data so we have it here in this struct as well
145          */
146         ccl_global char *ray_state;
147 } SplitData;
148
149 #ifndef __KERNEL_CUDA__
150 #  define kernel_split_state (kg->split_data)
151 #  define kernel_split_params (kg->split_param_data)
152 #else
153 __device__ SplitData __split_data;
154 #  define kernel_split_state (__split_data)
155 __device__ SplitParams __split_param_data;
156 #  define kernel_split_params (__split_param_data)
157 #endif  /* __KERNEL_CUDA__ */
158
159 #define kernel_split_sd(sd, ray_index) ((ShaderData*) \
160         ( \
161                 ((ccl_global char*)kernel_split_state._##sd) + \
162                 (sizeof(ShaderData) + sizeof(ShaderClosure)*(kernel_data.integrator.max_closures-1)) * (ray_index) \
163         ))
164
165 /* Local storage for queue_enqueue kernel. */
166 typedef struct QueueEnqueueLocals {
167         uint queue_atomics[2];
168 } QueueEnqueueLocals;
169
170 /* Local storage for holdout_emission_blurring_pathtermination_ao kernel. */
171 typedef struct BackgroundAOLocals {
172         uint queue_atomics_bg;
173         uint queue_atomics_ao;
174 } BackgroundAOLocals;
175
176 typedef struct ShaderSortLocals {
177         uint local_value[SHADER_SORT_BLOCK_SIZE];
178         ushort local_index[SHADER_SORT_BLOCK_SIZE];
179 } ShaderSortLocals;
180
181 CCL_NAMESPACE_END
182
183 #endif  /* __KERNEL_SPLIT_DATA_TYPES_H__ */