From 1a79abdad2443ff9f12e7efd95ee78a264a9d60a Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 21 Feb 2014 16:35:23 +0100 Subject: Fix more of T38726: there still was a crash when deleting render layers. --- source/blender/render/intern/source/pipeline.c | 10 ++++++++-- source/blender/render/intern/source/render_result.c | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) (limited to 'source/blender/render') diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index e381a7ea6f5..4cf36826bba 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -230,7 +230,7 @@ static int render_scene_needs_vector(Render *re) { SceneRenderLayer *srl; - for (srl = re->scene->r.layers.first; srl; srl = srl->next) + for (srl = re->r.layers.first; srl; srl = srl->next) if (!(srl->layflag & SCE_LAY_DISABLE)) if (srl->passflag & SCE_PASS_VECTOR) return 1; @@ -412,6 +412,8 @@ void RE_FreeRender(Render *re) RE_engine_free(re->engine); BLI_rw_mutex_end(&re->resultmutex); + + BLI_freelistN(&re->r.layers); /* main dbase can already be invalid now, some database-free code checks it */ re->main = NULL; @@ -508,7 +510,11 @@ void RE_InitState(Render *re, Render *source, RenderData *rd, SceneRenderLayer * re->ok = TRUE; /* maybe flag */ re->i.starttime = PIL_check_seconds_timer(); - re->r = *rd; /* hardcopy */ + + /* copy render data and render layers for thread safety */ + BLI_freelistN(&re->r.layers); + re->r = *rd; + BLI_duplicatelist(&re->r.layers, &rd->layers); if (source) { /* reuse border flags from source renderer */ diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c index b174748a050..f2c5a7597b8 100644 --- a/source/blender/render/intern/source/render_result.c +++ b/source/blender/render/intern/source/render_result.c @@ -868,7 +868,7 @@ void render_result_single_layer_end(Render *re) BLI_remlink(&re->result->layers, rl); /* reconstruct render result layers */ - for (nr = 0, srl = re->scene->r.layers.first; srl; srl = srl->next, nr++) { + for (nr = 0, srl = re->r.layers.first; srl; srl = srl->next, nr++) { if (nr == re->r.actlay) { BLI_addtail(&re->result->layers, rl); } -- cgit v1.2.3