[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