Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2017-04-05 16:36:55 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2017-04-05 16:36:55 +0300
commit3bb88a7807d00560351a0ca6768b8339fa019d2b (patch)
treef47647aa9600358eab91f39179a86504cf5e1132
parent929c45b7d40536ce5fe572d19ebcbb70e9416a42 (diff)
parentf921442a441abbb458ed540f55c24372971acff7 (diff)
Merge branch 'master' into blender2.8
-rw-r--r--intern/cycles/render/svm.cpp4
-rw-r--r--intern/cycles/render/svm.h2
-rw-r--r--intern/cycles/util/util_thread.h17
-rw-r--r--intern/locale/msgfmt.cc63
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder.cc8
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder.h3
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