diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-03-01 20:51:16 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-03-01 21:03:51 +0300 |
commit | d16386e50bc104f9446a30e041a7b74f38b51ae9 (patch) | |
tree | 06a5211905abf63359e92e2da571481f6fd6d3ea /source/blender/depsgraph/intern/eval/deg_eval_flush.cc | |
parent | faec3655d8bfddf510ee9330fa6c9511086ba79d (diff) |
Fix T62087: Crash when rendering in Cycles
The issue was discovered only after recent changes, but roots back
to much older changes.
What was happening is scene's ID recalc flags where never cleared,
which caused ensure_view_layer() to always run copy-on-write on the
scene. This resulted in certain runtime data being cleared, without
proper flag stored in the dependency graph.
This was caused by ID recalc clear function checking whether any ID
was tagged for recalc in that graph or not. This was happening due
to all areas using DEG_id_type_tag() which can only set flags on the
graph from viewport scenes, and could not inform render dependency
graph.
Now ID tyoe tagging is happening on per-graph level, which avoids
possibility of flags running out of sync.
In a bit longer term we also need to get rid of two functions which
are clearing flags: DEG_id_type_tag() and deg_graph_clear_tags().
Diffstat (limited to 'source/blender/depsgraph/intern/eval/deg_eval_flush.cc')
-rw-r--r-- | source/blender/depsgraph/intern/eval/deg_eval_flush.cc | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc index a5bfab2bce1..5498e75ade0 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc @@ -237,15 +237,15 @@ void flush_engine_data_update(ID *id) } /* NOTE: It will also accumulate flags from changed components. */ -void flush_editors_id_update(Main *bmain, - Depsgraph *graph, +void flush_editors_id_update(Depsgraph *graph, const DEGEditorUpdateContext *update_ctx) { for (IDNode *id_node : graph->id_nodes) { if (id_node->custom_flags != ID_STATE_MODIFIED) { continue; } - DEG_id_type_tag(bmain, GS(id_node->id_orig->name)); + DEG_graph_id_type_tag(reinterpret_cast<::Depsgraph*>(graph), + GS(id_node->id_orig->name)); /* TODO(sergey): Do we need to pass original or evaluated ID here? */ ID *id_orig = id_node->id_orig; ID *id_cow = id_node->id_cow; @@ -398,7 +398,7 @@ void deg_graph_flush_updates(Main *bmain, Depsgraph *graph) } } /* Inform editors about all changes. */ - flush_editors_id_update(bmain, graph, &update_ctx); + flush_editors_id_update(graph, &update_ctx); /* Reset evaluation result tagged which is tagged for update to some state * which is obvious to catch. */ invalidate_tagged_evaluated_data(graph); |