forked from bartvdbraak/blender
Cycles: Fix possible race condition when generating Beckmann table
Two issues here: - Checking table size to be non-zero is not a proper way to go here. This is because we first resize the table and then fill it in. So it was possible that non-initialized table was used. Trickery with using temporary memory and then doing table.swap() might work, but we can not guarantee that table size will be set after the data pointer. - Mutex guard was useless, because every thread was using own mutex. Need to make mutex guard static so all threads are using same mutex.
This commit is contained in:
parent
837383ac78
commit
83ce02879f
@ -33,7 +33,9 @@
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
thread_mutex ShaderManager::lookup_table_mutex;
|
||||
vector<float> ShaderManager::beckmann_table;
|
||||
bool ShaderManager::beckmann_table_ready = false;
|
||||
|
||||
/* Beckmann sampling precomputed table, see bsdf_microfacet.h */
|
||||
|
||||
@ -482,10 +484,11 @@ void ShaderManager::device_update_common(Device *device,
|
||||
|
||||
/* beckmann lookup table */
|
||||
if(beckmann_table_offset == TABLE_OFFSET_INVALID) {
|
||||
if(beckmann_table.size() == 0) {
|
||||
if(!beckmann_table_ready) {
|
||||
thread_scoped_lock lock(lookup_table_mutex);
|
||||
if(beckmann_table.size() == 0) {
|
||||
if(!beckmann_table_ready) {
|
||||
beckmann_table_build(beckmann_table);
|
||||
beckmann_table_ready = true;
|
||||
}
|
||||
}
|
||||
beckmann_table_offset = scene->lookup_tables->add_table(dscene, beckmann_table);
|
||||
|
@ -200,8 +200,9 @@ protected:
|
||||
typedef unordered_map<ustring, uint, ustringHash> AttributeIDMap;
|
||||
AttributeIDMap unique_attribute_id;
|
||||
|
||||
thread_mutex lookup_table_mutex;
|
||||
static thread_mutex lookup_table_mutex;
|
||||
static vector<float> beckmann_table;
|
||||
static bool beckmann_table_ready;
|
||||
|
||||
size_t beckmann_table_offset;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user