[Bf-blender-cvs] [ae2471b] master: OpenGL render: Fix non-deterministic order of frame writes for movies

Sergey Sharybin noreply at git.blender.org
Fri Oct 7 17:48:35 CEST 2016


Commit: ae2471b8509bb09aaaee453da5aadd453e56c70f
Author: Sergey Sharybin
Date:   Fri Oct 7 17:12:27 2016 +0200
Branches: master
https://developer.blender.org/rBae2471b8509bb09aaaee453da5aadd453e56c70f

OpenGL render: Fix non-deterministic order of frame writes for movies

By the design of task scheduler it was possible that tasks from somewhere
in the middle of scheduled list will be handled first.

For example, one thread might be iterating over the scheduled list and
ignore tasks because there is other thread is working on task from the
same pool. However, if that other thread finishes task before iteration
is over current thread will pick up task from somewhere in in the middle
of the list.

This isn't a problem in general case, but for movie rendering we do need
to have strict order of frames.

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

M	source/blender/editors/render/render_opengl.c

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

diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c
index d2941e1..2ce1abb 100644
--- a/source/blender/editors/render/render_opengl.c
+++ b/source/blender/editors/render/render_opengl.c
@@ -131,6 +131,7 @@ typedef struct OGLRender {
 	wmTimer *timer; /* use to check if running modal or not (invoke'd or exec'd)*/
 	void **movie_ctx_arr;
 
+	TaskScheduler *task_scheduler;
 	TaskPool *task_pool;
 	bool pool_ok;
 	bool is_animation;
@@ -693,11 +694,14 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op)
 	if (is_animation) {
 		TaskScheduler *task_scheduler = BLI_task_scheduler_get();
 		if (BKE_imtype_is_movie(scene->r.im_format.imtype)) {
+			task_scheduler = BLI_task_scheduler_create(1);
+			oglrender->task_scheduler = task_scheduler;
 			oglrender->task_pool = BLI_task_pool_create_background(task_scheduler,
 			                                                       oglrender);
 			BLI_pool_set_num_threads(oglrender->task_pool, 1);
 		}
 		else {
+			oglrender->task_scheduler = NULL;
 			oglrender->task_pool = BLI_task_pool_create(task_scheduler,
 			                                            oglrender);
 		}
@@ -705,6 +709,7 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op)
 		BLI_spin_init(&oglrender->reports_lock);
 	}
 	else {
+		oglrender->task_scheduler = NULL;
 		oglrender->task_pool = NULL;
 	}
 
@@ -724,6 +729,7 @@ static void screen_opengl_render_end(bContext *C, OGLRender *oglrender)
 	if (oglrender->is_animation) {
 		BLI_task_pool_work_and_wait(oglrender->task_pool);
 		BLI_task_pool_free(oglrender->task_pool);
+		BLI_task_scheduler_free(oglrender->task_scheduler);
 		BLI_spin_end(&oglrender->reports_lock);
 	}




More information about the Bf-blender-cvs mailing list