[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