commit 7e50c82a2538283656f632f107778ed45803e0b9
parent 475b525076043ca52b0fd546a68ba9c482617a71
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Wed, 14 Feb 2018 16:52:35 +0100
Move tmp data out of the descriptor.
Allowing to release them early.
Diffstat:
3 files changed, 19 insertions(+), 16 deletions(-)
diff --git a/src/senc_descriptor.c b/src/senc_descriptor.c
@@ -34,7 +34,6 @@ descriptor_release(ref_T * ref)
ASSERT(ref);
desc = CONTAINER_OF(ref, struct senc_descriptor, ref);
scn = desc->scene;
- darray_triangle_comp_release(&desc->triangles_comp);
darray_triangle_enc_release(&desc->triangles_enc);
darray_enclosure_release(&desc->enclosures);
@@ -54,7 +53,6 @@ descriptor_create(struct senc_scene* scn)
if(desc) {
desc->scene = scn;
SENC(scene_ref_get(desc->scene));
- darray_triangle_comp_init(scn->dev->allocator, &desc->triangles_comp);
darray_triangle_enc_init(scn->dev->allocator, &desc->triangles_enc);
/* Enclosure 0 is always defined for infinite */
darray_enclosure_init(scn->dev->allocator, &desc->enclosures);
diff --git a/src/senc_descriptor_c.h b/src/senc_descriptor_c.h
@@ -77,8 +77,6 @@ triangle_enc_init(struct mem_allocator* alloc, struct triangle_enc* trg) {
struct senc_descriptor {
struct senc_scene* scene;
enclosure_id_t enclosures_count;
- /* Store by-triangle components */
- struct darray_triangle_comp triangles_comp;
/* Store by-triangle enclosures */
struct darray_triangle_enc triangles_enc;
/* Store enclosures */
diff --git a/src/senc_scene_analyze.c b/src/senc_scene_analyze.c
@@ -280,6 +280,7 @@ extract_connex_components
struct trgside* trgsides,
struct darray_cc_descriptor* connex_components,
struct darray_triangle_tmp* triangles_tmp_array,
+ struct darray_triangle_comp* triangles_comp,
struct darray_side_id* side_ids_by_medium)
{
res_T res = RES_OK;
@@ -288,7 +289,6 @@ extract_connex_components
struct senc_scene* scn;
struct mem_allocator* alloc;
struct darray_side_id stack;
- struct triangle_comp* triangles_comp;
/* Arrays of cc_descriptor ids, organized by medium. */
struct darray_component_id* component_ids_by_medium = NULL;
@@ -297,9 +297,6 @@ extract_connex_components
alloc = descriptor_get_allocator(desc);
scn = desc->scene;
-
- OK(darray_triangle_comp_resize(&desc->triangles_comp, scn->nutris));
- triangles_comp = darray_triangle_comp_data_get(&desc->triangles_comp);
/* Init data structures */
darray_side_id_init(alloc, &stack);
@@ -353,7 +350,8 @@ extract_connex_components
/* Pop waiting stack to feed crt_side */
struct trgside* crt_side = trgsides + crt_side_id;
const trg_id_t crt_trg_id = TRGSIDE_2_TRG(crt_side_id);
- struct triangle_comp* trg_comp = triangles_comp + crt_trg_id;
+ struct triangle_comp* trg_comp =
+ darray_triangle_comp_data_get(triangles_comp) + crt_trg_id;
ASSERT(crt_trg_id < scn->nutris);
ASSERT(trgsides[crt_side_id].medium == m);
@@ -444,7 +442,7 @@ exit:
}
darray_side_id_release(&stack);
ASSERT(desc->triangle_count
- == darray_triangle_comp_size_get(&desc->triangles_comp));
+ == darray_triangle_comp_size_get(triangles_comp));
/* triangles_enc is still unused: no size to assert */
return res;
error:
@@ -475,6 +473,7 @@ static res_T
group_connex_components
(struct senc_descriptor* desc,
struct trgside* trgsides,
+ const struct darray_triangle_comp* triangles_comp,
struct darray_cc_descriptor* connex_components)
{
res_T res = RES_OK;
@@ -598,7 +597,7 @@ group_connex_components
const struct triangle_in* hit_trg_in =
darray_triangle_in_cdata_get(&desc->scene->triangles_in) + hit_trg_id;
const struct triangle_comp* hit_trg_comp =
- darray_triangle_comp_cdata_get(&desc->triangles_comp) + hit_trg_id;
+ darray_triangle_comp_cdata_get(triangles_comp) + hit_trg_id;
enum side_id hit_side = (hit.normal[2] > 0) ? SIDE_FRONT : SIDE_BACK;
const side_id_t hit_side_id = TRGIDxSIDE_2_TRGSIDE(hit_trg_id, hit_side);
@@ -1026,6 +1025,9 @@ senc_scene_analyze(struct senc_scene* scn, struct senc_descriptor** out_desc)
/* Triangle neighbourhood by edge. */
struct darray_neighbourhood neighbourhood_by_edge;
char neighbourhood_by_edge_initialized = 0;
+ /* Store by-triangle components */
+ struct darray_triangle_comp triangles_comp;
+ char triangles_comp_initialized = 0;
/* Array of triangle sides. */
struct trgside* trgsides = NULL;
@@ -1080,10 +1082,13 @@ senc_scene_analyze(struct senc_scene* scn, struct senc_descriptor** out_desc)
neighbourhood_by_edge_initialized = 0;
darray_cc_descriptor_init(scn->dev->allocator, &connex_components);
connex_components_initialized = 1;
+ darray_triangle_comp_init(scn->dev->allocator, &triangles_comp);
+ triangles_comp_initialized = 1;
+ OK(darray_triangle_comp_resize(&triangles_comp, scn->nutris));
/* Step 3: extract triangle connex components */
res = extract_connex_components(desc, trgsides, &connex_components,
- &triangles_tmp, side_ids_by_medium);
+ &triangles_tmp, &triangles_comp, side_ids_by_medium);
if(res != RES_OK) {
log_err(scn->dev,
"%s: could not extract connex components from scene.\n", FUNC_NAME);
@@ -1102,13 +1107,17 @@ senc_scene_analyze(struct senc_scene* scn, struct senc_descriptor** out_desc)
side_ids_by_medium = NULL;
/* Step 4: group components */
- res = group_connex_components(desc, trgsides, &connex_components);
+ res = group_connex_components(desc, trgsides, &triangles_comp,
+ &connex_components);
if(res != RES_OK) {
log_err(scn->dev,
"%s: could not group connex components from scene.\n", FUNC_NAME);
goto error;
}
+ darray_triangle_comp_release(&triangles_comp);
+ triangles_comp_initialized = 0;
+
/* Build result. */
res = build_result(desc, &connex_components);
if(res != RES_OK) {
@@ -1116,15 +1125,13 @@ senc_scene_analyze(struct senc_scene* scn, struct senc_descriptor** out_desc)
goto error;
}
- darray_triangle_comp_purge(&desc->triangles_comp);
-
-
exit:
if(connex_components_initialized)
darray_cc_descriptor_release(&connex_components);
if(neighbourhood_by_edge_initialized)
darray_neighbourhood_release(&neighbourhood_by_edge);
if(triangles_tmp_initialized) darray_triangle_tmp_release(&triangles_tmp);
+ if(triangles_comp_initialized) darray_triangle_comp_release(&triangles_comp);
if(side_ids_by_medium) {
FOR_EACH(m, 0, scn->nmeds) {
struct darray_side_id* cc = side_ids_by_medium + m;