[Bf-blender-cvs] [fd49ce1d7b5] soc-2018-npr: Fixed hidden multi-thread error.
Yiming Wu
noreply at git.blender.org
Sat Dec 29 14:31:42 CET 2018
Commit: fd49ce1d7b5866c498c1c9002ef98320d64d6907
Author: Yiming Wu
Date: Sat Dec 29 21:31:32 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rBfd49ce1d7b5866c498c1c9002ef98320d64d6907
Fixed hidden multi-thread error.
===================================================================
M source/blender/draw/engines/lanpr/lanpr_ops.c
===================================================================
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/source/blender/draw/engines/lanpr/lanpr_ops.c
index 840856502e8..08f50a89f14 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -58,11 +58,11 @@ int use_smooth_contour_modifier_contour = 0; // debug purpose
/* ====================================== base structures =========================================== */
#define TNS_BOUND_AREA_CROSSES(b1, b2) \
- ((b1)[0] < (b2)[1] && (b1)[1] > (b2)[0] && (b1)[3] < (b2)[2] && (b1)[2] > (b2)[3])
+ ((b1)[0] <= (b2)[1] && (b1)[1] >= (b2)[0] && (b1)[3] <= (b2)[2] && (b1)[2] >= (b2)[3])
void lanpr_make_initial_bounding_areas(LANPR_RenderBuffer *rb) {
- int sp_w = 20;
- int sp_h = rb->H / (rb->W / sp_w);
+ int sp_w = 4;//20;
+ int sp_h = 4;//rb->H / (rb->W / sp_w);
int row, col;
LANPR_BoundingArea *ba;
real W = (real)rb->W;
@@ -80,7 +80,7 @@ void lanpr_make_initial_bounding_areas(LANPR_RenderBuffer *rb) {
for (row = 0; row < sp_h; row++) {
for (col = 0; col < sp_w; col++) {
- ba = &rb->InitialBoundingAreas[row * 20 + col];
+ ba = &rb->InitialBoundingAreas[row * 4 + col];
ba->L = span_w * col - 1.0;
ba->R = (col == sp_w - 1) ? 1.0 : (span_w * (col + 1) - 1.0);
@@ -91,16 +91,16 @@ void lanpr_make_initial_bounding_areas(LANPR_RenderBuffer *rb) {
ba->CY = (ba->U + ba->B) / 2;
if (row) {
- list_append_pointer_static(&ba->UP, &rb->RenderDataPool, &rb->InitialBoundingAreas[(row - 1) * 20 + col]);
+ list_append_pointer_static(&ba->UP, &rb->RenderDataPool, &rb->InitialBoundingAreas[(row - 1) * 4 + col]);
}
if (col) {
- list_append_pointer_static(&ba->LP, &rb->RenderDataPool, &rb->InitialBoundingAreas[row * 20 + col - 1]);
+ list_append_pointer_static(&ba->LP, &rb->RenderDataPool, &rb->InitialBoundingAreas[row * 4 + col - 1]);
}
if (row != sp_h - 1) {
- list_append_pointer_static(&ba->BP, &rb->RenderDataPool, &rb->InitialBoundingAreas[(row + 1) * 20 + col]);
+ list_append_pointer_static(&ba->BP, &rb->RenderDataPool, &rb->InitialBoundingAreas[(row + 1) * 4 + col]);
}
if (col != sp_w - 1) {
- list_append_pointer_static(&ba->RP, &rb->RenderDataPool, &rb->InitialBoundingAreas[row * 20 + col + 1]);
+ list_append_pointer_static(&ba->RP, &rb->RenderDataPool, &rb->InitialBoundingAreas[row * 4 + col + 1]);
}
}
}
@@ -395,7 +395,7 @@ LANPR_BoundingArea *lanpr_get_point_bounding_area(LANPR_RenderBuffer *rb, real x
if (col < 0) col = 0;
if (row < 0) row = 0;
- return &rb->InitialBoundingAreas[row * 20 + col];
+ return &rb->InitialBoundingAreas[row * 4 + col];
}
void lanpr_add_triangles(LANPR_RenderBuffer *rb) {
LANPR_RenderElementLinkNode *reln;
@@ -430,7 +430,7 @@ void lanpr_add_triangles(LANPR_RenderBuffer *rb) {
if (lanpr_get_triangle_bounding_areas(rb, rt, &y1, &y2, &x1, &x2)) {
for (co = x1; co <= x2; co++) {
for (r = y1; r <= y2; r++) {
- lanpr_link_triangle_with_bounding_area(rb, &rb->InitialBoundingAreas[r * 20 + co], rt, 0, 1);
+ lanpr_link_triangle_with_bounding_area(rb, &rb->InitialBoundingAreas[r * 4 + co], rt, 0, 1);
}
}
}
@@ -578,7 +578,7 @@ LANPR_BoundingArea *lanpr_get_bounding_area(LANPR_RenderBuffer *rb, real x, real
if (r >= rb->TileCountY) r = rb->TileCountY - 1;
if (c >= rb->TileCountX) c = rb->TileCountX - 1;
- iba = &rb->InitialBoundingAreas[r * 20 + c];
+ iba = &rb->InitialBoundingAreas[r * 4 + c];
while (iba->Child) {
if (x > iba->CX) {
if (y > iba->CY) iba = &iba->Child[0];
@@ -2115,7 +2115,7 @@ int lanpr_triangle_line_imagespace_intersection_v2(SpinLock *spl, LANPR_RenderTr
tnsVector3d LV;
tnsVector3d RV;
tnsVector4d vd4;
- real *CV = CameraDir;
+ real CV[3];
real DotL, DotR, DotLA, DotRA;
real DotF;
LANPR_RenderVert *Result, *rv;
@@ -2145,13 +2145,9 @@ int lanpr_triangle_line_imagespace_intersection_v2(SpinLock *spl, LANPR_RenderTr
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);
//printf("abc: %d %d %d\n", a,b,c);
@@ -2160,6 +2156,8 @@ int lanpr_triangle_line_imagespace_intersection_v2(SpinLock *spl, LANPR_RenderTr
tMatVectorMinus3d(LV, rl->L->GLocation, rt->V[0]->GLocation);
tMatVectorMinus3d(RV, rl->R->GLocation, rt->V[0]->GLocation);
+ tMatVectorCopy3d(CameraDir,CV);
+
tMatVectorConvert4fd(cam->obmat[3], vd4);
if (((Camera *)cam->data)->type == CAM_PERSP) tMatVectorMinus3d(CV, vd4, rt->V[0]->GLocation);
@@ -2497,11 +2495,13 @@ LANPR_RenderLine *lanpr_triangle_generate_intersection_line_only(LANPR_RenderBuf
if (lanpr_get_line_bounding_areas(rb, Result, &r1, &r2, &c1, &c2)) {
for (row = r1; row != r2 + 1; row++) {
for (col = c1; col != c2 + 1; col++) {
- lanpr_link_line_with_bounding_area(rb, &rb->InitialBoundingAreas[row * 20 + col], Result);
+ lanpr_link_line_with_bounding_area(rb, &rb->InitialBoundingAreas[row * 4 + col], Result);
}
}
}
+ //printf("Intersection (%f %f)-(%f %f)\n",Result->L->FrameBufferCoord[0], Result->L->FrameBufferCoord[1],Result->R->FrameBufferCoord[0], Result->R->FrameBufferCoord[1]);
+
//tnsglobal_TriangleIntersectionCount++;
rb->IntersectionCount++;
@@ -2668,7 +2668,7 @@ void lanpr_compute_scene_contours(LANPR_RenderBuffer *rb, float threshold) {
if (lanpr_get_line_bounding_areas(rb, rl, &r1, &r2, &c1, &c2)) {
for (row = r1; row != r2 + 1; row++) {
for (col = c1; col != c2 + 1; col++) {
- lanpr_link_line_with_bounding_area(rb, &rb->InitialBoundingAreas[row * 20 + col], rl);
+ lanpr_link_line_with_bounding_area(rb, &rb->InitialBoundingAreas[row * 4 + col], rl);
}
}
}
More information about the Bf-blender-cvs
mailing list