[Bf-blender-cvs] [e941813e3c8] soc-2018-npr: Debugging small problem in threads, in lanpr_triangle_line_imagespace_intersection_v2()

Nick Wu noreply at git.blender.org
Fri Jul 27 09:59:35 CEST 2018


Commit: e941813e3c8bace99db02eec9fc39c58e852a527
Author: Nick Wu
Date:   Fri Jul 27 15:53:13 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rBe941813e3c8bace99db02eec9fc39c58e852a527

Debugging small problem in threads, in lanpr_triangle_line_imagespace_intersection_v2()

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

M	source/blender/draw/engines/lanpr/lanpr_all.h
M	source/blender/draw/engines/lanpr/lanpr_chain.c
M	source/blender/draw/engines/lanpr/lanpr_dpix.c
M	source/blender/draw/engines/lanpr/lanpr_engine.c
M	source/blender/draw/engines/lanpr/lanpr_ops.c

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

diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index faffecf4b9f..62c47163546 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -417,7 +417,7 @@ typedef struct LANPR_RenderTriangle {
 
 typedef struct LANPR_RenderTriangleThread {
 	struct LANPR_RenderTriangle Base;
-	struct LANPR_RenderLine *Testing[128];    //max thread support;
+	struct LANPR_RenderLine *Testing[127];    //max thread support;
 }LANPR_RenderTriangleThread;
 
 typedef struct LANPR_RenderElementLinkNode {
@@ -601,7 +601,7 @@ BLI_INLINE int lanpr_TrangleLineBoundBoxTest(LANPR_RenderTriangle *rt, LANPR_Ren
 }
 
 BLI_INLINE double tMatGetLinearRatio(real L, real R, real FromL);
-BLI_INLINE int lanpr_LineIntersectTest2d(tnsVector2d a1, tnsVector2d a2, tnsVector2d b1, tnsVector2d b2, double *aRatio) {
+BLI_INLINE int lanpr_LineIntersectTest2d(const double* a1, const double* a2, const double* b1, const double* b2, double *aRatio) {
 	double k1, k2;
 	double x;
 	double y;
diff --git a/source/blender/draw/engines/lanpr/lanpr_chain.c b/source/blender/draw/engines/lanpr/lanpr_chain.c
index 46bdd76cd21..45a1c2063c9 100644
--- a/source/blender/draw/engines/lanpr/lanpr_chain.c
+++ b/source/blender/draw/engines/lanpr/lanpr_chain.c
@@ -377,6 +377,7 @@ void lanpr_chain_generate_draw_command(LANPR_RenderBuffer *rb){
 
 	MEM_freeN(lengths);
 
+	if (rb->ChainDrawBatch) GPU_batch_discard(rb->ChainDrawBatch);
     rb->ChainDrawBatch = GPU_batch_create_ex(GPU_PRIM_LINES_ADJ, vbo, GPU_indexbuf_build(&elb), GPU_USAGE_DYNAMIC | GPU_BATCH_OWNS_VBO);
 
 }
\ No newline at end of file
diff --git a/source/blender/draw/engines/lanpr/lanpr_dpix.c b/source/blender/draw/engines/lanpr/lanpr_dpix.c
index b400a3f9a89..92346a17c8c 100644
--- a/source/blender/draw/engines/lanpr/lanpr_dpix.c
+++ b/source/blender/draw/engines/lanpr/lanpr_dpix.c
@@ -100,8 +100,8 @@ void lanpr_destroy_atlas(void *ved){
 	LANPR_StorageList *stl = ((LANPR_Data *)vedata)->stl;
 	LANPR_PassList *psl = ((LANPR_Data *)vedata)->psl;
 
-	DRW_pass_free(psl->dpix_transform_pass);
-	DRW_pass_free(psl->dpix_preview_pass);
+	//DRW_pass_free(psl->dpix_transform_pass);
+	//DRW_pass_free(psl->dpix_preview_pass);
 
 	GPU_framebuffer_free(fbl->dpix_transform);
 	GPU_framebuffer_free(fbl->dpix_preview);
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index 7d24e76348f..d408a138411 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -178,8 +178,8 @@ static void lanpr_engine_free(void){
 	LANPR_StorageList *stl = ((LANPR_Data *)vedata)->stl;
 	LANPR_PassList *psl = ((LANPR_Data *)vedata)->psl;
 
-	DRW_pass_free(psl->color_pass);
-	DRW_pass_free(psl->edge_intermediate);
+	//DRW_pass_free(psl->color_pass);
+	//DRW_pass_free(psl->edge_intermediate);
 
 	GPU_framebuffer_free(fbl->passes);
 	GPU_framebuffer_free(fbl->edge_intermediate);
@@ -560,7 +560,7 @@ static void lanpr_render_to_image(LANPR_Data *vedata, RenderEngine *engine, stru
 	                           BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
 	                           4, 0, rp->rect);
 
-	lanpr_engine_free();
+	//lanpr_engine_free();
 
 	lanpr_clear_render_flag();
 }
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/source/blender/draw/engines/lanpr/lanpr_ops.c
index eb8f8042dde..2d6bdc0f32d 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -51,7 +51,7 @@
 struct Object;
 
 
-int lanpr_triangle_line_imagespace_intersection_v2(LANPR_RenderTriangle *rt, LANPR_RenderLine *rl, Object *cam, tnsMatrix44d vp, real *CameraDir, double *From, double *To);
+int lanpr_triangle_line_imagespace_intersection_v2(SpinLock* spl, LANPR_RenderTriangle *rt, LANPR_RenderLine *rl, Object *cam, tnsMatrix44d vp, real *CameraDir, double *From, double *To);
 
 
 /* ====================================== base structures =========================================== */
@@ -770,14 +770,17 @@ void lanpr_calculate_single_line_occlusion(LANPR_RenderBuffer *rb, LANPR_RenderL
 
 	while (nba) {
 
+		
 		for (lip = nba->LinkedTriangles.pFirst; lip; lip = lip->pNext) {
 			rt = lip->p;
-			if (rt->Testing[ThreadID] == rl || rl->L->IntersectWith == (void *)rt || rl->R->IntersectWith == (void *)rt) continue;
+			if (rt->Testing[ThreadID] == rl || rl->L->IntersectWith == (void *)rt || rl->R->IntersectWith == (void *)rt)continue;
 			rt->Testing[ThreadID] = rl;
-			if (lanpr_triangle_line_imagespace_intersection_v2((void *)rt, rl, c, rb->ViewProjection, rb->ViewVector, &l, &r)) {
+			if (lanpr_triangle_line_imagespace_intersection_v2(&rb->csManagement,(void *)rt, rl, c, rb->ViewProjection, rb->ViewVector, &l, &r)) {
 				lanpr_cut_render_line(rb, rl, l, r);
 			}
 		}
+
+		
 		nba = lanpr_get_next_bounding_area(nba, rl, x, y, k, PositiveX, PositiveY, &x, &y);
 	}
 }
@@ -826,6 +829,7 @@ void lanpr_THREAD_calculate_line_occlusion_begin(LANPR_RenderBuffer *rb) {
 	}
 	BLI_task_pool_work_and_wait(tp);
 
+	MEM_freeN(rti);
 }
 
 void lanpr_NO_THREAD_calculate_line_occlusion(LANPR_RenderBuffer *rb) {
@@ -2025,7 +2029,7 @@ int lanpr_TriangleLineImageSpaceIntersectTestOnly(LANPR_RenderTriangle *rt, LANP
 
 	return 1;
 }
-int lanpr_triangle_line_imagespace_intersection_v2(LANPR_RenderTriangle *rt, LANPR_RenderLine *rl, Object *cam, tnsMatrix44d vp, real *CameraDir, double *From, double *To) {
+int lanpr_triangle_line_imagespace_intersection_v2(SpinLock* spl, LANPR_RenderTriangle *rt, LANPR_RenderLine *rl, Object *cam, tnsMatrix44d vp, real *CameraDir, double *From, double *To) {
 	double dl, dr;
 	double ratio;
 	double is[3] = { 0 };
@@ -2072,9 +2076,13 @@ int lanpr_triangle_line_imagespace_intersection_v2(LANPR_RenderTriangle *rt, LAN
 	if (lanpr_share_edge_direct(rt, rl))
 		return 0;
 
+	// XXX: not using lock will cause very few random calculation error if running in multiple threads.
+	//      lanpr_LineIntersectTest2d() doesn't even write data
+	//BLI_spin_lock(spl);
 	a = lanpr_LineIntersectTest2d(LFBC, RFBC, FBC0, FBC1, &is[0]);
 	b = lanpr_LineIntersectTest2d(LFBC, RFBC, FBC1, FBC2, &is[1]);
 	c = lanpr_LineIntersectTest2d(LFBC, RFBC, FBC2, FBC0, &is[2]);
+	//BLI_spin_unlock(spl);
 
 	INTERSECT_SORT_MIN_TO_MAX_3(is[0], is[1], is[2], order);
 
@@ -2614,12 +2622,15 @@ void lanpr_destroy_render_data(LANPR_RenderBuffer *rb) {
 	rb->MaterialManaged = 0;
 	rb->CreaseCount = 0;
 	rb->CreaseManaged = 0;
+	rb->EdgeMarkCount = 0;
+	rb->EdgeMarkManaged = 0;
 	rb->CalculationStatus = TNS_CALCULATION_IDLE;
 
 	lstEmptyDirect(&rb->Contours);
 	lstEmptyDirect(&rb->IntersectionLines);
 	lstEmptyDirect(&rb->CreaseLines);
 	lstEmptyDirect(&rb->MaterialLines);
+	lstEmptyDirect(&rb->EdgeMarks);
 	lstEmptyDirect(&rb->AllRenderLines);
 	lstEmptyDirect(&rb->Chains);



More information about the Bf-blender-cvs mailing list