[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