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

Reply via email to