diff options
Diffstat (limited to 'source/blender/depsgraph')
-rw-r--r-- | source/blender/depsgraph/DEG_depsgraph.h | 8 | ||||
-rw-r--r-- | source/blender/depsgraph/DEG_depsgraph_build.h | 3 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/depsgraph.cc | 7 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/depsgraph.h | 3 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/depsgraph_build.cc | 5 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/eval/deg_eval.cc | 56 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/eval/deg_eval_visibility.cc | 6 |
7 files changed, 50 insertions, 38 deletions
diff --git a/source/blender/depsgraph/DEG_depsgraph.h b/source/blender/depsgraph/DEG_depsgraph.h index a8b21e4c153..48a6a5cda74 100644 --- a/source/blender/depsgraph/DEG_depsgraph.h +++ b/source/blender/depsgraph/DEG_depsgraph.h @@ -221,6 +221,14 @@ bool DEG_is_active(const struct Depsgraph *depsgraph); void DEG_make_active(struct Depsgraph *depsgraph); void DEG_make_inactive(struct Depsgraph *depsgraph); +/** + * Disable the visibility optimization making it so IDs which affect hidden objects or disabled + * modifiers are still evaluated. + * + * For example, this ensures that an object which is needed by a modifier is ignoring checks about + * whether the object is hidden or the modifier is disabled. */ +void DEG_disable_visibility_optimization(struct Depsgraph *depsgraph); + /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/depsgraph/DEG_depsgraph_build.h b/source/blender/depsgraph/DEG_depsgraph_build.h index 201a534f535..ffeb5e897ab 100644 --- a/source/blender/depsgraph/DEG_depsgraph_build.h +++ b/source/blender/depsgraph/DEG_depsgraph_build.h @@ -56,6 +56,9 @@ void DEG_graph_build_for_render_pipeline(struct Depsgraph *graph); */ void DEG_graph_build_for_compositor_preview(struct Depsgraph *graph, struct bNodeTree *nodetree); +/** + * Builds the minimal dependency graph needed for evaluation of the given IDs. + */ void DEG_graph_build_from_ids(struct Depsgraph *graph, struct ID **ids, int num_ids); /** Tag relations from the given graph for update. */ diff --git a/source/blender/depsgraph/intern/depsgraph.cc b/source/blender/depsgraph/intern/depsgraph.cc index 316d0b615c6..4d7d537b450 100644 --- a/source/blender/depsgraph/intern/depsgraph.cc +++ b/source/blender/depsgraph/intern/depsgraph.cc @@ -58,6 +58,7 @@ Depsgraph::Depsgraph(Main *bmain, Scene *scene, ViewLayer *view_layer, eEvaluati ctime(BKE_scene_ctime_get(scene)), scene_cow(nullptr), is_active(false), + use_visibility_optimization(true), is_evaluating(false), is_render_pipeline_depsgraph(false), use_editors_update(false) @@ -334,3 +335,9 @@ void DEG_make_inactive(struct Depsgraph *depsgraph) deg::Depsgraph *deg_graph = reinterpret_cast<deg::Depsgraph *>(depsgraph); deg_graph->is_active = false; } + +void DEG_disable_visibility_optimization(struct Depsgraph *depsgraph) +{ + deg::Depsgraph *deg_graph = reinterpret_cast<deg::Depsgraph *>(depsgraph); + deg_graph->use_visibility_optimization = false; +}
\ No newline at end of file diff --git a/source/blender/depsgraph/intern/depsgraph.h b/source/blender/depsgraph/intern/depsgraph.h index 2f88199384d..042cb045c6f 100644 --- a/source/blender/depsgraph/intern/depsgraph.h +++ b/source/blender/depsgraph/intern/depsgraph.h @@ -147,6 +147,9 @@ struct Depsgraph { * to read stuff from. */ bool is_active; + /* Optimize out evaluation of operations which affect hidden objects or disabled modifiers. */ + bool use_visibility_optimization; + DepsgraphDebug debug; bool is_evaluating; diff --git a/source/blender/depsgraph/intern/depsgraph_build.cc b/source/blender/depsgraph/intern/depsgraph_build.cc index 6da290d6c4e..9eeb074bbaa 100644 --- a/source/blender/depsgraph/intern/depsgraph_build.cc +++ b/source/blender/depsgraph/intern/depsgraph_build.cc @@ -138,9 +138,14 @@ void DEG_add_node_tree_output_relation(DepsNodeHandle *node_handle, { deg::OperationKey ntree_output_key( &node_tree->id, deg::NodeType::NTREE_OUTPUT, deg::OperationCode::NTREE_OUTPUT); + deg::OperationKey ntree_preprocess_key(&node_tree->id, + deg::NodeType::NTREE_GEOMETRY_PREPROCESS, + deg::OperationCode::NTREE_GEOMETRY_PREPROCESS); deg::DepsNodeHandle *deg_node_handle = get_node_handle(node_handle); deg_node_handle->builder->add_node_handle_relation( ntree_output_key, deg_node_handle, description); + deg_node_handle->builder->add_node_handle_relation( + ntree_preprocess_key, deg_node_handle, description, deg::RELATION_FLAG_NO_FLUSH); } void DEG_add_object_cache_relation(DepsNodeHandle *node_handle, diff --git a/source/blender/depsgraph/intern/eval/deg_eval.cc b/source/blender/depsgraph/intern/eval/deg_eval.cc index 45a13b807af..5ca32d00ba5 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval.cc @@ -12,6 +12,7 @@ #include "PIL_time.h" #include "BLI_compiler_attrs.h" +#include "BLI_function_ref.hh" #include "BLI_gsqueue.h" #include "BLI_task.h" #include "BLI_utildefines.h" @@ -52,16 +53,9 @@ struct DepsgraphEvalState; void deg_task_run_func(TaskPool *pool, void *taskdata); -template<typename ScheduleFunction, typename... ScheduleFunctionArgs> void schedule_children(DepsgraphEvalState *state, OperationNode *node, - ScheduleFunction *schedule_function, - ScheduleFunctionArgs... schedule_function_args); - -void schedule_node_to_pool(OperationNode *node, const int /*thread_id*/, TaskPool *pool) -{ - BLI_task_pool_push(pool, deg_task_run_func, node, false, nullptr); -} + FunctionRef<void(OperationNode *node)> schedule_fn); /* Denotes which part of dependency graph is being evaluated. */ enum class EvaluationStage { @@ -125,7 +119,9 @@ void deg_task_run_func(TaskPool *pool, void *taskdata) evaluate_node(state, operation_node); /* Schedule children. */ - schedule_children(state, operation_node, schedule_node_to_pool, pool); + schedule_children(state, operation_node, [&](OperationNode *node) { + BLI_task_pool_push(pool, deg_task_run_func, node, false, nullptr); + }); } bool check_operation_node_visible(const DepsgraphEvalState *state, OperationNode *op_node) @@ -241,12 +237,10 @@ bool need_evaluate_operation_at_stage(DepsgraphEvalState *state, * dec_parents: Decrement pending parents count, true when child nodes are * scheduled after a task has been completed. */ -template<typename ScheduleFunction, typename... ScheduleFunctionArgs> void schedule_node(DepsgraphEvalState *state, OperationNode *node, bool dec_parents, - ScheduleFunction *schedule_function, - ScheduleFunctionArgs... schedule_function_args) + const FunctionRef<void(OperationNode *node)> schedule_fn) { /* No need to schedule nodes of invisible ID. */ if (!check_operation_node_visible(state, node)) { @@ -277,30 +271,26 @@ void schedule_node(DepsgraphEvalState *state, if (!is_scheduled) { if (node->is_noop()) { /* skip NOOP node, schedule children right away */ - schedule_children(state, node, schedule_function, schedule_function_args...); + schedule_children(state, node, schedule_fn); } else { /* children are scheduled once this task is completed */ - schedule_function(node, 0, schedule_function_args...); + schedule_fn(node); } } } -template<typename ScheduleFunction, typename... ScheduleFunctionArgs> void schedule_graph(DepsgraphEvalState *state, - ScheduleFunction *schedule_function, - ScheduleFunctionArgs... schedule_function_args) + const FunctionRef<void(OperationNode *node)> schedule_fn) { for (OperationNode *node : state->graph->operations) { - schedule_node(state, node, false, schedule_function, schedule_function_args...); + schedule_node(state, node, false, schedule_fn); } } -template<typename ScheduleFunction, typename... ScheduleFunctionArgs> void schedule_children(DepsgraphEvalState *state, OperationNode *node, - ScheduleFunction *schedule_function, - ScheduleFunctionArgs... schedule_function_args) + const FunctionRef<void(OperationNode *node)> schedule_fn) { for (Relation *rel : node->outlinks) { OperationNode *child = (OperationNode *)rel->to; @@ -309,21 +299,10 @@ void schedule_children(DepsgraphEvalState *state, /* Happens when having cyclic dependencies. */ continue; } - schedule_node(state, - child, - (rel->flag & RELATION_FLAG_CYCLIC) == 0, - schedule_function, - schedule_function_args...); + schedule_node(state, child, (rel->flag & RELATION_FLAG_CYCLIC) == 0, schedule_fn); } } -void schedule_node_to_queue(OperationNode *node, - const int /*thread_id*/, - GSQueue *evaluation_queue) -{ - BLI_gsqueue_push(evaluation_queue, &node); -} - /* Evaluate given stage of the dependency graph evaluation using multiple threads. * * NOTE: Will assign the `state->stage` to the given stage. */ @@ -335,7 +314,9 @@ void evaluate_graph_threaded_stage(DepsgraphEvalState *state, calculate_pending_parents_if_needed(state); - schedule_graph(state, schedule_node_to_pool, task_pool); + schedule_graph(state, [&](OperationNode *node) { + BLI_task_pool_push(task_pool, deg_task_run_func, node, false, nullptr); + }); BLI_task_pool_work_and_wait(task_pool); } @@ -351,14 +332,17 @@ void evaluate_graph_single_threaded_if_needed(DepsgraphEvalState *state) state->stage = EvaluationStage::SINGLE_THREADED_WORKAROUND; GSQueue *evaluation_queue = BLI_gsqueue_new(sizeof(OperationNode *)); - schedule_graph(state, schedule_node_to_queue, evaluation_queue); + auto schedule_node_to_queue = [&](OperationNode *node) { + BLI_gsqueue_push(evaluation_queue, &node); + }; + schedule_graph(state, schedule_node_to_queue); while (!BLI_gsqueue_is_empty(evaluation_queue)) { OperationNode *operation_node; BLI_gsqueue_pop(evaluation_queue, &operation_node); evaluate_node(state, operation_node); - schedule_children(state, operation_node, schedule_node_to_queue, evaluation_queue); + schedule_children(state, operation_node, schedule_node_to_queue); } BLI_gsqueue_free(evaluation_queue); diff --git a/source/blender/depsgraph/intern/eval/deg_eval_visibility.cc b/source/blender/depsgraph/intern/eval/deg_eval_visibility.cc index a056ba1dfa7..0ee4052eff3 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_visibility.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_visibility.cc @@ -37,7 +37,8 @@ void deg_evaluate_object_node_visibility(::Depsgraph *depsgraph, IDNode *id_node const int required_flags = (graph->mode == DAG_EVAL_VIEWPORT) ? BASE_ENABLED_VIEWPORT : BASE_ENABLED_RENDER; - const bool is_enabled = object->base_flag & required_flags; + const bool is_enabled = !graph->use_visibility_optimization || + object->base_flag & required_flags; if (id_node->is_enabled_on_eval != is_enabled) { id_node->is_enabled_on_eval = is_enabled; @@ -73,7 +74,8 @@ void deg_evaluate_object_modifiers_mode_node_visibility(::Depsgraph *depsgraph, "Modifier node in depsgraph is not found. Likely due to missing " "DEG_relations_tag_update()."); - const bool modifier_enabled = modifier->mode & modifier_mode; + const bool modifier_enabled = !graph->use_visibility_optimization || + (modifier->mode & modifier_mode); const int mute_flag = modifier_enabled ? 0 : DEPSOP_FLAG_MUTE; if ((modifier_node->flag & DEPSOP_FLAG_MUTE) != mute_flag) { modifier_node->flag &= ~DEPSOP_FLAG_MUTE; |