[Bf-blender-cvs] [c48eb521642] blender2.8: Fix Cycles headless render failing, after grease pencil merge.

Brecht Van Lommel noreply at git.blender.org
Wed Aug 1 14:47:28 CEST 2018


Commit: c48eb521642b5d94e5f0eb8fd15f7d587f407078
Author: Brecht Van Lommel
Date:   Wed Aug 1 14:21:50 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBc48eb521642b5d94e5f0eb8fd15f7d587f407078

Fix Cycles headless render failing, after grease pencil merge.

Now it should at least succeed when there are no grease pencil objects.

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

M	source/blender/draw/intern/draw_manager.c
M	source/blender/render/intern/source/external_engine.c

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

diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index ba53c3aa664..5140e379aaf 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1619,11 +1619,11 @@ void DRW_draw_render_loop_offscreen(
 }
 
 /* helper to check if exit object type to render */
-static bool DRW_render_check_object_type(struct Depsgraph *depsgraph, short obtype)
+static bool DRW_render_check_grease_pencil(Depsgraph *depsgraph)
 {
 	DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(depsgraph, ob)
 	{
-		if ((ob->type == obtype) && (DRW_check_object_visible_within_active_context(ob))) {
+		if ((ob->type == OB_GPENCIL) && (DRW_check_object_visible_within_active_context(ob))) {
 			return true;
 		}
 	}
@@ -1632,13 +1632,11 @@ static bool DRW_render_check_object_type(struct Depsgraph *depsgraph, short obty
 	return false;
 }
 
-static void DRW_render_gpencil_to_image(RenderEngine *engine, struct Depsgraph *depsgraph, struct RenderLayer *render_layer, const rcti *rect)
+static void DRW_render_gpencil_to_image(RenderEngine *engine, struct RenderLayer *render_layer, const rcti *rect)
 {
 	if (draw_engine_gpencil_type.render_to_image) {
-		if (DRW_render_check_object_type(depsgraph, OB_GPENCIL)) {
-			ViewportEngineData *gpdata = drw_viewport_engine_data_ensure(&draw_engine_gpencil_type);
-			draw_engine_gpencil_type.render_to_image(gpdata, engine, render_layer, rect);
-		}
+		ViewportEngineData *gpdata = drw_viewport_engine_data_ensure(&draw_engine_gpencil_type);
+		draw_engine_gpencil_type.render_to_image(gpdata, engine, render_layer, rect);
 	}
 }
 
@@ -1652,6 +1650,12 @@ void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph
 		return;
 	}
 
+	/* Early out if there are no grease pencil objects, especially important
+	 * to avoid failing in in background renders without OpenGL context. */
+	if (!DRW_render_check_grease_pencil(depsgraph)) {
+		return;
+	}
+
 	Scene *scene = DEG_get_evaluated_scene(depsgraph);
 	ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph);
 	RenderEngineType *engine_type = engine->type;
@@ -1712,7 +1716,7 @@ void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph
 	RenderResult *render_result = RE_engine_get_result(engine);
 	RenderLayer *render_layer = render_result->layers.first;
 
-	DRW_render_gpencil_to_image(engine, depsgraph, render_layer, &render_rect);
+	DRW_render_gpencil_to_image(engine, render_layer, &render_rect);
 
 	/* Force cache to reset. */
 	drw_viewport_cache_resize();
@@ -1814,7 +1818,9 @@ void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph)
 		RE_SetActiveRenderView(render, render_view->name);
 		engine_type->draw_engine->render_to_image(data, engine, render_layer, &render_rect);
 		/* grease pencil: render result is merged in the previous render result. */
-		DRW_render_gpencil_to_image(engine, depsgraph, render_layer, &render_rect);
+		if (DRW_render_check_grease_pencil(depsgraph)) {
+			DRW_render_gpencil_to_image(engine, render_layer, &render_rect);
+		}
 		DST.buffer_finish_called = false;
 	}
 
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c
index 0b27cadd086..09ab3e39d5f 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -740,9 +740,15 @@ int RE_engine_render(Render *re, int do_all)
 			type->render(engine, engine->depsgraph);
 
 			/* grease pencil render over previous render result */
-			DRW_render_gpencil(engine, engine->depsgraph);
+			if (!RE_engine_test_break(engine)) {
+				DRW_render_gpencil(engine, engine->depsgraph);
+			}
 
 			engine_depsgraph_free(engine);
+
+			if (RE_engine_test_break(engine)) {
+				break;
+			}
 		}
 		FOREACH_VIEW_LAYER_TO_RENDER_END;
 	}



More information about the Bf-blender-cvs mailing list