2 * Copyright 2011-2013 Blender Foundation
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 /* Shader Virtual Machine
22 * A shader is a list of nodes to be executed. These are simply read one after
23 * the other and executed, using an node counter. Each node and it's associated
24 * data is encoded as one or more uint4's in a 1D texture. If the data is larger
25 * than an uint4, the node can increase the node counter to compensate for this.
26 * Floats are encoded as int and then converted to float again.
28 * Nodes write their output into a stack. All stack data in the stack is
29 * floats, since it's all factors, colors and vectors. The stack will be stored
30 * in local memory on the GPU, as it would take too many register and indexes in
31 * ways not known at compile time. This seems the only solution even though it
32 * may be slow, with two positive factors. If the same shader is being executed,
33 * memory access will be coalesced, and on fermi cards, memory will actually be
36 * The result of shader execution will be a single closure. This means the
37 * closure type, associated label, data and weight. Sampling from multiple
38 * closures is supported through the mix closure node, the logic for that is
39 * mostly taken care of in the SVM compiler.
42 #include "kernel/svm/svm_types.h"
48 ccl_device_inline float3 stack_load_float3(float *stack, uint a)
50 kernel_assert(a+2 < SVM_STACK_SIZE);
52 return make_float3(stack[a+0], stack[a+1], stack[a+2]);
55 ccl_device_inline void stack_store_float3(float *stack, uint a, float3 f)
57 kernel_assert(a+2 < SVM_STACK_SIZE);
64 ccl_device_inline float stack_load_float(float *stack, uint a)
66 kernel_assert(a < SVM_STACK_SIZE);
71 ccl_device_inline float stack_load_float_default(float *stack, uint a, uint value)
73 return (a == (uint)SVM_STACK_INVALID)? __uint_as_float(value): stack_load_float(stack, a);
76 ccl_device_inline void stack_store_float(float *stack, uint a, float f)
78 kernel_assert(a < SVM_STACK_SIZE);
83 ccl_device_inline int stack_load_int(float *stack, uint a)
85 kernel_assert(a < SVM_STACK_SIZE);
87 return __float_as_int(stack[a]);
90 ccl_device_inline int stack_load_int_default(float *stack, uint a, uint value)
92 return (a == (uint)SVM_STACK_INVALID)? (int)value: stack_load_int(stack, a);
95 ccl_device_inline void stack_store_int(float *stack, uint a, int i)
97 kernel_assert(a < SVM_STACK_SIZE);
99 stack[a] = __int_as_float(i);
102 ccl_device_inline bool stack_valid(uint a)
104 return a != (uint)SVM_STACK_INVALID;
109 ccl_device_inline uint4 read_node(KernelGlobals *kg, int *offset)
111 uint4 node = kernel_tex_fetch(__svm_nodes, *offset);
116 ccl_device_inline float4 read_node_float(KernelGlobals *kg, int *offset)
118 uint4 node = kernel_tex_fetch(__svm_nodes, *offset);
119 float4 f = make_float4(__uint_as_float(node.x), __uint_as_float(node.y), __uint_as_float(node.z), __uint_as_float(node.w));
124 ccl_device_inline float4 fetch_node_float(KernelGlobals *kg, int offset)
126 uint4 node = kernel_tex_fetch(__svm_nodes, offset);
127 return make_float4(__uint_as_float(node.x), __uint_as_float(node.y), __uint_as_float(node.z), __uint_as_float(node.w));
130 ccl_device_inline void decode_node_uchar4(uint i, uint *x, uint *y, uint *z, uint *w)
132 if(x) *x = (i & 0xFF);
133 if(y) *y = ((i >> 8) & 0xFF);
134 if(z) *z = ((i >> 16) & 0xFF);
135 if(w) *w = ((i >> 24) & 0xFF);
142 #include "kernel/svm/svm_noise.h"
143 #include "svm_texture.h"
145 #include "kernel/svm/svm_color_util.h"
146 #include "kernel/svm/svm_math_util.h"
148 #include "kernel/svm/svm_attribute.h"
149 #include "kernel/svm/svm_gradient.h"
150 #include "kernel/svm/svm_blackbody.h"
151 #include "kernel/svm/svm_closure.h"
152 #include "kernel/svm/svm_noisetex.h"
153 #include "kernel/svm/svm_convert.h"
154 #include "kernel/svm/svm_displace.h"
155 #include "kernel/svm/svm_fresnel.h"
156 #include "kernel/svm/svm_wireframe.h"
157 #include "kernel/svm/svm_wavelength.h"
158 #include "kernel/svm/svm_camera.h"
159 #include "kernel/svm/svm_geometry.h"
160 #include "kernel/svm/svm_hsv.h"
161 #include "kernel/svm/svm_image.h"
162 #include "kernel/svm/svm_gamma.h"
163 #include "kernel/svm/svm_brightness.h"
164 #include "kernel/svm/svm_invert.h"
165 #include "kernel/svm/svm_light_path.h"
166 #include "kernel/svm/svm_magic.h"
167 #include "kernel/svm/svm_mapping.h"
168 #include "kernel/svm/svm_normal.h"
169 #include "kernel/svm/svm_wave.h"
170 #include "kernel/svm/svm_math.h"
171 #include "kernel/svm/svm_mix.h"
172 #include "kernel/svm/svm_ramp.h"
173 #include "kernel/svm/svm_sepcomb_hsv.h"
174 #include "kernel/svm/svm_sepcomb_vector.h"
175 #include "kernel/svm/svm_musgrave.h"
176 #include "kernel/svm/svm_sky.h"
177 #include "kernel/svm/svm_tex_coord.h"
178 #include "kernel/svm/svm_value.h"
179 #include "kernel/svm/svm_voronoi.h"
180 #include "kernel/svm/svm_checker.h"
181 #include "kernel/svm/svm_brick.h"
182 #include "kernel/svm/svm_vector_transform.h"
183 #include "kernel/svm/svm_voxel.h"
184 #include "kernel/svm/svm_bump.h"
186 #ifdef __SHADER_RAYTRACE__
187 # include "kernel/svm/svm_bevel.h"
192 #define NODES_GROUP(group) ((group) <= __NODES_MAX_GROUP__)
193 #define NODES_FEATURE(feature) ((__NODES_FEATURES__ & (feature)) != 0)
195 /* Main Interpreter Loop */
196 ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ccl_addr_space PathState *state, ShaderType type, int path_flag)
198 float stack[SVM_STACK_SIZE];
199 int offset = sd->shader & SHADER_MASK;
202 uint4 node = read_node(kg, &offset);
205 #if NODES_GROUP(NODE_GROUP_LEVEL_0)
206 case NODE_SHADER_JUMP: {
207 if(type == SHADER_TYPE_SURFACE) offset = node.y;
208 else if(type == SHADER_TYPE_VOLUME) offset = node.z;
209 else if(type == SHADER_TYPE_DISPLACEMENT) offset = node.w;
213 case NODE_CLOSURE_BSDF:
214 svm_node_closure_bsdf(kg, sd, stack, node, type, path_flag, &offset);
216 case NODE_CLOSURE_EMISSION:
217 svm_node_closure_emission(sd, stack, node);
219 case NODE_CLOSURE_BACKGROUND:
220 svm_node_closure_background(sd, stack, node);
222 case NODE_CLOSURE_SET_WEIGHT:
223 svm_node_closure_set_weight(sd, node.y, node.z, node.w);
225 case NODE_CLOSURE_WEIGHT:
226 svm_node_closure_weight(sd, stack, node.y);
228 case NODE_EMISSION_WEIGHT:
229 svm_node_emission_weight(kg, sd, stack, node);
231 case NODE_MIX_CLOSURE:
232 svm_node_mix_closure(sd, stack, node);
234 case NODE_JUMP_IF_ZERO:
235 if(stack_load_float(stack, node.z) == 0.0f)
238 case NODE_JUMP_IF_ONE:
239 if(stack_load_float(stack, node.z) == 1.0f)
243 svm_node_geometry(kg, sd, stack, node.y, node.z);
246 svm_node_convert(sd, stack, node.y, node.z, node.w);
249 svm_node_tex_coord(kg, sd, path_flag, stack, node, &offset);
252 svm_node_value_f(kg, sd, stack, node.y, node.z);
255 svm_node_value_v(kg, sd, stack, node.y, &offset);
258 svm_node_attr(kg, sd, stack, node);
260 # if NODES_FEATURE(NODE_FEATURE_BUMP)
261 case NODE_GEOMETRY_BUMP_DX:
262 svm_node_geometry_bump_dx(kg, sd, stack, node.y, node.z);
264 case NODE_GEOMETRY_BUMP_DY:
265 svm_node_geometry_bump_dy(kg, sd, stack, node.y, node.z);
267 case NODE_SET_DISPLACEMENT:
268 svm_node_set_displacement(kg, sd, stack, node.y);
270 case NODE_DISPLACEMENT:
271 svm_node_displacement(kg, sd, stack, node);
273 # endif /* NODES_FEATURE(NODE_FEATURE_BUMP) */
276 svm_node_tex_image(kg, sd, stack, node);
278 case NODE_TEX_IMAGE_BOX:
279 svm_node_tex_image_box(kg, sd, stack, node);
282 svm_node_tex_noise(kg, sd, stack, node, &offset);
284 # endif /* __TEXTURES__ */
285 # ifdef __EXTRA_NODES__
286 # if NODES_FEATURE(NODE_FEATURE_BUMP)
288 svm_node_set_bump(kg, sd, stack, node);
290 case NODE_ATTR_BUMP_DX:
291 svm_node_attr_bump_dx(kg, sd, stack, node);
293 case NODE_ATTR_BUMP_DY:
294 svm_node_attr_bump_dy(kg, sd, stack, node);
296 case NODE_TEX_COORD_BUMP_DX:
297 svm_node_tex_coord_bump_dx(kg, sd, path_flag, stack, node, &offset);
299 case NODE_TEX_COORD_BUMP_DY:
300 svm_node_tex_coord_bump_dy(kg, sd, path_flag, stack, node, &offset);
302 case NODE_CLOSURE_SET_NORMAL:
303 svm_node_set_normal(kg, sd, stack, node.y, node.z);
305 # if NODES_FEATURE(NODE_FEATURE_BUMP_STATE)
306 case NODE_ENTER_BUMP_EVAL:
307 svm_node_enter_bump_eval(kg, sd, stack, node.y);
309 case NODE_LEAVE_BUMP_EVAL:
310 svm_node_leave_bump_eval(kg, sd, stack, node.y);
312 # endif /* NODES_FEATURE(NODE_FEATURE_BUMP_STATE) */
313 # endif /* NODES_FEATURE(NODE_FEATURE_BUMP) */
315 svm_node_hsv(kg, sd, stack, node, &offset);
317 # endif /* __EXTRA_NODES__ */
318 #endif /* NODES_GROUP(NODE_GROUP_LEVEL_0) */
320 #if NODES_GROUP(NODE_GROUP_LEVEL_1)
321 case NODE_CLOSURE_HOLDOUT:
322 svm_node_closure_holdout(sd, stack, node);
324 case NODE_CLOSURE_AMBIENT_OCCLUSION:
325 svm_node_closure_ambient_occlusion(sd, stack, node);
328 svm_node_fresnel(sd, stack, node.y, node.z, node.w);
330 case NODE_LAYER_WEIGHT:
331 svm_node_layer_weight(sd, stack, node);
333 # if NODES_FEATURE(NODE_FEATURE_VOLUME)
334 case NODE_CLOSURE_VOLUME:
335 svm_node_closure_volume(kg, sd, stack, node, type, path_flag);
337 # endif /* NODES_FEATURE(NODE_FEATURE_VOLUME) */
338 # ifdef __EXTRA_NODES__
340 svm_node_math(kg, sd, stack, node.y, node.z, node.w, &offset);
342 case NODE_VECTOR_MATH:
343 svm_node_vector_math(kg, sd, stack, node.y, node.z, node.w, &offset);
346 svm_node_rgb_ramp(kg, sd, stack, node, &offset);
349 svm_node_gamma(sd, stack, node.y, node.z, node.w);
351 case NODE_BRIGHTCONTRAST:
352 svm_node_brightness(sd, stack, node.y, node.z, node.w);
354 case NODE_LIGHT_PATH:
355 svm_node_light_path(sd, state, stack, node.y, node.z, path_flag);
357 case NODE_OBJECT_INFO:
358 svm_node_object_info(kg, sd, stack, node.y, node.z);
360 case NODE_PARTICLE_INFO:
361 svm_node_particle_info(kg, sd, stack, node.y, node.z);
364 # if NODES_FEATURE(NODE_FEATURE_HAIR)
366 svm_node_hair_info(kg, sd, stack, node.y, node.z);
368 # endif /* NODES_FEATURE(NODE_FEATURE_HAIR) */
369 # endif /* __HAIR__ */
370 # endif /* __EXTRA_NODES__ */
371 #endif /* NODES_GROUP(NODE_GROUP_LEVEL_1) */
373 #if NODES_GROUP(NODE_GROUP_LEVEL_2)
375 svm_node_mapping(kg, sd, stack, node.y, node.z, &offset);
378 svm_node_min_max(kg, sd, stack, node.y, node.z, &offset);
381 svm_node_camera(kg, sd, stack, node.y, node.z, node.w);
384 case NODE_TEX_ENVIRONMENT:
385 svm_node_tex_environment(kg, sd, stack, node);
388 svm_node_tex_sky(kg, sd, stack, node, &offset);
390 case NODE_TEX_GRADIENT:
391 svm_node_tex_gradient(sd, stack, node);
393 case NODE_TEX_VORONOI:
394 svm_node_tex_voronoi(kg, sd, stack, node, &offset);
396 case NODE_TEX_MUSGRAVE:
397 svm_node_tex_musgrave(kg, sd, stack, node, &offset);
400 svm_node_tex_wave(kg, sd, stack, node, &offset);
403 svm_node_tex_magic(kg, sd, stack, node, &offset);
405 case NODE_TEX_CHECKER:
406 svm_node_tex_checker(kg, sd, stack, node);
409 svm_node_tex_brick(kg, sd, stack, node, &offset);
411 # endif /* __TEXTURES__ */
412 # ifdef __EXTRA_NODES__
414 svm_node_normal(kg, sd, stack, node.y, node.z, node.w, &offset);
416 case NODE_LIGHT_FALLOFF:
417 svm_node_light_falloff(sd, stack, node);
419 # endif /* __EXTRA_NODES__ */
420 #endif /* NODES_GROUP(NODE_GROUP_LEVEL_2) */
422 #if NODES_GROUP(NODE_GROUP_LEVEL_3)
423 case NODE_RGB_CURVES:
424 case NODE_VECTOR_CURVES:
425 svm_node_curves(kg, sd, stack, node, &offset);
428 svm_node_tangent(kg, sd, stack, node);
430 case NODE_NORMAL_MAP:
431 svm_node_normal_map(kg, sd, stack, node);
433 # ifdef __EXTRA_NODES__
435 svm_node_invert(sd, stack, node.y, node.z, node.w);
438 svm_node_mix(kg, sd, stack, node.y, node.z, node.w, &offset);
440 case NODE_SEPARATE_VECTOR:
441 svm_node_separate_vector(sd, stack, node.y, node.z, node.w);
443 case NODE_COMBINE_VECTOR:
444 svm_node_combine_vector(sd, stack, node.y, node.z, node.w);
446 case NODE_SEPARATE_HSV:
447 svm_node_separate_hsv(kg, sd, stack, node.y, node.z, node.w, &offset);
449 case NODE_COMBINE_HSV:
450 svm_node_combine_hsv(kg, sd, stack, node.y, node.z, node.w, &offset);
452 case NODE_VECTOR_TRANSFORM:
453 svm_node_vector_transform(kg, sd, stack, node);
456 svm_node_wireframe(kg, sd, stack, node);
458 case NODE_WAVELENGTH:
459 svm_node_wavelength(sd, stack, node.y, node.z);
462 svm_node_blackbody(kg, sd, stack, node.y, node.z);
464 # endif /* __EXTRA_NODES__ */
465 # if NODES_FEATURE(NODE_FEATURE_VOLUME)
467 svm_node_tex_voxel(kg, sd, stack, node, &offset);
469 # endif /* NODES_FEATURE(NODE_FEATURE_VOLUME) */
470 # ifdef __SHADER_RAYTRACE__
472 svm_node_bevel(kg, sd, state, stack, node);
474 # endif /* __SHADER_RAYTRACE__ */
475 #endif /* NODES_GROUP(NODE_GROUP_LEVEL_3) */
479 kernel_assert(!"Unknown node type was passed to the SVM machine");
490 #endif /* __SVM_H__ */