Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/render/svm.cpp
| Show First 20 Lines • Show All 440 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| node->compile(*this); | node->compile(*this); | ||||
| stack_clear_users(node, done); | stack_clear_users(node, done); | ||||
| stack_clear_temporary(node); | stack_clear_temporary(node); | ||||
| if (current_type == SHADER_TYPE_SURFACE) { | if (current_type == SHADER_TYPE_SURFACE) { | ||||
| if (node->has_spatial_varying()) | if (node->has_spatial_varying()) | ||||
| current_shader->has_surface_spatial_varying = true; | current_shader->has_surface_spatial_varying = true; | ||||
| if (node->get_feature() & KERNEL_FEATURE_NODE_RAYTRACE) | |||||
| current_shader->has_surface_raytrace = true; | |||||
| } | } | ||||
| else if (current_type == SHADER_TYPE_VOLUME) { | else if (current_type == SHADER_TYPE_VOLUME) { | ||||
| if (node->has_spatial_varying()) | if (node->has_spatial_varying()) | ||||
| current_shader->has_volume_spatial_varying = true; | current_shader->has_volume_spatial_varying = true; | ||||
| if (node->has_attribute_dependency()) | if (node->has_attribute_dependency()) | ||||
| current_shader->has_volume_attribute_dependency = true; | current_shader->has_volume_attribute_dependency = true; | ||||
| } | } | ||||
| Show All 30 Lines | foreach (ShaderNode *node, nodes) { | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } while (!nodes_done); | } while (!nodes_done); | ||||
| } | } | ||||
| void SVMCompiler::generate_closure_node(ShaderNode *node, CompilerState *state) | void SVMCompiler::generate_closure_node(ShaderNode *node, CompilerState *state) | ||||
| { | { | ||||
| /* Skip generating closure that are not supported or needed for a particular | |||||
| * type of shader. For example a BSDF in a volume shader. */ | |||||
| const int node_feature = node->get_feature(); | |||||
| if ((state->node_feature_mask & node_feature) != node_feature) { | |||||
| return; | |||||
| } | |||||
| /* execute dependencies for closure */ | /* execute dependencies for closure */ | ||||
| foreach (ShaderInput *in, node->inputs) { | foreach (ShaderInput *in, node->inputs) { | ||||
| if (in->link != NULL) { | if (in->link != NULL) { | ||||
| ShaderNodeSet dependencies; | ShaderNodeSet dependencies; | ||||
| find_dependencies(dependencies, state->nodes_done, in); | find_dependencies(dependencies, state->nodes_done, in); | ||||
| generate_svm_nodes(dependencies, state); | generate_svm_nodes(dependencies, state); | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | |||||
| void SVMCompiler::find_aov_nodes_and_dependencies(ShaderNodeSet &aov_nodes, | void SVMCompiler::find_aov_nodes_and_dependencies(ShaderNodeSet &aov_nodes, | ||||
| ShaderGraph *graph, | ShaderGraph *graph, | ||||
| CompilerState *state) | CompilerState *state) | ||||
| { | { | ||||
| foreach (ShaderNode *node, graph->nodes) { | foreach (ShaderNode *node, graph->nodes) { | ||||
| if (node->special_type == SHADER_SPECIAL_TYPE_OUTPUT_AOV) { | if (node->special_type == SHADER_SPECIAL_TYPE_OUTPUT_AOV) { | ||||
| OutputAOVNode *aov_node = static_cast<OutputAOVNode *>(node); | OutputAOVNode *aov_node = static_cast<OutputAOVNode *>(node); | ||||
| if (aov_node->slot >= 0) { | if (aov_node->offset >= 0) { | ||||
| aov_nodes.insert(aov_node); | aov_nodes.insert(aov_node); | ||||
| foreach (ShaderInput *in, node->inputs) { | foreach (ShaderInput *in, node->inputs) { | ||||
| if (in->link != NULL) { | if (in->link != NULL) { | ||||
| find_dependencies(aov_nodes, state->nodes_done, in); | find_dependencies(aov_nodes, state->nodes_done, in); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 213 Lines • ▼ Show 20 Lines | if (shader->reference_count()) { | ||||
| CompilerState state(graph); | CompilerState state(graph); | ||||
| if (clin->link) { | if (clin->link) { | ||||
| bool generate = false; | bool generate = false; | ||||
| switch (type) { | switch (type) { | ||||
| case SHADER_TYPE_SURFACE: /* generate surface shader */ | case SHADER_TYPE_SURFACE: /* generate surface shader */ | ||||
| generate = true; | generate = true; | ||||
| shader->has_surface = true; | shader->has_surface = true; | ||||
| state.node_feature_mask = KERNEL_FEATURE_NODE_MASK_SURFACE; | |||||
| break; | break; | ||||
| case SHADER_TYPE_VOLUME: /* generate volume shader */ | case SHADER_TYPE_VOLUME: /* generate volume shader */ | ||||
| generate = true; | generate = true; | ||||
| shader->has_volume = true; | shader->has_volume = true; | ||||
| state.node_feature_mask = KERNEL_FEATURE_NODE_MASK_VOLUME; | |||||
| break; | break; | ||||
| case SHADER_TYPE_DISPLACEMENT: /* generate displacement shader */ | case SHADER_TYPE_DISPLACEMENT: /* generate displacement shader */ | ||||
| generate = true; | generate = true; | ||||
| shader->has_displacement = true; | shader->has_displacement = true; | ||||
| state.node_feature_mask = KERNEL_FEATURE_NODE_MASK_DISPLACEMENT; | |||||
| break; | break; | ||||
| case SHADER_TYPE_BUMP: /* generate bump shader */ | case SHADER_TYPE_BUMP: /* generate bump shader */ | ||||
| generate = true; | generate = true; | ||||
| state.node_feature_mask = KERNEL_FEATURE_NODE_MASK_BUMP; | |||||
| break; | break; | ||||
| default: | default: | ||||
| break; | break; | ||||
| } | } | ||||
| if (generate) { | if (generate) { | ||||
| if (type == SHADER_TYPE_SURFACE) { | if (type == SHADER_TYPE_SURFACE) { | ||||
| find_aov_nodes_and_dependencies(state.aov_nodes, graph, &state); | find_aov_nodes_and_dependencies(state.aov_nodes, graph, &state); | ||||
| ▲ Show 20 Lines • Show All 55 Lines • ▼ Show 20 Lines | shader->graph->finalize(scene, | ||||
| shader->get_displacement_method() == DISPLACE_BOTH); | shader->get_displacement_method() == DISPLACE_BOTH); | ||||
| } | } | ||||
| current_shader = shader; | current_shader = shader; | ||||
| shader->has_surface = false; | shader->has_surface = false; | ||||
| shader->has_surface_emission = false; | shader->has_surface_emission = false; | ||||
| shader->has_surface_transparent = false; | shader->has_surface_transparent = false; | ||||
| shader->has_surface_raytrace = false; | |||||
| shader->has_surface_bssrdf = false; | shader->has_surface_bssrdf = false; | ||||
| shader->has_bump = has_bump; | shader->has_bump = has_bump; | ||||
| shader->has_bssrdf_bump = has_bump; | shader->has_bssrdf_bump = has_bump; | ||||
| shader->has_volume = false; | shader->has_volume = false; | ||||
| shader->has_displacement = false; | shader->has_displacement = false; | ||||
| shader->has_surface_spatial_varying = false; | shader->has_surface_spatial_varying = false; | ||||
| shader->has_volume_spatial_varying = false; | shader->has_volume_spatial_varying = false; | ||||
| shader->has_volume_attribute_dependency = false; | shader->has_volume_attribute_dependency = false; | ||||
| ▲ Show 20 Lines • Show All 81 Lines • ▼ Show 20 Lines | |||||
| SVMCompiler::CompilerState::CompilerState(ShaderGraph *graph) | SVMCompiler::CompilerState::CompilerState(ShaderGraph *graph) | ||||
| { | { | ||||
| int max_id = 0; | int max_id = 0; | ||||
| foreach (ShaderNode *node, graph->nodes) { | foreach (ShaderNode *node, graph->nodes) { | ||||
| max_id = max(node->id, max_id); | max_id = max(node->id, max_id); | ||||
| } | } | ||||
| nodes_done_flag.resize(max_id + 1, false); | nodes_done_flag.resize(max_id + 1, false); | ||||
| node_feature_mask = 0; | |||||
| } | } | ||||
| CCL_NAMESPACE_END | CCL_NAMESPACE_END | ||||