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; _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
