Blender  V3.3
kernel/svm/svm.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright 2011-2022 Blender Foundation */
3 
4 #pragma once
5 
6 /* Shader Virtual Machine
7  *
8  * A shader is a list of nodes to be executed. These are simply read one after
9  * the other and executed, using an node counter. Each node and its associated
10  * data is encoded as one or more uint4's in a 1D texture. If the data is larger
11  * than an uint4, the node can increase the node counter to compensate for this.
12  * Floats are encoded as int and then converted to float again.
13  *
14  * Nodes write their output into a stack. All stack data in the stack is
15  * floats, since it's all factors, colors and vectors. The stack will be stored
16  * in local memory on the GPU, as it would take too many register and indexes in
17  * ways not known at compile time. This seems the only solution even though it
18  * may be slow, with two positive factors. If the same shader is being executed,
19  * memory access will be coalesced and cached.
20  *
21  * The result of shader execution will be a single closure. This means the
22  * closure type, associated label, data and weight. Sampling from multiple
23  * closures is supported through the mix closure node, the logic for that is
24  * mostly taken care of in the SVM compiler.
25  */
26 
27 #include "kernel/svm/types.h"
28 
30 
31 /* Stack */
32 
34 {
36 
37  ccl_private float *stack_a = stack + a;
38  return make_float3(stack_a[0], stack_a[1], stack_a[2]);
39 }
40 
42 {
44 
45  ccl_private float *stack_a = stack + a;
46  stack_a[0] = f.x;
47  stack_a[1] = f.y;
48  stack_a[2] = f.z;
49 }
50 
52 {
54 
55  return stack[a];
56 }
57 
59 {
60  return (a == (uint)SVM_STACK_INVALID) ? __uint_as_float(value) : stack_load_float(stack, a);
61 }
62 
64 {
66 
67  stack[a] = f;
68 }
69 
71 {
73 
74  return __float_as_int(stack[a]);
75 }
76 
78 {
79  return (a == (uint)SVM_STACK_INVALID) ? (int)value : stack_load_int(stack, a);
80 }
81 
83 {
85 
86  stack[a] = __int_as_float(i);
87 }
88 
90 {
91  return a != (uint)SVM_STACK_INVALID;
92 }
93 
94 /* Reading Nodes */
95 
97 {
98  uint4 node = kernel_data_fetch(svm_nodes, *offset);
99  (*offset)++;
100  return node;
101 }
102 
104 {
105  uint4 node = kernel_data_fetch(svm_nodes, *offset);
109  __uint_as_float(node.w));
110  (*offset)++;
111  return f;
112 }
113 
115 {
116  uint4 node = kernel_data_fetch(svm_nodes, offset);
117  return make_float4(__uint_as_float(node.x),
120  __uint_as_float(node.w));
121 }
122 
124  ccl_private uint *x,
125  ccl_private uint *y)
126 {
127  *x = (i & 0xFF);
128  *y = ((i >> 8) & 0xFF);
129 }
130 
132  ccl_private uint *x,
133  ccl_private uint *y,
134  ccl_private uint *z)
135 {
136  *x = (i & 0xFF);
137  *y = ((i >> 8) & 0xFF);
138  *z = ((i >> 16) & 0xFF);
139 }
140 
143 {
144  *x = (i & 0xFF);
145  *y = ((i >> 8) & 0xFF);
146  *z = ((i >> 16) & 0xFF);
147  *w = ((i >> 24) & 0xFF);
148 }
149 
151 
152 /* Nodes */
153 
154 #include "kernel/svm/aov.h"
155 #include "kernel/svm/attribute.h"
156 #include "kernel/svm/blackbody.h"
157 #include "kernel/svm/brick.h"
158 #include "kernel/svm/brightness.h"
159 #include "kernel/svm/bump.h"
160 #include "kernel/svm/camera.h"
161 #include "kernel/svm/checker.h"
162 #include "kernel/svm/clamp.h"
163 #include "kernel/svm/closure.h"
164 #include "kernel/svm/convert.h"
165 #include "kernel/svm/displace.h"
166 #include "kernel/svm/fresnel.h"
167 #include "kernel/svm/gamma.h"
168 #include "kernel/svm/geometry.h"
169 #include "kernel/svm/gradient.h"
170 #include "kernel/svm/hsv.h"
171 #include "kernel/svm/ies.h"
172 #include "kernel/svm/image.h"
173 #include "kernel/svm/invert.h"
174 #include "kernel/svm/light_path.h"
175 #include "kernel/svm/magic.h"
176 #include "kernel/svm/map_range.h"
177 #include "kernel/svm/mapping.h"
178 #include "kernel/svm/math.h"
179 #include "kernel/svm/mix.h"
180 #include "kernel/svm/musgrave.h"
181 #include "kernel/svm/noisetex.h"
182 #include "kernel/svm/normal.h"
183 #include "kernel/svm/ramp.h"
185 #include "kernel/svm/sepcomb_hsv.h"
187 #include "kernel/svm/sky.h"
188 #include "kernel/svm/tex_coord.h"
189 #include "kernel/svm/value.h"
192 #include "kernel/svm/vertex_color.h"
193 #include "kernel/svm/voronoi.h"
194 #include "kernel/svm/voxel.h"
195 #include "kernel/svm/wave.h"
196 #include "kernel/svm/wavelength.h"
197 #include "kernel/svm/white_noise.h"
198 #include "kernel/svm/wireframe.h"
199 
200 #ifdef __SHADER_RAYTRACE__
201 # include "kernel/svm/ao.h"
202 # include "kernel/svm/bevel.h"
203 #endif
204 
206 
207 #ifdef __KERNEL_USE_DATA_CONSTANTS__
208 # define SVM_CASE(node) \
209  case node: \
210  if (!kernel_data_svm_usage_##node) \
211  break;
212 #else
213 # define SVM_CASE(node) case node:
214 #endif
215 
216 /* Main Interpreter Loop */
217 template<uint node_feature_mask, ShaderType type, typename ConstIntegratorGenericState>
219  ConstIntegratorGenericState state,
221  ccl_global float *render_buffer,
222  uint32_t path_flag)
223 {
224  float stack[SVM_STACK_SIZE];
225  int offset = sd->shader & SHADER_MASK;
226 
227  while (1) {
228  uint4 node = read_node(kg, &offset);
229 
230  switch (node.x) {
231  SVM_CASE(NODE_END)
232  return;
233  SVM_CASE(NODE_SHADER_JUMP)
234  {
235  if (type == SHADER_TYPE_SURFACE)
236  offset = node.y;
237  else if (type == SHADER_TYPE_VOLUME)
238  offset = node.z;
239  else if (type == SHADER_TYPE_DISPLACEMENT)
240  offset = node.w;
241  else
242  return;
243  break;
244  }
245  SVM_CASE(NODE_CLOSURE_BSDF)
246  offset = svm_node_closure_bsdf<node_feature_mask, type>(
247  kg, sd, stack, node, path_flag, offset);
248  break;
249  SVM_CASE(NODE_CLOSURE_EMISSION)
250  IF_KERNEL_NODES_FEATURE(EMISSION)
251  {
252  svm_node_closure_emission(sd, stack, node);
253  }
254  break;
255  SVM_CASE(NODE_CLOSURE_BACKGROUND)
256  IF_KERNEL_NODES_FEATURE(EMISSION)
257  {
258  svm_node_closure_background(sd, stack, node);
259  }
260  break;
261  SVM_CASE(NODE_CLOSURE_SET_WEIGHT)
263  break;
264  SVM_CASE(NODE_CLOSURE_WEIGHT)
265  svm_node_closure_weight(sd, stack, node.y);
266  break;
267  SVM_CASE(NODE_EMISSION_WEIGHT)
268  IF_KERNEL_NODES_FEATURE(EMISSION)
269  {
270  svm_node_emission_weight(kg, sd, stack, node);
271  }
272  break;
273  SVM_CASE(NODE_MIX_CLOSURE)
274  svm_node_mix_closure(sd, stack, node);
275  break;
276  SVM_CASE(NODE_JUMP_IF_ZERO)
277  if (stack_load_float(stack, node.z) <= 0.0f)
278  offset += node.y;
279  break;
280  SVM_CASE(NODE_JUMP_IF_ONE)
281  if (stack_load_float(stack, node.z) >= 1.0f)
282  offset += node.y;
283  break;
284  SVM_CASE(NODE_GEOMETRY)
285  svm_node_geometry(kg, sd, stack, node.y, node.z);
286  break;
287  SVM_CASE(NODE_CONVERT)
288  svm_node_convert(kg, sd, stack, node.y, node.z, node.w);
289  break;
290  SVM_CASE(NODE_TEX_COORD)
291  offset = svm_node_tex_coord(kg, sd, path_flag, stack, node, offset);
292  break;
293  SVM_CASE(NODE_VALUE_F)
294  svm_node_value_f(kg, sd, stack, node.y, node.z);
295  break;
296  SVM_CASE(NODE_VALUE_V)
297  offset = svm_node_value_v(kg, sd, stack, node.y, offset);
298  break;
299  SVM_CASE(NODE_ATTR)
300  svm_node_attr<node_feature_mask>(kg, sd, stack, node);
301  break;
302  SVM_CASE(NODE_VERTEX_COLOR)
303  svm_node_vertex_color(kg, sd, stack, node.y, node.z, node.w);
304  break;
305  SVM_CASE(NODE_GEOMETRY_BUMP_DX)
307  {
308  svm_node_geometry_bump_dx(kg, sd, stack, node.y, node.z);
309  }
310  break;
311  SVM_CASE(NODE_GEOMETRY_BUMP_DY)
313  {
314  svm_node_geometry_bump_dy(kg, sd, stack, node.y, node.z);
315  }
316  break;
317  SVM_CASE(NODE_SET_DISPLACEMENT)
318  svm_node_set_displacement<node_feature_mask>(kg, sd, stack, node.y);
319  break;
320  SVM_CASE(NODE_DISPLACEMENT)
321  svm_node_displacement<node_feature_mask>(kg, sd, stack, node);
322  break;
323  SVM_CASE(NODE_VECTOR_DISPLACEMENT)
324  offset = svm_node_vector_displacement<node_feature_mask>(kg, sd, stack, node, offset);
325  break;
326  SVM_CASE(NODE_TEX_IMAGE)
327  offset = svm_node_tex_image(kg, sd, stack, node, offset);
328  break;
329  SVM_CASE(NODE_TEX_IMAGE_BOX)
330  svm_node_tex_image_box(kg, sd, stack, node);
331  break;
332  SVM_CASE(NODE_TEX_NOISE)
333  offset = svm_node_tex_noise(kg, sd, stack, node.y, node.z, node.w, offset);
334  break;
335  SVM_CASE(NODE_SET_BUMP)
336  svm_node_set_bump<node_feature_mask>(kg, sd, stack, node);
337  break;
338  SVM_CASE(NODE_ATTR_BUMP_DX)
340  {
341  svm_node_attr_bump_dx(kg, sd, stack, node);
342  }
343  break;
344  SVM_CASE(NODE_ATTR_BUMP_DY)
346  {
347  svm_node_attr_bump_dy(kg, sd, stack, node);
348  }
349  break;
350  SVM_CASE(NODE_VERTEX_COLOR_BUMP_DX)
352  {
353  svm_node_vertex_color_bump_dx(kg, sd, stack, node.y, node.z, node.w);
354  }
355  break;
356  SVM_CASE(NODE_VERTEX_COLOR_BUMP_DY)
358  {
359  svm_node_vertex_color_bump_dy(kg, sd, stack, node.y, node.z, node.w);
360  }
361  break;
362  SVM_CASE(NODE_TEX_COORD_BUMP_DX)
364  {
365  offset = svm_node_tex_coord_bump_dx(kg, sd, path_flag, stack, node, offset);
366  }
367  break;
368  SVM_CASE(NODE_TEX_COORD_BUMP_DY)
370  {
371  offset = svm_node_tex_coord_bump_dy(kg, sd, path_flag, stack, node, offset);
372  }
373  break;
374  SVM_CASE(NODE_CLOSURE_SET_NORMAL)
376  {
377  svm_node_set_normal(kg, sd, stack, node.y, node.z);
378  }
379  break;
380  SVM_CASE(NODE_ENTER_BUMP_EVAL)
381  IF_KERNEL_NODES_FEATURE(BUMP_STATE)
382  {
383  svm_node_enter_bump_eval(kg, sd, stack, node.y);
384  }
385  break;
386  SVM_CASE(NODE_LEAVE_BUMP_EVAL)
387  IF_KERNEL_NODES_FEATURE(BUMP_STATE)
388  {
389  svm_node_leave_bump_eval(kg, sd, stack, node.y);
390  }
391  break;
392  SVM_CASE(NODE_HSV)
393  svm_node_hsv(kg, sd, stack, node);
394  break;
395  SVM_CASE(NODE_CLOSURE_HOLDOUT)
396  svm_node_closure_holdout(sd, stack, node);
397  break;
398  SVM_CASE(NODE_FRESNEL)
399  svm_node_fresnel(sd, stack, node.y, node.z, node.w);
400  break;
401  SVM_CASE(NODE_LAYER_WEIGHT)
402  svm_node_layer_weight(sd, stack, node);
403  break;
404  SVM_CASE(NODE_CLOSURE_VOLUME)
406  {
407  svm_node_closure_volume<type>(kg, sd, stack, node);
408  }
409  break;
410  SVM_CASE(NODE_PRINCIPLED_VOLUME)
412  {
413  offset = svm_node_principled_volume<type>(kg, sd, stack, node, path_flag, offset);
414  }
415  break;
416  SVM_CASE(NODE_MATH)
417  svm_node_math(kg, sd, stack, node.y, node.z, node.w);
418  break;
419  SVM_CASE(NODE_VECTOR_MATH)
420  offset = svm_node_vector_math(kg, sd, stack, node.y, node.z, node.w, offset);
421  break;
422  SVM_CASE(NODE_RGB_RAMP)
423  offset = svm_node_rgb_ramp(kg, sd, stack, node, offset);
424  break;
425  SVM_CASE(NODE_GAMMA)
426  svm_node_gamma(sd, stack, node.y, node.z, node.w);
427  break;
428  SVM_CASE(NODE_BRIGHTCONTRAST)
429  svm_node_brightness(sd, stack, node.y, node.z, node.w);
430  break;
431  SVM_CASE(NODE_LIGHT_PATH)
432  svm_node_light_path<node_feature_mask>(kg, state, sd, stack, node.y, node.z, path_flag);
433  break;
434  SVM_CASE(NODE_OBJECT_INFO)
435  svm_node_object_info(kg, sd, stack, node.y, node.z);
436  break;
437  SVM_CASE(NODE_PARTICLE_INFO)
438  svm_node_particle_info(kg, sd, stack, node.y, node.z);
439  break;
440 #if defined(__HAIR__)
441  SVM_CASE(NODE_HAIR_INFO)
442  svm_node_hair_info(kg, sd, stack, node.y, node.z);
443  break;
444 #endif
445 #if defined(__POINTCLOUD__)
446  SVM_CASE(NODE_POINT_INFO)
447  svm_node_point_info(kg, sd, stack, node.y, node.z);
448  break;
449 #endif
450  SVM_CASE(NODE_TEXTURE_MAPPING)
451  offset = svm_node_texture_mapping(kg, sd, stack, node.y, node.z, offset);
452  break;
453  SVM_CASE(NODE_MAPPING)
454  svm_node_mapping(kg, sd, stack, node.y, node.z, node.w);
455  break;
456  SVM_CASE(NODE_MIN_MAX)
457  offset = svm_node_min_max(kg, sd, stack, node.y, node.z, offset);
458  break;
459  SVM_CASE(NODE_CAMERA)
460  svm_node_camera(kg, sd, stack, node.y, node.z, node.w);
461  break;
462  SVM_CASE(NODE_TEX_ENVIRONMENT)
463  svm_node_tex_environment(kg, sd, stack, node);
464  break;
465  SVM_CASE(NODE_TEX_SKY)
466  offset = svm_node_tex_sky(kg, sd, stack, node, offset);
467  break;
468  SVM_CASE(NODE_TEX_GRADIENT)
469  svm_node_tex_gradient(sd, stack, node);
470  break;
471  SVM_CASE(NODE_TEX_VORONOI)
472  offset = svm_node_tex_voronoi<node_feature_mask>(
473  kg, sd, stack, node.y, node.z, node.w, offset);
474  break;
475  SVM_CASE(NODE_TEX_MUSGRAVE)
476  offset = svm_node_tex_musgrave(kg, sd, stack, node.y, node.z, node.w, offset);
477  break;
478  SVM_CASE(NODE_TEX_WAVE)
479  offset = svm_node_tex_wave(kg, sd, stack, node, offset);
480  break;
481  SVM_CASE(NODE_TEX_MAGIC)
482  offset = svm_node_tex_magic(kg, sd, stack, node, offset);
483  break;
484  SVM_CASE(NODE_TEX_CHECKER)
485  svm_node_tex_checker(kg, sd, stack, node);
486  break;
487  SVM_CASE(NODE_TEX_BRICK)
488  offset = svm_node_tex_brick(kg, sd, stack, node, offset);
489  break;
490  SVM_CASE(NODE_TEX_WHITE_NOISE)
491  svm_node_tex_white_noise(kg, sd, stack, node.y, node.z, node.w);
492  break;
493  SVM_CASE(NODE_NORMAL)
494  offset = svm_node_normal(kg, sd, stack, node.y, node.z, node.w, offset);
495  break;
496  SVM_CASE(NODE_LIGHT_FALLOFF)
497  svm_node_light_falloff(sd, stack, node);
498  break;
499  SVM_CASE(NODE_IES)
500  svm_node_ies(kg, sd, stack, node);
501  break;
502  SVM_CASE(NODE_CURVES)
503  offset = svm_node_curves(kg, sd, stack, node, offset);
504  break;
505  SVM_CASE(NODE_FLOAT_CURVE)
506  offset = svm_node_curve(kg, sd, stack, node, offset);
507  break;
508  SVM_CASE(NODE_TANGENT)
509  svm_node_tangent(kg, sd, stack, node);
510  break;
511  SVM_CASE(NODE_NORMAL_MAP)
512  svm_node_normal_map(kg, sd, stack, node);
513  break;
514  SVM_CASE(NODE_INVERT)
515  svm_node_invert(sd, stack, node.y, node.z, node.w);
516  break;
517  SVM_CASE(NODE_MIX)
518  offset = svm_node_mix(kg, sd, stack, node.y, node.z, node.w, offset);
519  break;
520  SVM_CASE(NODE_SEPARATE_COLOR)
521  svm_node_separate_color(kg, sd, stack, node.y, node.z, node.w);
522  break;
523  SVM_CASE(NODE_COMBINE_COLOR)
524  svm_node_combine_color(kg, sd, stack, node.y, node.z, node.w);
525  break;
526  SVM_CASE(NODE_SEPARATE_VECTOR)
527  svm_node_separate_vector(sd, stack, node.y, node.z, node.w);
528  break;
529  SVM_CASE(NODE_COMBINE_VECTOR)
530  svm_node_combine_vector(sd, stack, node.y, node.z, node.w);
531  break;
532  SVM_CASE(NODE_SEPARATE_HSV)
533  offset = svm_node_separate_hsv(kg, sd, stack, node.y, node.z, node.w, offset);
534  break;
535  SVM_CASE(NODE_COMBINE_HSV)
536  offset = svm_node_combine_hsv(kg, sd, stack, node.y, node.z, node.w, offset);
537  break;
538  SVM_CASE(NODE_VECTOR_ROTATE)
539  svm_node_vector_rotate(sd, stack, node.y, node.z, node.w);
540  break;
541  SVM_CASE(NODE_VECTOR_TRANSFORM)
542  svm_node_vector_transform(kg, sd, stack, node);
543  break;
544  SVM_CASE(NODE_WIREFRAME)
545  svm_node_wireframe(kg, sd, stack, node);
546  break;
547  SVM_CASE(NODE_WAVELENGTH)
548  svm_node_wavelength(kg, sd, stack, node.y, node.z);
549  break;
550  SVM_CASE(NODE_BLACKBODY)
551  svm_node_blackbody(kg, sd, stack, node.y, node.z);
552  break;
553  SVM_CASE(NODE_MAP_RANGE)
554  offset = svm_node_map_range(kg, sd, stack, node.y, node.z, node.w, offset);
555  break;
556  SVM_CASE(NODE_VECTOR_MAP_RANGE)
557  offset = svm_node_vector_map_range(kg, sd, stack, node.y, node.z, node.w, offset);
558  break;
559  SVM_CASE(NODE_CLAMP)
560  offset = svm_node_clamp(kg, sd, stack, node.y, node.z, node.w, offset);
561  break;
562 #ifdef __SHADER_RAYTRACE__
563  SVM_CASE(NODE_BEVEL)
564  svm_node_bevel<node_feature_mask>(kg, state, sd, stack, node);
565  break;
566  SVM_CASE(NODE_AMBIENT_OCCLUSION)
567  svm_node_ao<node_feature_mask>(kg, state, sd, stack, node);
568  break;
569 #endif
570 
571  SVM_CASE(NODE_TEX_VOXEL)
573  {
574  offset = svm_node_tex_voxel(kg, sd, stack, node, offset);
575  }
576  break;
577  SVM_CASE(NODE_AOV_START)
578  if (!svm_node_aov_check(path_flag, render_buffer)) {
579  return;
580  }
581  break;
582  SVM_CASE(NODE_AOV_COLOR)
583  svm_node_aov_color<node_feature_mask>(kg, state, sd, stack, node, render_buffer);
584  break;
585  SVM_CASE(NODE_AOV_VALUE)
586  svm_node_aov_value<node_feature_mask>(kg, state, sd, stack, node, render_buffer);
587  break;
588  default:
589  kernel_assert(!"Unknown node type was passed to the SVM machine");
590  return;
591  }
592  }
593 }
594 
unsigned int uint
Definition: BLI_sys_types.h:67
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble z
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
float float4[4]
CCL_NAMESPACE_BEGIN ccl_device_inline bool svm_node_aov_check(const uint32_t path_flag, ccl_global float *render_buffer)
Definition: aov.h:10
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:17
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:64
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:10
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:10
ccl_device_noinline void svm_node_tex_checker(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition: checker.h:24
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:10
ccl_device_noinline void svm_node_emission_weight(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition: closure.h:1203
ccl_device_noinline void svm_node_mix_closure(ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition: closure.h:1217
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:1241
ccl_device_noinline void svm_node_closure_background(ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition: closure.h:1142
ccl_device void svm_node_closure_weight(ccl_private ShaderData *sd, ccl_private float *stack, uint weight_offset)
Definition: closure.h:1195
ccl_device void svm_node_closure_set_weight(ccl_private ShaderData *sd, uint r, uint g, uint b)
Definition: closure.h:1189
ccl_device_noinline void svm_node_closure_emission(ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition: closure.h:1123
ccl_device_noinline void svm_node_closure_holdout(ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition: closure.h:1161
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:10
#define kernel_assert(cond)
Definition: cpu/compat.h:34
#define ccl_device_forceinline
Definition: cuda/compat.h:35
#define ccl_device
Definition: cuda/compat.h:32
#define ccl_private
Definition: cuda/compat.h:48
#define ccl_device_inline
Definition: cuda/compat.h:34
#define ccl_global
Definition: cuda/compat.h:43
#define CCL_NAMESPACE_END
Definition: cuda/compat.h:9
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
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
ccl_device_noinline void svm_node_layer_weight(ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition: fresnel.h:32
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:10
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:8
ccl_device_noinline void svm_node_tex_gradient(ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition: gradient.h:52
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:8
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:13
ccl_gpu_kernel_postfix ccl_global KernelWorkTile const int ccl_global float * render_buffer
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
const int state
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_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_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
Definition: kernel/types.h:925
@ SHADER_MASK
Definition: kernel/types.h:449
ccl_device_noinline void svm_node_light_falloff(ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition: light_path.h:100
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:95
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:78
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:16
#define make_float4(x, y, z, w)
Definition: metal/compat.h:205
#define make_float3(x, y, z)
Definition: metal/compat.h:204
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:10
ccl_device_noinline int svm_node_tex_musgrave(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint offsets1, uint offsets2, uint offsets3, int offset)
Definition: musgrave.h:706
static unsigned a[3]
Definition: RandGen.cpp:78
ccl_device_noinline int svm_node_tex_noise(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint dimensions, uint offsets1, uint offsets2, int offset)
Definition: noisetex.h:134
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:8
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:80
ccl_device_noinline int svm_node_curves(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node, int offset)
Definition: ramp.h:102
ccl_device_noinline int svm_node_curve(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node, int offset)
Definition: ramp.h:128
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)
Definition: sepcomb_color.h:8
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)
Definition: sepcomb_color.h:30
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:31
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:8
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, ccl_private float *stack, uint4 node, int offset)
Definition: sky.h:200
unsigned int uint32_t
Definition: stdint.h:80
float z
float y
float x
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:12
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:37
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:56
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:180
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:14
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:95
ccl_device_noinline void svm_node_tangent(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition: tex_coord.h:358
ccl_device_noinline void svm_node_normal_map(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition: tex_coord.h:265
ccl_device_inline float __uint_as_float(uint i)
Definition: util/math.h:273
ccl_device_inline int __float_as_int(float f)
Definition: util/math.h:243
ccl_device_inline float __int_as_float(int i)
Definition: util/math.h:253
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:19
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:10
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)
Definition: vector_rotate.h:10
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)
Definition: vertex_color.h:64
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:8
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)
Definition: vertex_color.h:34
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:11
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:74
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:15
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 ouptuts_stack_offsets)
Definition: white_noise.h:8
ccl_device_noinline void svm_node_wireframe(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition: wireframe.h:74