Cycles: Split path initialization into own kernel
[blender-staging.git] / intern / cycles / kernel / split / kernel_sum_all_radiance.h
1 /*
2  * Copyright 2011-2015 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 CCL_NAMESPACE_BEGIN
18
19 /* Since we process various samples in parallel; The output radiance of different samples
20  * are stored in different locations; This kernel combines the output radiance contributed
21  * by all different samples and stores them in the RenderTile's output buffer.
22  */
23
24 ccl_device void kernel_sum_all_radiance(KernelGlobals *kg)
25 {
26         int x = ccl_global_id(0);
27         int y = ccl_global_id(1);
28
29         ccl_global float *buffer = kernel_split_params.buffer;
30         int sw = kernel_split_params.w;
31         int sh = kernel_split_params.h;
32         int stride = kernel_split_params.stride;
33         int start_sample = kernel_split_params.start_sample;
34
35         if(x < sw && y < sh) {
36                 ccl_global float *per_sample_output_buffer = kernel_split_state.per_sample_output_buffers;
37                 per_sample_output_buffer += (x + y * stride) * (kernel_data.film.pass_stride);
38
39                 x += kernel_split_params.x;
40                 y += kernel_split_params.y;
41
42                 buffer += (kernel_split_params.offset + x + y*stride) * (kernel_data.film.pass_stride);
43
44                 int pass_stride_iterator = 0;
45                 int num_floats = kernel_data.film.pass_stride;
46
47                 for(pass_stride_iterator = 0; pass_stride_iterator < num_floats; pass_stride_iterator++) {
48                         *(buffer + pass_stride_iterator) =
49                                 (start_sample == 0)
50                                         ? *(per_sample_output_buffer + pass_stride_iterator)
51                                         : *(buffer + pass_stride_iterator) + *(per_sample_output_buffer + pass_stride_iterator);
52                 }
53         }
54 }
55
56 CCL_NAMESPACE_END
57