[Bf-blender-cvs] [c81d9fd] master: Optimize threaded scanline processor

Sergey Sharybin noreply at git.blender.org
Thu May 5 14:45:49 CEST 2016


Commit: c81d9fda46665ebf2b2b98624c4c7ad01088a346
Author: Sergey Sharybin
Date:   Thu May 5 14:18:11 2016 +0200
Branches: master
https://developer.blender.org/rBc81d9fda46665ebf2b2b98624c4c7ad01088a346

Optimize threaded scanline processor

Avoid memory allocation for task data.

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

M	source/blender/imbuf/IMB_imbuf.h
M	source/blender/imbuf/intern/imageprocess.c

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

diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index bd19271..2c97d9b 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -583,7 +583,7 @@ void IMB_processor_apply_threaded(int buffer_lines, int handle_size, void *init_
 typedef void (*ScanlineThreadFunc) (void *custom_data,
                                     int start_scanline,
                                     int num_scanlines);
-void IMB_processor_apply_threaded_scanlines(int buffer_lines,
+void IMB_processor_apply_threaded_scanlines(int total_scanlines,
                                             ScanlineThreadFunc do_thread,
                                             void *custom_data);
 
diff --git a/source/blender/imbuf/intern/imageprocess.c b/source/blender/imbuf/intern/imageprocess.c
index ebcd6e0..7088819 100644
--- a/source/blender/imbuf/intern/imageprocess.c
+++ b/source/blender/imbuf/intern/imageprocess.c
@@ -377,6 +377,8 @@ void IMB_processor_apply_threaded(int buffer_lines, int handle_size, void *init_
 typedef struct ScanlineGlobalData {
 	void *custom_data;
 	ScanlineThreadFunc do_thread;
+	int scanlines_per_task;
+	int total_scanlines;
 } ScanlineGlobalData;
 
 typedef struct ScanlineTask {
@@ -388,50 +390,41 @@ static void processor_apply_scanline_func(TaskPool * __restrict pool,
                                           void *taskdata,
                                           int UNUSED(threadid))
 {
-	ScanlineTask *task = (ScanlineTask *)taskdata;
 	ScanlineGlobalData *data = (ScanlineGlobalData*)BLI_task_pool_userdata(pool);
+	int start_scanline = GET_INT_FROM_POINTER(taskdata);
+	int num_scanlines = min_ii(data->scanlines_per_task,
+	                           data->total_scanlines - start_scanline);
 	data->do_thread(data->custom_data,
-	                task->start_scanline,
-	                task->num_scanlines);
+	                start_scanline,
+	                num_scanlines);
 }
 
-void IMB_processor_apply_threaded_scanlines(int buffer_lines,
+void IMB_processor_apply_threaded_scanlines(int total_scanlines,
                                             ScanlineThreadFunc do_thread,
                                             void *custom_data)
 {
+	const int scanlines_per_task = 64;
 	ScanlineGlobalData data;
 	data.custom_data = custom_data;
 	data.do_thread = do_thread;
-	const int lines_per_task = 64;
-	const int total_tasks = (buffer_lines + lines_per_task - 1) / lines_per_task;
+	data.scanlines_per_task = scanlines_per_task;
+	data.total_scanlines = total_scanlines;
+	const int total_tasks = (total_scanlines + scanlines_per_task - 1) / scanlines_per_task;
 	TaskScheduler *task_scheduler = BLI_task_scheduler_get();
 	TaskPool *task_pool = BLI_task_pool_create(task_scheduler, &data);
-	ScanlineTask *handles = MEM_mallocN(sizeof(ScanlineTask) * total_tasks,
-	                      "processor apply threaded handles");
 	for (int i = 0, start_line = 0; i < total_tasks; i++) {
-		ScanlineTask *handle = &handles[i];
-		handle->start_scanline = start_line;
-		if (i < total_tasks - 1) {
-			handle->num_scanlines = lines_per_task;
-		}
-		else {
-			handle->num_scanlines = buffer_lines - start_line;
-		}
-
 		BLI_task_pool_push(task_pool,
 		                   processor_apply_scanline_func,
-		                   handle,
+		                   SET_INT_IN_POINTER(start_line),
 		                   false,
 		                   TASK_PRIORITY_LOW);
-
-		start_line += lines_per_task;
+		start_line += scanlines_per_task;
 	}
 
 	/* work and wait until tasks are done */
 	BLI_task_pool_work_and_wait(task_pool);
 
 	/* Free memory. */
-	MEM_freeN(handles);
 	BLI_task_pool_free(task_pool);
 }




More information about the Bf-blender-cvs mailing list