[Bf-blender-cvs] [1f51b0212fd] temp-eeveelightcache: Eevee: LightCache: Add Autobake property

Clément Foucault noreply at git.blender.org
Mon Jul 9 23:03:36 CEST 2018


Commit: 1f51b0212fd46f943d598e41fff64a7a4c301da2
Author: Clément Foucault
Date:   Sun Jul 8 09:28:58 2018 +0200
Branches: temp-eeveelightcache
https://developer.blender.org/rB1f51b0212fd46f943d598e41fff64a7a4c301da2

Eevee: LightCache: Add Autobake property

This also add partial probe update per type (only update cubemap if needed)
but it seems to be broken by some double update tagging in the depsgraph.

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

M	release/scripts/startup/bl_ui/properties_render.py
M	source/blender/draw/engines/eevee/eevee_lightcache.c
M	source/blender/draw/engines/eevee/eevee_lightprobes.c
M	source/blender/editors/render/render_shading.c
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_scene.c

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

diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index a9f50644986..d973eeb8f1d 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -718,6 +718,8 @@ class RENDER_PT_eevee_indirect_lighting(RenderButtonsPanel, Panel):
 
         col = layout.column()
         col.operator("scene.light_cache_bake", text="Bake Indirect Lighting", icon='RENDER_STILL')
+        col.prop(props, "gi_auto_bake")
+
         col.prop(props, "gi_diffuse_bounces")
         col.prop(props, "gi_cubemap_resolution")
         col.prop(props, "gi_visibility_resolution", text="Diffuse Occlusion")
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c
index 89f21b02dcd..c7694b0cbba 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.c
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.c
@@ -138,6 +138,7 @@ typedef struct EEVEE_LightBake {
 
 	bool resource_only;              /* For only handling the resources. */
 	bool own_resources;
+	bool own_light_cache;            /* If the lightcache was created for baking, it's first owned by the baker. */
 	int delay;                       /* ms. delay the start of the baking to not slowdown interactions (TODO remove) */
 
 	void *gl_context, *gwn_context;  /* If running in parallel (in a separate thread), use this context. */
@@ -175,8 +176,8 @@ static bool EEVEE_lightcache_validate(
 		    (irr_size[1] == light_cache->grid_tx.tex_size[1]) &&
 		    (irr_size[2] == light_cache->grid_tx.tex_size[2]))
 		{
-			if ((cube_res == light_cache->grid_tx.tex_size[0]) &&
-			    (cube_len == light_cache->grid_tx.tex_size[2])) {
+			if ((cube_res == light_cache->cube_tx.tex_size[0]) &&
+			    (cube_len == light_cache->cube_tx.tex_size[2])) {
 				return true;
 			}
 		}
@@ -421,11 +422,14 @@ static void eevee_lightbake_create_resources(EEVEE_LightBake *lbake)
 		                                        lbake->ref_cube_res,
 		                                        lbake->vis_res,
 		                                        lbake->irr_size);
+		lbake->lcache->flag = LIGHTCACHE_UPDATE_WORLD | LIGHTCACHE_UPDATE_CUBE | LIGHTCACHE_UPDATE_GRID;
+		lbake->lcache->vis_res = lbake->vis_res;
+		lbake->own_light_cache = true;
+
 		eevee->light_cache = lbake->lcache;
 	}
 
-	lbake->lcache->vis_res = lbake->vis_res;
-	lbake->lcache->flag = LIGHTCACHE_UPDATE_WORLD | LIGHTCACHE_UPDATE_CUBE | LIGHTCACHE_UPDATE_GRID | LIGHTCACHE_BAKING;
+	lbake->lcache->flag |= LIGHTCACHE_BAKING;
 }
 
 wmJob *EEVEE_lightbake_job_create(
@@ -455,7 +459,6 @@ wmJob *EEVEE_lightbake_job_create(
 		lbake->bmain = bmain;
 		lbake->view_layer_input = view_layer;
 		lbake->gl_context = old_lbake->gl_context;
-		lbake->gwn_context = old_lbake->gwn_context;
 		lbake->own_resources = true;
 		lbake->delay = delay;
 
@@ -492,6 +495,7 @@ void *EEVEE_lightbake_job_data_alloc(
 	lbake->bmain = bmain;
 	lbake->view_layer_input = view_layer;
 	lbake->own_resources = true;
+	lbake->own_light_cache = false;
 
 	if (run_as_job) {
 		lbake->gl_context = WM_opengl_context_create();
@@ -526,6 +530,11 @@ static void eevee_lightbake_delete_resources(EEVEE_LightBake *lbake)
 		DRW_opengl_context_enable();
 	}
 
+	if (lbake->own_light_cache) {
+		EEVEE_lightcache_free(lbake->lcache);
+		lbake->lcache = NULL;
+	}
+
 	DRW_TEXTURE_FREE_SAFE(lbake->rt_depth);
 	DRW_TEXTURE_FREE_SAFE(lbake->rt_color);
 	DRW_TEXTURE_FREE_SAFE(lbake->grid_prev);
@@ -534,18 +543,20 @@ static void eevee_lightbake_delete_resources(EEVEE_LightBake *lbake)
 		GPU_FRAMEBUFFER_FREE_SAFE(lbake->rt_fb[i]);
 	}
 
-	if (lbake->gl_context && lbake->own_resources) {
-		/* Delete the baking context. */
+	if (lbake->gwn_context) {
 		DRW_gawain_render_context_disable(lbake->gwn_context);
 		DRW_gawain_render_context_enable(lbake->gwn_context);
 		GWN_context_discard(lbake->gwn_context);
+	}
+
+	if (lbake->gl_context && lbake->own_resources) {
+		/* Delete the baking context. */
 		DRW_opengl_render_context_disable(lbake->gl_context);
 		WM_opengl_context_dispose(lbake->gl_context);
 		lbake->gwn_context = NULL;
 		lbake->gl_context = NULL;
 	}
 	else if (lbake->gl_context) {
-		DRW_gawain_render_context_disable(lbake->gwn_context);
 		DRW_opengl_render_context_disable(lbake->gl_context);
 	}
 	else if (!lbake->resource_only) {
@@ -559,7 +570,6 @@ static void eevee_lightbake_cache_create(EEVEE_Data *vedata, EEVEE_LightBake *lb
 	EEVEE_StorageList *stl = vedata->stl;
 	EEVEE_FramebufferList *fbl = vedata->fbl;
 	EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
-	EEVEE_LightProbesInfo *pinfo = sldata->probes;
 	Scene *scene_eval = DEG_get_evaluated_scene(lbake->depsgraph);
 	/* Disable all effects BUT high bitdepth shadows. */
 	scene_eval->eevee.flag &= SCE_EEVEE_SHADOW_HIGH_BITDEPTH;
@@ -592,6 +602,7 @@ static void eevee_lightbake_cache_create(EEVEE_Data *vedata, EEVEE_LightBake *lb
 	EEVEE_lightbake_cache_init(sldata, vedata, lbake->rt_color, lbake->rt_depth);
 
 	if (lbake->probe) {
+		EEVEE_LightProbesInfo *pinfo = sldata->probes;
 		LightProbe *prb = *lbake->probe;
 		pinfo->vis_data.collection = prb->visibility_grp;
 		pinfo->vis_data.invert = prb->flag & LIGHTPROBE_FLAG_INVERT_GROUP;
@@ -899,11 +910,12 @@ void EEVEE_lightbake_update(void *custom_data)
 	Scene *scene_orig = lbake->scene;
 
 	/* If a new lightcache was created, free the old one and reference the new. */
-	if (scene_orig->eevee.light_cache != lbake->lcache) {
+	if (lbake->lcache && scene_orig->eevee.light_cache != lbake->lcache) {
 		if (scene_orig->eevee.light_cache != NULL) {
 			EEVEE_lightcache_free(scene_orig->eevee.light_cache);
 		}
 		scene_orig->eevee.light_cache = lbake->lcache;
+		lbake->own_light_cache = false;
 	}
 
 	DEG_id_tag_update(&scene_orig->id, DEG_TAG_COPY_ON_WRITE);
@@ -1015,7 +1027,8 @@ void EEVEE_lightbake_job(void *custom_data, short *stop, short *do_update, float
 	eevee_lightbake_readback_reflections(lcache);
 	eevee_lightbake_context_disable(lbake);
 
-	lcache->flag |= LIGHTCACHE_BAKED;
+	lcache->flag |=  LIGHTCACHE_BAKED;
+	lcache->flag &= ~LIGHTCACHE_BAKING;
 
 	eevee_lightbake_delete_resources(lbake);
 }
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index 92e61aa773a..bca667d2ab0 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -837,19 +837,22 @@ void EEVEE_lightprobes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *ved
 		const DRWContextState *draw_ctx = DRW_context_state_get();
 		BLI_assert(draw_ctx->evil_C);
 
-		Scene *scene_orig = DEG_get_input_scene(draw_ctx->depsgraph);
-
-		if (scene_orig->eevee.light_cache != NULL) {
-			if (pinfo->do_grid_update) {
-				scene_orig->eevee.light_cache->flag |= LIGHTCACHE_UPDATE_GRID;
+		if (draw_ctx->scene->eevee.flag & SCE_EEVEE_GI_AUTOBAKE) {
+			Scene *scene_orig = DEG_get_input_scene(draw_ctx->depsgraph);
+			if (scene_orig->eevee.light_cache != NULL) {
+				if (pinfo->do_grid_update) {
+					scene_orig->eevee.light_cache->flag |= LIGHTCACHE_UPDATE_GRID;
+				printf("LIGHTCACHE_UPDATE_GRID\n");
+				}
+				/* If we update grid we need to update the cubemaps too.
+				 * So always refresh cubemaps. */
+				scene_orig->eevee.light_cache->flag |= LIGHTCACHE_UPDATE_CUBE;
+				printf("LIGHTCACHE_UPDATE_CUBE\n");
 			}
-			/* If we update grid we need to update the cubemaps too.
-			 * So always refresh cubemaps. */
-			scene_orig->eevee.light_cache->flag |= LIGHTCACHE_UPDATE_CUBE;
-		}
 
-		/* Use a notifier to trigger the operator after all */
-		WM_event_add_notifier(draw_ctx->evil_C, NC_LIGHTPROBE, scene_orig);
+			/* Use a notifier to trigger the operator after drawing. */
+			WM_event_add_notifier(draw_ctx->evil_C, NC_LIGHTPROBE, scene_orig);
+		}
 	}
 }
 
diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c
index 23ac1dfd598..f1a138e2292 100644
--- a/source/blender/editors/render/render_shading.c
+++ b/source/blender/editors/render/render_shading.c
@@ -33,6 +33,7 @@
 
 #include "DNA_curve_types.h"
 #include "DNA_lamp_types.h"
+#include "DNA_lightprobe_types.h"
 #include "DNA_material_types.h"
 #include "DNA_node_types.h"
 #include "DNA_object_types.h"
@@ -676,6 +677,29 @@ void SCENE_OT_view_layer_remove(wmOperatorType *ot)
 }
 
 /********************** light cache operators *********************/
+enum {
+	LIGHTCACHE_SUBSET_ALL = 0,
+	LIGHTCACHE_SUBSET_DIRTY,
+	LIGHTCACHE_SUBSET_CUBE,
+};
+
+static void light_cache_bake_tag_cache(Scene *scene, wmOperator *op)
+{
+	if (scene->eevee.light_cache != NULL) {
+		int subset = RNA_enum_get(op->ptr, "subset");
+		switch (subset) {
+			case LIGHTCACHE_SUBSET_ALL:
+				scene->eevee.light_cache->flag |= LIGHTCACHE_UPDATE_GRID | LIGHTCACHE_UPDATE_CUBE;
+				break;
+			case LIGHTCACHE_SUBSET_CUBE:
+				scene->eevee.light_cache->flag |= LIGHTCACHE_UPDATE_CUBE;
+				break;
+			case LIGHTCACHE_SUBSET_DIRTY:
+				/* Leave tag untouched. */
+				break;
+		}
+	}
+}
 
 /* catch esc */
 static int light_cache_bake_modal(bContext *C, wmOperator *op, const wmEvent *event)
@@ -705,7 +729,7 @@ static void light_cache_bake_cancel(bContext *C, wmOperator *op)
 }
 
 /* executes blocking render */
-static int light_cache_bake_exec(bContext *C, wmOperator *UNUSED(op))
+static int light_cache_bake_exec(bContext *C, wmOperator *op)
 {
 	ViewLayer *view_layer = CTX_data_view_layer(C);
 	Main *bmain = CTX_data_main(C);
@@ -715,6 +739,9 @@ static int light_cache_bake_exec(bContext *C, wmOperator *UNUSED(op))
 
 	/* TODO abort if selected engine is not eevee. */
 	void *rj = EEVEE_lightbake_job_data_alloc(bmain, view_layer, scene, false);
+
+	light_cache_bake_tag_cache(scene, op);
+
 	short stop = 0, do_update; float progress; /* Not actually used. */
 	EEVEE_lightbake_job(rj, &stop, &do_update, &progress);
 	EEVEE_lightbake_update(rj);
@@ -746,6 +773,8 @@ static int light_cache_bake_invoke(bContext *C, wmOperator *op, const wmEvent *U
 	/* add modal handler for ESC */
 	WM_event_add_modal_handler(C, op);
 
+	light_cache_bake_tag_cache(

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list