[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