Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2013-01-21 22:34:14 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2013-01-21 22:34:14 +0400
commit64c85d89dd31e3875d46cba07b6c4cab0e631e6b (patch)
treec33ae5a93c17473d307f4f08804b4c1880171c5d /source/blender/render
parent698aeec8b8bf55d6b804b7294ddc47601de03fa8 (diff)
Multires baker: fix memory leak caused by threading issues
Didn't notice this before because of non-working guarded allocation at the time threading was added to multires baker.
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/intern/source/multires_bake.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/source/blender/render/intern/source/multires_bake.c b/source/blender/render/intern/source/multires_bake.c
index 091ba9589d7..0462561e029 100644
--- a/source/blender/render/intern/source/multires_bake.c
+++ b/source/blender/render/intern/source/multires_bake.c
@@ -428,6 +428,27 @@ static void *do_multires_bake_thread(void *data_v)
return NULL;
}
+/* some of arrays inside ccgdm are lazy-initialized, which will generally
+ * require lock around accessing such data
+ * this function will ensure all arrays are allocated before threading started
+ */
+static void init_ccgdm_arrays(DerivedMesh *dm)
+{
+ CCGElem **grid_data;
+ CCGKey key;
+ int grid_size;
+ int *grid_offset;
+
+ grid_size = dm->getGridSize(dm);
+ grid_data = dm->getGridData(dm);
+ grid_offset = dm->getGridOffset(dm);
+ dm->getGridKey(dm, &key);
+
+ (void) grid_data;
+ (void) grid_data;
+ (void) grid_offset;
+}
+
static void do_multires_bake(MultiresBakeRender *bkr, Image *ima, int require_tangent, MPassKnownData passKnownData,
MInitBakeData initBakeData, MApplyBakeData applyBakeData, MFreeBakeData freeBakeData)
{
@@ -467,6 +488,8 @@ static void do_multires_bake(MultiresBakeRender *bkr, Image *ima, int require_ta
handles = MEM_callocN(tot_thread * sizeof(MultiresBakeThread), "do_multires_bake handles");
+ init_ccgdm_arrays(bkr->hires_dm);
+
/* faces queue */
queue.cur_face = 0;
queue.tot_face = tot_face;
@@ -515,6 +538,8 @@ static void do_multires_bake(MultiresBakeRender *bkr, Image *ima, int require_ta
if (freeBakeData)
freeBakeData(bake_data);
+ MEM_freeN(handles);
+
BKE_image_release_ibuf(ima, ibuf, NULL);
}
}
@@ -673,6 +698,7 @@ static void *init_heights_data(MultiresBakeRender *bkr, Image *ima)
smd.subdivType = ME_SIMPLE_SUBSURF;
height_data->ssdm = subsurf_make_derived_from_derived(bkr->lores_dm, &smd, NULL, 0);
+ init_ccgdm_arrays(height_data->ssdm);
}
}