Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2016-10-07 18:12:27 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2016-10-07 18:12:27 +0300
commitae2471b8509bb09aaaee453da5aadd453e56c70f (patch)
tree180a79d6eef568de9a266e1a7da1d0964adf7fed /source/blender/editors/render
parent09b9e462b99347e76b42326b4345127ddf72a787 (diff)
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.
Diffstat (limited to 'source/blender/editors/render')
-rw-r--r--source/blender/editors/render/render_opengl.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c
index d2941e175be..2ce1abb522c 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);
}