diff options
-rw-r--r-- | intern/cycles/render/svm.cpp | 4 | ||||
-rw-r--r-- | intern/cycles/render/svm.h | 2 | ||||
-rw-r--r-- | intern/cycles/util/util_thread.h | 17 | ||||
-rw-r--r-- | intern/locale/msgfmt.cc | 63 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder.cc | 8 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder.h | 3 |
6 files changed, 59 insertions, 38 deletions
diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp index 4cb4018e2b4..9cf3f4cb0b2 100644 --- a/intern/cycles/render/svm.cpp +++ b/intern/cycles/render/svm.cpp @@ -67,6 +67,7 @@ void SVMShaderManager::device_update_shader(Scene *scene, << "Shader name: " << shader->name << "\n" << summary.full_report(); + nodes_lock_.lock(); if(shader->use_mis && shader->has_surface_emission) { scene->light_manager->need_update = true; } @@ -74,7 +75,6 @@ void SVMShaderManager::device_update_shader(Scene *scene, /* The copy needs to be done inside the lock, if another thread resizes the array * while memcpy is running, it'll be copying into possibly invalid/freed ram. */ - nodes_lock_.lock(); size_t global_nodes_size = global_svm_nodes->size(); global_svm_nodes->resize(global_nodes_size + svm_nodes.size()); @@ -393,11 +393,13 @@ void SVMCompiler::add_node(const float4& f) uint SVMCompiler::attribute(ustring name) { + thread_scoped_spin_lock lock(attribute_lock_); return shader_manager->get_attribute_id(name); } uint SVMCompiler::attribute(AttributeStandard std) { + thread_scoped_spin_lock lock(attribute_lock_); return shader_manager->get_attribute_id(std); } diff --git a/intern/cycles/render/svm.h b/intern/cycles/render/svm.h index abbd9e50610..eef344a506e 100644 --- a/intern/cycles/render/svm.h +++ b/intern/cycles/render/svm.h @@ -218,6 +218,8 @@ protected: int max_stack_use; uint mix_weight_offset; bool compile_failed; + + thread_spin_lock attribute_lock_; }; CCL_NAMESPACE_END diff --git a/intern/cycles/util/util_thread.h b/intern/cycles/util/util_thread.h index 1b4e87ebf03..1e91fb8a706 100644 --- a/intern/cycles/util/util_thread.h +++ b/intern/cycles/util/util_thread.h @@ -106,6 +106,23 @@ protected: #endif }; +class thread_scoped_spin_lock { +public: + explicit thread_scoped_spin_lock(thread_spin_lock& lock) + : lock_(lock) { + lock_.lock(); + } + + ~thread_scoped_spin_lock() { + lock_.unlock(); + } + + /* TODO(sergey): Implement manual control over lock/unlock. */ + +protected: + thread_spin_lock& lock_; +}; + CCL_NAMESPACE_END #endif /* __UTIL_THREAD_H__ */ diff --git a/intern/locale/msgfmt.cc b/intern/locale/msgfmt.cc index 4779450bd1b..6ee1ee14781 100644 --- a/intern/locale/msgfmt.cc +++ b/intern/locale/msgfmt.cc @@ -27,42 +27,48 @@ namespace { std::map<std::string, std::string> MESSAGES; -bool starts_with(const std::string &string, +bool starts_with(const std::string &str, const std::string &prefix) { - return prefix.size() <= string.size() && - string.compare(0, prefix.size(), prefix) == 0; + const size_t prefix_length = prefix.length(); + if (prefix_length == 0) { + return true; + } + // TODO(sergey): Could be optimized if we calculate str.length() + // to maximum of prefix_length characters. + if (prefix_length > str.length()) { + return false; + } else { + return str.compare(0, prefix_length, prefix) == 0; + } } -std::string ltrim(const std::string &s) { - std::string result = s; - result.erase(result.begin(), - std::find_if(result.begin(), - result.end(), - std::not1(std::ptr_fun<int, int>(std::isspace)))); +std::string ltrim(const std::string &str) { + std::string result = str; + result.erase(0, result.find_first_not_of(" \t\r\n")); return result; } -std::string rtrim(const std::string &s) { - std::string result = s; - result.erase( - std::find_if(result.rbegin(), - result.rend(), - std::not1(std::ptr_fun<int, int>(std::isspace))).base(), - result.end()); +std::string rtrim(const std::string &str) { + std::string result = str; + result.erase(result.find_last_not_of(" \t\r\n") + 1); return result; } -std::string trim(const std::string &s) { - return ltrim(rtrim(s)); +std::string trim(const std::string &str) { + std::string result = str; + result.erase(0, result.find_first_not_of(" \t\r\n")); + result.erase(result.find_last_not_of(" \t\r\n") + 1); + return result; } -std::string unescape(const std::string &s) { +std::string unescape(const std::string &str) { std::string result; - std::string::const_iterator it = s.begin(); - while (it != s.end()) { - char current_char = *it++; - if (current_char == '\\' && it != s.end()) { - char next_char = *it++; + const size_t str_length = str.length(); + size_t i = 0; + while (i < str_length) { + char current_char = str[i++]; + if (current_char == '\\' && i < str_length - 1) { + char next_char = str[i++]; if (next_char == '\\') { current_char = '\\'; } else if (next_char == 'n') { @@ -76,8 +82,9 @@ std::string unescape(const std::string &s) { result += current_char; } - if (result[0] == '"' && result[result.size() - 1] == '"') { - result = result.substr(1, result.size() - 2); + const size_t result_length = result.length(); + if (result[0] == '"' && result[result_length - 1] == '"') { + result = result.substr(1, result_length - 2); } return result; @@ -100,6 +107,7 @@ void add(const std::string &msgctxt, template<typename TKey, typename TValue> void get_keys(std::map<TKey, TValue> map, std::vector<TKey> *keys) { + keys->reserve(map.size()); for (typename std::map<TKey, TValue>::iterator it = map.begin(); it != map.end(); it++) { @@ -136,6 +144,7 @@ std::string generate(void) { std::sort(keys.begin(), keys.end()); std::vector<Offset> offsets; + offsets.reserve(keys.size()); std::string ids = "", strs = ""; for (std::vector<std::string>::iterator it = keys.begin(); it != keys.end(); @@ -160,6 +169,8 @@ std::string generate(void) { int valuestart = keystart + ids.size(); std::vector<int> koffsets; std::vector<int> voffsets; + koffsets.reserve(offsets.size() * 2); + voffsets.reserve(offsets.size() * 2); // The string table first has the list of keys, then the list of values. // Each entry has first the size of the string, then the file offset. for (std::vector<Offset>::iterator it = offsets.begin(); diff --git a/source/blender/depsgraph/intern/builder/deg_builder.cc b/source/blender/depsgraph/intern/builder/deg_builder.cc index 137b507acfc..f8e384bf51c 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder.cc @@ -52,14 +52,6 @@ namespace DEG { -string deg_fcurve_id_name(const FCurve *fcu) -{ - char index_buf[32]; - // TODO(sergey): Use int-to-string utility or so. - BLI_snprintf(index_buf, sizeof(index_buf), "[%d]", fcu->array_index); - return string(fcu->rna_path) + index_buf; -} - void deg_graph_build_finalize(Depsgraph *graph) { /* Re-tag IDs for update if it was tagged before the relations diff --git a/source/blender/depsgraph/intern/builder/deg_builder.h b/source/blender/depsgraph/intern/builder/deg_builder.h index bdc030e3810..31426819fb9 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder.h +++ b/source/blender/depsgraph/intern/builder/deg_builder.h @@ -38,9 +38,6 @@ namespace DEG { struct Depsgraph; -/* Get unique identifier for FCurves and Drivers */ -string deg_fcurve_id_name(const FCurve *fcu); - void deg_graph_build_finalize(struct Depsgraph *graph); } // namespace DEG |