[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44161] branches/bmesh/blender/source/ blender: more knit-picky memory saving

Campbell Barton ideasman42 at gmail.com
Thu Feb 16 17:44:13 CET 2012


Revision: 44161
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44161
Author:   campbellbarton
Date:     2012-02-16 16:44:10 +0000 (Thu, 16 Feb 2012)
Log Message:
-----------
more knit-picky memory saving

don't store a flag array, (or pointer to a flag array) per BMLoop.
saves 4 pointers per quad - obviously, so this can add up a bit.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh_class.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_private.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c
    branches/bmesh/blender/source/blender/bmesh/operators/bmo_create.c
    branches/bmesh/blender/source/blender/bmesh/operators/bmo_dupe.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_class.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_class.h	2012-02-16 16:38:05 UTC (rev 44160)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_class.h	2012-02-16 16:44:10 UTC (rev 44161)
@@ -50,7 +50,6 @@
 */
 typedef struct BMHeader {
 	void *data; /* customdata layers */
-	struct BMFlagLayer *flags;
 	int index; /* notes:
 	            * - Use BM_elem_index_get/SetIndex macros for index
 	            * - Unitialized to -1 so we can easily tell its not set.
@@ -68,6 +67,8 @@
 
 typedef struct BMVert {
 	BMHeader head;
+	struct BMFlagLayer *oflags; /* keep after header, an array of flags, mostly used by the operator stack */
+
 	float co[3];
 	float no[3];
 	struct BMEdge *e;
@@ -80,6 +81,8 @@
 
 typedef struct BMEdge {
 	BMHeader head;
+	struct BMFlagLayer *oflags; /* keep after header, an array of flags, mostly used by the operator stack */
+
 	struct BMVert *v1, *v2;
 	struct BMLoop *l;
 	
@@ -89,6 +92,8 @@
 
 typedef struct BMLoop {
 	BMHeader head;
+	/* notice no flags layer */
+
 	struct BMVert *v;
 	struct BMEdge *e;
 	struct BMFace *f;
@@ -100,6 +105,12 @@
 	struct BMLoop *next, *prev;
 } BMLoop;
 
+/* can cast BMFace/BMEdge/BMVert, but NOT BMLoop, since these dont have a flag layer */
+typedef struct BMElemF {
+	BMHeader head;
+	struct BMFlagLayer *oflags; /* keep after header, an array of flags, mostly used by the operator stack */
+} BMElemF;
+
 #ifdef USE_BMESH_HOLES
 /* eventually, this structure will be used for supporting holes in faces */
 typedef struct BMLoopList {
@@ -110,6 +121,8 @@
 
 typedef struct BMFace {
 	BMHeader head;
+	struct BMFlagLayer *oflags; /* an array of flags, mostly used by the operator stack */
+
 	int len; /*includes all boundary loops*/
 #ifdef USE_BMESH_HOLES
 	int totbounds; /*total boundaries, is one plus the number of holes in the face*/

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h	2012-02-16 16:38:05 UTC (rev 44160)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h	2012-02-16 16:44:10 UTC (rev 44161)
@@ -178,10 +178,10 @@
  * ghash or a mapping slot to do it. */
 
 /* flags 15 and 16 (1<<14 and 1<<15) are reserved for bmesh api use */
-#define BMO_elem_flag_test(bm, element, oflag) (((BMHeader*)(element))->flags[bm->stackdepth-1].f & (oflag))
-#define BMO_elem_flag_enable(bm, element, oflag) (((BMHeader*)(element))->flags[bm->stackdepth-1].f |= (oflag))
-#define BMO_elem_flag_disable(bm, element, oflag) (((BMHeader*)(element))->flags[bm->stackdepth-1].f &= ~(oflag))
-#define BMO_elem_flag_toggle(bm, element, oflag) (((BMHeader*)(element))->flags[bm->stackdepth-1].f ^= (oflag))
+#define BMO_elem_flag_test(bm, element, oflag)    ((element)->oflags[bm->stackdepth-1].f &   (oflag))
+#define BMO_elem_flag_enable(bm, element, oflag)  ((element)->oflags[bm->stackdepth-1].f |=  (oflag))
+#define BMO_elem_flag_disable(bm, element, oflag) ((element)->oflags[bm->stackdepth-1].f &= ~(oflag))
+#define BMO_elem_flag_toggle(bm, element, oflag)  ((element)->oflags[bm->stackdepth-1].f ^=  (oflag))
 
 /* profiling showed a significant amount of time spent in BMO_elem_flag_test */
 #if 0

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c	2012-02-16 16:38:05 UTC (rev 44160)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c	2012-02-16 16:44:10 UTC (rev 44161)
@@ -408,20 +408,20 @@
 {
 	BMVert *v;
 	BMEdge *e;
-	BMLoop *f;
+	BMFace *f;
 
 	BMIter verts;
 	BMIter edges;
 	BMIter faces;
 
 	for (v = BM_iter_new(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BM_iter_step(&verts)) {
-		if (BMO_elem_flag_test(bm, (BMHeader *)v, oflag)) {
+		if (BMO_elem_flag_test(bm, v, oflag)) {
 			/* Visit edge */
 			for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_VERT, v); e; e = BM_iter_step(&edges))
-				BMO_elem_flag_enable(bm, (BMHeader *)e, oflag);
+				BMO_elem_flag_enable(bm, e, oflag);
 			/* Visit face */
 			for (f = BM_iter_new(&faces, bm, BM_FACES_OF_VERT, v); f; f = BM_iter_step(&faces))
-				BMO_elem_flag_enable(bm, (BMHeader *)f, oflag);
+				BMO_elem_flag_enable(bm, f, oflag);
 		}
 	}
 
@@ -439,9 +439,9 @@
 	BMIter faces;
 
 	for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BM_iter_step(&edges)) {
-		if (BMO_elem_flag_test(bm, (BMHeader *)e, oflag)) {
+		if (BMO_elem_flag_test(bm, e, oflag)) {
 			for (f = BM_iter_new(&faces, bm, BM_FACES_OF_EDGE, e); f; f = BM_iter_step(&faces)) {
-				BMO_elem_flag_enable(bm, (BMHeader *)f, oflag);
+				BMO_elem_flag_enable(bm, f, oflag);
 			}
 		}
 	}
@@ -474,16 +474,16 @@
 		{
 			/* flush down to vert */
 			for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BM_iter_step(&edges)) {
-				if (BMO_elem_flag_test(bm, (BMHeader *)e, oflag)) {
-					BMO_elem_flag_enable(bm, (BMHeader *)(e->v1), oflag);
-					BMO_elem_flag_enable(bm, (BMHeader *)(e->v2), oflag);
+				if (BMO_elem_flag_test(bm, e, oflag)) {
+					BMO_elem_flag_enable(bm, e->v1, oflag);
+					BMO_elem_flag_enable(bm, e->v2, oflag);
 				}
 			}
 			bmo_remove_tagged_context_edges(bm, oflag);
 			/* remove loose vertice */
 			for (v = BM_iter_new(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BM_iter_step(&verts)) {
-				if (BMO_elem_flag_test(bm, (BMHeader *)v, oflag) && (!(v->e)))
-					BMO_elem_flag_enable(bm, (BMHeader *)v, DEL_WIREVERT);
+				if (BMO_elem_flag_test(bm, v, oflag) && (!(v->e)))
+					BMO_elem_flag_enable(bm, v, DEL_WIREVERT);
 			}
 			BMO_remove_tagged_verts(bm, DEL_WIREVERT);
 
@@ -513,29 +513,29 @@
 		{
 			/* go through and mark all edges and all verts of all faces for delet */
 			for (f = BM_iter_new(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BM_iter_step(&faces)) {
-				if (BMO_elem_flag_test(bm, (BMHeader *)f, oflag)) {
+				if (BMO_elem_flag_test(bm, f, oflag)) {
 					for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_FACE, f); e; e = BM_iter_step(&edges))
-						BMO_elem_flag_enable(bm, (BMHeader *)e, oflag);
+						BMO_elem_flag_enable(bm, e, oflag);
 					for (v = BM_iter_new(&verts, bm, BM_VERTS_OF_FACE, f); v; v = BM_iter_step(&verts))
-						BMO_elem_flag_enable(bm, (BMHeader *)v, oflag);
+						BMO_elem_flag_enable(bm, v, oflag);
 				}
 			}
 			/* now go through and mark all remaining faces all edges for keeping */
 			for (f = BM_iter_new(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BM_iter_step(&faces)) {
-				if (!BMO_elem_flag_test(bm, (BMHeader *)f, oflag)) {
+				if (!BMO_elem_flag_test(bm, f, oflag)) {
 					for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_FACE, f); e; e = BM_iter_step(&edges)) {
-						BMO_elem_flag_disable(bm, (BMHeader *)e, oflag);
+						BMO_elem_flag_disable(bm, e, oflag);
 					}
 					for (v = BM_iter_new(&verts, bm, BM_VERTS_OF_FACE, f); v; v = BM_iter_step(&verts)) {
-						BMO_elem_flag_disable(bm, (BMHeader *)v, oflag);
+						BMO_elem_flag_disable(bm, v, oflag);
 					}
 				}
 			}
 			/* also mark all the vertices of remaining edges for keeping */
 			for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BM_iter_step(&edges)) {
-				if (!BMO_elem_flag_test(bm, (BMHeader *)e, oflag)) {
-					BMO_elem_flag_disable(bm, (BMHeader *)e->v1, oflag);
-					BMO_elem_flag_disable(bm, (BMHeader *)e->v2, oflag);
+				if (!BMO_elem_flag_test(bm, e, oflag)) {
+					BMO_elem_flag_disable(bm, e->v1, oflag);
+					BMO_elem_flag_disable(bm, e->v2, oflag);
 				}
 			}
 			/* now delete marked face */
@@ -551,11 +551,11 @@
 		{
 			/* does this option even belong in here? */
 			for (f = BM_iter_new(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BM_iter_step(&faces))
-				BMO_elem_flag_enable(bm, (BMHeader *)f, oflag);
+				BMO_elem_flag_enable(bm, f, oflag);
 			for (e = BM_iter_new(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BM_iter_step(&edges))
-				BMO_elem_flag_enable(bm, (BMHeader *)e, oflag);
+				BMO_elem_flag_enable(bm, e, oflag);
 			for (v = BM_iter_new(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BM_iter_step(&verts))
-				BMO_elem_flag_enable(bm, (BMHeader *)v, oflag);
+				BMO_elem_flag_enable(bm, v, oflag);
 
 			BMO_remove_tagged_faces(bm, oflag);
 			BMO_remove_tagged_edges(bm, oflag);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c	2012-02-16 16:38:05 UTC (rev 44160)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c	2012-02-16 16:44:10 UTC (rev 44161)
@@ -70,7 +70,7 @@
 	if (co) copy_v3_v3(v->co, co);
 	
 	/* allocate flag */
-	v->head.flags = BLI_mempool_calloc(bm->toolflagpool);
+	v->oflags = BLI_mempool_calloc(bm->toolflagpool);
 
 	CustomData_bmesh_set_default(&bm->vdata, &v->head.data);
 	
@@ -129,7 +129,7 @@
 	e->head.htype = BM_EDGE;
 	
 	/* allocate flag */
-	e->head.flags = BLI_mempool_calloc(bm->toolflagpool);
+	e->oflags = BLI_mempool_calloc(bm->toolflagpool);
 
 	e->v1 = (BMVert *) v1;
 	e->v2 = (BMVert *) v2;
@@ -307,7 +307,7 @@
 	}
 	
 	/* allocate flag */
-	f->head.flags = BLI_mempool_calloc(bm->toolflagpool);
+	f->oflags = BLI_mempool_calloc(bm->toolflagpool);
 
 	CustomData_bmesh_set_default(&bm->pdata, &f->head.data);
 	
@@ -464,7 +464,7 @@
 	if (v->head.data)
 		CustomData_bmesh_free_block(&bm->vdata, &v->head.data);
 
-	BLI_mempool_free(bm->toolflagpool, v->head.flags);
+	BLI_mempool_free(bm->toolflagpool, v->oflags);
 	BLI_mempool_free(bm->vpool, v);
 }
 
@@ -478,7 +478,7 @@
 	if (e->head.data)
 		CustomData_bmesh_free_block(&bm->edata, &e->head.data);
 
-	BLI_mempool_free(bm->toolflagpool, e->head.flags);
+	BLI_mempool_free(bm->toolflagpool, e->oflags);
 	BLI_mempool_free(bm->epool, e);
 }
 
@@ -495,7 +495,7 @@
 	if (f->head.data)
 		CustomData_bmesh_free_block(&bm->pdata, &f->head.data);
 
-	BLI_mempool_free(bm->toolflagpool, f->head.flags);
+	BLI_mempool_free(bm->toolflagpool, f->oflags);
 	BLI_mempool_free(bm->fpool, f);
 }
 
@@ -505,8 +505,6 @@
 	if (l->head.data)
 		CustomData_bmesh_free_block(&bm->ldata, &l->head.data);
 
-	if (l->head.flags)
-		BLI_mempool_free(bm->toolflagpool, l->head.flags);
 	BLI_mempool_free(bm->lpool, l);
 }
 
@@ -766,7 +764,7 @@
 	int i;
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list