commit b293d850467926092b0f70d76a43bd3224dc1263
parent a8f6347c7f33467d9c59a9a428e0d98ef7526b84
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Fri, 16 Feb 2018 05:14:17 +0100
Reduce memory footprint of vertices deduplicate.
Replace a large global array by a small one local to a single add_geometry.
Diffstat:
2 files changed, 10 insertions(+), 16 deletions(-)
diff --git a/src/senc_scene.c b/src/senc_scene.c
@@ -36,7 +36,6 @@ scene_release(ref_T * ref)
darray_triangle_in_release(&scn->triangles_in);
darray_position_release(&scn->vertices);
htable_vrtx_release(&scn->unique_vertices);
- darray_vrtx_id_release(&scn->unique_vertice_ids);
htable_trg_release(&scn->unique_triangles);
MEM_RM(dev->allocator, scn);
SENC(device_ref_put(dev));
@@ -75,7 +74,6 @@ senc_scene_create
darray_triangle_in_init(dev->allocator, &scn->triangles_in);
darray_position_init(dev->allocator, &scn->vertices);
htable_vrtx_init(dev->allocator, &scn->unique_vertices);
- darray_vrtx_id_init(dev->allocator, &scn->unique_vertice_ids);
htable_trg_init(dev->allocator, &scn->unique_triangles);
exit:
@@ -99,6 +97,7 @@ senc_scene_add_geometry
void(*position)(const unsigned ivert, double pos[3], void* ctx),
void* ctx)
{
+ struct darray_vrtx_id unique_vertice_ids;
unsigned i;
vrtx_id_t actual_nverts = 0;
vrtx_id_t actual_nuverts = 0;
@@ -114,15 +113,16 @@ senc_scene_add_geometry
return RES_BAD_ARG;
/* Make room for new geometry; suppose no more duplicates. */
+ darray_vrtx_id_init(scn->dev->allocator, &unique_vertice_ids);
+ OK(darray_vrtx_id_reserve(&unique_vertice_ids, nverts));
OK(darray_position_reserve(&scn->vertices, scn->nuverts + nverts));
OK(darray_triangle_in_reserve(&scn->triangles_in, scn->nutris + ntris));
OK(htable_vrtx_reserve(&scn->unique_vertices, scn->nuverts + nverts));
- OK(darray_vrtx_id_reserve(&scn->unique_vertice_ids, scn->nverts + nverts));
OK(htable_trg_reserve(&scn->unique_triangles, scn->nutris + ntris));
- /* Get geometry */
trg = darray_triangle_in_cdata_get(&scn->triangles_in);
+ /* Get geometry */
FOR_EACH(i, 0, nverts) {
vrtx_id_t* p_vrtx;
union double3 tmp;
@@ -132,7 +132,7 @@ senc_scene_add_geometry
p_vrtx = htable_vrtx_find(&scn->unique_vertices, &tmp);
if(p_vrtx) {
/* Duplicate vertex */
- unique_v = darray_vrtx_id_cdata_get(&scn->unique_vertice_ids)[*p_vrtx];
+ unique_v = *p_vrtx;
} else {
/* New vertex */
unique_v = scn->nuverts + actual_nuverts;
@@ -143,9 +143,8 @@ senc_scene_add_geometry
++actual_nuverts;
}
/* The unique ID for vertex v is u */
- ASSERT(scn->nverts + i
- == darray_vrtx_id_size_get(&scn->unique_vertice_ids));
- OK(darray_vrtx_id_push_back(&scn->unique_vertice_ids, &unique_v));
+ ASSERT(i == darray_vrtx_id_size_get(&unique_vertice_ids));
+ OK(darray_vrtx_id_push_back(&unique_vertice_ids, &unique_v));
++actual_nverts;
}
@@ -153,7 +152,6 @@ senc_scene_add_geometry
int j;
unsigned med[2];
unsigned ind[3];
- vrtx_id_t vrtx_key;
union vrtx_id3 trg_key;
struct triangle_in tmp;
trg_id_t* p_trg;
@@ -165,11 +163,9 @@ senc_scene_add_geometry
res = RES_BAD_ARG;
goto error;
}
- vrtx_key = ind[j] + scn->nverts;
- ASSERT(vrtx_key < darray_vrtx_id_size_get(&scn->unique_vertice_ids));
+ ASSERT(ind[j] < darray_vrtx_id_size_get(&unique_vertice_ids));
/* Find the unique ID for this vertex */
- tmp.vertice_id[j] =
- darray_vrtx_id_cdata_get(&scn->unique_vertice_ids)[vrtx_key];
+ tmp.vertice_id[j] = darray_vrtx_id_cdata_get(&unique_vertice_ids)[ind[j]];
}
if(tmp.vertice_id[0] == tmp.vertice_id[1]
|| tmp.vertice_id[0] == tmp.vertice_id[2]
@@ -250,12 +246,12 @@ senc_scene_add_geometry
}
exit:
+ darray_vrtx_id_release(&unique_vertice_ids);
/* Update sizes */
scn->nuverts += actual_nuverts;
scn->nverts += actual_nverts;
scn->nutris += actual_nutris;
scn->ntris += actual_ntris;
- ASSERT(scn->nverts == darray_vrtx_id_size_get(&scn->unique_vertice_ids));
ASSERT(scn->nuverts == htable_vrtx_size_get(&scn->unique_vertices));
ASSERT(scn->nutris == htable_trg_size_get(&scn->unique_triangles));
++scn->ngeoms;
diff --git a/src/senc_scene_c.h b/src/senc_scene_c.h
@@ -186,8 +186,6 @@ struct senc_scene {
* neighbourhoods, we need vertice unicity. */
/* Keep each unique vertex; no duplicates here. */
struct htable_vrtx unique_vertices;
- /* Associate each vertex with its rank in unique_vertices. */
- struct darray_vrtx_id unique_vertice_ids;
/* Htables used to detect duplicate triangles. */
/* Keep each unique triangle; no duplicates here. */