Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/svm/svm.h
| Show First 20 Lines • Show All 101 Lines • ▼ Show 20 Lines | |||||
| ccl_device_inline bool stack_valid(uint a) | ccl_device_inline bool stack_valid(uint a) | ||||
| { | { | ||||
| return a != (uint)SVM_STACK_INVALID; | return a != (uint)SVM_STACK_INVALID; | ||||
| } | } | ||||
| /* Reading Nodes */ | /* Reading Nodes */ | ||||
| ccl_device_inline uint4 read_node(ccl_global const KernelGlobals *kg, ccl_private int *offset) | ccl_device_inline uint4 read_node(KernelGlobals kg, ccl_private int *offset) | ||||
| { | { | ||||
| uint4 node = kernel_tex_fetch(__svm_nodes, *offset); | uint4 node = kernel_tex_fetch(__svm_nodes, *offset); | ||||
| (*offset)++; | (*offset)++; | ||||
| return node; | return node; | ||||
| } | } | ||||
| ccl_device_inline float4 read_node_float(ccl_global const KernelGlobals *kg, | ccl_device_inline float4 read_node_float(KernelGlobals kg, ccl_private int *offset) | ||||
| ccl_private int *offset) | |||||
| { | { | ||||
| uint4 node = kernel_tex_fetch(__svm_nodes, *offset); | uint4 node = kernel_tex_fetch(__svm_nodes, *offset); | ||||
| float4 f = make_float4(__uint_as_float(node.x), | float4 f = make_float4(__uint_as_float(node.x), | ||||
| __uint_as_float(node.y), | __uint_as_float(node.y), | ||||
| __uint_as_float(node.z), | __uint_as_float(node.z), | ||||
| __uint_as_float(node.w)); | __uint_as_float(node.w)); | ||||
| (*offset)++; | (*offset)++; | ||||
| return f; | return f; | ||||
| } | } | ||||
| ccl_device_inline float4 fetch_node_float(ccl_global const KernelGlobals *kg, int offset) | ccl_device_inline float4 fetch_node_float(KernelGlobals kg, int offset) | ||||
| { | { | ||||
| uint4 node = kernel_tex_fetch(__svm_nodes, offset); | uint4 node = kernel_tex_fetch(__svm_nodes, offset); | ||||
| return make_float4(__uint_as_float(node.x), | return make_float4(__uint_as_float(node.x), | ||||
| __uint_as_float(node.y), | __uint_as_float(node.y), | ||||
| __uint_as_float(node.z), | __uint_as_float(node.z), | ||||
| __uint_as_float(node.w)); | __uint_as_float(node.w)); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 84 Lines • ▼ Show 20 Lines | |||||
| # include "kernel/svm/svm_ao.h" | # include "kernel/svm/svm_ao.h" | ||||
| # include "kernel/svm/svm_bevel.h" | # include "kernel/svm/svm_bevel.h" | ||||
| #endif | #endif | ||||
| CCL_NAMESPACE_BEGIN | CCL_NAMESPACE_BEGIN | ||||
| /* Main Interpreter Loop */ | /* Main Interpreter Loop */ | ||||
| template<uint node_feature_mask, ShaderType type> | template<uint node_feature_mask, ShaderType type> | ||||
| ccl_device void svm_eval_nodes(INTEGRATOR_STATE_CONST_ARGS, | ccl_device void svm_eval_nodes(KernelGlobals kg, | ||||
| ConstIntegratorState state, | |||||
| ShaderData *sd, | ShaderData *sd, | ||||
| ccl_global float *render_buffer, | ccl_global float *render_buffer, | ||||
| int path_flag) | int path_flag) | ||||
| { | { | ||||
| float stack[SVM_STACK_SIZE]; | float stack[SVM_STACK_SIZE]; | ||||
| int offset = sd->shader & SHADER_MASK; | int offset = sd->shader & SHADER_MASK; | ||||
| while (1) { | while (1) { | ||||
| Show All 13 Lines | switch (node.x) { | ||||
| return; | return; | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_CLOSURE_BSDF: | case NODE_CLOSURE_BSDF: | ||||
| offset = svm_node_closure_bsdf<node_feature_mask, type>( | offset = svm_node_closure_bsdf<node_feature_mask, type>( | ||||
| kg, sd, stack, node, path_flag, offset); | kg, sd, stack, node, path_flag, offset); | ||||
| break; | break; | ||||
| case NODE_CLOSURE_EMISSION: | case NODE_CLOSURE_EMISSION: | ||||
| if (KERNEL_NODES_FEATURE(EMISSION)) { | IF_KERNEL_NODES_FEATURE(EMISSION) | ||||
| { | |||||
| svm_node_closure_emission(sd, stack, node); | svm_node_closure_emission(sd, stack, node); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_CLOSURE_BACKGROUND: | case NODE_CLOSURE_BACKGROUND: | ||||
| if (KERNEL_NODES_FEATURE(EMISSION)) { | IF_KERNEL_NODES_FEATURE(EMISSION) | ||||
| { | |||||
| svm_node_closure_background(sd, stack, node); | svm_node_closure_background(sd, stack, node); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_CLOSURE_SET_WEIGHT: | case NODE_CLOSURE_SET_WEIGHT: | ||||
| svm_node_closure_set_weight(sd, node.y, node.z, node.w); | svm_node_closure_set_weight(sd, node.y, node.z, node.w); | ||||
| break; | break; | ||||
| case NODE_CLOSURE_WEIGHT: | case NODE_CLOSURE_WEIGHT: | ||||
| svm_node_closure_weight(sd, stack, node.y); | svm_node_closure_weight(sd, stack, node.y); | ||||
| break; | break; | ||||
| case NODE_EMISSION_WEIGHT: | case NODE_EMISSION_WEIGHT: | ||||
| if (KERNEL_NODES_FEATURE(EMISSION)) { | IF_KERNEL_NODES_FEATURE(EMISSION) | ||||
| { | |||||
| svm_node_emission_weight(kg, sd, stack, node); | svm_node_emission_weight(kg, sd, stack, node); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_MIX_CLOSURE: | case NODE_MIX_CLOSURE: | ||||
| svm_node_mix_closure(sd, stack, node); | svm_node_mix_closure(sd, stack, node); | ||||
| break; | break; | ||||
| case NODE_JUMP_IF_ZERO: | case NODE_JUMP_IF_ZERO: | ||||
| if (stack_load_float(stack, node.z) == 0.0f) | if (stack_load_float(stack, node.z) == 0.0f) | ||||
| Show All 20 Lines | switch (node.x) { | ||||
| break; | break; | ||||
| case NODE_ATTR: | case NODE_ATTR: | ||||
| svm_node_attr<node_feature_mask>(kg, sd, stack, node); | svm_node_attr<node_feature_mask>(kg, sd, stack, node); | ||||
| break; | break; | ||||
| case NODE_VERTEX_COLOR: | case NODE_VERTEX_COLOR: | ||||
| svm_node_vertex_color(kg, sd, stack, node.y, node.z, node.w); | svm_node_vertex_color(kg, sd, stack, node.y, node.z, node.w); | ||||
| break; | break; | ||||
| case NODE_GEOMETRY_BUMP_DX: | case NODE_GEOMETRY_BUMP_DX: | ||||
| if (KERNEL_NODES_FEATURE(BUMP)) { | IF_KERNEL_NODES_FEATURE(BUMP) | ||||
| { | |||||
| svm_node_geometry_bump_dx(kg, sd, stack, node.y, node.z); | svm_node_geometry_bump_dx(kg, sd, stack, node.y, node.z); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_GEOMETRY_BUMP_DY: | case NODE_GEOMETRY_BUMP_DY: | ||||
| if (KERNEL_NODES_FEATURE(BUMP)) { | IF_KERNEL_NODES_FEATURE(BUMP) | ||||
| { | |||||
| svm_node_geometry_bump_dy(kg, sd, stack, node.y, node.z); | svm_node_geometry_bump_dy(kg, sd, stack, node.y, node.z); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_SET_DISPLACEMENT: | case NODE_SET_DISPLACEMENT: | ||||
| if (KERNEL_NODES_FEATURE(BUMP)) { | IF_KERNEL_NODES_FEATURE(BUMP) | ||||
| { | |||||
| svm_node_set_displacement(kg, sd, stack, node.y); | svm_node_set_displacement(kg, sd, stack, node.y); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_DISPLACEMENT: | case NODE_DISPLACEMENT: | ||||
| if (KERNEL_NODES_FEATURE(BUMP)) { | IF_KERNEL_NODES_FEATURE(BUMP) | ||||
| { | |||||
| svm_node_displacement(kg, sd, stack, node); | svm_node_displacement(kg, sd, stack, node); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_VECTOR_DISPLACEMENT: | case NODE_VECTOR_DISPLACEMENT: | ||||
| if (KERNEL_NODES_FEATURE(BUMP)) { | IF_KERNEL_NODES_FEATURE(BUMP) | ||||
| { | |||||
| offset = svm_node_vector_displacement(kg, sd, stack, node, offset); | offset = svm_node_vector_displacement(kg, sd, stack, node, offset); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_TEX_IMAGE: | case NODE_TEX_IMAGE: | ||||
| offset = svm_node_tex_image(kg, sd, stack, node, offset); | offset = svm_node_tex_image(kg, sd, stack, node, offset); | ||||
| break; | break; | ||||
| case NODE_TEX_IMAGE_BOX: | case NODE_TEX_IMAGE_BOX: | ||||
| svm_node_tex_image_box(kg, sd, stack, node); | svm_node_tex_image_box(kg, sd, stack, node); | ||||
| break; | break; | ||||
| case NODE_TEX_NOISE: | case NODE_TEX_NOISE: | ||||
| offset = svm_node_tex_noise(kg, sd, stack, node.y, node.z, node.w, offset); | offset = svm_node_tex_noise(kg, sd, stack, node.y, node.z, node.w, offset); | ||||
| break; | break; | ||||
| case NODE_SET_BUMP: | case NODE_SET_BUMP: | ||||
| if (KERNEL_NODES_FEATURE(BUMP)) { | IF_KERNEL_NODES_FEATURE(BUMP) | ||||
| { | |||||
| svm_node_set_bump(kg, sd, stack, node); | svm_node_set_bump(kg, sd, stack, node); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_ATTR_BUMP_DX: | case NODE_ATTR_BUMP_DX: | ||||
| if (KERNEL_NODES_FEATURE(BUMP)) { | IF_KERNEL_NODES_FEATURE(BUMP) | ||||
| { | |||||
| svm_node_attr_bump_dx(kg, sd, stack, node); | svm_node_attr_bump_dx(kg, sd, stack, node); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_ATTR_BUMP_DY: | case NODE_ATTR_BUMP_DY: | ||||
| if (KERNEL_NODES_FEATURE(BUMP)) { | IF_KERNEL_NODES_FEATURE(BUMP) | ||||
| { | |||||
| svm_node_attr_bump_dy(kg, sd, stack, node); | svm_node_attr_bump_dy(kg, sd, stack, node); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_VERTEX_COLOR_BUMP_DX: | case NODE_VERTEX_COLOR_BUMP_DX: | ||||
| if (KERNEL_NODES_FEATURE(BUMP)) { | IF_KERNEL_NODES_FEATURE(BUMP) | ||||
| { | |||||
| svm_node_vertex_color_bump_dx(kg, sd, stack, node.y, node.z, node.w); | svm_node_vertex_color_bump_dx(kg, sd, stack, node.y, node.z, node.w); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_VERTEX_COLOR_BUMP_DY: | case NODE_VERTEX_COLOR_BUMP_DY: | ||||
| if (KERNEL_NODES_FEATURE(BUMP)) { | IF_KERNEL_NODES_FEATURE(BUMP) | ||||
| { | |||||
| svm_node_vertex_color_bump_dy(kg, sd, stack, node.y, node.z, node.w); | svm_node_vertex_color_bump_dy(kg, sd, stack, node.y, node.z, node.w); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_TEX_COORD_BUMP_DX: | case NODE_TEX_COORD_BUMP_DX: | ||||
| if (KERNEL_NODES_FEATURE(BUMP)) { | IF_KERNEL_NODES_FEATURE(BUMP) | ||||
| { | |||||
| offset = svm_node_tex_coord_bump_dx(kg, sd, path_flag, stack, node, offset); | offset = svm_node_tex_coord_bump_dx(kg, sd, path_flag, stack, node, offset); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_TEX_COORD_BUMP_DY: | case NODE_TEX_COORD_BUMP_DY: | ||||
| if (KERNEL_NODES_FEATURE(BUMP)) { | IF_KERNEL_NODES_FEATURE(BUMP) | ||||
| { | |||||
| offset = svm_node_tex_coord_bump_dy(kg, sd, path_flag, stack, node, offset); | offset = svm_node_tex_coord_bump_dy(kg, sd, path_flag, stack, node, offset); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_CLOSURE_SET_NORMAL: | case NODE_CLOSURE_SET_NORMAL: | ||||
| if (KERNEL_NODES_FEATURE(BUMP)) { | IF_KERNEL_NODES_FEATURE(BUMP) | ||||
| { | |||||
| svm_node_set_normal(kg, sd, stack, node.y, node.z); | svm_node_set_normal(kg, sd, stack, node.y, node.z); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_ENTER_BUMP_EVAL: | case NODE_ENTER_BUMP_EVAL: | ||||
| if (KERNEL_NODES_FEATURE(BUMP_STATE)) { | IF_KERNEL_NODES_FEATURE(BUMP_STATE) | ||||
| { | |||||
| svm_node_enter_bump_eval(kg, sd, stack, node.y); | svm_node_enter_bump_eval(kg, sd, stack, node.y); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_LEAVE_BUMP_EVAL: | case NODE_LEAVE_BUMP_EVAL: | ||||
| if (KERNEL_NODES_FEATURE(BUMP_STATE)) { | IF_KERNEL_NODES_FEATURE(BUMP_STATE) | ||||
| { | |||||
| svm_node_leave_bump_eval(kg, sd, stack, node.y); | svm_node_leave_bump_eval(kg, sd, stack, node.y); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_HSV: | case NODE_HSV: | ||||
| svm_node_hsv(kg, sd, stack, node); | svm_node_hsv(kg, sd, stack, node); | ||||
| break; | break; | ||||
| case NODE_CLOSURE_HOLDOUT: | case NODE_CLOSURE_HOLDOUT: | ||||
| svm_node_closure_holdout(sd, stack, node); | svm_node_closure_holdout(sd, stack, node); | ||||
| break; | break; | ||||
| case NODE_FRESNEL: | case NODE_FRESNEL: | ||||
| svm_node_fresnel(sd, stack, node.y, node.z, node.w); | svm_node_fresnel(sd, stack, node.y, node.z, node.w); | ||||
| break; | break; | ||||
| case NODE_LAYER_WEIGHT: | case NODE_LAYER_WEIGHT: | ||||
| svm_node_layer_weight(sd, stack, node); | svm_node_layer_weight(sd, stack, node); | ||||
| break; | break; | ||||
| case NODE_CLOSURE_VOLUME: | case NODE_CLOSURE_VOLUME: | ||||
| if (KERNEL_NODES_FEATURE(VOLUME)) { | IF_KERNEL_NODES_FEATURE(VOLUME) | ||||
| { | |||||
| svm_node_closure_volume<type>(kg, sd, stack, node); | svm_node_closure_volume<type>(kg, sd, stack, node); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_PRINCIPLED_VOLUME: | case NODE_PRINCIPLED_VOLUME: | ||||
| if (KERNEL_NODES_FEATURE(VOLUME)) { | IF_KERNEL_NODES_FEATURE(VOLUME) | ||||
| { | |||||
| offset = svm_node_principled_volume<type>(kg, sd, stack, node, path_flag, offset); | offset = svm_node_principled_volume<type>(kg, sd, stack, node, path_flag, offset); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_MATH: | case NODE_MATH: | ||||
| svm_node_math(kg, sd, stack, node.y, node.z, node.w); | svm_node_math(kg, sd, stack, node.y, node.z, node.w); | ||||
| break; | break; | ||||
| case NODE_VECTOR_MATH: | case NODE_VECTOR_MATH: | ||||
| offset = svm_node_vector_math(kg, sd, stack, node.y, node.z, node.w, offset); | offset = svm_node_vector_math(kg, sd, stack, node.y, node.z, node.w, offset); | ||||
| break; | break; | ||||
| case NODE_RGB_RAMP: | case NODE_RGB_RAMP: | ||||
| offset = svm_node_rgb_ramp(kg, sd, stack, node, offset); | offset = svm_node_rgb_ramp(kg, sd, stack, node, offset); | ||||
| break; | break; | ||||
| case NODE_GAMMA: | case NODE_GAMMA: | ||||
| svm_node_gamma(sd, stack, node.y, node.z, node.w); | svm_node_gamma(sd, stack, node.y, node.z, node.w); | ||||
| break; | break; | ||||
| case NODE_BRIGHTCONTRAST: | case NODE_BRIGHTCONTRAST: | ||||
| svm_node_brightness(sd, stack, node.y, node.z, node.w); | svm_node_brightness(sd, stack, node.y, node.z, node.w); | ||||
| break; | break; | ||||
| case NODE_LIGHT_PATH: | case NODE_LIGHT_PATH: | ||||
| svm_node_light_path(INTEGRATOR_STATE_PASS, sd, stack, node.y, node.z, path_flag); | svm_node_light_path<node_feature_mask>(kg, state, sd, stack, node.y, node.z, path_flag); | ||||
| break; | break; | ||||
| case NODE_OBJECT_INFO: | case NODE_OBJECT_INFO: | ||||
| svm_node_object_info(kg, sd, stack, node.y, node.z); | svm_node_object_info(kg, sd, stack, node.y, node.z); | ||||
| break; | break; | ||||
| case NODE_PARTICLE_INFO: | case NODE_PARTICLE_INFO: | ||||
| svm_node_particle_info(kg, sd, stack, node.y, node.z); | svm_node_particle_info(kg, sd, stack, node.y, node.z); | ||||
| break; | break; | ||||
| #if defined(__HAIR__) | #if defined(__HAIR__) | ||||
| case NODE_HAIR_INFO: | case NODE_HAIR_INFO: | ||||
| if (KERNEL_NODES_FEATURE(HAIR)) { | IF_KERNEL_NODES_FEATURE(HAIR) | ||||
| { | |||||
| svm_node_hair_info(kg, sd, stack, node.y, node.z); | svm_node_hair_info(kg, sd, stack, node.y, node.z); | ||||
| } | } | ||||
| break; | break; | ||||
| #endif | #endif | ||||
| case NODE_TEXTURE_MAPPING: | case NODE_TEXTURE_MAPPING: | ||||
| offset = svm_node_texture_mapping(kg, sd, stack, node.y, node.z, offset); | offset = svm_node_texture_mapping(kg, sd, stack, node.y, node.z, offset); | ||||
| break; | break; | ||||
| ▲ Show 20 Lines • Show All 95 Lines • ▼ Show 20 Lines | #endif | ||||
| case NODE_MAP_RANGE: | case NODE_MAP_RANGE: | ||||
| offset = svm_node_map_range(kg, sd, stack, node.y, node.z, node.w, offset); | offset = svm_node_map_range(kg, sd, stack, node.y, node.z, node.w, offset); | ||||
| break; | break; | ||||
| case NODE_CLAMP: | case NODE_CLAMP: | ||||
| offset = svm_node_clamp(kg, sd, stack, node.y, node.z, node.w, offset); | offset = svm_node_clamp(kg, sd, stack, node.y, node.z, node.w, offset); | ||||
| break; | break; | ||||
| #ifdef __SHADER_RAYTRACE__ | #ifdef __SHADER_RAYTRACE__ | ||||
| case NODE_BEVEL: | case NODE_BEVEL: | ||||
| svm_node_bevel<node_feature_mask>(INTEGRATOR_STATE_PASS, sd, stack, node); | svm_node_bevel<node_feature_mask>(kg, state, sd, stack, node); | ||||
| break; | break; | ||||
| case NODE_AMBIENT_OCCLUSION: | case NODE_AMBIENT_OCCLUSION: | ||||
| svm_node_ao<node_feature_mask>(INTEGRATOR_STATE_PASS, sd, stack, node); | svm_node_ao<node_feature_mask>(kg, state, sd, stack, node); | ||||
| break; | break; | ||||
| #endif | #endif | ||||
| case NODE_TEX_VOXEL: | case NODE_TEX_VOXEL: | ||||
| if (KERNEL_NODES_FEATURE(VOLUME)) { | IF_KERNEL_NODES_FEATURE(VOLUME) | ||||
| { | |||||
| offset = svm_node_tex_voxel(kg, sd, stack, node, offset); | offset = svm_node_tex_voxel(kg, sd, stack, node, offset); | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_AOV_START: | case NODE_AOV_START: | ||||
| if (!svm_node_aov_check(path_flag, render_buffer)) { | if (!svm_node_aov_check(path_flag, render_buffer)) { | ||||
| return; | return; | ||||
| } | } | ||||
| break; | break; | ||||
| case NODE_AOV_COLOR: | case NODE_AOV_COLOR: | ||||
| svm_node_aov_color(INTEGRATOR_STATE_PASS, sd, stack, node, render_buffer); | svm_node_aov_color<node_feature_mask>(kg, state, sd, stack, node, render_buffer); | ||||
| break; | break; | ||||
| case NODE_AOV_VALUE: | case NODE_AOV_VALUE: | ||||
| svm_node_aov_value(INTEGRATOR_STATE_PASS, sd, stack, node, render_buffer); | svm_node_aov_value<node_feature_mask>(kg, state, sd, stack, node, render_buffer); | ||||
| break; | break; | ||||
| default: | default: | ||||
| kernel_assert(!"Unknown node type was passed to the SVM machine"); | kernel_assert(!"Unknown node type was passed to the SVM machine"); | ||||
| return; | return; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| CCL_NAMESPACE_END | CCL_NAMESPACE_END | ||||
| #endif /* __SVM_H__ */ | #endif /* __SVM_H__ */ | ||||