[Bf-blender-cvs] [8e8d1cab6f6] blender2.8: Eevee: Fix crash when clicking the lightcache bake button multiple time

Clément Foucault noreply at git.blender.org
Tue Oct 23 18:05:03 CEST 2018


Commit: 8e8d1cab6f605d738911bf2172cbe6e04870da9f
Author: Clément Foucault
Date:   Tue Oct 23 17:27:10 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB8e8d1cab6f605d738911bf2172cbe6e04870da9f

Eevee: Fix crash when clicking the lightcache bake button multiple time

===================================================================

M	source/blender/draw/engines/eevee/eevee_lightcache.c

===================================================================

diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c
index 7448396eebb..f7945da196e 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.c
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.c
@@ -146,6 +146,8 @@ typedef struct EEVEE_LightBake {
 	int delay;                       /* ms. delay the start of the baking to not slowdown interactions (TODO remove) */
 
 	void *gl_context, *gpu_context;  /* If running in parallel (in a separate thread), use this context. */
+
+	ThreadMutex *mutex;
 } EEVEE_LightBake;
 
 /* -------------------------------------------------------------------- */
@@ -518,6 +520,11 @@ wmJob *EEVEE_lightbake_job_create(
 		/* lbake->depsgraph = old_lbake->depsgraph; */
 		lbake->depsgraph = DEG_graph_new(scene, view_layer, DAG_EVAL_RENDER);
 
+		lbake->mutex = BLI_mutex_alloc();
+
+		BLI_mutex_lock(old_lbake->mutex);
+		old_lbake->own_resources = false;
+
 		lbake->scene = scene;
 		lbake->bmain = bmain;
 		lbake->view_layer_input = view_layer;
@@ -525,11 +532,15 @@ wmJob *EEVEE_lightbake_job_create(
 		lbake->own_resources = true;
 		lbake->delay = delay;
 
-		old_lbake->own_resources = false;
+		if (lbake->gl_context == NULL) {
+			lbake->gl_context = WM_opengl_context_create();
+			wm_window_reset_drawable();
+		}
 
 		if (old_lbake->stop != NULL) {
 			*old_lbake->stop = 1;
 		}
+		BLI_mutex_unlock(old_lbake->mutex);
 	}
 	else {
 		lbake = EEVEE_lightbake_job_data_alloc(bmain, view_layer, scene, true);
@@ -559,6 +570,7 @@ void *EEVEE_lightbake_job_data_alloc(
 	lbake->view_layer_input = view_layer;
 	lbake->own_resources = true;
 	lbake->own_light_cache = false;
+	lbake->mutex = BLI_mutex_alloc();
 
 	if (run_as_job) {
 		lbake->gl_context = WM_opengl_context_create();
@@ -572,6 +584,8 @@ void EEVEE_lightbake_job_data_free(void *custom_data)
 {
 	EEVEE_LightBake *lbake = (EEVEE_LightBake *)custom_data;
 
+
+
 	/* TODO reuse depsgraph. */
 	/* if (lbake->own_resources) { */
 		DEG_graph_free(lbake->depsgraph);
@@ -580,11 +594,17 @@ void EEVEE_lightbake_job_data_free(void *custom_data)
 	MEM_SAFE_FREE(lbake->cube_prb);
 	MEM_SAFE_FREE(lbake->grid_prb);
 
+	BLI_mutex_free(lbake->mutex);
+
 	MEM_freeN(lbake);
 }
 
 static void eevee_lightbake_delete_resources(EEVEE_LightBake *lbake)
 {
+	if (!lbake->resource_only) {
+		BLI_mutex_lock(lbake->mutex);
+	}
+
 	if (lbake->gl_context) {
 		DRW_opengl_render_context_enable(lbake->gl_context);
 		DRW_gawain_render_context_enable(lbake->gpu_context);
@@ -631,6 +651,10 @@ static void eevee_lightbake_delete_resources(EEVEE_LightBake *lbake)
 	else if (!lbake->resource_only) {
 		DRW_opengl_context_disable();
 	}
+
+	if (!lbake->resource_only) {
+		BLI_mutex_unlock(lbake->mutex);
+	}
 }
 
 /* Cache as in draw cache not light cache. */



More information about the Bf-blender-cvs mailing list