Code cleanup: store branch factor in PathState.
[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         int x;
26         int y;
27         int w;
28         int h;
29
30         int offset;
31         int stride;
32
33         ccl_global uint *rng_state;
34
35         int start_sample;
36         int end_sample;
37
38         ccl_global unsigned int *work_pools;
39         unsigned int num_samples;
40
41         ccl_global int *queue_index;
42         int queue_size;
43         ccl_global char *use_queues_flag;
44
45         ccl_global float *buffer;
46
47         /* Place for storing sd->flag. AMD GPU OpenCL compiler workaround */
48         int dummy_sd_flag;
49 } SplitParams;
50
51 /* Global memory variables [porting]; These memory is used for
52  * co-operation between different kernels; Data written by one
53  * kernel will be available to another kernel via this global
54  * memory.
55  */
56
57 /* SPLIT_DATA_ENTRY(type, name, num) */
58
59 #ifdef __BRANCHED_PATH__
60
61 typedef ccl_global struct SplitBranchedState {
62         /* various state that must be kept and restored after an indirect loop */
63         PathState path_state;
64         float3 throughput;
65         Ray ray;
66
67         struct ShaderData sd;
68         Intersection isect;
69
70         char ray_state;
71
72         /* indirect loop state */
73         int next_closure;
74         int next_sample;
75
76 #ifdef __SUBSURFACE__
77         int ss_next_closure;
78         int ss_next_sample;
79         int next_hit;
80         int num_hits;
81
82         uint lcg_state;
83         SubsurfaceIntersection ss_isect;
84
85 #  ifdef __VOLUME__
86         VolumeStack volume_stack[VOLUME_STACK_SIZE];
87 #  endif  /* __VOLUME__ */
88 #endif  /*__SUBSURFACE__ */
89
90         int shared_sample_count; /* number of branched samples shared with other threads */
91         int original_ray; /* index of original ray when sharing branched samples */
92         bool waiting_on_shared_samples;
93 } SplitBranchedState;
94
95 #define SPLIT_DATA_BRANCHED_ENTRIES \
96         SPLIT_DATA_ENTRY( SplitBranchedState, branched_state, 1)
97 #else
98 #define SPLIT_DATA_BRANCHED_ENTRIES
99 #endif  /* __BRANCHED_PATH__ */
100
101 #ifdef __SUBSURFACE__
102 #  define SPLIT_DATA_SUBSURFACE_ENTRIES \
103         SPLIT_DATA_ENTRY(ccl_global SubsurfaceIndirectRays, ss_rays, 1)
104 #else
105 #  define SPLIT_DATA_SUBSURFACE_ENTRIES
106 #endif /* __SUBSURFACE__ */
107
108 #ifdef __VOLUME__
109 #  define SPLIT_DATA_VOLUME_ENTRIES \
110         SPLIT_DATA_ENTRY(ccl_global PathState, state_shadow, 1)
111 #else
112 #  define SPLIT_DATA_VOLUME_ENTRIES
113 #endif /* __VOLUME__ */
114
115 #define SPLIT_DATA_ENTRIES \
116         SPLIT_DATA_ENTRY(ccl_global float3, throughput, 1) \
117         SPLIT_DATA_ENTRY(PathRadiance, path_radiance, 1) \
118         SPLIT_DATA_ENTRY(ccl_global Ray, ray, 1) \
119         SPLIT_DATA_ENTRY(ccl_global PathState, path_state, 1) \
120         SPLIT_DATA_ENTRY(ccl_global Intersection, isect, 1) \
121         SPLIT_DATA_ENTRY(ccl_global BsdfEval, bsdf_eval, 1) \
122         SPLIT_DATA_ENTRY(ccl_global int, is_lamp, 1) \
123         SPLIT_DATA_ENTRY(ccl_global Ray, light_ray, 1) \
124         SPLIT_DATA_ENTRY(ccl_global int, queue_data, (NUM_QUEUES*2)) /* TODO(mai): this is too large? */ \
125         SPLIT_DATA_ENTRY(ccl_global uint, work_array, 1) \
126         SPLIT_DATA_ENTRY(ShaderData, sd, 1) \
127         SPLIT_DATA_ENTRY(ShaderData, sd_DL_shadow, 1) \
128         SPLIT_DATA_SUBSURFACE_ENTRIES \
129         SPLIT_DATA_VOLUME_ENTRIES \
130         SPLIT_DATA_BRANCHED_ENTRIES \
131
132 /* entries to be copied to inactive rays when sharing branched samples (TODO: which are actually needed?) */
133 #define SPLIT_DATA_ENTRIES_BRANCHED_SHARED \
134         SPLIT_DATA_ENTRY(ccl_global float3, throughput, 1) \
135         SPLIT_DATA_ENTRY(PathRadiance, path_radiance, 1) \
136         SPLIT_DATA_ENTRY(ccl_global Ray, ray, 1) \
137         SPLIT_DATA_ENTRY(ccl_global PathState, path_state, 1) \
138         SPLIT_DATA_ENTRY(ccl_global Intersection, isect, 1) \
139         SPLIT_DATA_ENTRY(ccl_global BsdfEval, bsdf_eval, 1) \
140         SPLIT_DATA_ENTRY(ccl_global int, is_lamp, 1) \
141         SPLIT_DATA_ENTRY(ccl_global Ray, light_ray, 1) \
142         SPLIT_DATA_ENTRY(ShaderData, sd, 1) \
143         SPLIT_DATA_ENTRY(ShaderData, sd_DL_shadow, 1) \
144         SPLIT_DATA_SUBSURFACE_ENTRIES \
145         SPLIT_DATA_VOLUME_ENTRIES \
146         SPLIT_DATA_BRANCHED_ENTRIES \
147
148 /* struct that holds pointers to data in the shared state buffer */
149 typedef struct SplitData {
150 #define SPLIT_DATA_ENTRY(type, name, num) type *name;
151         SPLIT_DATA_ENTRIES
152 #undef SPLIT_DATA_ENTRY
153
154         /* this is actually in a separate buffer from the rest of the split state data (so it can be read back from
155          * the host easily) but is still used the same as the other data so we have it here in this struct as well
156          */
157         ccl_global char *ray_state;
158 } SplitData;
159
160 #ifndef __KERNEL_CUDA__
161 #  define kernel_split_state (kg->split_data)
162 #  define kernel_split_params (kg->split_param_data)
163 #else
164 __device__ SplitData __split_data;
165 #  define kernel_split_state (__split_data)
166 __device__ SplitParams __split_param_data;
167 #  define kernel_split_params (__split_param_data)
168 #endif  /* __KERNEL_CUDA__ */
169
170 /* Local storage for queue_enqueue kernel. */
171 typedef struct QueueEnqueueLocals {
172         uint queue_atomics[2];
173 } QueueEnqueueLocals;
174
175 /* Local storage for holdout_emission_blurring_pathtermination_ao kernel. */
176 typedef struct BackgroundAOLocals {
177         uint queue_atomics_bg;
178         uint queue_atomics_ao;
179 } BackgroundAOLocals;
180
181 typedef struct ShaderSortLocals {
182         uint local_value[SHADER_SORT_BLOCK_SIZE];
183         ushort local_index[SHADER_SORT_BLOCK_SIZE];
184 } ShaderSortLocals;
185
186 CCL_NAMESPACE_END
187
188 #endif  /* __KERNEL_SPLIT_DATA_TYPES_H__ */