[Bf-blender-cvs] [686ddc842cb] temp-lanpr-staging: LANPR: Bypass thread for LANPR calculations.
YimingWu
noreply at git.blender.org
Sun Aug 18 15:30:04 CEST 2019
Commit: 686ddc842cb4d2f77bb77b3b6addac7723cd833b
Author: YimingWu
Date: Sun Aug 18 21:22:36 2019 +0800
Branches: temp-lanpr-staging
https://developer.blender.org/rB686ddc842cb4d2f77bb77b3b6addac7723cd833b
LANPR: Bypass thread for LANPR calculations.
===================================================================
M source/blender/draw/engines/lanpr/lanpr_engine.c
M source/blender/editors/include/ED_lanpr.h
M source/blender/editors/lanpr/lanpr_cpu.c
===================================================================
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index 552618069f3..fe72fd516bd 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -426,16 +426,17 @@ static void lanpr_cache_init(void *vedata)
(!lanpr_share.render_buffer_shared ||
lanpr_share.render_buffer_shared->cached_for_frame != draw_ctx->scene->r.cfra)) {
if (draw_ctx->scene->lanpr.master_mode == LANPR_MASTER_MODE_SOFTWARE) {
- ED_lanpr_compute_feature_lines_internal(draw_ctx->depsgraph, 0);
- updated = 1;
+
+ ED_lanpr_compute_feature_lines_background(draw_ctx->depsgraph, 0);
}
else if (draw_ctx->scene->lanpr.master_mode == LANPR_MASTER_MODE_DPIX) {
- ED_lanpr_compute_feature_lines_internal(draw_ctx->depsgraph, 1);
+ ED_lanpr_compute_feature_lines_background(draw_ctx->depsgraph, 1);
}
}
- if (updated) {
+ if (ED_lanpr_calculation_flag_check(LANPR_RENDER_FINISHED)) {
ED_lanpr_rebuild_all_command(&draw_ctx->scene->lanpr);
+ ED_lanpr_calculation_set_flag(LANPR_RENDER_IDLE);
}
}
diff --git a/source/blender/editors/include/ED_lanpr.h b/source/blender/editors/include/ED_lanpr.h
index 1cebaf71868..785779f60fb 100644
--- a/source/blender/editors/include/ED_lanpr.h
+++ b/source/blender/editors/include/ED_lanpr.h
@@ -314,9 +314,8 @@ typedef struct LANPR_RenderBuffer {
typedef enum LANPR_RenderStatus{
LANPR_RENDER_IDLE = 0,
LANPR_RENDER_RUNNING = 1,
- LANPR_RENDER_CANCELED = 2,
- LANPR_RENDER_INCOMPELTE = 3,
- LANPR_RENDER_FINISHED = 4,
+ LANPR_RENDER_INCOMPELTE = 2,
+ LANPR_RENDER_FINISHED = 2,
}LANPR_RenderStatus;
typedef struct LANPR_SharedResource {
@@ -599,8 +598,13 @@ void ED_lanpr_discard_short_chains(LANPR_RenderBuffer *rb, float threshold);
int ED_lanpr_count_chain(LANPR_RenderLineChain *rlc);
void ED_lanpr_chain_clear_picked_flag(struct LANPR_RenderBuffer *rb);
+void ED_lanpr_calculation_set_flag(LANPR_RenderStatus flag);
+bool ED_lanpr_calculation_flag_check(LANPR_RenderStatus flag);
+
int ED_lanpr_compute_feature_lines_internal(struct Depsgraph *depsgraph, int instersections_only);
+void ED_lanpr_compute_feature_lines_background(struct Depsgraph* dg, int intersection_only);
+
LANPR_RenderBuffer *ED_lanpr_create_render_buffer(void);
void ED_lanpr_destroy_render_data(struct LANPR_RenderBuffer *rb);
diff --git a/source/blender/editors/lanpr/lanpr_cpu.c b/source/blender/editors/lanpr/lanpr_cpu.c
index cb32c57b6c4..07995ea6542 100644
--- a/source/blender/editors/lanpr/lanpr_cpu.c
+++ b/source/blender/editors/lanpr/lanpr_cpu.c
@@ -706,7 +706,7 @@ static bool lanpr_calculation_is_canceled(){
bool is_canceled;
BLI_spin_lock(&lanpr_share.lock_render_status);
switch(lanpr_share.flag_render_status){
- case LANPR_RENDER_CANCELED:
+ case LANPR_RENDER_INCOMPELTE:
is_canceled = true;
default:
is_canceled = false;
@@ -714,7 +714,7 @@ static bool lanpr_calculation_is_canceled(){
BLI_spin_unlock(&lanpr_share.lock_render_status);
return is_canceled;
}
-static void lanpr_THREAD_calculate_line_occlusion(TaskPool *__restrict UNUSED(pool),
+static void lanpr_calculate_line_occlusion_worker(TaskPool *__restrict UNUSED(pool),
LANPR_RenderTaskInfo *rti,
int UNUSED(threadid))
{
@@ -760,7 +760,7 @@ static void lanpr_THREAD_calculate_line_occlusion(TaskPool *__restrict UNUSED(po
if(lanpr_calculation_is_canceled()) return;
}
}
-static void lanpr_THREAD_calculate_line_occlusion_begin(LANPR_RenderBuffer *rb)
+static void lanpr_calculate_line_occlusion_begin(LANPR_RenderBuffer *rb)
{
int thread_count = rb->thread_count;
LANPR_RenderTaskInfo *rti = MEM_callocN(sizeof(LANPR_RenderTaskInfo) * thread_count,
@@ -779,7 +779,7 @@ static void lanpr_THREAD_calculate_line_occlusion_begin(LANPR_RenderBuffer *rb)
for (i = 0; i < thread_count; i++) {
rti[i].thread_id = i;
BLI_task_pool_push(tp,
- (TaskRunFunction)lanpr_THREAD_calculate_line_occlusion,
+ (TaskRunFunction)lanpr_calculate_line_occlusion_worker,
&rti[i],
0,
TASK_PRIORITY_HIGH);
@@ -2643,7 +2643,13 @@ LANPR_RenderBuffer *ED_lanpr_create_render_buffer(void)
void ED_lanpr_calculation_set_flag(LANPR_RenderStatus flag){
BLI_spin_lock(&lanpr_share.lock_render_status);
- lanpr_share.flag_render_status = flag;
+
+ if(flag == LANPR_RENDER_FINISHED && lanpr_share.flag_render_status==LANPR_RENDER_INCOMPELTE){
+ ;/* Don't set the finished flag when it's canceled from any one of the thread.*/
+ }else{
+ lanpr_share.flag_render_status = flag;
+ }
+
BLI_spin_unlock(&lanpr_share.lock_render_status);
}
@@ -3802,7 +3808,7 @@ int ED_lanpr_compute_feature_lines_internal(Depsgraph *depsgraph, int intersecto
ED_lanpr_update_render_progress("LANPR: Computing line occlusion.");
if (!intersectons_only) {
- lanpr_THREAD_calculate_line_occlusion_begin(rb);
+ lanpr_calculate_line_occlusion_begin(rb);
}
ED_lanpr_update_render_progress("LANPR: Chaining.");
@@ -3816,7 +3822,8 @@ int ED_lanpr_compute_feature_lines_internal(Depsgraph *depsgraph, int intersecto
if (is_lanpr_engine) {
/* Enough with it. We can provide an option after we have LANPR internal smoothing */
- return OPERATOR_CANCELLED;
+ ED_lanpr_calculation_set_flag(LANPR_RENDER_FINISHED);
+ return OPERATOR_FINISHED;
}
/* Below are simply for better GPencil experience. */
@@ -3837,8 +3844,42 @@ int ED_lanpr_compute_feature_lines_internal(Depsgraph *depsgraph, int intersecto
rb->cached_for_frame = rb->scene->r.cfra;
+ ED_lanpr_calculation_set_flag(LANPR_RENDER_FINISHED);
+
return OPERATOR_FINISHED;
}
+
+typedef struct LANPR_FeatureLineWorker{
+ Depsgraph* dg;
+ int intersection_only;
+}LANPR_FeatureLineWorker;
+
+static void lanpr_compute_feature_lines_worker(TaskPool *__restrict UNUSED(pool),
+ LANPR_FeatureLineWorker * worker_data,
+ int UNUSED(threadid))
+{
+ ED_lanpr_compute_feature_lines_internal(worker_data->dg, worker_data->intersection_only);
+}
+
+void ED_lanpr_compute_feature_lines_background(Depsgraph* dg, int intersection_only){
+ /* If the calculation is already started then bypass it. */
+ if (!ED_lanpr_calculation_flag_check(LANPR_RENDER_IDLE)){
+ return;
+ }
+
+ ED_lanpr_calculation_set_flag(LANPR_RENDER_RUNNING);
+
+ LANPR_FeatureLineWorker *flw = MEM_callocN(sizeof(LANPR_FeatureLineWorker), "Task Pool");
+ TaskScheduler *scheduler = BLI_task_scheduler_get();
+
+ flw->dg = dg;
+ flw->intersection_only = intersection_only;
+
+ TaskPool* tp = BLI_task_pool_create_background(scheduler, flw);
+
+ BLI_task_pool_push(tp,lanpr_compute_feature_lines_worker,flw,true,TASK_PRIORITY_HIGH);
+}
+
static bool lanpr_camera_exists(struct bContext *c)
{
Scene *s = CTX_data_scene(c);
More information about the Bf-blender-cvs
mailing list