[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19313] branches/bmesh/blender/source/ blender: made editmesh use mempools, though editmesh customdata does not.

Joseph Eagar joeedh at gmail.com
Mon Mar 16 15:52:31 CET 2009


Revision: 19313
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19313
Author:   joeedh
Date:     2009-03-16 15:52:30 +0100 (Mon, 16 Mar 2009)

Log Message:
-----------
made editmesh use mempools, though editmesh customdata does not.  this was a major slowdown in bmesh<-> editmesh conversion (even more so then the mf euler, which may not be that bad after all).

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenlib/BLI_editVert.h
    branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh.c

Modified: branches/bmesh/blender/source/blender/blenlib/BLI_editVert.h
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/BLI_editVert.h	2009-03-16 14:15:18 UTC (rev 19312)
+++ branches/bmesh/blender/source/blender/blenlib/BLI_editVert.h	2009-03-16 14:52:30 UTC (rev 19313)
@@ -42,6 +42,7 @@
 
 struct DerivedMesh;
 struct RetopoPaintData;
+struct BLI_mempool;
 
 /* note; changing this also might affect the undo copy in editmesh.c */
 typedef struct EditVert
@@ -153,6 +154,8 @@
 	HashEdge *hashedgetab;
 	
 	/* this is for the editmesh_fastmalloc */
+	struct BLI_mempool *vertpool, *edgepool, *facepool;
+
 	EditVert *allverts, *curvert;
 	EditEdge *alledges, *curedge;
 	EditFace *allfaces, *curface;

Modified: branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c	2009-03-16 14:15:18 UTC (rev 19312)
+++ branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c	2009-03-16 14:52:30 UTC (rev 19313)
@@ -382,11 +382,15 @@
 
 	/*copy face corner data*/
 	CustomData_to_bmeshpoly(&em->fdata, &bm->pdata, &bm->ldata);
-	/*initialize memory pools*/
+	
+	/*EVIL HACK WARNING: this uses a fixed size for the customdata
+	  blocks, when it should be more smart about it.
+	  initialize customdata memory pools*/
 	CustomData_bmesh_init_pool(&bm->vdata, allocsize[0]);
 	CustomData_bmesh_init_pool(&bm->edata, allocsize[1]);
 	CustomData_bmesh_init_pool(&bm->ldata, allocsize[2]);
 	CustomData_bmesh_init_pool(&bm->pdata, allocsize[3]);
+
 	/*needed later*/
 	numTex = CustomData_number_of_layers(&bm->pdata, CD_MTEXPOLY);
 	numCol = CustomData_number_of_layers(&bm->ldata, CD_MLOOPCOL);

Modified: branches/bmesh/blender/source/blender/editors/mesh/editmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/editmesh.c	2009-03-16 14:15:18 UTC (rev 19312)
+++ branches/bmesh/blender/source/blender/editors/mesh/editmesh.c	2009-03-16 14:52:30 UTC (rev 19313)
@@ -53,6 +53,7 @@
 #include "BLI_editVert.h"
 #include "BLI_dynstr.h"
 #include "BLI_rand.h"
+#include "BLI_mempool.h"
 
 #include "BKE_cloth.h"
 #include "BKE_context.h"
@@ -112,22 +113,21 @@
 
 /* ************ ADD / REMOVE / FIND ****************** */
 
-static void *calloc_em(EditMesh *em, size_t size, size_t nr)
-{
-	return calloc(size, nr);
+static void init_editMesh(EditMesh *em) {
+	if (!em->vertpool) em->vertpool = BLI_mempool_create(sizeof(EditVert), 1, 512);
+	if (!em->edgepool) em->edgepool = BLI_mempool_create(sizeof(EditEdge), 1, 512);
+	if (!em->facepool) em->facepool = BLI_mempool_create(sizeof(EditFace), 1, 512);
 }
 
-/* used to bypass normal calloc with fast one */
-static void *(*callocvert)(EditMesh *, size_t, size_t) = calloc_em;
-static void *(*callocedge)(EditMesh *, size_t, size_t) = calloc_em;
-static void *(*callocface)(EditMesh *, size_t, size_t) = calloc_em;
-
 EditVert *addvertlist(EditMesh *em, float *vec, EditVert *example)
 {
 	EditVert *eve;
 	static int hashnr= 0;
+	
+	if (!em->vertpool) init_editMesh(em);
 
-	eve= callocvert(em, sizeof(EditVert), 1);
+	eve= BLI_mempool_calloc(em->vertpool);
+
 	BLI_addtail(&em->verts, eve);
 	em->totvert++;
 	
@@ -157,8 +157,7 @@
 
 	EM_remove_selection(em, eve, EDITVERT);
 	CustomData_em_free_block(&em->vdata, &eve->data);
-	if(eve->fast==0)
-		free(eve);
+	BLI_mempool_free(em->vertpool, eve);
 	
 	em->totvert--;
 }
@@ -256,11 +255,12 @@
 	}
 	
 	/* find in hashlist */
+	if (!em->edgepool) init_editMesh(em);
 	eed= findedgelist(em, v1, v2);
 
 	if(eed==NULL) {
 	
-		eed= (EditEdge *)callocedge(em, sizeof(EditEdge), 1);
+		eed= (EditEdge *)BLI_mempool_calloc(em->edgepool);
 		eed->v1= v1;
 		eed->v2= v2;
 		BLI_addtail(&em->edges, eed);
@@ -293,9 +293,8 @@
 void free_editedge(EditMesh *em, EditEdge *eed)
 {
 	EM_remove_selection(em, eed, EDITEDGE);
-	if(eed->fast==0){ 
-		free(eed);
-	}
+
+	BLI_mempool_free(em->edgepool, eed);
 }
 
 void free_editface(EditMesh *em, EditFace *efa)
@@ -307,8 +306,7 @@
 	}
 		
 	CustomData_em_free_block(&em->fdata, &efa->data);
-	if(efa->fast==0)
-		free(efa);
+	BLI_mempool_free(em->facepool, efa);
 	
 	em->totface--;
 }
@@ -384,7 +382,9 @@
 	if(v1==v2 || v2==v3 || v1==v3) return NULL;
 	if(e2==0) return NULL;
 
-	efa= (EditFace *)callocface(em, sizeof(EditFace), 1);
+	if (!em->facepool) init_editMesh(em);
+	efa= (EditFace *)BLI_mempool_calloc(em->facepool);
+
 	efa->v1= v1;
 	efa->v2= v2;
 	efa->v3= v3;
@@ -467,57 +467,6 @@
 
 /* ************************ stuct EditMesh manipulation ***************************** */
 
-/* fake callocs for fastmalloc below */
-static void *calloc_fastvert(EditMesh *em, size_t size, size_t nr)
-{
-	EditVert *eve= em->curvert++;
-	eve->fast= 1;
-	return eve;
-}
-static void *calloc_fastedge(EditMesh *em, size_t size, size_t nr)
-{
-	EditEdge *eed= em->curedge++;
-	eed->fast= 1;
-	return eed;
-}
-static void *calloc_fastface(EditMesh *em, size_t size, size_t nr)
-{
-	EditFace *efa= em->curface++;
-	efa->fast= 1;
-	return efa;
-}
-
-/* allocate 1 chunk for all vertices, edges, faces. These get tagged to
-   prevent it from being freed
-*/
-static void init_editmesh_fastmalloc(EditMesh *em, int totvert, int totedge, int totface)
-{
-	if(totvert) em->allverts= MEM_callocN(totvert*sizeof(EditVert), "allverts");
-	else em->allverts= NULL;
-	em->curvert= em->allverts;
-	
-	if(totedge==0) totedge= 4*totface;	// max possible
-
-	if(totedge) em->alledges= MEM_callocN(totedge*sizeof(EditEdge), "alledges");
-	else em->alledges= NULL;
-	em->curedge= em->alledges;
-	
-	if(totface) em->allfaces= MEM_callocN(totface*sizeof(EditFace), "allfaces");
-	else em->allfaces= NULL;
-	em->curface= em->allfaces;
-
-	callocvert= calloc_fastvert;
-	callocedge= calloc_fastedge;
-	callocface= calloc_fastface;
-}
-
-static void end_editmesh_fastmalloc(void)
-{
-	callocvert= calloc_em;
-	callocedge= calloc_em;
-	callocface= calloc_em;
-}
-
 void set_editMesh(EditMesh *dst, EditMesh *src)
 {
 	free_editMesh(dst);
@@ -533,7 +482,12 @@
 	if(em->edges.first) free_edgelist(em, &em->edges);
 	if(em->faces.first) free_facelist(em, &em->faces);
 	if(em->selected.first) BLI_freelistN(&(em->selected));
-
+	
+	if (em->vertpool) BLI_mempool_destroy(em->vertpool);
+	if (em->edgepool) BLI_mempool_destroy(em->edgepool);
+	if (em->facepool) BLI_mempool_destroy(em->facepool);
+	em->vertpool = em->edgepool = em->facepool = NULL;
+	
 	CustomData_free(&em->vdata, 0);
 	CustomData_free(&em->fdata, 0);
 
@@ -857,9 +811,6 @@
 		return;
 	}
 	
-	/* initialize fastmalloc for editmesh */
-	init_editmesh_fastmalloc(em, me->totvert, me->totedge, me->totface);
-
 	actkey = ob_get_keyblock(ob);
 	if(actkey) {
 		tot= actkey->totelem;
@@ -985,8 +936,6 @@
 		error("This Mesh has old style edgecodes, please put it in the bugtracker!");
 	
 	MEM_freeN(evlist);
-
-	end_editmesh_fastmalloc();	// resets global function pointers
 	
 	if(me->mselect){
 		//restore editselections
@@ -1822,8 +1771,6 @@
 	memset(em, 0, sizeof(EditMesh));
 		
 	em->selectmode = um->selectmode;
-	
-	init_editmesh_fastmalloc(em, um->totvert, um->totedge, um->totface);
 
 	CustomData_free(&em->vdata, 0);
 	CustomData_free(&em->edata, 0);
@@ -1881,7 +1828,6 @@
 		CustomData_to_em_block(&um->fdata, &em->fdata, a, &efa->data);
 	}
 	
-	end_editmesh_fastmalloc();
 	if(evar) MEM_freeN(evar);
 	
 	em->totvert = um->totvert;





More information about the Bf-blender-cvs mailing list