Blender V4.3
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/svm/types.h"
29
31
32/* Stack */
33
35{
37
38 ccl_private float *stack_a = stack + a;
39 return make_float3(stack_a[0], stack_a[1], stack_a[2]);
40}
41
43{
45
46 ccl_private float *stack_a = stack + a;
47 stack_a[0] = f.x;
48 stack_a[1] = f.y;
49 stack_a[2] = f.z;
50}
51
53{
55
56 return stack[a];
57}
58
60{
61 return (a == (uint)SVM_STACK_INVALID) ? __uint_as_float(value) : stack_load_float(stack, a);
62}
63
65{
67
68 stack[a] = f;
69}
70
72{
74
75 return __float_as_int(stack[a]);
76}
77
79{
80 return (a == (uint)SVM_STACK_INVALID) ? (int)value : stack_load_int(stack, a);
81}
82
84{
86
87 stack[a] = __int_as_float(i);
88}
89
91{
92 return a != (uint)SVM_STACK_INVALID;
93}
94
95/* Reading Nodes */
96
98{
99 uint4 node = kernel_data_fetch(svm_nodes, *offset);
100 (*offset)++;
101 return node;
102}
103
105{
106 uint4 node = kernel_data_fetch(svm_nodes, *offset);
107 float4 f = make_float4(__uint_as_float(node.x),
108 __uint_as_float(node.y),
109 __uint_as_float(node.z),
110 __uint_as_float(node.w));
111 (*offset)++;
112 return f;
113}
114
116{
117 uint4 node = kernel_data_fetch(svm_nodes, offset);
118 return make_float4(__uint_as_float(node.x),
119 __uint_as_float(node.y),
120 __uint_as_float(node.z),
121 __uint_as_float(node.w));
122}
123
125 ccl_private uint *x,
126 ccl_private uint *y)
127{
128 *x = (i & 0xFF);
129 *y = ((i >> 8) & 0xFF);
130}
131
133 ccl_private uint *x,
134 ccl_private uint *y,
136{
137 *x = (i & 0xFF);
138 *y = ((i >> 8) & 0xFF);
139 *z = ((i >> 16) & 0xFF);
140}
141
144{
145 *x = (i & 0xFF);
146 *y = ((i >> 8) & 0xFF);
147 *z = ((i >> 16) & 0xFF);
148 *w = ((i >> 24) & 0xFF);
149}
150
152
153/* Nodes */
154
155#include "kernel/svm/aov.h"
156#include "kernel/svm/attribute.h"
157#include "kernel/svm/blackbody.h"
158#include "kernel/svm/brick.h"
160#include "kernel/svm/bump.h"
161#include "kernel/svm/camera.h"
162#include "kernel/svm/checker.h"
163#include "kernel/svm/clamp.h"
164#include "kernel/svm/closure.h"
165#include "kernel/svm/convert.h"
166#include "kernel/svm/displace.h"
167#include "kernel/svm/fresnel.h"
168#include "kernel/svm/gabor.h"
169#include "kernel/svm/gamma.h"
170#include "kernel/svm/geometry.h"
171#include "kernel/svm/gradient.h"
172#include "kernel/svm/hsv.h"
173#include "kernel/svm/ies.h"
174#include "kernel/svm/image.h"
175#include "kernel/svm/invert.h"
177#include "kernel/svm/magic.h"
178#include "kernel/svm/map_range.h"
179#include "kernel/svm/mapping.h"
180#include "kernel/svm/math.h"
181#include "kernel/svm/mix.h"
182#include "kernel/svm/noisetex.h"
183#include "kernel/svm/normal.h"
184#include "kernel/svm/ramp.h"
188#include "kernel/svm/sky.h"
189#include "kernel/svm/tex_coord.h"
190#include "kernel/svm/value.h"
194#include "kernel/svm/voronoi.h"
195#include "kernel/svm/voxel.h"
196#include "kernel/svm/wave.h"
199#include "kernel/svm/wireframe.h"
200
201#ifdef __SHADER_RAYTRACE__
202# include "kernel/svm/ao.h"
203# include "kernel/svm/bevel.h"
204#endif
205
207
208#ifdef __KERNEL_USE_DATA_CONSTANTS__
209# define SVM_CASE(node) \
210 case node: \
211 if (!kernel_data_svm_usage_##node) \
212 break;
213#else
214# define SVM_CASE(node) case node:
215#endif
216
217/* Main Interpreter Loop */
218template<uint node_feature_mask, ShaderType type, typename ConstIntegratorGenericState>
220 ConstIntegratorGenericState state,
223 uint32_t path_flag)
224{
225 float stack[SVM_STACK_SIZE];
226 Spectrum closure_weight;
227 int offset = sd->shader & SHADER_MASK;
228
229 while (1) {
230 uint4 node = read_node(kg, &offset);
231
232 switch (node.x) {
233 SVM_CASE(NODE_END)
234 return;
235 SVM_CASE(NODE_SHADER_JUMP)
236 {
237 if (type == SHADER_TYPE_SURFACE) {
238 offset = node.y;
239 }
240 else if (type == SHADER_TYPE_VOLUME) {
241 offset = node.z;
242 }
243 else if (type == SHADER_TYPE_DISPLACEMENT) {
244 offset = node.w;
245 }
246 else {
247 return;
248 }
249 break;
250 }
251 SVM_CASE(NODE_CLOSURE_BSDF)
253 kg, sd, stack, closure_weight, node, path_flag, offset);
254 break;
255 SVM_CASE(NODE_CLOSURE_EMISSION)
257 {
258 svm_node_closure_emission(kg, sd, stack, closure_weight, node);
259 }
260 break;
261 SVM_CASE(NODE_CLOSURE_BACKGROUND)
263 {
264 svm_node_closure_background(sd, stack, closure_weight, node);
265 }
266 break;
267 SVM_CASE(NODE_CLOSURE_SET_WEIGHT)
268 svm_node_closure_set_weight(sd, &closure_weight, node.y, node.z, node.w);
269 break;
270 SVM_CASE(NODE_CLOSURE_WEIGHT)
271 svm_node_closure_weight(sd, stack, &closure_weight, node.y);
272 break;
273 SVM_CASE(NODE_EMISSION_WEIGHT)
275 {
276 svm_node_emission_weight(kg, sd, stack, &closure_weight, node);
277 }
278 break;
279 SVM_CASE(NODE_MIX_CLOSURE)
280 svm_node_mix_closure(sd, stack, node);
281 break;
282 SVM_CASE(NODE_JUMP_IF_ZERO)
283 if (stack_load_float(stack, node.z) <= 0.0f) {
284 offset += node.y;
285 }
286 break;
287 SVM_CASE(NODE_JUMP_IF_ONE)
288 if (stack_load_float(stack, node.z) >= 1.0f) {
289 offset += node.y;
290 }
291 break;
292 SVM_CASE(NODE_GEOMETRY)
293 svm_node_geometry(kg, sd, stack, node.y, node.z);
294 break;
295 SVM_CASE(NODE_CONVERT)
296 svm_node_convert(kg, sd, stack, node.y, node.z, node.w);
297 break;
298 SVM_CASE(NODE_TEX_COORD)
299 offset = svm_node_tex_coord(kg, sd, path_flag, stack, node, offset);
300 break;
301 SVM_CASE(NODE_VALUE_F)
302 svm_node_value_f(kg, sd, stack, node.y, node.z);
303 break;
304 SVM_CASE(NODE_VALUE_V)
305 offset = svm_node_value_v(kg, sd, stack, node.y, offset);
306 break;
307 SVM_CASE(NODE_ATTR)
308 svm_node_attr<node_feature_mask>(kg, sd, stack, node);
309 break;
310 SVM_CASE(NODE_VERTEX_COLOR)
311 svm_node_vertex_color(kg, sd, stack, node.y, node.z, node.w);
312 break;
313 SVM_CASE(NODE_GEOMETRY_BUMP_DX)
315 {
316 svm_node_geometry_bump_dx(kg, sd, stack, node.y, node.z);
317 }
318 break;
319 SVM_CASE(NODE_GEOMETRY_BUMP_DY)
321 {
322 svm_node_geometry_bump_dy(kg, sd, stack, node.y, node.z);
323 }
324 break;
325 SVM_CASE(NODE_SET_DISPLACEMENT)
327 break;
328 SVM_CASE(NODE_DISPLACEMENT)
329 svm_node_displacement<node_feature_mask>(kg, sd, stack, node);
330 break;
331 SVM_CASE(NODE_VECTOR_DISPLACEMENT)
332 offset = svm_node_vector_displacement<node_feature_mask>(kg, sd, stack, node, offset);
333 break;
334 SVM_CASE(NODE_TEX_IMAGE)
335 offset = svm_node_tex_image(kg, sd, stack, node, offset);
336 break;
337 SVM_CASE(NODE_TEX_IMAGE_BOX)
338 svm_node_tex_image_box(kg, sd, stack, node);
339 break;
340 SVM_CASE(NODE_TEX_NOISE)
341 offset = svm_node_tex_noise(kg, sd, stack, node.y, node.z, node.w, offset);
342 break;
343 SVM_CASE(NODE_SET_BUMP)
344 svm_node_set_bump<node_feature_mask>(kg, sd, stack, node);
345 break;
346 SVM_CASE(NODE_ATTR_BUMP_DX)
348 {
349 svm_node_attr_bump_dx(kg, sd, stack, node);
350 }
351 break;
352 SVM_CASE(NODE_ATTR_BUMP_DY)
354 {
355 svm_node_attr_bump_dy(kg, sd, stack, node);
356 }
357 break;
358 SVM_CASE(NODE_VERTEX_COLOR_BUMP_DX)
360 {
361 svm_node_vertex_color_bump_dx(kg, sd, stack, node.y, node.z, node.w);
362 }
363 break;
364 SVM_CASE(NODE_VERTEX_COLOR_BUMP_DY)
366 {
367 svm_node_vertex_color_bump_dy(kg, sd, stack, node.y, node.z, node.w);
368 }
369 break;
370 SVM_CASE(NODE_TEX_COORD_BUMP_DX)
372 {
373 offset = svm_node_tex_coord_bump_dx(kg, sd, path_flag, stack, node, offset);
374 }
375 break;
376 SVM_CASE(NODE_TEX_COORD_BUMP_DY)
378 {
379 offset = svm_node_tex_coord_bump_dy(kg, sd, path_flag, stack, node, offset);
380 }
381 break;
382 SVM_CASE(NODE_CLOSURE_SET_NORMAL)
384 {
385 svm_node_set_normal(kg, sd, stack, node.y, node.z);
386 }
387 break;
388 SVM_CASE(NODE_ENTER_BUMP_EVAL)
389 IF_KERNEL_NODES_FEATURE(BUMP_STATE)
390 {
391 svm_node_enter_bump_eval(kg, sd, stack, node.y);
392 }
393 break;
394 SVM_CASE(NODE_LEAVE_BUMP_EVAL)
395 IF_KERNEL_NODES_FEATURE(BUMP_STATE)
396 {
397 svm_node_leave_bump_eval(kg, sd, stack, node.y);
398 }
399 break;
400 SVM_CASE(NODE_HSV)
401 svm_node_hsv(kg, sd, stack, node);
402 break;
403 SVM_CASE(NODE_CLOSURE_HOLDOUT)
404 svm_node_closure_holdout(sd, stack, closure_weight, node);
405 break;
406 SVM_CASE(NODE_FRESNEL)
407 svm_node_fresnel(sd, stack, node.y, node.z, node.w);
408 break;
409 SVM_CASE(NODE_LAYER_WEIGHT)
410 svm_node_layer_weight(sd, stack, node);
411 break;
412 SVM_CASE(NODE_CLOSURE_VOLUME)
414 {
415 svm_node_closure_volume<type>(kg, sd, stack, closure_weight, node);
416 }
417 break;
418 SVM_CASE(NODE_PRINCIPLED_VOLUME)
420 {
422 kg, sd, stack, closure_weight, node, path_flag, offset);
423 }
424 break;
425 SVM_CASE(NODE_MATH)
426 svm_node_math(kg, sd, stack, node.y, node.z, node.w);
427 break;
428 SVM_CASE(NODE_VECTOR_MATH)
429 offset = svm_node_vector_math(kg, sd, stack, node.y, node.z, node.w, offset);
430 break;
431 SVM_CASE(NODE_RGB_RAMP)
432 offset = svm_node_rgb_ramp(kg, sd, stack, node, offset);
433 break;
434 SVM_CASE(NODE_GAMMA)
435 svm_node_gamma(sd, stack, node.y, node.z, node.w);
436 break;
437 SVM_CASE(NODE_BRIGHTCONTRAST)
438 svm_node_brightness(sd, stack, node.y, node.z, node.w);
439 break;
440 SVM_CASE(NODE_LIGHT_PATH)
441 svm_node_light_path<node_feature_mask>(kg, state, sd, stack, node.y, node.z, path_flag);
442 break;
443 SVM_CASE(NODE_OBJECT_INFO)
444 svm_node_object_info(kg, sd, stack, node.y, node.z);
445 break;
446 SVM_CASE(NODE_PARTICLE_INFO)
447 svm_node_particle_info(kg, sd, stack, node.y, node.z);
448 break;
449#if defined(__HAIR__)
450 SVM_CASE(NODE_HAIR_INFO)
451 svm_node_hair_info(kg, sd, stack, node.y, node.z);
452 break;
453#endif
454#if defined(__POINTCLOUD__)
455 SVM_CASE(NODE_POINT_INFO)
456 svm_node_point_info(kg, sd, stack, node.y, node.z);
457 break;
458#endif
459 SVM_CASE(NODE_TEXTURE_MAPPING)
460 offset = svm_node_texture_mapping(kg, sd, stack, node.y, node.z, offset);
461 break;
462 SVM_CASE(NODE_MAPPING)
463 svm_node_mapping(kg, sd, stack, node.y, node.z, node.w);
464 break;
465 SVM_CASE(NODE_MIN_MAX)
466 offset = svm_node_min_max(kg, sd, stack, node.y, node.z, offset);
467 break;
468 SVM_CASE(NODE_CAMERA)
469 svm_node_camera(kg, sd, stack, node.y, node.z, node.w);
470 break;
471 SVM_CASE(NODE_TEX_ENVIRONMENT)
472 svm_node_tex_environment(kg, sd, stack, node);
473 break;
474 SVM_CASE(NODE_TEX_SKY)
475 offset = svm_node_tex_sky(kg, sd, path_flag, stack, node, offset);
476 break;
477 SVM_CASE(NODE_TEX_GRADIENT)
478 svm_node_tex_gradient(sd, stack, node);
479 break;
480 SVM_CASE(NODE_TEX_VORONOI)
482 kg, sd, stack, node.y, node.z, node.w, offset);
483 break;
484 SVM_CASE(NODE_TEX_GABOR)
485 offset = svm_node_tex_gabor(kg, sd, stack, node.y, node.z, node.w, offset);
486 break;
487 SVM_CASE(NODE_TEX_WAVE)
488 offset = svm_node_tex_wave(kg, sd, stack, node, offset);
489 break;
490 SVM_CASE(NODE_TEX_MAGIC)
491 offset = svm_node_tex_magic(kg, sd, stack, node, offset);
492 break;
493 SVM_CASE(NODE_TEX_CHECKER)
494 svm_node_tex_checker(kg, sd, stack, node);
495 break;
496 SVM_CASE(NODE_TEX_BRICK)
497 offset = svm_node_tex_brick(kg, sd, stack, node, offset);
498 break;
499 SVM_CASE(NODE_TEX_WHITE_NOISE)
500 svm_node_tex_white_noise(kg, sd, stack, node.y, node.z, node.w);
501 break;
502 SVM_CASE(NODE_NORMAL)
503 offset = svm_node_normal(kg, sd, stack, node.y, node.z, node.w, offset);
504 break;
505 SVM_CASE(NODE_LIGHT_FALLOFF)
506 svm_node_light_falloff(sd, stack, node);
507 break;
508 SVM_CASE(NODE_IES)
509 svm_node_ies(kg, sd, stack, node);
510 break;
511 SVM_CASE(NODE_CURVES)
512 offset = svm_node_curves(kg, sd, stack, node, offset);
513 break;
514 SVM_CASE(NODE_FLOAT_CURVE)
515 offset = svm_node_curve(kg, sd, stack, node, offset);
516 break;
517 SVM_CASE(NODE_TANGENT)
518 svm_node_tangent(kg, sd, stack, node);
519 break;
520 SVM_CASE(NODE_NORMAL_MAP)
521 svm_node_normal_map(kg, sd, stack, node);
522 break;
523 SVM_CASE(NODE_INVERT)
524 svm_node_invert(sd, stack, node.y, node.z, node.w);
525 break;
526 SVM_CASE(NODE_MIX)
527 offset = svm_node_mix(kg, sd, stack, node.y, node.z, node.w, offset);
528 break;
529 SVM_CASE(NODE_SEPARATE_COLOR)
530 svm_node_separate_color(kg, sd, stack, node.y, node.z, node.w);
531 break;
532 SVM_CASE(NODE_COMBINE_COLOR)
533 svm_node_combine_color(kg, sd, stack, node.y, node.z, node.w);
534 break;
535 SVM_CASE(NODE_SEPARATE_VECTOR)
536 svm_node_separate_vector(sd, stack, node.y, node.z, node.w);
537 break;
538 SVM_CASE(NODE_COMBINE_VECTOR)
539 svm_node_combine_vector(sd, stack, node.y, node.z, node.w);
540 break;
541 SVM_CASE(NODE_SEPARATE_HSV)
542 offset = svm_node_separate_hsv(kg, sd, stack, node.y, node.z, node.w, offset);
543 break;
544 SVM_CASE(NODE_COMBINE_HSV)
545 offset = svm_node_combine_hsv(kg, sd, stack, node.y, node.z, node.w, offset);
546 break;
547 SVM_CASE(NODE_VECTOR_ROTATE)
548 svm_node_vector_rotate(sd, stack, node.y, node.z, node.w);
549 break;
550 SVM_CASE(NODE_VECTOR_TRANSFORM)
551 svm_node_vector_transform(kg, sd, stack, node);
552 break;
553 SVM_CASE(NODE_WIREFRAME)
554 svm_node_wireframe(kg, sd, stack, node);
555 break;
556 SVM_CASE(NODE_WAVELENGTH)
557 svm_node_wavelength(kg, sd, stack, node.y, node.z);
558 break;
559 SVM_CASE(NODE_BLACKBODY)
560 svm_node_blackbody(kg, sd, stack, node.y, node.z);
561 break;
562 SVM_CASE(NODE_MAP_RANGE)
563 offset = svm_node_map_range(kg, sd, stack, node.y, node.z, node.w, offset);
564 break;
565 SVM_CASE(NODE_VECTOR_MAP_RANGE)
566 offset = svm_node_vector_map_range(kg, sd, stack, node.y, node.z, node.w, offset);
567 break;
568 SVM_CASE(NODE_CLAMP)
569 offset = svm_node_clamp(kg, sd, stack, node.y, node.z, node.w, offset);
570 break;
571#ifdef __SHADER_RAYTRACE__
572 SVM_CASE(NODE_BEVEL)
573 svm_node_bevel<node_feature_mask>(kg, state, sd, stack, node);
574 break;
575 SVM_CASE(NODE_AMBIENT_OCCLUSION)
576 svm_node_ao<node_feature_mask>(kg, state, sd, stack, node);
577 break;
578#endif
579
580 SVM_CASE(NODE_TEX_VOXEL)
581 offset = svm_node_tex_voxel<node_feature_mask>(kg, sd, stack, node, offset);
582 break;
583 SVM_CASE(NODE_AOV_START)
584 if (!svm_node_aov_check(path_flag, render_buffer)) {
585 return;
586 }
587 break;
588 SVM_CASE(NODE_AOV_COLOR)
590 break;
591 SVM_CASE(NODE_AOV_VALUE)
593 break;
594 SVM_CASE(NODE_MIX_COLOR)
595 svm_node_mix_color(sd, stack, node.y, node.z, node.w);
596 break;
597 SVM_CASE(NODE_MIX_FLOAT)
598 svm_node_mix_float(sd, stack, node.y, node.z, node.w);
599 break;
600 SVM_CASE(NODE_MIX_VECTOR)
601 svm_node_mix_vector(sd, stack, node.y, node.z);
602 break;
603 SVM_CASE(NODE_MIX_VECTOR_NON_UNIFORM)
604 svm_node_mix_vector_non_uniform(sd, stack, node.y, node.z);
605 break;
606 default:
607 kernel_assert(!"Unknown node type was passed to the SVM machine");
608 return;
609 }
610 }
611}
612
unsigned int uint
ccl_device void svm_node_aov_color(KernelGlobals kg, ConstIntegratorGenericState state, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node, ccl_global float *render_buffer)
Definition aov.h:21
CCL_NAMESPACE_BEGIN ccl_device_inline bool svm_node_aov_check(const uint32_t path_flag, ccl_global float *render_buffer)
Definition aov.h:11
ccl_device void svm_node_aov_value(KernelGlobals kg, ConstIntegratorGenericState state, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node, ccl_global float *render_buffer)
Definition aov.h:36
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_blackbody(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint temperature_offset, uint col_offset)
Definition blackbody.h:16
ccl_device_noinline int svm_node_tex_brick(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node, int offset)
Definition brick.h:65
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_brightness(ccl_private ShaderData *sd, ccl_private float *stack, uint in_color, uint out_color, uint node)
Definition brightness.h:11
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
Definition btQuadWord.h:117
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Definition btQuadWord.h:119
ccl_device_noinline void svm_node_leave_bump_eval(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint offset)
Definition bump.h:40
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_enter_bump_eval(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint offset)
Definition bump.h:11
ccl_device_noinline void svm_node_tex_checker(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition checker.h:25
CCL_NAMESPACE_BEGIN ccl_device_noinline int svm_node_clamp(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint value_stack_offset, uint parameters_stack_offsets, uint result_stack_offset, int offset)
Definition clamp.h:11
ccl_device void svm_node_closure_set_weight(ccl_private ShaderData *sd, ccl_private Spectrum *closure_weight, uint r, uint g, uint b)
Definition closure.h:1296
ccl_device_noinline void svm_node_emission_weight(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, ccl_private Spectrum *closure_weight, uint4 node)
Definition closure.h:1311
ccl_device_noinline void svm_node_closure_volume(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, Spectrum closure_weight, uint4 node)
Definition closure.h:996
ccl_device_noinline void svm_node_mix_closure(ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition closure.h:1324
ccl_device void svm_node_set_normal(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint in_direction, uint out_normal)
Definition closure.h:1348
ccl_device_noinline void svm_node_closure_emission(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, Spectrum closure_weight, uint4 node)
Definition closure.h:1224
ccl_device_noinline void svm_node_closure_holdout(ccl_private ShaderData *sd, ccl_private float *stack, Spectrum closure_weight, uint4 node)
Definition closure.h:1271
ccl_device void svm_node_closure_weight(ccl_private ShaderData *sd, ccl_private float *stack, ccl_private Spectrum *closure_weight, uint weight_offset)
Definition closure.h:1303
ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, Spectrum closure_weight, uint4 node, uint32_t path_flag, int offset)
Definition closure.h:38
ccl_device_noinline void svm_node_closure_background(ccl_private ShaderData *sd, ccl_private float *stack, Spectrum closure_weight, uint4 node)
Definition closure.h:1250
ccl_device_noinline int svm_node_principled_volume(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, Spectrum closure_weight, uint4 node, uint32_t path_flag, int offset)
Definition closure.h:1103
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_convert(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint type, uint from, uint to)
Definition convert.h:11
ccl_device_noinline void svm_node_tex_image_box(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
ccl_device_noinline void svm_node_tex_environment(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
ccl_device_noinline int svm_node_tex_image(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node, int offset)
OperationNode * node
#define kernel_assert(cond)
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
#define ccl_device_forceinline
#define ccl_device
#define ccl_private
#define ccl_device_inline
#define ccl_global
#define CCL_NAMESPACE_END
ccl_device_forceinline float4 make_float4(const float x, const float y, const float z, const float w)
ccl_device_forceinline float3 make_float3(const float x, const float y, const float z)
#define __int_as_float(x)
#define __float_as_int(x)
#define __uint_as_float(x)
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_set_bump(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition displace.h:13
ccl_device_noinline int svm_node_vector_displacement(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node, int offset)
Definition displace.h:149
ccl_device void svm_node_set_displacement(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint fac_offset)
Definition displace.h:98
ccl_device_noinline void svm_node_displacement(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition displace.h:111
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
ccl_device_noinline void svm_node_layer_weight(ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition fresnel.h:33
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_fresnel(ccl_private ShaderData *sd, ccl_private float *stack, uint ior_offset, uint ior_value, uint node)
Definition fresnel.h:11
ccl_device_noinline int svm_node_tex_gabor(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint type, uint stack_offsets_1, uint stack_offsets_2, int offset)
Definition gabor.h:283
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_gamma(ccl_private ShaderData *sd, ccl_private float *stack, uint in_gamma, uint in_color, uint out_color)
Definition gamma.h:9
ccl_device_noinline void svm_node_tex_gradient(ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition gradient.h:55
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_hsv(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition hsv.h:9
ccl_device_noinline void svm_node_invert(ccl_private ShaderData *sd, ccl_private float *stack, uint in_fac, uint in_color, uint out_color)
Definition invert.h:14
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, uint4 node)
ccl_device_noinline void svm_node_attr(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
ccl_device_noinline void svm_node_attr_bump_dy(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_camera(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint out_vector, uint out_zdepth, uint out_distance)
ccl_device_noinline void svm_node_particle_info(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint type, uint out_offset)
ccl_device_noinline void svm_node_geometry_bump_dy(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint type, uint out_offset)
ccl_device_noinline void svm_node_geometry_bump_dx(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint type, uint out_offset)
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_geometry(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint type, uint out_offset)
ccl_device_noinline void svm_node_object_info(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint type, uint out_offset)
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_ies(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
ccl_device_noinline int svm_node_vector_math(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint type, uint inputs_stack_offsets, 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, uint type, uint inputs_stack_offsets, uint result_stack_offset)
ccl_device_inline float4 read_node_float(KernelGlobals kg, ccl_private int *offset)
#define SVM_CASE(node)
ccl_device_inline void stack_store_float3(ccl_private float *stack, uint a, float3 f)
ccl_device_inline float4 fetch_node_float(KernelGlobals kg, int offset)
ccl_device_inline int stack_load_int(ccl_private float *stack, uint a)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 stack_load_float3(ccl_private float *stack, uint a)
ccl_device void svm_eval_nodes(KernelGlobals kg, ConstIntegratorGenericState state, ccl_private ShaderData *sd, ccl_global float *render_buffer, uint32_t path_flag)
ccl_device_inline uint4 read_node(KernelGlobals kg, ccl_private int *offset)
ccl_device_forceinline void svm_unpack_node_uchar3(uint i, ccl_private uint *x, ccl_private uint *y, ccl_private uint *z)
ccl_device_forceinline void svm_unpack_node_uchar2(uint i, ccl_private uint *x, ccl_private uint *y)
ccl_device_inline float stack_load_float_default(ccl_private float *stack, uint a, uint value)
ccl_device_inline void stack_store_int(ccl_private float *stack, uint a, int i)
ccl_device_inline void stack_store_float(ccl_private float *stack, uint a, float f)
ccl_device_inline float stack_load_float(ccl_private float *stack, uint a)
ccl_device_forceinline void svm_unpack_node_uchar4(uint i, ccl_private uint *x, ccl_private uint *y, ccl_private uint *z, ccl_private uint *w)
ccl_device_inline int stack_load_int_default(ccl_private float *stack, uint a, uint value)
ccl_device_inline bool stack_valid(uint a)
#define SVM_STACK_SIZE
@ SHADER_TYPE_SURFACE
@ SHADER_TYPE_VOLUME
@ SHADER_TYPE_DISPLACEMENT
#define SVM_STACK_INVALID
#define IF_KERNEL_NODES_FEATURE(feature)
ShaderData
@ SHADER_MASK
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_light_path(KernelGlobals kg, ConstIntegratorGenericState state, ccl_private const ShaderData *sd, ccl_private float *stack, uint type, uint out_offset, uint32_t path_flag)
Definition light_path.h:12
ccl_device_noinline void svm_node_light_falloff(ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition light_path.h:101
ccl_device_noinline int svm_node_tex_magic(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node, int offset)
Definition magic.h:96
ccl_device_noinline int svm_node_vector_map_range(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint value_stack_offset, uint parameters_stack_offsets, uint results_stack_offsets, int offset)
Definition map_range.h:79
ccl_device_noinline int svm_node_map_range(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint value_stack_offset, uint parameters_stack_offsets, uint results_stack_offsets, int offset)
Definition map_range.h:17
static ulong state[N]
ccl_device_noinline void svm_node_mix_vector(ccl_private ShaderData *sd, ccl_private float *stack, uint input_offset, uint result_offset)
Definition mix.h:77
ccl_device_noinline void svm_node_mix_color(ccl_private ShaderData *sd, ccl_private float *stack, uint options, uint input_offset, uint result_offset)
Definition mix.h:31
ccl_device_noinline void svm_node_mix_vector_non_uniform(ccl_private ShaderData *sd, ccl_private float *stack, uint input_offset, uint result_offset)
Definition mix.h:96
CCL_NAMESPACE_BEGIN ccl_device_noinline int svm_node_mix(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint fac_offset, uint c1_offset, uint c2_offset, int offset)
Definition mix.h:11
ccl_device_noinline void svm_node_mix_float(ccl_private ShaderData *sd, ccl_private float *stack, uint use_clamp, uint input_offset, uint result_offset)
Definition mix.h:56
ccl_device_noinline int svm_node_tex_noise(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint offsets1, uint offsets2, uint offsets3, int node_offset)
Definition noisetex.h:244
CCL_NAMESPACE_BEGIN ccl_device_noinline int svm_node_normal(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint in_normal_offset, uint out_normal_offset, uint out_dot_offset, int offset)
Definition normal.h:9
ccl_device_noinline int svm_node_rgb_ramp(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node, int offset)
Definition ramp.h:81
ccl_device_noinline int svm_node_curves(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node, int offset)
Definition ramp.h:103
ccl_device_noinline int svm_node_curve(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node, int offset)
Definition ramp.h:129
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_combine_color(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint color_type, uint inputs_stack_offsets, uint result_stack_offset)
ccl_device_noinline void svm_node_separate_color(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint color_type, uint input_stack_offset, uint results_stack_offsets)
ccl_device_noinline int svm_node_separate_hsv(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint color_in, uint hue_out, uint saturation_out, int offset)
Definition sepcomb_hsv.h:33
CCL_NAMESPACE_BEGIN ccl_device_noinline int svm_node_combine_hsv(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint hue_in, uint saturation_in, uint value_in, int offset)
Definition sepcomb_hsv.h:9
CCL_NAMESPACE_BEGIN ccl_device void svm_node_combine_vector(ccl_private ShaderData *sd, ccl_private float *stack, uint in_offset, uint vector_index, uint out_offset)
ccl_device void svm_node_separate_vector(ccl_private ShaderData *sd, ccl_private float *stack, uint ivector_offset, uint vector_index, uint out_offset)
ccl_device_noinline int svm_node_tex_sky(KernelGlobals kg, ccl_private ShaderData *sd, uint32_t path_flag, ccl_private float *stack, uint4 node, int offset)
Definition sky.h:205
unsigned int uint32_t
Definition stdint.h:80
float z
Definition sky_float3.h:27
float y
Definition sky_float3.h:27
float x
Definition sky_float3.h:27
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_mapping(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint type, uint inputs_stack_offsets, uint result_stack_offset)
Definition svm/mapping.h:13
ccl_device_noinline int svm_node_texture_mapping(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint vec_offset, uint out_offset, int offset)
Definition svm/mapping.h:38
ccl_device_noinline int svm_node_min_max(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint vec_offset, uint out_offset, int offset)
Definition svm/mapping.h:57
ccl_device_noinline int svm_node_tex_coord_bump_dy(KernelGlobals kg, ccl_private ShaderData *sd, uint32_t path_flag, ccl_private float *stack, uint4 node, int offset)
Definition tex_coord.h:181
CCL_NAMESPACE_BEGIN ccl_device_noinline int svm_node_tex_coord(KernelGlobals kg, ccl_private ShaderData *sd, uint32_t path_flag, ccl_private float *stack, uint4 node, int offset)
Definition tex_coord.h:15
ccl_device_noinline int svm_node_tex_coord_bump_dx(KernelGlobals kg, ccl_private ShaderData *sd, uint32_t path_flag, ccl_private float *stack, uint4 node, int offset)
Definition tex_coord.h:96
ccl_device_noinline void svm_node_tangent(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition tex_coord.h:369
ccl_device_noinline void svm_node_normal_map(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition tex_coord.h:266
SPECTRUM_DATA_TYPE Spectrum
ccl_device int svm_node_value_v(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint out_offset, int offset)
Definition value.h:20
CCL_NAMESPACE_BEGIN ccl_device void svm_node_value_f(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint ivalue, uint out_offset)
Definition value.h:11
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_vector_rotate(ccl_private ShaderData *sd, ccl_private float *stack, uint input_stack_offsets, uint axis_stack_offsets, 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, uint4 node)
ccl_device_noinline void svm_node_vertex_color_bump_dy(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint layer_id, uint color_offset, uint alpha_offset)
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_vertex_color(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint layer_id, uint color_offset, uint alpha_offset)
Definition vertex_color.h:9
ccl_device_noinline void svm_node_vertex_color_bump_dx(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint layer_id, uint color_offset, uint alpha_offset)
ccl_device_noinline int svm_node_tex_voronoi(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint dimensions, uint feature, uint metric, int offset)
Definition voronoi.h:1013
CCL_NAMESPACE_BEGIN ccl_device_noinline int svm_node_tex_voxel(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node, int offset)
Definition voxel.h:13
ccl_device_noinline int svm_node_tex_wave(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node, int offset)
Definition wave.h:76
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_wavelength(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint wavelength, uint color_out)
Definition wavelength.h:16
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_tex_white_noise(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint dimensions, uint inputs_stack_offsets, uint outputs_stack_offsets)
Definition white_noise.h:9
ccl_device_noinline void svm_node_wireframe(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition wireframe.h:75