Blender V4.5
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"
65#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/voxel.h"
77#include "kernel/svm/wave.h"
81
82#ifdef __SHADER_RAYTRACE__
83# include "kernel/svm/ao.h"
84# include "kernel/svm/bevel.h"
85#endif
86
88
89#ifdef __KERNEL_USE_DATA_CONSTANTS__
90# define SVM_CASE(node) \
91 case node: \
92 if (!kernel_data_svm_usage_##node) \
93 break;
94#else
95# define SVM_CASE(node) case node:
96#endif
97
98/* Main Interpreter Loop */
99template<uint node_feature_mask, ShaderType type, typename ConstIntegratorGenericState>
101 ConstIntegratorGenericState state,
102 ccl_private ShaderData *sd,
104 const uint32_t path_flag)
105{
106 float stack[SVM_STACK_SIZE];
107 Spectrum closure_weight;
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(sd, &closure_weight, node.y, node.z, node.w);
150 break;
151 SVM_CASE(NODE_CLOSURE_WEIGHT)
152 svm_node_closure_weight(sd, stack, &closure_weight, node.y);
153 break;
154 SVM_CASE(NODE_EMISSION_WEIGHT)
156 {
157 svm_node_emission_weight(kg, sd, stack, &closure_weight, node);
158 }
159 break;
160 SVM_CASE(NODE_MIX_CLOSURE)
161 svm_node_mix_closure(sd, 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, sd, 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(kg, sd, stack, node.y, node.z);
184 break;
185 SVM_CASE(NODE_VALUE_V)
186 offset = svm_node_value_v(kg, sd, 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, sd, 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(kg, 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(kg, sd, stack, node.y);
279 }
280 break;
281 SVM_CASE(NODE_HSV)
282 svm_node_hsv(kg, sd, 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(kg, sd, stack, node.y, node.z, node.w);
314 break;
315 SVM_CASE(NODE_VECTOR_MATH)
316 offset = svm_node_vector_math(kg, sd, stack, node.y, node.z, node.w, offset);
317 break;
318 SVM_CASE(NODE_RGB_RAMP)
319 offset = svm_node_rgb_ramp(kg, sd, stack, node, offset);
320 break;
321 SVM_CASE(NODE_GAMMA)
322 svm_node_gamma(sd, stack, node.y, node.z, node.w);
323 break;
324 SVM_CASE(NODE_BRIGHTCONTRAST)
325 svm_node_brightness(sd, 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, sd, stack, node.y, node.z, offset);
348 break;
349 SVM_CASE(NODE_MAPPING)
350 svm_node_mapping(kg, sd, stack, node.y, node.z, node.w);
351 break;
352 SVM_CASE(NODE_MIN_MAX)
353 offset = svm_node_min_max(kg, sd, 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, sd, path_flag, stack, node, offset);
363 break;
364 SVM_CASE(NODE_TEX_GRADIENT)
365 svm_node_tex_gradient(sd, stack, node);
366 break;
367 SVM_CASE(NODE_TEX_VORONOI)
369 kg, sd, stack, node.y, node.z, node.w, offset);
370 break;
371 SVM_CASE(NODE_TEX_GABOR)
372 offset = svm_node_tex_gabor(kg, sd, stack, node.y, node.z, node.w, offset);
373 break;
374 SVM_CASE(NODE_TEX_WAVE)
375 offset = svm_node_tex_wave(kg, sd, stack, node, offset);
376 break;
377 SVM_CASE(NODE_TEX_MAGIC)
378 offset = svm_node_tex_magic(kg, sd, stack, node, offset);
379 break;
380 SVM_CASE(NODE_TEX_CHECKER)
381 svm_node_tex_checker(kg, sd, stack, node);
382 break;
383 SVM_CASE(NODE_TEX_BRICK)
384 offset = svm_node_tex_brick(kg, sd, stack, node, offset);
385 break;
386 SVM_CASE(NODE_TEX_WHITE_NOISE)
387 svm_node_tex_white_noise(kg, sd, stack, node.y, node.z, node.w);
388 break;
389 SVM_CASE(NODE_NORMAL)
390 offset = svm_node_normal(kg, sd, stack, node.y, node.z, node.w, offset);
391 break;
392 SVM_CASE(NODE_LIGHT_FALLOFF)
393 svm_node_light_falloff(sd, stack, node);
394 break;
395 SVM_CASE(NODE_IES)
396 svm_node_ies(kg, sd, stack, node);
397 break;
398 SVM_CASE(NODE_CURVES)
399 offset = svm_node_curves(kg, sd, stack, node, offset);
400 break;
401 SVM_CASE(NODE_FLOAT_CURVE)
402 offset = svm_node_curve(kg, sd, stack, node, offset);
403 break;
404 SVM_CASE(NODE_TANGENT)
405 svm_node_tangent(kg, sd, stack, node);
406 break;
407 SVM_CASE(NODE_NORMAL_MAP)
408 svm_node_normal_map(kg, sd, stack, node);
409 break;
410 SVM_CASE(NODE_INVERT)
411 svm_node_invert(sd, stack, node.y, node.z, node.w);
412 break;
413 SVM_CASE(NODE_MIX)
414 offset = svm_node_mix(kg, sd, stack, node.y, node.z, node.w, offset);
415 break;
416 SVM_CASE(NODE_SEPARATE_COLOR)
417 svm_node_separate_color(kg, sd, stack, node.y, node.z, node.w);
418 break;
419 SVM_CASE(NODE_COMBINE_COLOR)
420 svm_node_combine_color(kg, sd, stack, node.y, node.z, node.w);
421 break;
422 SVM_CASE(NODE_SEPARATE_VECTOR)
423 svm_node_separate_vector(sd, stack, node.y, node.z, node.w);
424 break;
425 SVM_CASE(NODE_COMBINE_VECTOR)
426 svm_node_combine_vector(sd, stack, node.y, node.z, node.w);
427 break;
428 SVM_CASE(NODE_SEPARATE_HSV)
429 offset = svm_node_separate_hsv(kg, sd, stack, node.y, node.z, node.w, offset);
430 break;
431 SVM_CASE(NODE_COMBINE_HSV)
432 offset = svm_node_combine_hsv(kg, sd, stack, node.y, node.z, node.w, offset);
433 break;
434 SVM_CASE(NODE_VECTOR_ROTATE)
435 svm_node_vector_rotate(sd, stack, node.y, node.z, node.w);
436 break;
437 SVM_CASE(NODE_VECTOR_TRANSFORM)
438 svm_node_vector_transform(kg, sd, stack, node);
439 break;
440 SVM_CASE(NODE_WIREFRAME)
441 svm_node_wireframe(kg, sd, stack, node);
442 break;
443 SVM_CASE(NODE_WAVELENGTH)
444 svm_node_wavelength(kg, sd, stack, node.y, node.z);
445 break;
446 SVM_CASE(NODE_BLACKBODY)
447 svm_node_blackbody(kg, sd, stack, node.y, node.z);
448 break;
449 SVM_CASE(NODE_MAP_RANGE)
450 offset = svm_node_map_range(kg, sd, stack, node.y, node.z, node.w, offset);
451 break;
452 SVM_CASE(NODE_VECTOR_MAP_RANGE)
453 offset = svm_node_vector_map_range(kg, sd, stack, node.y, node.z, node.w, offset);
454 break;
455 SVM_CASE(NODE_CLAMP)
456 offset = svm_node_clamp(kg, sd, stack, node.y, node.z, node.w, offset);
457 break;
458#ifdef __SHADER_RAYTRACE__
459 SVM_CASE(NODE_BEVEL)
460 svm_node_bevel<node_feature_mask>(kg, state, sd, stack, node);
461 break;
462 SVM_CASE(NODE_AMBIENT_OCCLUSION)
463 svm_node_ao<node_feature_mask>(kg, state, sd, stack, node);
464 break;
465#endif
466
467 SVM_CASE(NODE_TEX_VOXEL)
468 offset = svm_node_tex_voxel<node_feature_mask>(kg, sd, stack, node, offset);
469 break;
470 SVM_CASE(NODE_AOV_START)
471 if (!svm_node_aov_check(path_flag, render_buffer)) {
472 return;
473 }
474 break;
475 SVM_CASE(NODE_AOV_COLOR)
477 break;
478 SVM_CASE(NODE_AOV_VALUE)
480 break;
481 SVM_CASE(NODE_MIX_COLOR)
482 svm_node_mix_color(sd, stack, node.y, node.z, node.w);
483 break;
484 SVM_CASE(NODE_MIX_FLOAT)
485 svm_node_mix_float(sd, stack, node.y, node.z, node.w);
486 break;
487 SVM_CASE(NODE_MIX_VECTOR)
488 svm_node_mix_vector(sd, stack, node.y, node.z);
489 break;
490 SVM_CASE(NODE_MIX_VECTOR_NON_UNIFORM)
491 svm_node_mix_vector_non_uniform(sd, stack, node.y, node.z);
492 break;
493 default:
494 kernel_assert(!"Unknown node type was passed to the SVM machine");
495 return;
496 }
497 }
498}
499
ccl_device void svm_node_aov_value(KernelGlobals kg, ConstIntegratorGenericState state, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node, ccl_global float *render_buffer)
Definition aov.h:38
ccl_device void svm_node_aov_color(KernelGlobals kg, ConstIntegratorGenericState state, ccl_private ShaderData *sd, 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_NAMESPACE_BEGIN ccl_device_noinline void svm_node_blackbody(KernelGlobals kg, ccl_private ShaderData *sd, 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 ShaderData *sd, 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 ShaderData *sd, 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(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint offset)
Definition bump.h:50
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(KernelGlobals kg, ccl_private ShaderData *sd, 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 ShaderData *sd, 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:1233
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:1410
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:1389
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:1177
ccl_device void svm_node_closure_weight(ccl_private ShaderData *sd, ccl_private float *stack, ccl_private Spectrum *closure_weight, const uint weight_offset)
Definition closure.h:1445
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:1363
ccl_device_noinline void svm_node_mix_closure(ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
Definition closure.h:1466
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:1129
ccl_device void svm_node_set_normal(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint in_direction, const uint out_normal)
Definition closure.h:1496
ccl_device void svm_node_closure_set_weight(ccl_private ShaderData *sd, ccl_private Spectrum *closure_weight, const uint r, uint g, const uint b)
Definition closure.h:1435
ccl_device_noinline void svm_node_emission_weight(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, ccl_private Spectrum *closure_weight, const uint4 node)
Definition closure.h:1453
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:47
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_convert(KernelGlobals kg, ccl_private ShaderData *sd, 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 ccl_device
#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(KernelGlobals kg, 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:179
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:137
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 ShaderData *sd, 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 ShaderData *sd, 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 ShaderData *sd, ccl_private float *stack, const uint4 node)
Definition gradient.h:58
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_hsv(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
Definition hsv.h:13
ccl_device_noinline void svm_node_invert(ccl_private ShaderData *sd, 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 ShaderData *sd, 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(KernelGlobals kg, ccl_private ShaderData *sd, 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:103
ccl_device_noinline int svm_node_tex_magic(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node, int offset)
Definition magic.h:101
ccl_device_noinline int svm_node_map_range(KernelGlobals kg, ccl_private ShaderData *sd, 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
ccl_device_noinline int svm_node_vector_map_range(KernelGlobals kg, ccl_private ShaderData *sd, 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:86
static ulong state[N]
ccl_device_noinline void svm_node_mix_vector(ccl_private ShaderData *sd, ccl_private float *stack, const uint input_offset, const uint result_offset)
Definition mix.h:86
ccl_device_noinline void svm_node_mix_float(ccl_private ShaderData *sd, ccl_private float *stack, const uint use_clamp, const uint input_offset, const uint result_offset)
Definition mix.h:63
ccl_device_noinline void svm_node_mix_vector_non_uniform(ccl_private ShaderData *sd, ccl_private float *stack, const uint input_offset, const uint result_offset)
Definition mix.h:108
CCL_NAMESPACE_BEGIN ccl_device_noinline int svm_node_mix(KernelGlobals kg, ccl_private ShaderData *sd, 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_color(ccl_private ShaderData *sd, ccl_private float *stack, const uint options, const uint input_offset, const uint result_offset)
Definition mix.h:34
ccl_device_noinline int svm_node_tex_noise(KernelGlobals kg, ccl_private ShaderData *sd, 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 ShaderData *sd, 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_curves(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node, int offset)
Definition ramp.h:124
ccl_device_noinline int svm_node_curve(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node, int offset)
Definition ramp.h:157
ccl_device_noinline int svm_node_rgb_ramp(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node, int offset)
Definition ramp.h:95
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_combine_color(KernelGlobals kg, ccl_private ShaderData *sd, 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(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint color_type, const uint input_stack_offset, const uint results_stack_offsets)
CCL_NAMESPACE_BEGIN ccl_device_noinline int svm_node_combine_hsv(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint hue_in, const uint saturation_in, const uint value_in, int offset)
Definition sepcomb_hsv.h:13
ccl_device_noinline int svm_node_separate_hsv(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint color_in, const uint hue_out, const uint saturation_out, int offset)
Definition sepcomb_hsv.h:37
CCL_NAMESPACE_BEGIN ccl_device void svm_node_combine_vector(ccl_private ShaderData *sd, ccl_private float *stack, const uint in_offset, const uint vector_index, const uint out_offset)
ccl_device void svm_node_separate_vector(ccl_private ShaderData *sd, ccl_private float *stack, const uint ivector_offset, const uint vector_index, const uint out_offset)
ccl_device_noinline int svm_node_tex_sky(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, ccl_private float *stack, const uint4 node, int offset)
Definition sky.h:214
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(KernelGlobals kg, ccl_private ShaderData *sd, 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 ShaderData *sd, ccl_private float *stack, const uint vec_offset, const uint out_offset, int offset)
Definition svm/mapping.h:42
ccl_device_noinline int svm_node_min_max(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint vec_offset, const uint out_offset, int offset)
Definition svm/mapping.h:61
ccl_device_noinline void svm_node_tangent(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node)
Definition tex_coord.h:442
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:144
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:240
CCL_NAMESPACE_BEGIN 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:22
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:336
float3 Spectrum
CCL_NAMESPACE_BEGIN ccl_device void svm_node_value_f(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint ivalue, const uint out_offset)
Definition value.h:13
ccl_device int svm_node_value_v(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint out_offset, int offset)
Definition value.h:22
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_vector_rotate(ccl_private ShaderData *sd, 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 ShaderData *sd, ccl_private float *stack, const uint dimensions, const uint feature, const uint metric, int offset)
Definition voronoi.h:1056
CCL_NAMESPACE_BEGIN ccl_device_noinline int svm_node_tex_voxel(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint4 node, int offset)
Definition voxel.h:16
ccl_device_noinline int svm_node_tex_wave(KernelGlobals kg, ccl_private ShaderData *sd, 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 ShaderData *sd, 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(KernelGlobals kg, ccl_private ShaderData *sd, 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