diff options
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/depsgraph/DEG_depsgraph_build.h | 12 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/depsgraph_build.cc | 36 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_edit.c | 27 |
3 files changed, 73 insertions, 2 deletions
diff --git a/source/blender/depsgraph/DEG_depsgraph_build.h b/source/blender/depsgraph/DEG_depsgraph_build.h index 15abc0c0a64..effcece6e00 100644 --- a/source/blender/depsgraph/DEG_depsgraph_build.h +++ b/source/blender/depsgraph/DEG_depsgraph_build.h @@ -33,6 +33,7 @@ struct Depsgraph; /* ------------------------------------------------ */ +struct bNodeTree; struct CacheFile; struct Collection; struct CustomData_MeshMasks; @@ -65,6 +66,17 @@ void DEG_graph_build_for_render_pipeline(struct Depsgraph *graph, struct Scene *scene, struct ViewLayer *view_layer); +/* Builds minimal dependency graph for compositor preview. + * + * Note that compositor editor might have pinned node tree, which is different from scene's node + * tree. + */ +void DEG_graph_build_for_compositor_preview(struct Depsgraph *graph, + struct Main *bmain, + struct Scene *scene, + struct ViewLayer *view_layer, + struct bNodeTree *nodetree); + /* Tag relations from the given graph for update. */ void DEG_graph_tag_relations_update(struct Depsgraph *graph); diff --git a/source/blender/depsgraph/intern/depsgraph_build.cc b/source/blender/depsgraph/intern/depsgraph_build.cc index 138b23888b4..cf1ebccc6c6 100644 --- a/source/blender/depsgraph/intern/depsgraph_build.cc +++ b/source/blender/depsgraph/intern/depsgraph_build.cc @@ -315,6 +315,42 @@ void DEG_graph_build_for_render_pipeline(Depsgraph *graph, } } +void DEG_graph_build_for_compositor_preview(Depsgraph *graph, + Main *bmain, + Scene *scene, + struct ViewLayer * /*view_layer*/, + bNodeTree *nodetree) +{ + double start_time = 0.0; + if (G.debug & (G_DEBUG_DEPSGRAPH_BUILD | G_DEBUG_DEPSGRAPH_TIME)) { + start_time = PIL_check_seconds_timer(); + } + DEG::Depsgraph *deg_graph = reinterpret_cast<DEG::Depsgraph *>(graph); + /* Perform sanity checks. */ + BLI_assert(deg_graph->scene == scene); + deg_graph->is_render_pipeline_depsgraph = true; + DEG::DepsgraphBuilderCache builder_cache; + /* Generate all the nodes in the graph first */ + DEG::DepsgraphNodeBuilder node_builder(bmain, deg_graph, &builder_cache); + node_builder.begin_build(); + node_builder.build_scene_render(scene); + node_builder.build_nodetree(nodetree); + node_builder.end_build(); + /* Hook up relationships between operations - to determine evaluation + * order. */ + DEG::DepsgraphRelationBuilder relation_builder(bmain, deg_graph, &builder_cache); + relation_builder.begin_build(); + relation_builder.build_scene_render(scene); + relation_builder.build_nodetree(nodetree); + relation_builder.build_copy_on_write_relations(); + /* Finalize building. */ + graph_build_finalize_common(deg_graph, bmain); + /* Finish statistics. */ + if (G.debug & (G_DEBUG_DEPSGRAPH_BUILD | G_DEBUG_DEPSGRAPH_TIME)) { + printf("Depsgraph built in %f seconds.\n", PIL_check_seconds_timer() - start_time); + } +} + /* Tag graph relations for update. */ void DEG_graph_tag_relations_update(Depsgraph *graph) { diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index d54a30047e6..7a6e37bfd4d 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -42,6 +42,8 @@ #include "BKE_scene.h" #include "DEG_depsgraph.h" +#include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_query.h" #include "RE_engine.h" #include "RE_pipeline.h" @@ -79,14 +81,19 @@ enum { }; typedef struct CompoJob { + /* Input parameters. */ Main *bmain; Scene *scene; + ViewLayer *view_layer; bNodeTree *ntree; + int recalc_flags; + /* Evaluated state/ */ + Depsgraph *compositor_depsgraph; bNodeTree *localtree; + /* Jon system integration. */ const short *stop; short *do_update; float *progress; - int recalc_flags; } CompoJob; static void compo_tag_output_nodes(bNodeTree *nodetree, int recalc_flags) @@ -182,6 +189,9 @@ static void compo_freejob(void *cjv) if (cj->localtree) { ntreeLocalMerge(cj->bmain, cj->localtree, cj->ntree); } + if (cj->compositor_depsgraph != NULL) { + DEG_graph_free(cj->compositor_depsgraph); + } MEM_freeN(cj); } @@ -190,8 +200,19 @@ static void compo_freejob(void *cjv) static void compo_initjob(void *cjv) { CompoJob *cj = cjv; + Main *bmain = cj->bmain; + Scene *scene = cj->scene; + ViewLayer *view_layer = cj->view_layer; + + cj->compositor_depsgraph = DEG_graph_new(scene, view_layer, DAG_EVAL_RENDER); + DEG_graph_build_for_compositor_preview( + cj->compositor_depsgraph, bmain, scene, view_layer, cj->ntree); + DEG_evaluate_on_framechange(bmain, cj->compositor_depsgraph, CFRA); + + bNodeTree *ntree_eval = (bNodeTree *)DEG_get_evaluated_id(cj->compositor_depsgraph, + &cj->ntree->id); - cj->localtree = ntreeLocalize(cj->ntree); + cj->localtree = ntreeLocalize(ntree_eval); if (cj->recalc_flags) { compo_tag_output_nodes(cj->localtree, cj->recalc_flags); @@ -283,6 +304,7 @@ void ED_node_composite_job(const bContext *C, struct bNodeTree *nodetree, Scene CompoJob *cj; Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); + ViewLayer *view_layer = CTX_data_view_layer(C); /* to fix bug: [#32272] */ if (G.is_rendering) { @@ -307,6 +329,7 @@ void ED_node_composite_job(const bContext *C, struct bNodeTree *nodetree, Scene /* customdata for preview thread */ cj->bmain = bmain; cj->scene = scene; + cj->view_layer = view_layer; cj->ntree = nodetree; cj->recalc_flags = compo_get_recalc_flags(C); |