[Bf-blender-cvs] [e432ce12a85] cycles-x: Render: Introduce render_frame_finish RenderEngine callback

Sergey Sharybin noreply at git.blender.org
Wed Sep 15 19:52:19 CEST 2021


Commit: e432ce12a8574f40c72d5d155a241bd80b05d93c
Author: Sergey Sharybin
Date:   Wed Sep 15 09:05:46 2021 +0200
Branches: cycles-x
https://developer.blender.org/rBe432ce12a8574f40c72d5d155a241bd80b05d93c

Render: Introduce render_frame_finish RenderEngine callback

Allows to inform the engine that nothing else will be rendered for the
current frame and that the engine can perform post-processing of any
pending result.

For example, this allows the engine to free its memory, read all files
from disk and write them to Blender.

Currently no functional changes, just preparing API for the further
development of Cycles on-disk tile storage.

Differential Revision: https://developer.blender.org/D12502

===================================================================

M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/external/external_engine.c
M	source/blender/draw/engines/select/select_engine.c
M	source/blender/draw/engines/workbench/workbench_engine.c
M	source/blender/makesrna/intern/rna_render.c
M	source/blender/render/RE_engine.h
M	source/blender/render/intern/engine.c

===================================================================

diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index a6bf1806579..f8e1cc9c923 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -649,6 +649,7 @@ RenderEngineType DRW_engine_viewport_eevee_type = {
     NULL,
     NULL,
     NULL,
+    NULL,
     &EEVEE_render_update_passes,
     &draw_engine_eevee_type,
     {NULL, NULL, NULL},
diff --git a/source/blender/draw/engines/external/external_engine.c b/source/blender/draw/engines/external/external_engine.c
index d5bed24a570..70201136f48 100644
--- a/source/blender/draw/engines/external/external_engine.c
+++ b/source/blender/draw/engines/external/external_engine.c
@@ -491,6 +491,7 @@ RenderEngineType DRW_engine_viewport_external_type = {
     NULL,
     NULL,
     NULL,
+    NULL,
     &draw_engine_external_type,
     {NULL, NULL, NULL},
 };
diff --git a/source/blender/draw/engines/select/select_engine.c b/source/blender/draw/engines/select/select_engine.c
index b11b0022f11..20edd78597b 100644
--- a/source/blender/draw/engines/select/select_engine.c
+++ b/source/blender/draw/engines/select/select_engine.c
@@ -389,6 +389,7 @@ RenderEngineType DRW_engine_viewport_select_type = {
     NULL,
     NULL,
     NULL,
+    NULL,
     &draw_engine_select_type,
     {NULL, NULL, NULL},
 };
diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c
index c5e03b72181..635aa7cef25 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.c
+++ b/source/blender/draw/engines/workbench/workbench_engine.c
@@ -652,6 +652,7 @@ RenderEngineType DRW_engine_viewport_workbench_type = {
     NULL,
     NULL,
     NULL,
+    NULL,
     &workbench_render_update_passes,
     &draw_engine_workbench,
     {NULL, NULL, NULL},
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index e716950867a..bfbfc6fc055 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -179,6 +179,22 @@ static void engine_render(RenderEngine *engine, Depsgraph *depsgraph)
   RNA_parameter_list_free(&list);
 }
 
+static void engine_render_frame_finish(RenderEngine *engine)
+{
+  extern FunctionRNA rna_RenderEngine_render_frame_finish_func;
+  PointerRNA ptr;
+  ParameterList list;
+  FunctionRNA *func;
+
+  RNA_pointer_create(NULL, engine->type->rna_ext.srna, engine, &ptr);
+  func = &rna_RenderEngine_render_frame_finish_func;
+
+  RNA_parameter_list_create(&list, &ptr, func);
+  engine->type->rna_ext.call(NULL, &ptr, func, &list);
+
+  RNA_parameter_list_free(&list);
+}
+
 static void engine_draw(RenderEngine *engine, const struct bContext *context, Depsgraph *depsgraph)
 {
   extern FunctionRNA rna_RenderEngine_draw_func;
@@ -378,12 +394,13 @@ static StructRNA *rna_RenderEngine_register(Main *bmain,
 
   et->update = (have_function[0]) ? engine_update : NULL;
   et->render = (have_function[1]) ? engine_render : NULL;
-  et->draw = (have_function[2]) ? engine_draw : NULL;
-  et->bake = (have_function[3]) ? engine_bake : NULL;
-  et->view_update = (have_function[4]) ? engine_view_update : NULL;
-  et->view_draw = (have_function[5]) ? engine_view_draw : NULL;
-  et->update_script_node = (have_function[6]) ? engine_update_script_node : NULL;
-  et->update_render_passes = (have_function[7]) ? engine_update_render_passes : NULL;
+  et->render_frame_finish = (have_function[2]) ? engine_render_frame_finish : NULL;
+  et->draw = (have_function[3]) ? engine_draw : NULL;
+  et->bake = (have_function[4]) ? engine_bake : NULL;
+  et->view_update = (have_function[5]) ? engine_view_update : NULL;
+  et->view_draw = (have_function[6]) ? engine_view_draw : NULL;
+  et->update_script_node = (have_function[7]) ? engine_update_script_node : NULL;
+  et->update_render_passes = (have_function[8]) ? engine_update_render_passes : NULL;
 
   RE_engines_register(et);
 
@@ -540,6 +557,11 @@ static void rna_def_render_engine(BlenderRNA *brna)
   parm = RNA_def_pointer(func, "depsgraph", "Depsgraph", "", "");
   RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
 
+  func = RNA_def_function(srna, "render_frame_finish", NULL);
+  RNA_def_function_ui_description(
+      func, "Perform finishing operations after all view layers in a frame were rendered");
+  RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
+
   func = RNA_def_function(srna, "draw", NULL);
   RNA_def_function_ui_description(func, "Draw render image");
   RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
diff --git a/source/blender/render/RE_engine.h b/source/blender/render/RE_engine.h
index 23769203b9d..27ae19a9c96 100644
--- a/source/blender/render/RE_engine.h
+++ b/source/blender/render/RE_engine.h
@@ -88,10 +88,20 @@ typedef struct RenderEngineType {
   int flag;
 
   void (*update)(struct RenderEngine *engine, struct Main *bmain, struct Depsgraph *depsgraph);
+
   void (*render)(struct RenderEngine *engine, struct Depsgraph *depsgraph);
+
+  /* Offline rendering is finished - no more view layers will be rendered.
+   *
+   * All the pending data is to be communicated from the engine back to Blender. In a possibly
+   * most memory-efficient manner (engine might free its database before making Blender to allocate
+   * full-frame render result). */
+  void (*render_frame_finish)(struct RenderEngine *engine);
+
   void (*draw)(struct RenderEngine *engine,
                const struct bContext *context,
                struct Depsgraph *depsgraph);
+
   void (*bake)(struct RenderEngine *engine,
                struct Depsgraph *depsgraph,
                struct Object *object,
diff --git a/source/blender/render/intern/engine.c b/source/blender/render/intern/engine.c
index b4fd7e90936..e84a625acd5 100644
--- a/source/blender/render/intern/engine.c
+++ b/source/blender/render/intern/engine.c
@@ -1010,6 +1010,10 @@ bool RE_engine_render(Render *re, bool do_all)
     FOREACH_VIEW_LAYER_TO_RENDER_END;
   }
 
+  if (type->render_frame_finish) {
+    type->render_frame_finish(engine);
+  }
+
   /* Clear tile data */
   engine->flag &= ~RE_ENGINE_RENDERING;



More information about the Bf-blender-cvs mailing list