Revision: 23027 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23027 Author: joeedh Date: 2009-09-06 04:43:36 +0200 (Sun, 06 Sep 2009)
Log Message: ----------- more optimization stuff. transformed a few functions into macro that profiling showed were taking a bunch of time. also have some work-in-progress (if disabled) stuff related to inlining, which I'm trying to get working but may be too much trouble. Modified Paths: -------------- branches/bmesh/blender/source/blender/blenkernel/BKE_utildefines.h branches/bmesh/blender/source/blender/blenlib/BLI_ghash.h branches/bmesh/blender/source/blender/blenlib/intern/BLI_ghash.c branches/bmesh/blender/source/blender/blenlib/intern/BLI_mempool.c branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c branches/bmesh/blender/source/blender/bmesh/operators/removedoubles.c branches/bmesh/blender/source/blender/editors/transform/transform_conversions.c branches/bmesh/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_utildefines.h =================================================================== --- branches/bmesh/blender/source/blender/blenkernel/BKE_utildefines.h 2009-09-06 01:51:23 UTC (rev 23026) +++ branches/bmesh/blender/source/blender/blenkernel/BKE_utildefines.h 2009-09-06 02:43:36 UTC (rev 23027) @@ -239,5 +239,14 @@ free the memory.*/ #define V_RESET(vec) _##vec##_count=0 +/*little macro so inline keyword works*/ +#if defined(_MSC_VER) +#define BM_INLINE //__forceinline +#else +#define BM_INLINE inline #endif +#define BMEMSET(mem, val, size) {int _i; char *_c = mem; for (_i=0; _i<size; _i++) *_c++ = val;} + +#endif + Modified: branches/bmesh/blender/source/blender/blenlib/BLI_ghash.h =================================================================== --- branches/bmesh/blender/source/blender/blenlib/BLI_ghash.h 2009-09-06 01:51:23 UTC (rev 23026) +++ branches/bmesh/blender/source/blender/blenlib/BLI_ghash.h 2009-09-06 02:43:36 UTC (rev 23027) @@ -32,27 +32,41 @@ #ifndef BLI_GHASH_H #define BLI_GHASH_H -struct GHash; -typedef struct GHash GHash; +#include "BKE_utildefines.h" +typedef unsigned int (*GHashHashFP) (void *key); +typedef int (*GHashCmpFP) (void *a, void *b); +typedef void (*GHashKeyFreeFP) (void *key); +typedef void (*GHashValFreeFP) (void *val); + +typedef struct Entry { + struct Entry *next; + + void *key, *val; +} Entry; + +typedef struct GHash { + GHashHashFP hashfp; + GHashCmpFP cmpfp; + + Entry **buckets; + struct BLI_mempool *entrypool; + int nbuckets, nentries, cursize; +} GHash; + typedef struct GHashIterator { GHash *gh; int curBucket; struct Entry *curEntry; } GHashIterator; -typedef unsigned int (*GHashHashFP) (void *key); -typedef int (*GHashCmpFP) (void *a, void *b); -typedef void (*GHashKeyFreeFP) (void *key); -typedef void (*GHashValFreeFP) (void *val); - GHash* BLI_ghash_new (GHashHashFP hashfp, GHashCmpFP cmpfp); void BLI_ghash_free (GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp); -void BLI_ghash_insert (GHash *gh, void *key, void *val); -int BLI_ghash_remove (GHash *gh, void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp); -void* BLI_ghash_lookup (GHash *gh, void *key); -int BLI_ghash_haskey (GHash *gh, void *key); +BM_INLINE void BLI_ghash_insert (GHash *gh, void *key, void *val); +BM_INLINE int BLI_ghash_remove (GHash *gh, void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp); +BM_INLINE void* BLI_ghash_lookup (GHash *gh, void *key); +BM_INLINE int BLI_ghash_haskey (GHash *gh, void *key); int BLI_ghash_size (GHash *gh); @@ -127,3 +141,29 @@ #endif +/*begin of macro-inlined functions*/ +extern unsigned int hashsizes[]; + +#define BLI_ghash_insert(gh, _k, _v){\ + unsigned int _hash= (gh)->hashfp(_k)%gh->nbuckets;\ + Entry *_e= BLI_mempool_alloc((gh)->entrypool);\ + _e->key= _k;\ + _e->val= _v;\ + _e->next= (gh)->buckets[_hash];\ + (gh)->buckets[_hash]= _e;\ + if (++(gh)->nentries>(gh)->nbuckets*3) {\ + Entry *_e, **_old= (gh)->buckets;\ + int _i, _nold= (gh)->nbuckets;\ + (gh)->nbuckets= hashsizes[++(gh)->cursize];\ + (gh)->buckets= malloc((gh)->nbuckets*sizeof(*(gh)->buckets));\ + memset((gh)->buckets, 0, (gh)->nbuckets*sizeof(*(gh)->buckets));\ + for (_i=0; _i<_nold; _i++) {\ + for (_e= _old[_i]; _e;) {\ + Entry *_n= _e->next;\ + _hash= (gh)->hashfp(_e->key)%(gh)->nbuckets;\ + _e->next= (gh)->buckets[_hash];\ + (gh)->buckets[_hash]= _e;\ + _e= _n;\ + }\ + }\ + free(_old); } } Modified: branches/bmesh/blender/source/blender/blenlib/intern/BLI_ghash.c =================================================================== --- branches/bmesh/blender/source/blender/blenlib/intern/BLI_ghash.c 2009-09-06 01:51:23 UTC (rev 23026) +++ branches/bmesh/blender/source/blender/blenlib/intern/BLI_ghash.c 2009-09-06 02:43:36 UTC (rev 23027) @@ -37,13 +37,15 @@ #include "BLO_sys_types.h" // for intptr_t support +#include "BKE_utildefines.h" + #ifdef HAVE_CONFIG_H #include <config.h> #endif /***/ -static unsigned int hashsizes[]= { +unsigned int hashsizes[]= { 1, 3, 5, 11, 17, 37, 67, 131, 257, 521, 1031, 2053, 4099, 8209, 16411, 32771, 65537, 131101, 262147, 524309, 1048583, 2097169, 4194319, 8388617, 16777259, 33554467, 67108879, 134217757, @@ -52,29 +54,13 @@ /***/ -typedef struct Entry Entry; -struct Entry { - Entry *next; - - void *key, *val; -}; - -struct GHash { - GHashHashFP hashfp; - GHashCmpFP cmpfp; - - Entry **buckets; - struct BLI_mempool *entrypool; - int nbuckets, nentries, cursize; -}; - /***/ GHash *BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp) { GHash *gh= MEM_mallocN(sizeof(*gh), "GHash"); gh->hashfp= hashfp; gh->cmpfp= cmpfp; - gh->entrypool = BLI_mempool_create(sizeof(Entry), 1, 32); + gh->entrypool = BLI_mempool_create(sizeof(Entry), 1024, 1024); gh->cursize= 0; gh->nentries= 0; @@ -86,7 +72,11 @@ return gh; } -void BLI_ghash_insert(GHash *gh, void *key, void *val) { +#ifdef BLI_ghash_insert +#undef BLI_ghash_insert +#endif + +BM_INLINE void BLI_ghash_insert(GHash *gh, void *key, void *val) { unsigned int hash= gh->hashfp(key)%gh->nbuckets; Entry *e= BLI_mempool_alloc(gh->entrypool); @@ -119,7 +109,7 @@ } } -void* BLI_ghash_lookup(GHash *gh, void *key) +BM_INLINE void* BLI_ghash_lookup(GHash *gh, void *key) { if(gh) { unsigned int hash= gh->hashfp(key)%gh->nbuckets; @@ -132,7 +122,7 @@ return NULL; } -int BLI_ghash_remove (GHash *gh, void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp) +BM_INLINE int BLI_ghash_remove (GHash *gh, void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp) { unsigned int hash= gh->hashfp(key)%gh->nbuckets; Entry *e; @@ -162,7 +152,7 @@ return 0; } -int BLI_ghash_haskey(GHash *gh, void *key) { +BM_INLINE int BLI_ghash_haskey(GHash *gh, void *key) { unsigned int hash= gh->hashfp(key)%gh->nbuckets; Entry *e; Modified: branches/bmesh/blender/source/blender/blenlib/intern/BLI_mempool.c =================================================================== --- branches/bmesh/blender/source/blender/blenlib/intern/BLI_mempool.c 2009-09-06 01:51:23 UTC (rev 23026) +++ branches/bmesh/blender/source/blender/blenlib/intern/BLI_mempool.c 2009-09-06 02:43:36 UTC (rev 23027) @@ -31,9 +31,14 @@ */ #include "MEM_guardedalloc.h" + +#include "BKE_utildefines.h" + #include "BLI_blenlib.h" +#include "BLI_linklist.h" + #include "DNA_listBase.h" -#include "BLI_linklist.h" + #include <string.h> typedef struct BLI_freenode{ @@ -122,7 +127,7 @@ void *BLI_mempool_calloc(BLI_mempool *pool){ void *retval=NULL; retval = BLI_mempool_alloc(pool); - memset(retval, 0, pool->esize); + BMEMSET(retval, 0, pool->esize); return retval; } Modified: branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c =================================================================== --- branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c 2009-09-06 01:51:23 UTC (rev 23026) +++ branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c 2009-09-06 02:43:36 UTC (rev 23027) @@ -31,6 +31,7 @@ #include <stdio.h> #include <math.h> #include <stdlib.h> +#include <string.h> #include "MEM_guardedalloc.h" @@ -154,7 +155,7 @@ { int blocksize= 16384; static int offs= 0; /* the current free adress */ - static struct mem_elements *cur= 0; + static struct mem_elements *cur= 0, *first; static ListBase lb= {0, 0}; void *adr; @@ -162,6 +163,10 @@ printf("incorrect use of new_mem_element\n"); } else if(size== -1) { + /*keep the first block*/ + first = lb.first; + BLI_remlink(&lb, first); + cur= lb.first; while(cur) { MEM_freeN(cur->data); @@ -169,6 +174,12 @@ } BLI_freelistN(&lb); + /*reset the block we're keeping*/ + BLI_addtail(&lb, first); + memset(first->data, 0, blocksize); + cur = first; + offs = 0; + return NULL; } @@ -770,6 +781,7 @@ - struct elements xs en ys are not used here: don't hide stuff in it - edge flag ->f becomes 2 when it's a new edge - mode: & 1 is check for crossings, then create edges (TO DO ) + - mode: & 2 is enable shortest diagonal test for quads */ ListBase tempve, temped; EditVert *eve; @@ -798,17 +810,22 @@ float vec1[3], vec2[3]; eve = fillvertbase.first; - - /*use shortest diagonal for quad*/ - VecSubf(vec1, eve->co, eve->next->next->co); - VecSubf(vec2, eve->next->co, eve->next->next->next->co); - - if (INPR(vec1, vec1) < INPR(vec2, vec2)) { - addfillface(eve, eve->next, eve->next->next, 0); - addfillface(eve->next->next, eve->next->next->next, eve, 0); + + if (mode & 2) { + /*use shortest diagonal for quad*/ + VecSubf(vec1, eve->co, eve->next->next->co); + VecSubf(vec2, eve->next->co, eve->next->next->next->co); + + if (INPR(vec1, vec1) < INPR(vec2, vec2)) { + addfillface(eve, eve->next, eve->next->next, 0); + addfillface(eve->next->next, eve->next->next->next, eve, 0); + } else{ + addfillface(eve->next, eve->next->next, eve->next->next->next, 0); + addfillface(eve->next->next->next, eve, eve->next, 0); + } } else { - addfillface(eve->next, eve->next->next, eve->next->next->next, 0); - addfillface(eve->next->next->next, eve, eve->next, 0); + addfillface(eve, eve->next, eve->next->next, 0); + addfillface(eve->next->next, eve->next->next->next, eve, 0); } return 1; } Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h =================================================================== --- branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h 2009-09-06 01:51:23 UTC (rev 23026) +++ branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h 2009-09-06 02:43:36 UTC (rev 23027) @@ -16,7 +16,7 @@ /*Defines for passing to BMIter_New. "OF" can be substituted for "around" - so BM_VERTS_OF_MESH_OF_FACE means "vertices + so BM_VERTS_OF_FACE means "vertices around a face." */ @@ -32,14 +32,13 @@ #define BM_LOOPS_OF_VERT 6 #define BM_FACES_OF_EDGE 7 #define BM_VERTS_OF_FACE 8 -#define BM_FACEVERTS_OF_FACE 9 -#define BM_EDGES_OF_FACE 10 -#define BM_LOOPS_OF_FACE 11 +#define BM_EDGES_OF_FACE 9 +#define BM_LOOPS_OF_FACE 10 /*iterate through loops around this loop, which are fetched from the other faces in the radial cycle surrounding the input loop's edge.*/ -#define BM_LOOPS_OF_LOOP 12 +#define BM_LOOPS_OF_LOOP 11 #define BM_ITER(ele, iter, bm, type, data) \ @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs