Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/intern/include/render_types.h5
-rw-r--r--source/blender/render/intern/source/pipeline.c60
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 */