diff options
Diffstat (limited to 'source/blender/imbuf/intern/imageprocess.c')
-rw-r--r-- | source/blender/imbuf/intern/imageprocess.c | 89 |
1 files changed, 33 insertions, 56 deletions
diff --git a/source/blender/imbuf/intern/imageprocess.c b/source/blender/imbuf/intern/imageprocess.c index 4320f30884b..a9b6e2bbb88 100644 --- a/source/blender/imbuf/intern/imageprocess.c +++ b/source/blender/imbuf/intern/imageprocess.c @@ -412,42 +412,34 @@ static void imb_transform_calc_add_y(const float transform_matrix[3][3], typedef void (*InterpolationColorFunction)( struct ImBuf *in, unsigned char outI[4], float outF[4], float u, float v); BLI_INLINE void imb_transform_scanlines(const TransformUserData *user_data, - int start_scanline, - int num_scanlines, + int scanline, InterpolationColorFunction interpolation) { const int width = user_data->dst->x; - float next_line_start_uv[2]; - madd_v2_v2v2fl(next_line_start_uv, user_data->start_uv, user_data->add_y, start_scanline); + float uv[2]; + madd_v2_v2v2fl(uv, user_data->start_uv, user_data->add_y, scanline); unsigned char *outI = NULL; float *outF = NULL; - pixel_from_buffer(user_data->dst, &outI, &outF, 0, start_scanline); - - for (int yi = start_scanline; yi < start_scanline + num_scanlines; yi++) { - float uv[2]; - copy_v2_v2(uv, next_line_start_uv); - add_v2_v2(next_line_start_uv, user_data->add_y); - for (int xi = 0; xi < width; xi++) { - if (uv[0] >= user_data->src_crop.xmin && uv[0] < user_data->src_crop.xmax && - uv[1] >= user_data->src_crop.ymin && uv[1] < user_data->src_crop.ymax) { - interpolation(user_data->src, outI, outF, uv[0], uv[1]); - } - add_v2_v2(uv, user_data->add_x); - if (outI) { - outI += 4; - } - if (outF) { - outF += 4; - } + pixel_from_buffer(user_data->dst, &outI, &outF, 0, scanline); + + for (int xi = 0; xi < width; xi++) { + if (uv[0] >= user_data->src_crop.xmin && uv[0] < user_data->src_crop.xmax && + uv[1] >= user_data->src_crop.ymin && uv[1] < user_data->src_crop.ymax) { + interpolation(user_data->src, outI, outF, uv[0], uv[1]); + } + add_v2_v2(uv, user_data->add_x); + if (outI) { + outI += 4; + } + if (outF) { + outF += 4; } } } -static void imb_transform_nearest_scanlines(void *custom_data, - int start_scanline, - int num_scanlines) +static void imb_transform_nearest_scanlines(void *custom_data, int scanline) { const TransformUserData *user_data = custom_data; InterpolationColorFunction interpolation = NULL; @@ -457,12 +449,10 @@ static void imb_transform_nearest_scanlines(void *custom_data, else { interpolation = nearest_interpolation_color_char; } - imb_transform_scanlines(user_data, start_scanline, num_scanlines, interpolation); + imb_transform_scanlines(user_data, scanline, interpolation); } -static void imb_transform_bilinear_scanlines(void *custom_data, - int start_scanline, - int num_scanlines) +static void imb_transform_bilinear_scanlines(void *custom_data, int scanline) { const TransformUserData *user_data = custom_data; InterpolationColorFunction interpolation = NULL; @@ -472,7 +462,7 @@ static void imb_transform_bilinear_scanlines(void *custom_data, else if (user_data->dst->rect) { interpolation = bilinear_interpolation_color_char; } - imb_transform_scanlines(user_data, start_scanline, num_scanlines, interpolation); + imb_transform_scanlines(user_data, scanline, interpolation); } static ScanlineThreadFunc imb_transform_scanline_func(const eIMBInterpolationFilterMode filter) @@ -568,41 +558,28 @@ void IMB_processor_apply_threaded( typedef struct ScanlineGlobalData { void *custom_data; ScanlineThreadFunc do_thread; - int scanlines_per_task; - int total_scanlines; } ScanlineGlobalData; -static void processor_apply_scanline_func(TaskPool *__restrict pool, void *taskdata) +static void processor_apply_parallel(void *__restrict userdata, + const int scanline, + const TaskParallelTLS *__restrict UNUSED(tls)) { - ScanlineGlobalData *data = BLI_task_pool_user_data(pool); - int start_scanline = POINTER_AS_INT(taskdata); - int num_scanlines = min_ii(data->scanlines_per_task, data->total_scanlines - start_scanline); - data->do_thread(data->custom_data, start_scanline, num_scanlines); + ScanlineGlobalData *data = userdata; + data->do_thread(data->custom_data, scanline); } 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; - 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; - TaskPool *task_pool = BLI_task_pool_create(&data, TASK_PRIORITY_LOW, TASK_ISOLATION_ON); - for (int i = 0, start_line = 0; i < total_tasks; i++) { - BLI_task_pool_push( - task_pool, processor_apply_scanline_func, POINTER_FROM_INT(start_line), false, NULL); - start_line += scanlines_per_task; - } - - /* work and wait until tasks are done */ - BLI_task_pool_work_and_wait(task_pool); - - /* Free memory. */ - BLI_task_pool_free(task_pool); + TaskParallelSettings settings; + ScanlineGlobalData data = { + .do_thread = do_thread, + .custom_data = custom_data, + }; + + BLI_parallel_range_settings_defaults(&settings); + BLI_task_parallel_range(0, total_scanlines, &data, processor_apply_parallel, &settings); } /** \} */ |