Commit: e8d4930c4dec1f7c43296639adf260e0f5415dac
Author: Clément Foucault
Date:   Fri Jun 22 14:00:08 2018 +0200
Branches: temp-eeveelightcache
https://developer.blender.org/rBe8d4930c4dec1f7c43296639adf260e0f5415dac

Eevee: LightCache: Add fallback cache for world if no scene cache found

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

M       source/blender/draw/engines/eevee/eevee_data.c
M       source/blender/draw/engines/eevee/eevee_lightcache.c
M       source/blender/draw/engines/eevee/eevee_lightcache.h
M       source/blender/draw/engines/eevee/eevee_lightprobes.c
M       source/blender/draw/engines/eevee/eevee_materials.c
M       source/blender/draw/engines/eevee/eevee_private.h

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

diff --git a/source/blender/draw/engines/eevee/eevee_data.c 
b/source/blender/draw/engines/eevee/eevee_data.c
index f055ab143d7..981913b55f1 100644
--- a/source/blender/draw/engines/eevee/eevee_data.c
+++ b/source/blender/draw/engines/eevee/eevee_data.c
@@ -28,6 +28,7 @@
 #include "DRW_render.h"
 
 #include "eevee_private.h"
+#include "eevee_lightcache.h"
 
 static void eevee_view_layer_data_free(void *storage)
 {
@@ -53,6 +54,11 @@ static void eevee_view_layer_data_free(void *storage)
        MEM_SAFE_FREE(sldata->shcasters_buffers[1].shadow_casters);
        MEM_SAFE_FREE(sldata->shcasters_buffers[1].flags);
 
+       if (sldata->fallback_lightcache) {
+               EEVEE_lightcache_free(sldata->fallback_lightcache);
+               sldata->fallback_lightcache = NULL;
+       }
+
        /* Probes */
        MEM_SAFE_FREE(sldata->probes);
        DRW_UBO_FREE_SAFE(sldata->probe_ubo);
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c 
b/source/blender/draw/engines/eevee/eevee_lightcache.c
index 8c5c0f7e804..111576b07f7 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.c
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.c
@@ -128,6 +128,8 @@ typedef struct EEVEE_LightBake {
        short *stop, *do_update;
        float *progress;
 
+       bool resource_only;              /* For only handling the resources. */
+
        void *gl_context, *gwn_context;  /* If running in parallel (in a 
separate thread), use this context. */
 } EEVEE_LightBake;
 
@@ -265,6 +267,24 @@ static void eevee_lightbake_count_probes(EEVEE_LightBake 
*lbake)
        DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END;
 }
 
+static void eevee_lightbake_create_render_target(EEVEE_LightBake *lbake, int 
rt_res)
+{
+       lbake->rt_depth = DRW_texture_create_cube(rt_res, 
GPU_DEPTH_COMPONENT24, 0, NULL);
+       lbake->rt_color = DRW_texture_create_cube(rt_res, GPU_RGBA16F, 
DRW_TEX_FILTER | DRW_TEX_MIPMAP, NULL);
+
+       for (int i = 0; i < 6; ++i) {
+               GPU_framebuffer_ensure_config(&lbake->rt_fb[i], {
+                       GPU_ATTACHMENT_TEXTURE_CUBEFACE(lbake->rt_depth, i),
+                       GPU_ATTACHMENT_TEXTURE_CUBEFACE(lbake->rt_color, i)
+               });
+       }
+
+       GPU_framebuffer_ensure_config(&lbake->store_fb, {
+               GPU_ATTACHMENT_NONE,
+               GPU_ATTACHMENT_NONE
+       });
+}
+
 static void eevee_lightbake_create_resources(EEVEE_LightBake *lbake)
 {
        Scene *scene_eval = DEG_get_evaluated_scene(lbake->depsgraph);
@@ -285,20 +305,7 @@ static void 
eevee_lightbake_create_resources(EEVEE_LightBake *lbake)
        lbake->grid_prev = DRW_texture_create_2D_array(lbake->irr_size[0], 
lbake->irr_size[1], lbake->irr_size[2],
                                                       IRRADIANCE_FORMAT, 
DRW_TEX_FILTER, NULL);
 
-       lbake->rt_depth = DRW_texture_create_cube(lbake->rt_res, 
GPU_DEPTH_COMPONENT24, 0, NULL);
-       lbake->rt_color = DRW_texture_create_cube(lbake->rt_res, GPU_RGBA16F, 
DRW_TEX_FILTER | DRW_TEX_MIPMAP, NULL);
-
-       for (int i = 0; i < 6; ++i) {
-               GPU_framebuffer_ensure_config(&lbake->rt_fb[i], {
-                       GPU_ATTACHMENT_TEXTURE_CUBEFACE(lbake->rt_depth, i),
-                       GPU_ATTACHMENT_TEXTURE_CUBEFACE(lbake->rt_color, i)
-               });
-       }
-
-       GPU_framebuffer_ensure_config(&lbake->store_fb, {
-               GPU_ATTACHMENT_NONE,
-               GPU_ATTACHMENT_NONE
-       });
+       eevee_lightbake_create_render_target(lbake, lbake->rt_res);
 
        /* Ensure Light Cache is ready to accept new data. If not recreate one.
         * WARNING: All the following must be threadsafe. It's currently 
protected
@@ -320,7 +327,7 @@ static void 
eevee_lightbake_create_resources(EEVEE_LightBake *lbake)
                DEG_id_tag_update(&scene_orig->id, DEG_TAG_COPY_ON_WRITE);
        }
 
-       lcache->flag = LIGHTCACHE_UPDATE_WORLD | LIGHTCACHE_UPDATE_CUBE | 
LIGHTCACHE_UPDATE_GRID;
+       lcache->flag = LIGHTCACHE_UPDATE_WORLD | LIGHTCACHE_UPDATE_CUBE | 
LIGHTCACHE_UPDATE_GRID | LIGHTCACHE_BAKING;
 
        /* Share light cache with the evaluated (baking) layer and the original 
layer.
         * This avoid full scene re-evaluation by depsgraph. */
@@ -374,7 +381,7 @@ static void 
eevee_lightbake_delete_resources(EEVEE_LightBake *lbake)
                DRW_opengl_render_context_enable(lbake->gl_context);
                DRW_gawain_render_context_enable(lbake->gwn_context);
        }
-       else {
+       else if (!lbake->resource_only) {
                DRW_opengl_context_enable();
        }
 
@@ -396,7 +403,7 @@ static void 
eevee_lightbake_delete_resources(EEVEE_LightBake *lbake)
                lbake->gwn_context = NULL;
                lbake->gl_context = NULL;
        }
-       else {
+       else if (!lbake->resource_only) {
                DRW_opengl_context_disable();
        }
 }
@@ -459,7 +466,7 @@ static void eevee_lightbake_copy_irradiance(EEVEE_LightBake 
*lbake, EEVEE_LightC
        MEM_freeN(tex);
 }
 
-static void eevee_lightbake_render_world(void *ved, void *user_data)
+static void eevee_lightbake_render_world_sample(void *ved, void *user_data)
 {
        EEVEE_Data *vedata = (EEVEE_Data *)ved;
        EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
@@ -617,7 +624,7 @@ static void eevee_lightbake_render_grid_sample(void *ved, 
void *user_data)
        }
 }
 
-static void eevee_lightbake_render_probe(void *ved, void *user_data)
+static void eevee_lightbake_render_probe_sample(void *ved, void *user_data)
 {
        EEVEE_Data *vedata = (EEVEE_Data *)ved;
        EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
@@ -721,7 +728,7 @@ void EEVEE_lightbake_job(void *custom_data, short *stop, 
short *do_update, float
 
        /* Render world irradiance and reflection first */
        if (lcache->flag & LIGHTCACHE_UPDATE_WORLD) {
-               lightbake_do_sample(lbake, eevee_lightbake_render_world);
+               lightbake_do_sample(lbake, eevee_lightbake_render_world_sample);
        }
 
        /* Render irradiance grids */
@@ -747,12 +754,43 @@ void EEVEE_lightbake_job(void *custom_data, short *stop, 
short *do_update, float
                lbake->probe = lbake->cube_prb + 1;
                lbake->cube = lcache->cube_data + 1;
                for (lbake->cube_offset = 1; lbake->cube_offset < 
lbake->cube_count; ++lbake->cube_offset, lbake->probe++, lbake->cube++) {
-                       lightbake_do_sample(lbake, 
eevee_lightbake_render_probe);
+                       lightbake_do_sample(lbake, 
eevee_lightbake_render_probe_sample);
                }
        }
 
+       lcache->flag |= LIGHTCACHE_BAKED;
+
        eevee_lightbake_delete_resources(lbake);
 }
 
+/* This is to update the world irradiance and reflection contribution from
+ * within the viewport drawing (does not have the overhead of a full light 
cache rebuild.) */
+void EEVEE_lightbake_update_world_quick(EEVEE_ViewLayerData *sldata, 
EEVEE_Data *vedata, const Scene *scene)
+{
+       EEVEE_LightCache *lcache = vedata->stl->g_data->light_cache;
+
+       EEVEE_LightBake lbake = {
+               .resource_only = true
+       };
+
+       /* Create resources. */
+       eevee_lightbake_create_render_target(&lbake, 
scene->eevee.gi_cubemap_resolution);
+
+       EEVEE_lightbake_cache_init(sldata, vedata, lbake.rt_color, 
lbake.rt_depth);
+
+       EEVEE_lightbake_render_world(sldata, vedata, lbake.rt_fb);
+       EEVEE_lightbake_filter_glossy(sldata, vedata, lbake.rt_color, 
lbake.store_fb, 0, 1.0f);
+       EEVEE_lightbake_filter_diffuse(sldata, vedata, lbake.rt_color, 
lbake.store_fb, 0, 1.0f);
+
+       /* Don't hide grids if they are already rendered. */
+       lcache->grid_count = max_ii(1, lcache->grid_count);
+       lcache->cube_count = 1;
+
+       lcache->flag |= LIGHTCACHE_CUBE_READY | LIGHTCACHE_GRID_READY;
+       lcache->flag &= ~LIGHTCACHE_UPDATE_WORLD;
+
+       eevee_lightbake_delete_resources(&lbake);
+}
+
 /** \} */
 
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.h 
b/source/blender/draw/engines/eevee/eevee_lightcache.h
index d38fe30e456..db2a42bbc79 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.h
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.h
@@ -31,6 +31,8 @@
 struct ViewLayer;
 struct Scene;
 struct EEVEE_LightCache;
+struct EEVEE_ViewLayerData;
+struct EEVEE_Data;
 
 /* Light Bake */
 void *EEVEE_lightbake_job_data_alloc(struct Main *bmain, struct ViewLayer 
*viewlayer, struct Scene *scene, bool run_as_job);
@@ -38,6 +40,8 @@ void EEVEE_lightbake_job_data_free(void *custom_data);
 void EEVEE_lightbake_update(void *custom_data);
 void EEVEE_lightbake_job(void *custom_data, short *stop, short *do_update, 
float *progress);
 
+void EEVEE_lightbake_update_world_quick(struct EEVEE_ViewLayerData *sldata, 
struct EEVEE_Data *vedata, const Scene *scene);
+
 /* Light Cache */
 struct EEVEE_LightCache *EEVEE_lightcache_create(const int grid_count, const 
int cube_count, const int cube_size, const int irr_size[3]);
 void EEVEE_lightcache_free(struct EEVEE_LightCache *lcache);
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c 
b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index 8690bbe148c..07e318537ff 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -46,6 +46,7 @@
 #include "DEG_depsgraph_query.h"
 
 #include "eevee_engine.h"
+#include "eevee_lightcache.h"
 #include "eevee_private.h"
 
 #include "ED_screen.h"
@@ -72,8 +73,6 @@ static struct {
 
        struct Gwn_VertFormat *format_probe_display_cube;
        struct Gwn_VertFormat *format_probe_display_planar;
-
-       EEVEE_LightCache dummy_cache;
 } e_data = {NULL}; /* Engine data */
 
 extern char datatoc_background_vert_glsl[];
@@ -251,23 +250,22 @@ void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, 
EEVEE_Data *vedata)
                lightprobe_shaders_init();
        }
 
-       /* XXX TODO remove only for testing */
-       if (e_data.dummy_cache.grid_tx == NULL) {
-#ifdef IRRADIANCE_SH_L2
-               /* we need a signed format for Spherical Harmonics */
-               int irradiance_format = GPU_RGBA16F;
-#else
-               int irradiance_format = GPU_RGBA8;
+       if ((scene_eval->eevee.light_cache == NULL) &&
+           (sldata->fallback_lightcache == NULL)) {
+#if defined(IRRADIANCE_SH_L2)
+               int grid_res = 4;
+#elif defined(IRRADIANCE_CUBEMAP)
+               int grid_res = 8;
+#elif defined(IRRADIANCE_HL2)
+               int grid_res = 4;
 #endif
-               float rgba[4] = {0.0f, 1.0f, 0.0f, 0.0f};
-               e_data.dummy_cache.grid_tx = DRW_texture_create_2D_array(1, 1, 
1, irradiance_format, DRW_TEX_FILTER, rgba);
-               e_data.dummy_cache.cube_tx = DRW_texture_create_2D_array(1, 1, 
1, GPU_RGBA8, DRW_TEX_FILTER, rgba);
-               e_data.dummy_cache.cube_data = 
MEM_callocN(sizeof(EEVEE_LightProbe), "EEVEE Cube Data Cache");
-               e_data.dummy_cache.grid_data = 
MEM_callocN(sizeof(EEVEE_LightGrid), "EEVEE Grid Data Cache");
-               e_data.dummy_cache.cube_count = 1;
-               e_data.dummy_cache.grid_count = 1;
+               int cube_res = scene_eval->eevee.gi_cubemap_resolution;
+
+               sldata->fallback_lightcach

@@ 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