Cycles: Remove sum_all_radiance kernel
[blender-staging.git] / intern / cycles / kernel / split / kernel_split_data.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_H__
18 #define __KERNEL_SPLIT_DATA_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 } SplitParams;
47
48 /* Global memory variables [porting]; These memory is used for
49  * co-operation between different kernels; Data written by one
50  * kernel will be available to another kernel via this global
51  * memory.
52  */
53
54 /* SPLIT_DATA_ENTRY(type, name, num) */
55
56 #if defined(WITH_CYCLES_DEBUG) || defined(__KERNEL_DEBUG__)
57 /* DebugData memory */
58 #  define SPLIT_DATA_DEBUG_ENTRIES \
59         SPLIT_DATA_ENTRY(DebugData, debug_data, 1)
60 #else
61 #  define SPLIT_DATA_DEBUG_ENTRIES
62 #endif
63
64 #define SPLIT_DATA_ENTRIES \
65         SPLIT_DATA_ENTRY(ccl_global RNG, rng, 1) \
66         SPLIT_DATA_ENTRY(ccl_global float3, throughput, 1) \
67         SPLIT_DATA_ENTRY(ccl_global float, L_transparent, 1) \
68         SPLIT_DATA_ENTRY(PathRadiance, path_radiance, 1) \
69         SPLIT_DATA_ENTRY(ccl_global Ray, ray, 1) \
70         SPLIT_DATA_ENTRY(ccl_global PathState, path_state, 1) \
71         SPLIT_DATA_ENTRY(Intersection, isect, 1) \
72         SPLIT_DATA_ENTRY(ccl_global float3, ao_alpha, 1) \
73         SPLIT_DATA_ENTRY(ccl_global float3, ao_bsdf, 1) \
74         SPLIT_DATA_ENTRY(ccl_global Ray, ao_light_ray, 1) \
75         SPLIT_DATA_ENTRY(ccl_global BsdfEval, bsdf_eval, 1) \
76         SPLIT_DATA_ENTRY(ccl_global int, is_lamp, 1) \
77         SPLIT_DATA_ENTRY(ccl_global Ray, light_ray, 1) \
78         SPLIT_DATA_ENTRY(Intersection, isect_shadow, 2) \
79         SPLIT_DATA_ENTRY(ccl_global int, queue_data, (NUM_QUEUES*2)) /* TODO(mai): this is too large? */ \
80         SPLIT_DATA_ENTRY(ccl_global uint, work_array, 1) \
81         SPLIT_DATA_DEBUG_ENTRIES \
82
83 /* struct that holds pointers to data in the shared state buffer */
84 typedef struct SplitData {
85 #define SPLIT_DATA_ENTRY(type, name, num) type *name;
86         SPLIT_DATA_ENTRIES
87 #undef SPLIT_DATA_ENTRY
88
89         /* size calculation for these is non trivial, so they are left out of SPLIT_DATA_ENTRIES and handled separately */
90         ShaderData *sd;
91         ShaderData *sd_DL_shadow;
92
93         /* this is actually in a separate buffer from the rest of the split state data (so it can be read back from
94          * the host easily) but is still used the same as the other data so we have it here in this struct as well
95          */
96         ccl_global char *ray_state;
97 } SplitData;
98
99 #define SIZEOF_SD(max_closure) (sizeof(ShaderData) - (sizeof(ShaderClosure) * (MAX_CLOSURE - (max_closure))))
100
101 ccl_device_inline size_t split_data_buffer_size(size_t num_elements,
102                                                 size_t max_closure,
103                                                 size_t per_thread_output_buffer_size)
104 {
105         size_t size = 0;
106 #define SPLIT_DATA_ENTRY(type, name, num) + align_up(num_elements * num * sizeof(type), 16)
107         size = size SPLIT_DATA_ENTRIES;
108 #undef SPLIT_DATA_ENTRY
109
110         /* TODO(sergey): This will actually over-allocate if
111          * particular kernel does not support multiclosure.
112          */
113         size += align_up(num_elements * SIZEOF_SD(max_closure), 16); /* sd */
114         size += align_up(2 * num_elements * SIZEOF_SD(max_closure), 16); /* sd_DL_shadow */
115
116         return size;
117 }
118
119 ccl_device_inline void split_data_init(ccl_global SplitData *split_data,
120                                        size_t num_elements,
121                                        ccl_global void *data,
122                                        ccl_global char *ray_state)
123 {
124         ccl_global char *p = (ccl_global char*)data;
125
126 #define SPLIT_DATA_ENTRY(type, name, num) \
127         split_data->name = (type*)p; p += align_up(num_elements * num * sizeof(type), 16);
128         SPLIT_DATA_ENTRIES
129 #undef SPLIT_DATA_ENTRY
130
131         split_data->sd = (ShaderData*)p;
132         p += align_up(num_elements * SIZEOF_SD(MAX_CLOSURE), 16);
133
134         split_data->sd_DL_shadow = (ShaderData*)p;
135         p += align_up(2 * num_elements * SIZEOF_SD(MAX_CLOSURE), 16);
136
137         split_data->ray_state = ray_state;
138 }
139
140 #ifndef __KERNEL_CUDA__
141 #  define kernel_split_state (kg->split_data)
142 #  define kernel_split_params (kg->split_param_data)
143 #else
144 __device__ SplitData __split_data;
145 #  define kernel_split_state (__split_data)
146 __device__ SplitParams __split_param_data;
147 #  define kernel_split_params (__split_param_data)
148 #endif  /* __KERNEL_CUDA__ */
149
150 CCL_NAMESPACE_END
151
152 #endif  /* __KERNEL_SPLIT_DATA_H__ */
153
154
155