[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