diff options
Diffstat (limited to 'intern/cycles/render/shader.cpp')
-rw-r--r-- | intern/cycles/render/shader.cpp | 81 |
1 files changed, 54 insertions, 27 deletions
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp index 5899c562f72..31be2a3d3f4 100644 --- a/intern/cycles/render/shader.cpp +++ b/intern/cycles/render/shader.cpp @@ -15,7 +15,7 @@ */ #include "background.h" -#include "blackbody.h" +#include "camera.h" #include "device.h" #include "graph.h" #include "light.h" @@ -32,6 +32,8 @@ CCL_NAMESPACE_BEGIN +vector<float> ShaderManager::beckmann_table; + /* Beckmann sampling precomputed table, see bsdf_microfacet.h */ /* 2D slope distribution (alpha = 1.0) */ @@ -146,7 +148,6 @@ Shader::Shader() has_surface_transparent = false; has_surface_emission = false; has_surface_bssrdf = false; - has_converter_blackbody = false; has_volume = false; has_displacement = false; has_bssrdf_bump = false; @@ -240,7 +241,6 @@ void Shader::tag_used(Scene *scene) ShaderManager::ShaderManager() { need_update = true; - blackbody_table_offset = TABLE_OFFSET_INVALID; beckmann_table_offset = TABLE_OFFSET_INVALID; } @@ -252,6 +252,8 @@ ShaderManager *ShaderManager::create(Scene *scene, int shadingsystem) { ShaderManager *manager; + (void)shadingsystem; /* Ignored when built without OSL. */ + #ifdef WITH_OSL if(shadingsystem == SHADINGSYSTEM_OSL) manager = new OSLShaderManager(); @@ -321,7 +323,10 @@ void ShaderManager::device_update_shaders_used(Scene *scene) scene->shaders[light->shader]->used = true; } -void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress) +void ShaderManager::device_update_common(Device *device, + DeviceScene *dscene, + Scene *scene, + Progress& /*progress*/) { device->tex_free(dscene->shader_flag); dscene->shader_flag.clear(); @@ -332,7 +337,6 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc uint shader_flag_size = scene->shaders.size()*4; uint *shader_flag = dscene->shader_flag.resize(shader_flag_size); uint i = 0; - bool has_converter_blackbody = false; bool has_volumes = false; foreach(Shader *shader, scene->shaders) { @@ -359,8 +363,6 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc flag |= SD_HETEROGENEOUS_VOLUME; if(shader->has_bssrdf_bump) flag |= SD_HAS_BSSRDF_BUMP; - if(shader->has_converter_blackbody) - has_converter_blackbody = true; if(shader->volume_sampling_method == VOLUME_SAMPLING_EQUIANGULAR) flag |= SD_VOLUME_EQUIANGULAR; if(shader->volume_sampling_method == VOLUME_SAMPLING_MULTIPLE_IMPORTANCE) @@ -384,26 +386,16 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc device->tex_alloc("__shader_flag", dscene->shader_flag); - /* blackbody lookup table */ + /* lookup tables */ KernelTables *ktables = &dscene->data.tables; - - if(has_converter_blackbody && blackbody_table_offset == TABLE_OFFSET_INVALID) { - if(blackbody_table.size() == 0) { - blackbody_table = blackbody_table_build(); - } - blackbody_table_offset = scene->lookup_tables->add_table(dscene, blackbody_table); - - ktables->blackbody_offset = (int)blackbody_table_offset; - } - else if(!has_converter_blackbody && blackbody_table_offset != TABLE_OFFSET_INVALID) { - scene->lookup_tables->remove_table(blackbody_table_offset); - blackbody_table_offset = TABLE_OFFSET_INVALID; - } /* beckmann lookup table */ if(beckmann_table_offset == TABLE_OFFSET_INVALID) { if(beckmann_table.size() == 0) { - beckmann_table_build(beckmann_table); + thread_scoped_lock lock(lookup_table_mutex); + if(beckmann_table.size() == 0) { + beckmann_table_build(beckmann_table); + } } beckmann_table_offset = scene->lookup_tables->add_table(dscene, beckmann_table); ktables->beckmann_offset = (int)beckmann_table_offset; @@ -416,11 +408,6 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc void ShaderManager::device_free_common(Device *device, DeviceScene *dscene, Scene *scene) { - if(blackbody_table_offset != TABLE_OFFSET_INVALID) { - scene->lookup_tables->remove_table(blackbody_table_offset); - blackbody_table_offset = TABLE_OFFSET_INVALID; - } - if(beckmann_table_offset != TABLE_OFFSET_INVALID) { scene->lookup_tables->remove_table(beckmann_table_offset); beckmann_table_offset = TABLE_OFFSET_INVALID; @@ -494,5 +481,45 @@ void ShaderManager::add_default(Scene *scene) } } +/* NOTE: Expects max_group and features to be initialized in the callee. */ +void ShaderManager::get_requested_graph_features(ShaderGraph *graph, + int& max_group, + int& features) +{ + foreach(ShaderNode *node, graph->nodes) { + max_group = max(max_group, node->get_group()); + features |= node->get_feature(); + if(node->special_type == SHADER_SPECIAL_TYPE_CLOSURE) { + BsdfNode *bsdf_node = static_cast<BsdfNode*>(node); + if(CLOSURE_IS_VOLUME(bsdf_node->closure)) { + features |= NODE_FEATURE_VOLUME; + } + } + } +} + +void ShaderManager::get_requested_features(Scene *scene, + int& max_group, + int& features) +{ + max_group = NODE_GROUP_LEVEL_0; + features = 0; + for(int i = 0; i < scene->shaders.size(); i++) { + Shader *shader = scene->shaders[i]; + /* Gather requested features from all the nodes from the graph nodes. */ + get_requested_graph_features(shader->graph, max_group, features); + /* Gather requested features from the graph itself. */ + if(shader->graph_bump) { + get_requested_graph_features(shader->graph_bump, + max_group, + features); + } + ShaderNode *output_node = shader->graph->output(); + if(output_node->input("Displacement")->link != NULL) { + features |= NODE_FEATURE_BUMP; + } + } +} + CCL_NAMESPACE_END |