Cycles: OpenCL split kernel cleanup, move casts from .h files to .cl files
[blender.git] / intern / cycles / kernel / split / kernel_shader_eval.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 #include "kernel_split_common.h"
18
19 /* Note on kernel_shader_eval kernel
20  * This kernel is the 5th kernel in the ray tracing logic. This is
21  * the 4rd kernel in path iteration. This kernel sets up the ShaderData
22  * structure from the values computed by the previous kernels. It also identifies
23  * the rays of state RAY_TO_REGENERATE and enqueues them in QUEUE_HITBG_BUFF_UPDATE_TOREGEN_RAYS queue.
24  *
25  * The input and output of the kernel is as follows,
26  * rng_coop -------------------------------------------|--- kernel_shader_eval --|--- sd
27  * Ray_coop -------------------------------------------|                         |--- Queue_data (QUEUE_HITBG_BUFF_UPDATE_TOREGEN_RAYS)
28  * PathState_coop -------------------------------------|                         |--- Queue_index (QUEUE_HITBG_BUFF_UPDATE_TOREGEN_RAYS)
29  * Intersection_coop ----------------------------------|                         |
30  * Queue_data (QUEUE_ACTIVE_AND_REGENERATD_RAYS)-------|                         |
31  * Queue_index(QUEUE_HITBG_BUFF_UPDATE_TOREGEN_RAYS)---|                         |
32  * ray_state ------------------------------------------|                         |
33  * kg (globals + data) --------------------------------|                         |
34  * queuesize ------------------------------------------|                         |
35  *
36  * Note on Queues :
37  * This kernel reads from the QUEUE_ACTIVE_AND_REGENERATED_RAYS queue and processes
38  * only the rays of state RAY_ACTIVE;
39  * State of queues when this kernel is called,
40  * at entry,
41  * QUEUE_ACTIVE_AND_REGENERATED_RAYS will be filled with RAY_ACTIVE and RAY_REGENERATED rays
42  * QUEUE_HITBG_BUFF_UPDATE_TOREGEN_RAYS will be empty.
43  * at exit,
44  * QUEUE_ACTIVE_AND_REGENERATED_RAYS will be filled with RAY_ACTIVE and RAY_REGENERATED rays
45  * QUEUE_HITBG_BUFF_UPDATE_TOREGEN_RAYS will be filled with RAY_TO_REGENERATE rays
46  */
47 ccl_device void kernel_shader_eval(
48         KernelGlobals *kg,
49         ccl_constant KernelData *data,
50         ShaderData *sd,                        /* Output ShaderData structure to be filled */
51         ccl_global uint *rng_coop,             /* Required for rbsdf calculation */
52         ccl_global Ray *Ray_coop,              /* Required for setting up shader from ray */
53         ccl_global PathState *PathState_coop,  /* Required for all functions in this kernel */
54         Intersection *Intersection_coop,       /* Required for setting up shader from ray */
55         ccl_global char *ray_state,            /* Denotes the state of each ray */
56         int ray_index)
57 {
58         if(IS_STATE(ray_state, ray_index, RAY_ACTIVE)) {
59                 Intersection *isect = &Intersection_coop[ray_index];
60                 ccl_global uint *rng = &rng_coop[ray_index];
61                 ccl_global PathState *state = &PathState_coop[ray_index];
62                 Ray ray = Ray_coop[ray_index];
63
64                 shader_setup_from_ray(kg,
65                                       sd,
66                                       isect,
67                                       &ray,
68                                       state->bounce,
69                                       state->transparent_bounce);
70                 float rbsdf = path_state_rng_1D_for_decision(kg, rng, state, PRNG_BSDF);
71                 shader_eval_surface(kg, sd, rbsdf, state->flag, SHADER_CONTEXT_MAIN);
72         }
73 }