[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