[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45675] trunk/blender/source: make scanfill threadsafe ( wasnt threadsafe before BMesh merge but before the merge it didn' t need to be) - now rendering uses its better if its threadsafe.

Campbell Barton ideasman42 at gmail.com
Mon Apr 16 08:48:58 CEST 2012


Revision: 45675
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45675
Author:   campbellbarton
Date:     2012-04-16 06:48:57 +0000 (Mon, 16 Apr 2012)
Log Message:
-----------
make scanfill threadsafe (wasnt threadsafe before BMesh merge but before the merge it didn't need to be) - now rendering uses its better if its threadsafe.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/blenlib/BLI_scanfill.h
    trunk/blender/source/blender/blenlib/BLI_threads.h
    trunk/blender/source/blender/blenlib/intern/scanfill.c
    trunk/blender/source/blender/blenlib/intern/threads.c
    trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c
    trunk/blender/source/blender/editors/mesh/editmesh_knife.c
    trunk/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c
    trunk/blender/source/blender/windowmanager/intern/wm_gesture.c
    trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c
    trunk/blender/source/creator/creator.c

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2012-04-16 05:23:40 UTC (rev 45674)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2012-04-16 06:48:57 UTC (rev 45675)
@@ -416,6 +416,7 @@
 
 void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
 {
+	ScanFillContext sf_ctx;
 	ScanFillVert *eve, *v1, *vlast;
 	ScanFillFace *efa;
 	DispList *dlnew=NULL, *dl;
@@ -431,7 +432,7 @@
 		totvert= 0;
 		nextcol= 0;
 		
-		BLI_begin_edgefill();
+		BLI_begin_edgefill(&sf_ctx);
 		
 		dl= dispbase->first;
 		while (dl) {
@@ -448,18 +449,18 @@
 						while (a--) {
 							vlast= eve;
 
-							eve= BLI_addfillvert(f1);
+							eve = BLI_addfillvert(&sf_ctx, f1);
 							totvert++;
 
 							if (vlast==NULL) v1= eve;
 							else {
-								BLI_addfilledge(vlast, eve);
+								BLI_addfilledge(&sf_ctx, vlast, eve);
 							}
 							f1+=3;
 						}
 
 						if (eve!=NULL && v1!=NULL) {
-							BLI_addfilledge(eve, v1);
+							BLI_addfilledge(&sf_ctx, eve, v1);
 						}
 					}
 					else if (colnr<dl->col) {
@@ -472,7 +473,7 @@
 			dl= dl->next;
 		}
 		
-		if (totvert && (tot= BLI_edgefill(FALSE))) { // XXX (obedit && obedit->actcol)?(obedit->actcol-1):0)) {
+		if (totvert && (tot= BLI_edgefill(&sf_ctx, FALSE))) { // XXX (obedit && obedit->actcol)?(obedit->actcol-1):0)) {
 			if (tot) {
 				dlnew= MEM_callocN(sizeof(DispList), "filldisplist");
 				dlnew->type= DL_INDEX3;
@@ -486,7 +487,7 @@
 				/* vert data */
 				f1= dlnew->verts;
 				totvert= 0;
-				eve= fillvertbase.first;
+				eve= sf_ctx.fillvertbase.first;
 				while (eve) {
 					copy_v3_v3(f1, eve->co);
 					f1+= 3;
@@ -499,7 +500,7 @@
 				}
 				
 				/* index data */
-				efa= fillfacebase.first;
+				efa = sf_ctx.fillfacebase.first;
 				index= dlnew->index;
 				while (efa) {
 					index[0]= (intptr_t)efa->v1->tmp.l;
@@ -517,7 +518,7 @@
 			BLI_addhead(to, dlnew);
 			
 		}
-		BLI_end_edgefill();
+		BLI_end_edgefill(&sf_ctx);
 
 		if (nextcol) {
 			/* stay at current char but fill polys with next material */

Modified: trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c	2012-04-16 05:23:40 UTC (rev 45674)
+++ trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c	2012-04-16 06:48:57 UTC (rev 45675)
@@ -120,6 +120,8 @@
 	BMLoop *l;
 	int i = 0, j;
 
+	ScanFillContext sf_ctx;
+
 #if 0
 	/* note, we could be clever and re-use this array but would need to ensure
 	 * its realloced at some point, for now just free it */
@@ -195,18 +197,18 @@
 			ScanFillFace *efa;
 			int totfilltri;
 
-			BLI_begin_edgefill();
+			BLI_begin_edgefill(&sf_ctx);
 			/*scanfill time*/
 			l = BM_iter_new(&liter, bm, BM_LOOPS_OF_FACE, f);
 			for (j=0; l; l=BM_iter_step(&liter), j++) {
 				/*mark order*/
 				BM_elem_index_set(l, j); /* set_loop */
 
-				v = BLI_addfillvert(l->v->co);
+				v = BLI_addfillvert(&sf_ctx, l->v->co);
 				v->tmp.p = l;
 
 				if (lastv) {
-					/* e = */ BLI_addfilledge(lastv, v);
+					/* e = */ BLI_addfilledge(&sf_ctx, lastv, v);
 				}
 
 				lastv = v;
@@ -214,12 +216,12 @@
 			}
 
 			/*complete the loop*/
-			BLI_addfilledge(firstv, v);
+			BLI_addfilledge(&sf_ctx, firstv, v);
 
-			totfilltri = BLI_edgefill(FALSE);
+			totfilltri = BLI_edgefill(&sf_ctx, FALSE);
 			BLI_array_growitems(looptris, totfilltri);
 
-			for (efa = fillfacebase.first; efa; efa=efa->next) {
+			for (efa = sf_ctx.fillfacebase.first; efa; efa=efa->next) {
 				BMLoop *l1= efa->v1->tmp.p;
 				BMLoop *l2= efa->v2->tmp.p;
 				BMLoop *l3= efa->v3->tmp.p;
@@ -234,7 +236,7 @@
 				i += 1;
 			}
 
-			BLI_end_edgefill();
+			BLI_end_edgefill(&sf_ctx);
 		}
 	}
 

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-04-16 05:23:40 UTC (rev 45674)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-04-16 06:48:57 UTC (rev 45675)
@@ -2354,7 +2354,6 @@
                             * we can skip copying here */
                            const int do_face_nor_cpy)
 {
-
 	/* use this to avoid locking pthread for _every_ polygon
 	 * and calling the fill function */
 
@@ -2368,6 +2367,7 @@
 	MLoop *ml, *mloop;
 	MFace *mface = NULL, *mf;
 	BLI_array_declare(mface);
+	ScanFillContext sf_ctx;
 	ScanFillVert *v, *lastv, *firstv;
 	ScanFillFace *f;
 	int *mface_orig_index = NULL;
@@ -2461,24 +2461,24 @@
 
 			ml = mloop + mp->loopstart;
 			
-			BLI_begin_edgefill();
+			BLI_begin_edgefill(&sf_ctx);
 			firstv = NULL;
 			lastv = NULL;
 			for (j=0; j<mp->totloop; j++, ml++) {
-				v = BLI_addfillvert(mvert[ml->v].co);
+				v = BLI_addfillvert(&sf_ctx, mvert[ml->v].co);
 	
 				v->keyindex = mp->loopstart + j;
 	
 				if (lastv)
-					BLI_addfilledge(lastv, v);
+					BLI_addfilledge(&sf_ctx, lastv, v);
 	
 				if (!firstv)
 					firstv = v;
 				lastv = v;
 			}
-			BLI_addfilledge(lastv, firstv);
+			BLI_addfilledge(&sf_ctx, lastv, firstv);
 			
-			totfilltri = BLI_edgefill(FALSE);
+			totfilltri = BLI_edgefill(&sf_ctx, FALSE);
 			if (totfilltri) {
 				BLI_array_growitems(mface_to_poly_map, totfilltri);
 				BLI_array_growitems(mface, totfilltri);
@@ -2486,7 +2486,7 @@
 					BLI_array_growitems(mface_orig_index, totfilltri);
 				}
 
-				for (f = fillfacebase.first; f; f = f->next, mf++) {
+				for (f = sf_ctx.fillfacebase.first; f; f = f->next, mf++) {
 					mface_to_poly_map[mface_index] = poly_index;
 					mf= &mface[mface_index];
 
@@ -2511,7 +2511,7 @@
 				}
 			}
 	
-			BLI_end_edgefill();
+			BLI_end_edgefill(&sf_ctx);
 		}
 	}
 

Modified: trunk/blender/source/blender/blenlib/BLI_scanfill.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_scanfill.h	2012-04-16 05:23:40 UTC (rev 45674)
+++ trunk/blender/source/blender/blenlib/BLI_scanfill.h	2012-04-16 06:48:57 UTC (rev 45675)
@@ -35,19 +35,31 @@
  *  \brief Filling meshes.
  */
 
-/**
- * \attention Defined in scanfill.c
- */
-extern struct ListBase fillvertbase;
-extern struct ListBase filledgebase;
-extern struct ListBase fillfacebase;
-
 struct ScanFillVert;
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+typedef struct ScanFillContext
+{
+	ListBase fillvertbase;
+	ListBase filledgebase;
+	ListBase fillfacebase;
+
+	/* simple optimization for allocating thousands of small memory blocks
+	 * only to be used within loops, and not by one function at a time
+	 * free in the end, with argument '-1'
+	 */
+	#define MEM_ELEM_BLOCKSIZE 16384
+	struct mem_elements *melem__cur;
+	int melem__offs;                   /* the current free address */
+	ListBase melem__lb;
+
+	/* private */
+	struct ScanFillVertLink *_scdata;
+} ScanFillContext;
+
 /* note; changing this also might affect the undo copy in editmesh.c */
 typedef struct ScanFillVert
 {
@@ -57,7 +69,8 @@
 		void            *p;
 		intptr_t         l;
 	} tmp;
-	float co[3]; /*vertex location */
+	float co[3]; /* vertex location */
+	float xy[2]; /* 2D copy of vertex location (using dominant axis) */
 	int keyindex; /* original index #, for restoring  key information */
 	short poly_nr;
 	unsigned char f, h;
@@ -78,16 +91,16 @@
 } ScanFillFace;
 
 /* scanfill.c: used in displist only... */
-struct ScanFillVert *BLI_addfillvert(const float vec[3]);
-struct ScanFillEdge *BLI_addfilledge(struct ScanFillVert *v1, struct ScanFillVert *v2);
+struct ScanFillVert *BLI_addfillvert(ScanFillContext *sf_ctx, const float vec[3]);
+struct ScanFillEdge *BLI_addfilledge(ScanFillContext *sf_ctx, struct ScanFillVert *v1, struct ScanFillVert *v2);
 
 /* Optionally set ScanFillEdge f to this to mark original boundary edges.
  * Only needed if there are internal diagonal edges passed to BLI_edgefill. */
 #define FILLBOUNDARY 1
 
-int BLI_begin_edgefill(void);
-int BLI_edgefill(const short do_quad_tri_speedup);
-void BLI_end_edgefill(void);
+int BLI_begin_edgefill(ScanFillContext *sf_ctx);
+int BLI_edgefill(ScanFillContext *sf_ctx, const short do_quad_tri_speedup);
+void BLI_end_edgefill(ScanFillContext *sf_ctx);
 
 /* These callbacks are needed to make the lib finction properly */
 
@@ -109,8 +122,6 @@
  */
 void BLI_setInterruptCallBack(int (*f)(void));
 
-void BLI_scanfill_free(void);
-
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/blender/source/blender/blenlib/BLI_threads.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_threads.h	2012-04-16 05:23:40 UTC (rev 45674)
+++ trunk/blender/source/blender/blenlib/BLI_threads.h	2012-04-16 06:48:57 UTC (rev 45675)
@@ -76,7 +76,6 @@
 #define LOCK_OPENGL		5
 #define LOCK_NODES		6
 #define LOCK_MOVIECLIP	7
-#define LOCK_SCANFILL	8
 
 void	BLI_lock_thread(int type);
 void	BLI_unlock_thread(int type);

Modified: trunk/blender/source/blender/blenlib/intern/scanfill.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/scanfill.c	2012-04-16 05:23:40 UTC (rev 45674)
+++ trunk/blender/source/blender/blenlib/intern/scanfill.c	2012-04-16 06:48:57 UTC (rev 45675)
@@ -42,7 +42,6 @@
 #include "BLI_math.h"
 #include "BLI_scanfill.h"
 #include "BLI_utildefines.h"
-#include "BLI_threads.h"
 
 /* callbacks for errors and interrupts and some goo */
 static void (*BLI_localErrorCallBack)(const char *) = NULL;
@@ -82,7 +81,7 @@
 /* local types */
 typedef struct PolyFill {
 	int edges, verts;
-	float min[3], max[3];
+	float min_xy[2], max_xy[2];
 	short f, nr;
 } PolyFill;
 
@@ -96,14 +95,6 @@
 
 #define COMPLIMIT   0.00003f
 
-static ScanFillVertLink *scdata;
-
-ListBase fillvertbase = {NULL, NULL};
-ListBase filledgebase = {NULL, NULL};
-ListBase fillfacebase = {NULL, NULL};
-
-static int cox, coy;
-
 /* ****  FUNCTIONS FOR QSORT *************************** */
 
 
@@ -111,10 +102,10 @@
 {
 	const ScanFillVertLink *x1 = a1, *x2 = a2;
 	
-	if      (x1->v1->co[coy] < x2->v1->co[coy]) return  1;
-	else if (x1->v1->co[coy] > x2->v1->co[coy]) return -1;
-	else if (x1->v1->co[cox] > x2->v1->co[cox]) return  1;
-	else if (x1->v1->co[cox] < x2->v1->co[cox]) return -1;
+	if      (x1->v1->xy[1] < x2->v1->xy[1]) return  1;
+	else if (x1->v1->xy[1] > x2->v1->xy[1]) return -1;
+	else if (x1->v1->xy[0] > x2->v1->xy[0]) return  1;
+	else if (x1->v1->xy[0] < x2->v1->xy[0]) return -1;
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list