Blender V5.0
kernel/svm/svm.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#pragma once
6
7/* Shader Virtual Machine
8 *
9 * A shader is a list of nodes to be executed. These are simply read one after
10 * the other and executed, using an node counter. Each node and its associated
11 * data is encoded as one or more uint4's in a 1D texture. If the data is larger
12 * than an uint4, the node can increase the node counter to compensate for this.
13 * Floats are encoded as int and then converted to float again.
14 *
15 * Nodes write their output into a stack. All stack data in the stack is
16 * floats, since it's all factors, colors and vectors. The stack will be stored
17 * in local memory on the GPU, as it would take too many register and indexes in
18 * ways not known at compile time. This seems the only solution even though it
19 * may be slow, with two positive factors. If the same shader is being executed,
20 * memory access will be coalesced and cached.
21 *
22 * The result of shader execution will be a single closure. This means the
23 * closure type, associated label, data and weight. Sampling from multiple
24 * closures is supported through the mix closure node, the logic for that is
25 * mostly taken care of in the SVM compiler.
26 */
27
28#include "kernel/globals.h"
29#include "kernel/types.h"
30
31#include "kernel/svm/types.h"
32#include "kernel/svm/util.h"
33
34/* Nodes */
35
36#include "kernel/svm/aov.h"
39#include "kernel/svm/brick.h"
41#include "kernel/svm/bump.h"
42#include "kernel/svm/camera.h"
43#include "kernel/svm/checker.h"
44#include "kernel/svm/clamp.h"
45#include "kernel/svm/closure.h"
46#include "kernel/svm/convert.h"
47#include "kernel/svm/displace.h"
48#include "kernel/svm/fresnel.h"
49#include "kernel/svm/gabor.h"
50#include "kernel/svm/gamma.h"
51#include "kernel/svm/geometry.h"
52#include "kernel/svm/gradient.h"
53#include "kernel/svm/hsv.h"
54#include "kernel/svm/ies.h"
55#include "kernel/svm/image.h"
56#include "kernel/svm/invert.h"
58#include "kernel/svm/magic.h"
60#include "kernel/svm/mapping.h"
61#include "kernel/svm/math.h"
62#include "kernel/svm/mix.h"
63#include "kernel/svm/noisetex.h"
64#include "kernel/svm/normal.h"
66#include "kernel/svm/ramp.h"
69#include "kernel/svm/sky.h"
71#include "kernel/svm/value.h"
75#include "kernel/svm/voronoi.h"
76#include "kernel/svm/wave.h"
80
81#ifdef __SHADER_RAYTRACE__
82# include "kernel/svm/ao.h"
83# include "kernel/svm/bevel.h"
84#endif
85
87
88#ifdef __KERNEL_USE_DATA_CONSTANTS__
89# define SVM_CASE(node) \
90 case node: \
91 if (!kernel_data_svm_usage_##node) \
92 break;
93#else
94# define SVM_CASE(node) case node:
95#endif
96
97/* Main Interpreter Loop */
98template<uint node_feature_mask, ShaderType type, typename ConstIntegratorGenericState>
100 ConstIntegratorGenericState state,
101 ccl_private ShaderData *sd,
103 const uint32_t path_flag)
104{
105 float stack[SVM_STACK_SIZE];
106 /* Initialiez to silence (false positive?) warning about uninitialzied use on Windows. */
107 Spectrum closure_weight = zero_spectrum();
108 int offset = sd->shader & SHADER_MASK;
109
110 while (true) {
111 uint4 node = read_node(kg, &offset);
112
113 switch (node.x) {
114 SVM_CASE(NODE_END)
115 return;
116 SVM_CASE(NODE_SHADER_JUMP)
117 {
118 if (type == SHADER_TYPE_SURFACE) {
119 offset = node.y;
120 }
121 else if (type == SHADER_TYPE_VOLUME) {
122 offset = node.z;
123 }
124 else if (type == SHADER_TYPE_DISPLACEMENT) {
125 offset = node.w;
126 }
127 else {
128 return;
129 }
130 break;
131 }
132 SVM_CASE(NODE_CLOSURE_BSDF)
134 kg, sd, stack, closure_weight, node, path_flag, offset);
135 break;
136 SVM_CASE(NODE_CLOSURE_EMISSION)
138 {
139 svm_node_closure_emission(kg, sd, stack, closure_weight, node);
140 }
141 break;
142 SVM_CASE(NODE_CLOSURE_BACKGROUND)
144 {
145 svm_node_closure_background(sd, stack, closure_weight, node);
146 }
147 break;
148 SVM_CASE(NODE_CLOSURE_SET_WEIGHT)
149 svm_node_closure_set_weight(&closure_weight, node.y, node.z, node.w);
150 break;
151 SVM_CASE(NODE_CLOSURE_WEIGHT)
152 svm_node_closure_weight(stack, &closure_weight, node.y);
153 break;
154 SVM_CASE(NODE_EMISSION_WEIGHT)
156 {
157 svm_node_emission_weight(stack, &closure_weight, node);
158 }
159 break;
160 SVM_CASE(NODE_MIX_CLOSURE)
161 svm_node_mix_closure(stack, node);
162 break;
163 SVM_CASE(NODE_JUMP_IF_ZERO)
164 if (stack_load_float(stack, node.z) <= 0.0f) {
165 offset += node.y;
166 }
167 break;
168 SVM_CASE(NODE_JUMP_IF_ONE)
169 if (stack_load_float(stack, node.z) >= 1.0f) {
170 offset += node.y;
171 }
172 break;
173 SVM_CASE(NODE_GEOMETRY)
174 svm_node_geometry(kg, sd, stack, node.y, node.z);
175 break;
176 SVM_CASE(NODE_CONVERT)
177 svm_node_convert(kg, stack, node.y, node.z, node.w);
178 break;
179 SVM_CASE(NODE_TEX_COORD)
180 offset = svm_node_tex_coord(kg, sd, path_flag, stack, node, offset);
181 break;
182 SVM_CASE(NODE_VALUE_F)
183 svm_node_value_f(stack, node.y, node.z);
184 break;
185 SVM_CASE(NODE_VALUE_V)
186 offset = svm_node_value_v(kg, stack, node.y, offset);
187 break;
188 SVM_CASE(NODE_ATTR)
189 svm_node_attr<node_feature_mask>(kg, sd, stack, node);
190 break;
191 SVM_CASE(NODE_VERTEX_COLOR)
192 svm_node_vertex_color(kg, sd, stack, node);
193 break;
194 SVM_CASE(NODE_GEOMETRY_BUMP_DX)
196 {
197 svm_node_geometry_bump_dx(kg, sd, stack, node.y, node.z, __uint_as_float(node.w));
198 }
199 break;
200 SVM_CASE(NODE_GEOMETRY_BUMP_DY)
202 {
203 svm_node_geometry_bump_dy(kg, sd, stack, node.y, node.z, __uint_as_float(node.w));
204 }
205 break;
206 SVM_CASE(NODE_SET_DISPLACEMENT)
208 break;
209 SVM_CASE(NODE_DISPLACEMENT)
210 svm_node_displacement<node_feature_mask>(kg, sd, stack, node);
211 break;
212 SVM_CASE(NODE_VECTOR_DISPLACEMENT)
213 offset = svm_node_vector_displacement<node_feature_mask>(kg, sd, stack, node, offset);
214 break;
215 SVM_CASE(NODE_TEX_IMAGE)
216 offset = svm_node_tex_image(kg, sd, stack, node, offset);
217 break;
218 SVM_CASE(NODE_TEX_IMAGE_BOX)
219 svm_node_tex_image_box(kg, sd, stack, node);
220 break;
221 SVM_CASE(NODE_TEX_NOISE)
222 offset = svm_node_tex_noise(kg, stack, node.y, node.z, node.w, offset);
223 break;
224 SVM_CASE(NODE_SET_BUMP)
225 offset = svm_node_set_bump<node_feature_mask>(kg, sd, stack, node, offset);
226 break;
227 SVM_CASE(NODE_ATTR_BUMP_DX)
229 {
230 svm_node_attr_bump_dx(kg, sd, stack, node);
231 }
232 break;
233 SVM_CASE(NODE_ATTR_BUMP_DY)
235 {
236 svm_node_attr_bump_dy(kg, sd, stack, node);
237 }
238 break;
239 SVM_CASE(NODE_VERTEX_COLOR_BUMP_DX)
241 {
242 svm_node_vertex_color_bump_dx(kg, sd, stack, node);
243 }
244 break;
245 SVM_CASE(NODE_VERTEX_COLOR_BUMP_DY)
247 {
248 svm_node_vertex_color_bump_dy(kg, sd, stack, node);
249 }
250 break;
251 SVM_CASE(NODE_TEX_COORD_BUMP_DX)
253 {
254 offset = svm_node_tex_coord_bump_dx(kg, sd, path_flag, stack, node, offset);
255 }
256 break;
257 SVM_CASE(NODE_TEX_COORD_BUMP_DY)
259 {
260 offset = svm_node_tex_coord_bump_dy(kg, sd, path_flag, stack, node, offset);
261 }
262 break;
263 SVM_CASE(NODE_CLOSURE_SET_NORMAL)
265 {
266 svm_node_set_normal(sd, stack, node.y, node.z);
267 }
268 break;
269 SVM_CASE(NODE_ENTER_BUMP_EVAL)
270 IF_KERNEL_NODES_FEATURE(BUMP_STATE)
271 {
272 svm_node_enter_bump_eval(kg, sd, stack, node.y);
273 }
274 break;
275 SVM_CASE(NODE_LEAVE_BUMP_EVAL)
276 IF_KERNEL_NODES_FEATURE(BUMP_STATE)
277 {
278 svm_node_leave_bump_eval(sd, stack, node.y);
279 }
280 break;
281 SVM_CASE(NODE_HSV)
282 svm_node_hsv(stack, node);
283 break;
284 SVM_CASE(NODE_CLOSURE_HOLDOUT)
285 svm_node_closure_holdout(sd, stack, closure_weight, node);
286 break;
287 SVM_CASE(NODE_FRESNEL)
288 svm_node_fresnel(sd, stack, node.y, node.z, node.w);
289 break;
290 SVM_CASE(NODE_LAYER_WEIGHT)
291 svm_node_layer_weight(sd, stack, node);
292 break;
293 SVM_CASE(NODE_CLOSURE_VOLUME)
295 {
296 svm_node_closure_volume<type>(kg, sd, stack, closure_weight, node);
297 }
298 break;
299 SVM_CASE(NODE_VOLUME_COEFFICIENTS)
301 {
302 svm_node_volume_coefficients<type>(kg, sd, stack, closure_weight, node, path_flag);
303 }
304 break;
305 SVM_CASE(NODE_PRINCIPLED_VOLUME)
307 {
309 kg, sd, stack, closure_weight, node, path_flag, offset);
310 }
311 break;
312 SVM_CASE(NODE_MATH)
313 svm_node_math(stack, node.y, node.z, node.w);
314 break;
315 SVM_CASE(NODE_VECTOR_MATH)
316 offset = svm_node_vector_math(kg, stack, node.y, node.z, node.w, offset);
317 break;
318 SVM_CASE(NODE_RGB_RAMP)
319 offset = svm_node_rgb_ramp(kg, stack, node, offset);
320 break;
321 SVM_CASE(NODE_GAMMA)
322 svm_node_gamma(stack, node.y, node.z, node.w);
323 break;
324 SVM_CASE(NODE_BRIGHTCONTRAST)
325 svm_node_brightness(stack, node.y, node.z, node.w);
326 break;
327 SVM_CASE(NODE_LIGHT_PATH)
328 svm_node_light_path<node_feature_mask>(kg, state, sd, stack, node.y, node.z, path_flag);
329 break;
330 SVM_CASE(NODE_OBJECT_INFO)
331 svm_node_object_info(kg, sd, stack, node.y, node.z);
332 break;
333 SVM_CASE(NODE_PARTICLE_INFO)
334 svm_node_particle_info(kg, sd, stack, node.y, node.z);
335 break;
336#if defined(__HAIR__)
337 SVM_CASE(NODE_HAIR_INFO)
338 svm_node_hair_info(kg, sd, stack, node.y, node.z);
339 break;
340#endif
341#if defined(__POINTCLOUD__)
342 SVM_CASE(NODE_POINT_INFO)
343 svm_node_point_info(kg, sd, stack, node.y, node.z);
344 break;
345#endif
346 SVM_CASE(NODE_TEXTURE_MAPPING)
347 offset = svm_node_texture_mapping(kg, stack, node.y, node.z, offset);
348 break;
349 SVM_CASE(NODE_MAPPING)
350 svm_node_mapping(stack, node.y, node.z, node.w);
351 break;
352 SVM_CASE(NODE_MIN_MAX)
353 offset = svm_node_min_max(kg, stack, node.y, node.z, offset);
354 break;
355 SVM_CASE(NODE_CAMERA)
356 svm_node_camera(kg, sd, stack, node.y, node.z, node.w);
357 break;
358 SVM_CASE(NODE_TEX_ENVIRONMENT)
359 svm_node_tex_environment(kg, sd, stack, node);
360 break;
361 SVM_CASE(NODE_TEX_SKY)
362 offset = svm_node_tex_sky(kg, path_flag, stack, node, offset);
363 break;
364 SVM_CASE(NODE_TEX_GRADIENT)
365 svm_node_tex_gradient(stack, node);
366 break;
367 SVM_CASE(NODE_TEX_VORONOI)
368 offset = svm_node_tex_voronoi<node_feature_mask>(kg, stack, node.y, node.z, node.w, offset);
369 break;
370 SVM_CASE(NODE_TEX_GABOR)
371 offset = svm_node_tex_gabor(kg, stack, node.y, node.z, node.w, offset);
372 break;
373 SVM_CASE(NODE_TEX_WAVE)
374 offset = svm_node_tex_wave(kg, stack, node, offset);
375 break;
376 SVM_CASE(NODE_TEX_MAGIC)
377 offset = svm_node_tex_magic(kg, stack, node, offset);
378 break;
379 SVM_CASE(NODE_TEX_CHECKER)
380 svm_node_tex_checker(stack, node);
381 break;
382 SVM_CASE(NODE_TEX_BRICK)
383 offset = svm_node_tex_brick(kg, stack, node, offset);
384 break;
385 SVM_CASE(NODE_TEX_WHITE_NOISE)
386 svm_node_tex_white_noise(stack, node.y, node.z, node.w);
387 break;
388 SVM_CASE(NODE_NORMAL)
389 offset = svm_node_normal(kg, stack, node.y, node.z, node.w, offset);
390 break;
391 SVM_CASE(NODE_LIGHT_FALLOFF)
392 svm_node_light_falloff(sd, stack, node);
393 break;
394 SVM_CASE(NODE_IES)
395 svm_node_ies(kg, sd, stack, node);
396 break;
397 SVM_CASE(NODE_CURVES)
398 offset = svm_node_curves(kg, stack, node, offset);
399 break;
400 SVM_CASE(NODE_TANGENT)
401 svm_node_tangent(kg, sd, stack, node);
402 break;
403 SVM_CASE(NODE_NORMAL_MAP)
404 svm_node_normal_map(kg, sd, stack, node);
405 break;
406 SVM_CASE(NODE_RADIAL_TILING)
407 offset = svm_node_radial_tiling<node_feature_mask>(stack, node, offset);
408 break;
409 SVM_CASE(NODE_INVERT)
410 svm_node_invert(stack, node.y, node.z, node.w);
411 break;
412 SVM_CASE(NODE_MIX)
413 offset = svm_node_mix(kg, stack, node.y, node.z, node.w, offset);
414 break;
415 SVM_CASE(NODE_SEPARATE_COLOR)
416 svm_node_separate_color(stack, node.y, node.z, node.w);
417 break;
418 SVM_CASE(NODE_COMBINE_COLOR)
419 svm_node_combine_color(stack, node.y, node.z, node.w);
420 break;
421 SVM_CASE(NODE_SEPARATE_VECTOR)
422 svm_node_separate_vector(stack, node.y, node.z, node.w);
423 break;
424 SVM_CASE(NODE_COMBINE_VECTOR)
425 svm_node_combine_vector(stack, node.y, node.z, node.w);
426 break;
427 SVM_CASE(NODE_VECTOR_ROTATE)
428 svm_node_vector_rotate(stack, node.y, node.z, node.w);
429 break;
430 SVM_CASE(NODE_VECTOR_TRANSFORM)
431 svm_node_vector_transform(kg, sd, stack, node);
432 break;
433 SVM_CASE(NODE_WIREFRAME)
434 svm_node_wireframe(kg, sd, stack, node);
435 break;
436 SVM_CASE(NODE_WAVELENGTH)
437 svm_node_wavelength(kg, stack, node.y, node.z);
438 break;
439 SVM_CASE(NODE_BLACKBODY)
440 svm_node_blackbody(kg, stack, node.y, node.z);
441 break;
442 SVM_CASE(NODE_MAP_RANGE)
443 offset = svm_node_map_range(kg, stack, node.y, node.z, node.w, offset);
444 break;
445 SVM_CASE(NODE_VECTOR_MAP_RANGE)
446 offset = svm_node_vector_map_range(stack, node.y, node.z, node.w, offset);
447 break;
448 SVM_CASE(NODE_CLAMP)
449 offset = svm_node_clamp(kg, stack, node.y, node.z, node.w, offset);
450 break;
451#ifdef __SHADER_RAYTRACE__
452 SVM_CASE(NODE_BEVEL)
453 svm_node_bevel<node_feature_mask>(kg, state, sd, stack, node);
454 break;
455 SVM_CASE(NODE_AMBIENT_OCCLUSION)
456 svm_node_ao<node_feature_mask>(kg, state, sd, stack, node);
457 break;
458#endif
459 SVM_CASE(NODE_AOV_START)
460 if (!svm_node_aov_check(path_flag, render_buffer)) {
461 return;
462 }
463 break;
464 SVM_CASE(NODE_AOV_COLOR)
466 break;
467 SVM_CASE(NODE_AOV_VALUE)
469 break;
470 SVM_CASE(NODE_FLOAT_CURVE)
471 offset = svm_node_curve(kg, stack, node, offset);
472 break;
473 SVM_CASE(NODE_MIX_COLOR)
474 svm_node_mix_color(stack, node.y, node.z, node.w);
475 break;
476 SVM_CASE(NODE_MIX_FLOAT)
477 svm_node_mix_float(stack, node.y, node.z, node.w);
478 break;
479 SVM_CASE(NODE_MIX_VECTOR)
480 svm_node_mix_vector(stack, node.y, node.z);
481 break;
482 SVM_CASE(NODE_MIX_VECTOR_NON_UNIFORM)
483 svm_node_mix_vector_non_uniform(stack, node.y, node.z);
484 break;
485 default:
486 kernel_assert(!"Unknown node type was passed to the SVM machine");
487 return;
488 }
489 }
490}
491
ccl_device void svm_node_aov_color(KernelGlobals kg, ConstIntegratorGenericState state, ccl_private float *stack, const uint4 node, ccl_global float *render_buffer)
Definition aov.h:23
CCL_NAMESPACE_BEGIN ccl_device_inline bool svm_node_aov_check(const uint32_t path_flag, const ccl_global float *render_buffer)
Definition aov.h:13
ccl_device void svm_node_aov_value(KernelGlobals kg, ConstIntegratorGenericState state, ccl_private float *stack, const uint4 node, ccl_global float *render_buffer)
Definition aov.h:37
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_blackbody(KernelGlobals kg, ccl_private float *stack, const uint temperature_offset, const uint col_offset)
Definition blackbody.h:21
ccl_device_noinline int svm_node_tex_brick(KernelGlobals kg, ccl_private float *stack, const uint4 node, int offset)
Definition brick.h:69
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_brightness(ccl_private float *stack, const uint in_color, const uint out_color, const uint node)
Definition brightness.h:12
ccl_device_noinline void svm_node_leave_bump_eval(ccl_private ShaderData *sd, ccl_private float *stack, const uint offset)
Definition bump.h:63
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_enter_bump_eval(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint offset)
Definition bump.h:21
ccl_device_noinline void svm_node_tex_checker(ccl_private float *stack, const uint4 node)
Definition checker.h:27
CCL_NAMESPACE_BEGIN ccl_device_noinline int svm_node_clamp(KernelGlobals kg, ccl_private float *stack, const uint value_stack_offset, const uint parameters_stack_offsets, const uint result_stack_offset, int offset)
Definition clamp.h:13
ccl_device_noinline int svm_node_principled_volume(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const Spectrum closure_weight, const uint4 node, const uint32_t path_flag, int offset)
Definition closure.h:1287
ccl_device_noinline void svm_node_closure_holdout(ccl_private ShaderData *sd, ccl_private float *stack, Spectrum closure_weight, const uint4 node)
Definition closure.h:1464
ccl_device_noinline void svm_node_closure_background(ccl_private ShaderData *sd, ccl_private float *stack, Spectrum closure_weight, const uint4 node)
Definition closure.h:1443
ccl_device_noinline void svm_node_volume_coefficients(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, Spectrum scatter_coeffs, const uint4 node, const uint32_t path_flag)
Definition closure.h:1231
ccl_device_noinline void svm_node_closure_emission(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, Spectrum closure_weight, const uint4 node)
Definition closure.h:1417
ccl_device void svm_node_emission_weight(ccl_private float *stack, ccl_private Spectrum *closure_weight, const uint4 node)
Definition closure.h:1505
ccl_device void svm_node_closure_set_weight(ccl_private Spectrum *closure_weight, const uint r, uint g, const uint b)
Definition closure.h:1489
ccl_device_noinline void svm_node_closure_volume(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, Spectrum closure_weight, const uint4 node)
Definition closure.h:1183
ccl_device_noinline void svm_node_mix_closure(ccl_private float *stack, const uint4 node)
Definition closure.h:1518
ccl_device void svm_node_closure_weight(ccl_private float *stack, ccl_private Spectrum *closure_weight, const uint weight_offset)
Definition closure.h:1498
ccl_device void svm_node_set_normal(ccl_private ShaderData *sd, ccl_private float *stack, const uint in_direction, const uint out_normal)
Definition closure.h:1546
ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, Spectrum closure_weight, const uint4 node, const uint32_t path_flag, int offset)
Definition closure.h:45
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_convert(KernelGlobals kg, ccl_private float *stack, const uint type, const uint from, const uint to)
Definition convert.h:15
ccl_device_noinline void svm_node_tex_image_box(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
ccl_device_noinline int svm_node_tex_image(KernelGlobals kg, ccl_private ShaderData *, ccl_private float *stack, const uint4 node, int offset)
ccl_device_noinline void svm_node_tex_environment(KernelGlobals kg, ccl_private ShaderData *, ccl_private float *stack, const uint4 node)
ccl_device_inline float stack_load_float(const ccl_private float *stack, const uint a)
ccl_device_inline uint4 read_node(KernelGlobals kg, ccl_private int *const offset)
#define kernel_assert(cond)
#define SVM_STACK_SIZE
#define IF_KERNEL_NODES_FEATURE(feature)
#define zero_spectrum
#define ccl_private
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_global
#define CCL_NAMESPACE_END
#define __uint_as_float(x)
ccl_device void svm_node_set_displacement(ccl_private ShaderData *sd, ccl_private float *stack, const uint fac_offset)
Definition displace.h:124
ccl_device_noinline int svm_node_vector_displacement(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node, int offset)
Definition displace.h:178
CCL_NAMESPACE_BEGIN ccl_device_noinline int svm_node_set_bump(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node, int offset)
Definition displace.h:19
ccl_device_noinline void svm_node_displacement(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
Definition displace.h:136
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_fresnel(ccl_private ShaderData *sd, ccl_private float *stack, const uint ior_offset, const uint ior_value, const uint node)
Definition fresnel.h:15
ccl_device_noinline void svm_node_layer_weight(ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
Definition fresnel.h:39
ccl_device_noinline int svm_node_tex_gabor(KernelGlobals kg, ccl_private float *stack, const uint type, const uint stack_offsets_1, const uint stack_offsets_2, int offset)
Definition gabor.h:304
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_gamma(ccl_private float *stack, const uint in_gamma, const uint in_color, const uint out_color)
Definition gamma.h:12
ccl_device_noinline void svm_node_tex_gradient(ccl_private float *stack, const uint4 node)
Definition gradient.h:58
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_hsv(ccl_private float *stack, const uint4 node)
Definition hsv.h:13
ccl_device_noinline void svm_node_invert(ccl_private float *stack, const uint in_fac, const uint in_color, const uint out_color)
Definition invert.h:16
ccl_gpu_kernel_postfix ccl_global KernelWorkTile const int ccl_global float * render_buffer
ccl_device_noinline void svm_node_attr_bump_dx(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
ccl_device_noinline void svm_node_attr_bump_dy(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
ccl_device_noinline void svm_node_attr(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_camera(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint out_vector, const uint out_zdepth, const uint out_distance)
ccl_device_noinline void svm_node_particle_info(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint type, const uint out_offset)
ccl_device_noinline void svm_node_geometry_bump_dy(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint type, const uint out_offset, const float bump_filter_width)
ccl_device_noinline void svm_node_geometry_bump_dx(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint type, const uint out_offset, const float bump_filter_width)
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_geometry(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint type, const uint out_offset)
ccl_device_noinline void svm_node_object_info(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint type, const uint out_offset)
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_ies(KernelGlobals kg, ccl_private ShaderData *, ccl_private float *stack, const uint4 node)
ccl_device_noinline int svm_node_vector_math(KernelGlobals kg, ccl_private float *stack, const uint type, const uint inputs_stack_offsets, const uint outputs_stack_offsets, int offset)
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_math(ccl_private float *stack, const uint type, const uint inputs_stack_offsets, const uint result_stack_offset)
#define SVM_CASE(node)
ccl_device void svm_eval_nodes(KernelGlobals kg, ConstIntegratorGenericState state, ccl_private ShaderData *sd, ccl_global float *render_buffer, const uint32_t path_flag)
@ SHADER_TYPE_SURFACE
@ SHADER_TYPE_VOLUME
@ SHADER_TYPE_DISPLACEMENT
@ SHADER_MASK
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_light_path(KernelGlobals kg, ConstIntegratorGenericState state, const ccl_private ShaderData *sd, ccl_private float *stack, const uint type, const uint out_offset, const uint32_t path_flag)
Definition light_path.h:14
ccl_device_noinline void svm_node_light_falloff(ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
Definition light_path.h:109
ccl_device_noinline int svm_node_tex_magic(KernelGlobals kg, ccl_private float *stack, const uint4 node, int offset)
Definition magic.h:101
ccl_device_noinline int svm_node_vector_map_range(ccl_private float *stack, const uint value_stack_offset, const uint parameters_stack_offsets, const uint results_stack_offsets, const int offset)
Definition map_range.h:85
ccl_device_noinline int svm_node_map_range(KernelGlobals kg, ccl_private float *stack, const uint value_stack_offset, const uint parameters_stack_offsets, const uint results_stack_offsets, int offset)
Definition map_range.h:19
static ulong state[N]
ccl_device_noinline void svm_node_mix_color(ccl_private float *stack, const uint options, const uint input_offset, const uint result_offset)
Definition mix.h:33
CCL_NAMESPACE_BEGIN ccl_device_noinline int svm_node_mix(KernelGlobals kg, ccl_private float *stack, const uint fac_offset, const uint c1_offset, const uint c2_offset, int offset)
Definition mix.h:14
ccl_device_noinline void svm_node_mix_vector(ccl_private float *stack, const uint input_offset, const uint result_offset)
Definition mix.h:83
ccl_device_noinline void svm_node_mix_vector_non_uniform(ccl_private float *stack, const uint input_offset, const uint result_offset)
Definition mix.h:104
ccl_device_noinline void svm_node_mix_float(ccl_private float *stack, const uint use_clamp, const uint input_offset, const uint result_offset)
Definition mix.h:61
ccl_device_noinline int svm_node_tex_noise(KernelGlobals kg, ccl_private float *stack, const uint offsets1, const uint offsets2, const uint offsets3, int node_offset)
Definition noisetex.h:245
CCL_NAMESPACE_BEGIN ccl_device_noinline int svm_node_normal(KernelGlobals kg, ccl_private float *stack, const uint in_normal_offset, const uint out_normal_offset, const uint out_dot_offset, int offset)
Definition normal.h:11
ccl_device_noinline int svm_node_radial_tiling(ccl_private float *stack, uint4 node, int offset)
#define ccl_device
ccl_device_noinline int svm_node_curves(KernelGlobals kg, ccl_private float *stack, const uint4 node, int offset)
Definition ramp.h:123
ccl_device_noinline int svm_node_curve(KernelGlobals kg, ccl_private float *stack, const uint4 node, int offset)
Definition ramp.h:155
ccl_device_noinline int svm_node_rgb_ramp(KernelGlobals kg, ccl_private float *stack, const uint4 node, int offset)
Definition ramp.h:95
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_combine_color(ccl_private float *stack, const uint color_type, const uint inputs_stack_offsets, const uint result_stack_offset)
ccl_device_noinline void svm_node_separate_color(ccl_private float *stack, const uint color_type, const uint input_stack_offset, const uint results_stack_offsets)
ccl_device void svm_node_separate_vector(ccl_private float *stack, const uint ivector_offset, const uint vector_index, const uint out_offset)
CCL_NAMESPACE_BEGIN ccl_device void svm_node_combine_vector(ccl_private float *stack, const uint in_offset, const uint vector_index, const uint out_offset)
ccl_device_noinline int svm_node_tex_sky(KernelGlobals kg, const uint32_t path_flag, ccl_private float *stack, const uint4 node, int offset)
Definition sky.h:181
uint x
Definition types_uint4.h:13
uint y
Definition types_uint4.h:13
uint z
Definition types_uint4.h:13
uint w
Definition types_uint4.h:13
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_mapping(ccl_private float *stack, const uint type, const uint inputs_stack_offsets, const uint result_stack_offset)
Definition svm/mapping.h:14
ccl_device_noinline int svm_node_texture_mapping(KernelGlobals kg, ccl_private float *stack, const uint vec_offset, const uint out_offset, int offset)
Definition svm/mapping.h:40
ccl_device_noinline int svm_node_min_max(KernelGlobals kg, ccl_private float *stack, const uint vec_offset, const uint out_offset, int offset)
Definition svm/mapping.h:58
ccl_device_noinline void svm_node_tangent(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
Definition tex_coord.h:446
ccl_device_noinline int svm_node_tex_coord_bump_dx(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, ccl_private float *stack, const uint4 node, int offset)
Definition tex_coord.h:155
ccl_device_noinline int svm_node_tex_coord(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, ccl_private float *stack, const uint4 node, int offset)
Definition tex_coord.h:44
ccl_device_noinline int svm_node_tex_coord_bump_dy(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, ccl_private float *stack, const uint4 node, int offset)
Definition tex_coord.h:239
ccl_device_noinline void svm_node_normal_map(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
Definition tex_coord.h:323
float3 Spectrum
ccl_device int svm_node_value_v(KernelGlobals kg, ccl_private float *stack, const uint out_offset, int offset)
Definition value.h:20
CCL_NAMESPACE_BEGIN ccl_device void svm_node_value_f(ccl_private float *stack, const uint ivalue, const uint out_offset)
Definition value.h:13
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_vector_rotate(ccl_private float *stack, const uint input_stack_offsets, const uint axis_stack_offsets, const uint result_stack_offset)
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_vector_transform(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
ccl_device_noinline void svm_node_vertex_color_bump_dx(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
ccl_device_noinline void svm_node_vertex_color_bump_dy(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_vertex_color(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
ccl_device_noinline int svm_node_tex_voronoi(KernelGlobals kg, ccl_private float *stack, const uint dimensions, const uint feature, const uint metric, int offset)
Definition voronoi.h:1076
ccl_device_noinline int svm_node_tex_wave(KernelGlobals kg, ccl_private float *stack, const uint4 node, int offset)
Definition wave.h:78
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_wavelength(KernelGlobals kg, ccl_private float *stack, const uint wavelength, const uint color_out)
Definition wavelength.h:19
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_tex_white_noise(ccl_private float *stack, const uint dimensions, const uint inputs_stack_offsets, const uint outputs_stack_offsets)
Definition white_noise.h:12
ccl_device_noinline void svm_node_wireframe(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
Definition wireframe.h:82