Commit: 007d3074fab68629e20a6596b363476a7fc4ab5d
Author: Clément Foucault
Date:   Wed Jun 20 11:59:41 2018 +0200
Branches: temp-eeveelightcache
https://developer.blender.org/rB007d3074fab68629e20a6596b363476a7fc4ab5d

Eevee: Move cache creation to main thread

This fix freeing hazard and use after free.

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

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

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

diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c 
b/source/blender/draw/engines/eevee/eevee_lightcache.c
index 1e0d64c2124..dac79c413e5 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.c
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.c
@@ -104,6 +104,7 @@ typedef struct EEVEE_LightBake {
        int irr_cube_res;                /* Target cubemap at MIP 0. */
        int irr_size[3];                 /* Size of the irradiance texture. */
        int total_irr_samples;           /* Total for all grids */
+       int grid_sample;                 /* Nth sample of the current grid 
being rendered. */
        int bounce_curr, bounce_count;   /* The current light bounce being 
evaluated. */
        float vis_range, vis_blur;       /* Sample Visibility compression and 
bluring. */
        float vis_res;                   /* Resolution of the Visibility 
shadowmap. */
@@ -203,39 +204,64 @@ void EEVEE_lightcache_free(EEVEE_LightCache *lcache)
 
 /* -------------------------------------------------------------------- */
 
-/** \name Light Bake Job
+/** \name Light Bake Context
  * \{ */
 
-void *EEVEE_lightbake_job_data_alloc(struct Main *bmain, struct ViewLayer 
*view_layer, struct Scene *scene, bool run_as_job)
+static void eevee_lightbake_context_enable(EEVEE_LightBake *lbake)
 {
-       EEVEE_LightBake *lbake = MEM_callocN(sizeof(EEVEE_LightBake), 
"EEVEE_LightBake");
-
-       lbake->depsgraph = DEG_graph_new(scene, view_layer, DAG_EVAL_RENDER);
-       lbake->scene = scene;
-       lbake->bmain = bmain;
+       if (lbake->gl_context) {
+               DRW_opengl_render_context_enable(lbake->gl_context);
+               if (lbake->gwn_context == NULL) {
+                       lbake->gwn_context = GWN_context_create();
+               }
+               DRW_gawain_render_context_enable(lbake->gwn_context);
+       }
+       else {
+               DRW_opengl_context_enable();
+       }
+}
 
-       if (run_as_job) {
-               lbake->gl_context = WM_opengl_context_create();
+static void eevee_lightbake_context_disable(EEVEE_LightBake *lbake)
+{
+       if (lbake->gl_context) {
+               DRW_opengl_render_context_disable(lbake->gl_context);
+               DRW_gawain_render_context_disable(lbake->gwn_context);
        }
+       else {
+               DRW_opengl_context_disable();
+       }
+}
 
-    DEG_graph_relations_update(lbake->depsgraph, bmain, scene, view_layer);
+/** \} */
 
-       int frame = 0; /* TODO make it user param. */
-       DEG_evaluate_on_framechange(lbake->bmain, lbake->depsgraph, frame);
 
-       return lbake;
-}
+/* -------------------------------------------------------------------- */
 
-void EEVEE_lightbake_job_data_free(void *custom_data)
+/** \name Light Bake Job
+ * \{ */
+
+static void eevee_lightbake_count_probes(EEVEE_LightBake *lbake)
 {
-       EEVEE_LightBake *lbake = (EEVEE_LightBake *)custom_data;
+       Depsgraph *depsgraph = lbake->depsgraph;
 
-       DEG_graph_free(lbake->depsgraph);
+       /* At least one of each for the world */
+       lbake->grid_count = lbake->cube_count = lbake->total_irr_samples = 1;
 
-       MEM_SAFE_FREE(lbake->cube_prb);
-       MEM_SAFE_FREE(lbake->grid_prb);
+       DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(depsgraph, ob)
+       {
+               if (ob->type == OB_LIGHTPROBE) {
+                       LightProbe *prb = (LightProbe *)ob->data;
 
-       MEM_freeN(lbake);
+                       if (prb->type == LIGHTPROBE_TYPE_GRID) {
+                               lbake->total_irr_samples += 
prb->grid_resolution_x * prb->grid_resolution_y * prb->grid_resolution_z;
+                               lbake->grid_count++;
+                       }
+                       else if (prb->type == LIGHTPROBE_TYPE_CUBE) {
+                               lbake->cube_count++;
+                       }
+               }
+       }
+       DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END;
 }
 
 static void eevee_lightbake_create_resources(EEVEE_LightBake *lbake)
@@ -290,6 +316,8 @@ static void 
eevee_lightbake_create_resources(EEVEE_LightBake *lbake)
        if (lcache == NULL) {
                lcache = EEVEE_lightcache_create(lbake->grid_count, 
lbake->cube_count, lbake->ref_cube_res, lbake->irr_size);
                scene_orig->eevee.light_cache = lcache;
+
+               DEG_id_tag_update(&scene_orig->id, DEG_TAG_COPY_ON_WRITE);
        }
 
        /* Share light cache with the evaluated (baking) layer and the original 
layer.
@@ -297,6 +325,48 @@ static void 
eevee_lightbake_create_resources(EEVEE_LightBake *lbake)
        scene_eval->eevee.light_cache = lcache;
 }
 
+/* MUST run on the main thread. */
+void *EEVEE_lightbake_job_data_alloc(struct Main *bmain, struct ViewLayer 
*view_layer, struct Scene *scene, bool run_as_job)
+{
+       EEVEE_LightBake *lbake = MEM_callocN(sizeof(EEVEE_LightBake), 
"EEVEE_LightBake");
+
+       lbake->depsgraph = DEG_graph_new(scene, view_layer, DAG_EVAL_RENDER);
+       lbake->scene = scene;
+       lbake->bmain = bmain;
+
+       if (run_as_job) {
+               lbake->gl_context = WM_opengl_context_create();
+       }
+
+    DEG_graph_relations_update(lbake->depsgraph, bmain, scene, view_layer);
+
+       int frame = 0; /* TODO make it user param. */
+       DEG_evaluate_on_framechange(lbake->bmain, lbake->depsgraph, frame);
+
+       /* The following needs to run on the main thread. */
+
+       /* Count lightprobes */
+       eevee_lightbake_count_probes(lbake);
+
+       DRW_opengl_context_enable();
+       eevee_lightbake_create_resources(lbake);
+       DRW_opengl_context_disable();
+
+       return lbake;
+}
+
+void EEVEE_lightbake_job_data_free(void *custom_data)
+{
+       EEVEE_LightBake *lbake = (EEVEE_LightBake *)custom_data;
+
+       DEG_graph_free(lbake->depsgraph);
+
+       MEM_SAFE_FREE(lbake->cube_prb);
+       MEM_SAFE_FREE(lbake->grid_prb);
+
+       MEM_freeN(lbake);
+}
+
 static void eevee_lightbake_delete_resources(EEVEE_LightBake *lbake)
 {
        if (lbake->gl_context) {
@@ -330,31 +400,6 @@ static void 
eevee_lightbake_delete_resources(EEVEE_LightBake *lbake)
        }
 }
 
-static void eevee_lightbake_context_enable(EEVEE_LightBake *lbake)
-{
-       if (lbake->gl_context) {
-               DRW_opengl_render_context_enable(lbake->gl_context);
-               if (lbake->gwn_context == NULL) {
-                       lbake->gwn_context = GWN_context_create();
-               }
-               DRW_gawain_render_context_enable(lbake->gwn_context);
-       }
-       else {
-               DRW_opengl_context_enable();
-       }
-}
-
-static void eevee_lightbake_context_disable(EEVEE_LightBake *lbake)
-{
-       if (lbake->gl_context) {
-               DRW_opengl_render_context_disable(lbake->gl_context);
-               DRW_gawain_render_context_disable(lbake->gwn_context);
-       }
-       else {
-               DRW_opengl_context_disable();
-       }
-}
-
 /* Cache as in draw cache not light cache. */
 static void eevee_lightbake_cache_create(EEVEE_Data *vedata, EEVEE_LightBake 
*lbake)
 {
@@ -395,6 +440,7 @@ static void eevee_lightbake_cache_create(EEVEE_Data 
*vedata, EEVEE_LightBake *lb
 
        DRW_render_instance_buffer_finish();
 }
+
 static void eevee_lightbake_render_world(void *ved, void *user_data)
 {
        EEVEE_Data *vedata = (EEVEE_Data *)ved;
@@ -425,62 +471,56 @@ static void eevee_lightbake_render_grid_sample(void *ved, 
void *user_data)
 {
        EEVEE_Data *vedata = (EEVEE_Data *)ved;
        EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
+       EEVEE_CommonUniformBuffer *common_data = &sldata->common_data;
        EEVEE_LightBake *lbake = (EEVEE_LightBake *)user_data;
+       EEVEE_LightGrid *egrid = lbake->grid;
+       LightProbe *prb = *lbake->probe;
 
        /* TODO do this once for the whole bake when we have independant 
DRWManagers. */
        eevee_lightbake_cache_create(vedata, lbake);
 
        /* Compute sample position */
-       /* ... */
-
-       /* Disable specular. */
-       /* ... */
-
-       EEVEE_lightbake_render_scene(sldata, vedata, lbake->rt_fb, 
(float[3]){0.0f}, 1.0f, 10.0f);
-       EEVEE_lightbake_filter_diffuse(sldata, vedata, lbake->rt_color, 
lbake->store_fb, 0, 1.0f);
-       EEVEE_lightbake_filter_visibility(sldata, vedata, lbake->rt_depth, 
lbake->store_fb, 0, 1.0f, 10.0f, 9.0f, 1.0f, 32);
+       float pos[3];
+       copy_v3_v3(pos, egrid->corner);
+       madd_v3_v3fl(pos, egrid->increment_x, lbake->grid_sample % 
prb->grid_resolution_x);
+       madd_v3_v3fl(pos, egrid->increment_y, lbake->grid_sample / 
prb->grid_resolution_x);
+       madd_v3_v3fl(pos, egrid->increment_z, lbake->grid_sample / 
(prb->grid_resolution_x * prb->grid_resolution_y));
+
+       /* Disable specular lighting when rendering probes to avoid feedback 
loops (looks bad). */
+       common_data->spec_toggle = false;
+       common_data->prb_num_planar = 0;
+       common_data->prb_num_render_cube = 0;
+       common_data->prb_num_render_grid = 0;
+       DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
+
+       int sample_offset = egrid->offset + lbake->grid_sample;
+       EEVEE_lightbake_render_scene(sldata, vedata, lbake->rt_fb, pos, 
prb->clipsta, prb->clipend);
+       EEVEE_lightbake_filter_diffuse(sldata, vedata, lbake->rt_color, 
lbake->store_fb, sample_offset, prb->intensity);
+       EEVEE_lightbake_filter_visibility(sldata, vedata, lbake->rt_depth, 
lbake->store_fb, sample_offset,
+                                         prb->clipsta, prb->clipend, 
egrid->visibility_range,
+                                         prb->vis_blur, lbake->vis_res);
 }
 
 static void eevee_lightbake_render_probe(void *ved, void *user_data)
 {
        EEVEE_Data *vedata = (EEVEE_Data *)ved;
        EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
+       EEVEE_CommonUniformBuffer *common_data = &sldata->common_data;
        EEVEE_LightBake *lbake = (EEVEE_LightBake *)user_data;
 
        /* TODO do this once for the whole bake when we have independant 
DRWManagers. */
        eevee_lightbake_cache_create(vedata, lbake);
 
-       /* Disable specular. */
-       /* ... */
+       /* Disable specular lighting when rendering probes to avoid feedback 
loops (looks bad). */
+       common_data->spec_toggle = false;
+       common_data->prb_num_planar = 0;
+       common_data->prb_num_render_cube = 0;
+       DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
 
        EEVEE_lightbake_render_scene(sldata, vedata, lbake->rt_fb, 
(float[3]){0.0f}, 1.0f, 10.0f);
        EEVEE_lightbake_filter_glossy(sldata, vedata, lbake->rt_color, 
lbake->store_fb, 0, 1.0);
 }
 
-static void eevee_lightbake_count_probes(EEVEE_LightBake *lbake)
-{
-       Depsgraph *depsgraph = lbake->depsgraph;
-
-       /* At least one of each for the world */
-       lbake->grid_count = lbake->cube_count = lbake->total_irr_samples = 1;
-
-       DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(depsgraph, ob)
-       {
-               if (ob->type == OB_LIGHTPROBE) {
-                       LightProbe *prb = (LightProbe *)ob->data;
-
-                       if (prb->type == LIGHTPROBE_TYPE_GRID) {
-                               lbake->total_irr_samples += 
prb->grid_resolution_x * prb->grid_resolution_y * prb->grid_resolution_z;
-                               lbake->grid_count++;
-                       }
-                       else if (prb->type == LIGHTPROBE_TYPE_CUBE) {
-                               lbake->cube_count++;
-                       }
-               }
-       }
-       DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END;
-}
-
 static void eevee_lightbake_gather_probes(EEVEE_LightBake *lbake)
 {
        Depsgraph *depsgraph = lb

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to