[Bf-blender-cvs] [e8d4930c4de] temp-eeveelightcache: Eevee: LightCache: Add fallback cache for world if no scene cache found
Clément Foucault
noreply at git.blender.org
Fri Jun 22 17:46:40 CEST 2018
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. @@
More information about the Bf-blender-cvs
mailing list