diff options
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/intern/include/render_types.h | 5 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 60 |
2 files changed, 52 insertions, 13 deletions
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index e4a2afa4349..efa328cf14d 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -118,6 +118,11 @@ struct Render { /* render engine */ struct RenderEngine *engine; + /* NOTE: This is a minimal dependency graph and evaluated scene which is enough to access view + * layer visibility and use for post-precessing (compositor and sequencer). */ + Depsgraph *pipeline_depsgraph; + Scene *pipeline_scene_eval; + #ifdef WITH_FREESTYLE struct Main *freestyle_bmain; ListBase freestyle_renders; diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 9c1c713ab94..76767d0d1d8 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -74,6 +74,7 @@ #include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_debug.h" #include "DEG_depsgraph_query.h" #include "PIL_time.h" @@ -1430,10 +1431,10 @@ static void free_all_freestyle_renders(void) /* returns fully composited render-result on given time step (in RenderData) */ static void do_render_composite(Render *re) { - bNodeTree *ntree = re->scene->nodetree; + bNodeTree *ntree = re->pipeline_scene_eval->nodetree; int update_newframe = 0; - if (composite_needs_render(re->scene, 1)) { + if (composite_needs_render(re->pipeline_scene_eval, 1)) { /* save memory... free all cached images */ ntreeFreeCache(ntree); @@ -1471,7 +1472,7 @@ static void do_render_composite(Render *re) if (!re->test_break(re->tbh)) { if (ntree) { - ntreeCompositTagRender(re->scene); + ntreeCompositTagRender(re->pipeline_scene_eval); } if (ntree && re->scene->use_nodes && re->r.scemode & R_DOCOMP) { @@ -1494,7 +1495,7 @@ static void do_render_composite(Render *re) RenderView *rv; for (rv = re->result->views.first; rv; rv = rv->next) { - ntreeCompositExecTree(re->scene, + ntreeCompositExecTree(re->pipeline_scene_eval, ntree, &re->r, true, @@ -1595,12 +1596,8 @@ static void do_render_seq(Render *re) tot_views = BKE_scene_multiview_num_views_get(&re->r); ibuf_arr = MEM_mallocN(sizeof(ImBuf *) * tot_views, "Sequencer Views ImBufs"); - /* TODO(sergey): Currently depsgraph is only used to check whether it is an active - * edit window or not to deal with unkeyed changes. We don't have depsgraph here yet, - * but we also dont' deal with unkeyed changes. But still nice to get proper depsgraph - * within tjhe render pipeline, somehow. - */ - BKE_sequencer_new_render_data(re->main, NULL, re->scene, re_x, re_y, 100, true, &context); + BKE_sequencer_new_render_data( + re->main, re->pipeline_depsgraph, re->scene, re_x, re_y, 100, true, &context); /* the renderresult gets destroyed during the rendering, so we first collect all ibufs * and then we populate the final renderesult */ @@ -1613,7 +1610,7 @@ static void do_render_seq(Render *re) ibuf_arr[view_id] = IMB_dupImBuf(out); IMB_metadata_copy(ibuf_arr[view_id], out); IMB_freeImBuf(out); - BKE_sequencer_imbuf_from_sequencer_space(re->scene, ibuf_arr[view_id]); + BKE_sequencer_imbuf_from_sequencer_space(re->pipeline_scene_eval, ibuf_arr[view_id]); } else { ibuf_arr[view_id] = NULL; @@ -1641,9 +1638,9 @@ static void do_render_seq(Render *re) } if (recurs_depth == 0) { /* with nested scenes, only free on toplevel... */ - Editing *ed = re->scene->ed; + Editing *ed = re->pipeline_scene_eval->ed; if (ed) { - BKE_sequencer_free_imbuf(re->scene, &ed->seqbase, true); + BKE_sequencer_free_imbuf(re->pipeline_scene_eval, &ed->seqbase, true); } } IMB_freeImBuf(ibuf_arr[view_id]); @@ -2071,6 +2068,32 @@ void RE_SetReports(Render *re, ReportList *reports) re->reports = reports; } +static void render_update_depsgraph(Render *re) +{ + Scene *scene = re->scene; + /* TODO(sergey): This doesn't run any callbacks and doesn't do sound update. But we can not use + * BKE_scene_graph_update_for_newframe() because that one builds dependency graph for view layer + * and not for the render pipeline. */ + DEG_evaluate_on_framechange(re->main, re->pipeline_depsgraph, CFRA); +} + +static void render_init_depsgraph(Render *re) +{ + Scene *scene = re->scene; + ViewLayer *view_layer = BKE_view_layer_default_render(re->scene); + + re->pipeline_depsgraph = DEG_graph_new(scene, view_layer, DAG_EVAL_RENDER); + DEG_debug_name_set(re->pipeline_depsgraph, "RENDER PIPELINE"); + + /* Make sure there is a correct evaluated scene pointer. */ + DEG_graph_build_for_render_pipeline(re->pipeline_depsgraph, re->main, scene, view_layer); + + /* Update immediately so we have proper evaluated scene. */ + render_update_depsgraph(re); + + re->pipeline_scene_eval = DEG_get_evaluated_scene(re->pipeline_depsgraph); +} + /* general Blender frame render call */ void RE_RenderFrame(Render *re, Main *bmain, @@ -2093,6 +2116,8 @@ void RE_RenderFrame(Render *re, const RenderData rd = scene->r; MEM_reset_peak_memory(); + render_init_depsgraph(re); + BLI_callback_exec(re->main, (ID *)scene, BLI_CB_EVT_RENDER_PRE); do_render_all_options(re); @@ -2490,6 +2515,8 @@ void RE_RenderAnim(Render *re, return; } + render_init_depsgraph(re); + if (is_movie) { size_t width, height; int i; @@ -2556,6 +2583,8 @@ void RE_RenderAnim(Render *re, BKE_animsys_evaluate_animdata(NULL, scene, &scene->id, adt, ctime, ADT_RECALC_ALL); } + render_update_depsgraph(re); + /* only border now, todo: camera lens. (ton) */ render_initialize_from_main(re, &rd, bmain, scene, single_layer, camera_override, 1, 0); @@ -2746,6 +2775,11 @@ void RE_CleanAfterRender(Render *re) { /* Destroy the opengl context in the correct thread. */ RE_gl_context_destroy(re); + if (re->pipeline_depsgraph != NULL) { + DEG_graph_free(re->pipeline_depsgraph); + } + re->pipeline_depsgraph = NULL; + re->pipeline_scene_eval = NULL; } /* note; repeated win/disprect calc... solve that nicer, also in compo */ |