[Bf-blender-cvs] [e84625dcbcf] blender-v3.0-release: Fix T94169: Missing grease pencil render with tiled rendering

Sergey Sharybin noreply at git.blender.org
Tue Jan 11 10:38:38 CET 2022


Commit: e84625dcbcfe33010e69e672efa8720e872cdd7e
Author: Sergey Sharybin
Date:   Wed Jan 5 17:11:16 2022 +0100
Branches: blender-v3.0-release
https://developer.blender.org/rBe84625dcbcfe33010e69e672efa8720e872cdd7e

Fix T94169: Missing grease pencil render with tiled rendering

Delay grease pencil for until after the render result is written
to the Blender side.

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

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

M	source/blender/render/intern/engine.c

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

diff --git a/source/blender/render/intern/engine.c b/source/blender/render/intern/engine.c
index cb92b15f873..67c1e4f0eeb 100644
--- a/source/blender/render/intern/engine.c
+++ b/source/blender/render/intern/engine.c
@@ -922,8 +922,10 @@ static void engine_render_view_layer(Render *re,
     }
   }
 
-  /* Optionally composite grease pencil over render result. */
-  if (engine->has_grease_pencil && use_grease_pencil) {
+  /* Optionally composite grease pencil over render result.
+   * Only do it if the passes are allocated (and the engine will not override the grease pencil
+   * when reading its result from EXR file and writing to the Blender side. */
+  if (engine->has_grease_pencil && use_grease_pencil && re->result->passes_allocated) {
     /* NOTE: External engine might have been requested to free its
      * dependency graph, which is only allowed if there is no grease
      * pencil (pipeline is taking care of that). */
@@ -1022,10 +1024,18 @@ bool RE_engine_render(Render *re, bool do_all)
     re->draw_lock(re->dlh, false);
   }
 
+  /* Render view layers. */
+  bool delay_grease_pencil = false;
+
   if (type->render) {
     FOREACH_VIEW_LAYER_TO_RENDER_BEGIN (re, view_layer_iter) {
       engine_render_view_layer(re, engine, view_layer_iter, true, true);
 
+      /* If render passes are not allocated the render engine deferred final pixels write for
+       * later. Need to defer the grease pencil for until after the engine has written the
+       * render result to Blender. */
+      delay_grease_pencil = engine->has_grease_pencil && !re->result->passes_allocated;
+
       if (RE_engine_test_break(engine)) {
         break;
       }
@@ -1037,6 +1047,17 @@ bool RE_engine_render(Render *re, bool do_all)
     type->render_frame_finish(engine);
   }
 
+  /* Perform delayed grease pencil rendering. */
+  if (delay_grease_pencil) {
+    FOREACH_VIEW_LAYER_TO_RENDER_BEGIN (re, view_layer_iter) {
+      engine_render_view_layer(re, engine, view_layer_iter, false, true);
+      if (RE_engine_test_break(engine)) {
+        break;
+      }
+    }
+    FOREACH_VIEW_LAYER_TO_RENDER_END;
+  }
+
   /* Clear tile data */
   engine->flag &= ~RE_ENGINE_RENDERING;



More information about the Bf-blender-cvs mailing list