[Bf-blender-cvs] [31e21d38e3f] tmp-eevee-shadowmap-refactor: Eevee: Light: Refactor shadow tagging to allow dupli shadow casters
Clément Foucault
noreply at git.blender.org
Mon Sep 2 16:53:37 CEST 2019
Commit: 31e21d38e3f2527fd13ac9e8a6adbf91f1879bc3
Author: Clément Foucault
Date: Fri Aug 30 20:05:21 2019 +0200
Branches: tmp-eevee-shadowmap-refactor
https://developer.blender.org/rB31e21d38e3f2527fd13ac9e8a6adbf91f1879bc3
Eevee: Light: Refactor shadow tagging to allow dupli shadow casters
Dupli objects can now cast shadows.
This also replace the custom lightbits by BLI_bitmap.
===================================================================
M source/blender/draw/engines/eevee/eevee_data.c
M source/blender/draw/engines/eevee/eevee_lights.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 8016e11e55a..8d8019d1e19 100644
--- a/source/blender/draw/engines/eevee/eevee_data.c
+++ b/source/blender/draw/engines/eevee/eevee_data.c
@@ -39,10 +39,10 @@ void EEVEE_view_layer_data_free(void *storage)
GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_fb);
DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_pool);
DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_pool);
- MEM_SAFE_FREE(sldata->shcasters_buffers[0].shadow_casters);
- MEM_SAFE_FREE(sldata->shcasters_buffers[0].flags);
- MEM_SAFE_FREE(sldata->shcasters_buffers[1].shadow_casters);
- MEM_SAFE_FREE(sldata->shcasters_buffers[1].flags);
+ for (int i = 0; i < 2; i++) {
+ MEM_SAFE_FREE(sldata->shcasters_buffers[i].bbox);
+ MEM_SAFE_FREE(sldata->shcasters_buffers[i].update);
+ }
if (sldata->fallback_lightcache) {
EEVEE_lightcache_free(sldata->fallback_lightcache);
@@ -144,7 +144,6 @@ static void eevee_light_data_init(DrawData *dd)
{
EEVEE_LightEngineData *led = (EEVEE_LightEngineData *)dd;
led->need_update = true;
- led->prev_cube_shadow_id = -1;
}
EEVEE_LightEngineData *EEVEE_light_data_get(Object *ob)
diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c
index 0f245d4fad7..6414da749ea 100644
--- a/source/blender/draw/engines/eevee/eevee_lights.c
+++ b/source/blender/draw/engines/eevee/eevee_lights.c
@@ -22,6 +22,7 @@
#include "DRW_render.h"
+#include "BLI_bitmap.h"
#include "BLI_dynstr.h"
#include "BLI_rand.h"
#include "BLI_rect.h"
@@ -32,7 +33,7 @@
#include "eevee_private.h"
-#define SHADOW_CASTER_ALLOC_CHUNK 16
+#define SH_CASTER_ALLOC_CHUNK 32
// #define DEBUG_CSM
// #define DEBUG_SHADOW_DISTRIBUTION
@@ -50,48 +51,6 @@ extern char datatoc_common_view_lib_glsl[];
static void eevee_light_setup(Object *ob, EEVEE_Light *evli);
static float light_attenuation_radius_get(Light *la, float light_threshold);
-/* *********** LIGHT BITS *********** */
-static void lightbits_set_single(EEVEE_LightBits *bitf, uint idx, bool val)
-{
- if (val) {
- bitf->fields[idx / 8] |= (1 << (idx % 8));
- }
- else {
- bitf->fields[idx / 8] &= ~(1 << (idx % 8));
- }
-}
-
-static void lightbits_set_all(EEVEE_LightBits *bitf, bool val)
-{
- memset(bitf, (val) ? 0xFF : 0x00, sizeof(EEVEE_LightBits));
-}
-
-static void lightbits_or(EEVEE_LightBits *r, const EEVEE_LightBits *v)
-{
- for (int i = 0; i < MAX_LIGHTBITS_FIELDS; ++i) {
- r->fields[i] |= v->fields[i];
- }
-}
-
-static bool lightbits_get(const EEVEE_LightBits *r, uint idx)
-{
- return r->fields[idx / 8] & (1 << (idx % 8));
-}
-
-static void lightbits_convert(EEVEE_LightBits *r,
- const EEVEE_LightBits *bitf,
- const int *light_bit_conv_table,
- uint table_length)
-{
- for (int i = 0; i < table_length; ++i) {
- if (lightbits_get(bitf, i) != 0) {
- if (light_bit_conv_table[i] >= 0) {
- r->fields[i / 8] |= (1 << (i % 8));
- }
- }
- }
-}
-
/* *********** FUNCTIONS *********** */
void EEVEE_lights_init(EEVEE_ViewLayerData *sldata)
@@ -118,15 +77,12 @@ void EEVEE_lights_init(EEVEE_ViewLayerData *sldata)
sldata->shadow_render_ubo = DRW_uniformbuffer_create(sizeof(EEVEE_ShadowRender), NULL);
for (int i = 0; i < 2; ++i) {
- sldata->shcasters_buffers[i].shadow_casters = MEM_callocN(
- sizeof(EEVEE_ShadowCaster) * SHADOW_CASTER_ALLOC_CHUNK, "EEVEE_ShadowCaster buf");
- sldata->shcasters_buffers[i].flags = MEM_callocN(sizeof(sldata->shcasters_buffers[0].flags) *
- SHADOW_CASTER_ALLOC_CHUNK,
- "EEVEE_shcast_buffer flags buf");
- sldata->shcasters_buffers[i].alloc_count = SHADOW_CASTER_ALLOC_CHUNK;
+ sldata->shcasters_buffers[i].bbox = MEM_callocN(
+ sizeof(EEVEE_BoundBox) * SH_CASTER_ALLOC_CHUNK, __func__);
+ sldata->shcasters_buffers[i].update = BLI_BITMAP_NEW(SH_CASTER_ALLOC_CHUNK, __func__);
+ sldata->shcasters_buffers[i].alloc_count = SH_CASTER_ALLOC_CHUNK;
sldata->shcasters_buffers[i].count = 0;
}
-
sldata->lights->shcaster_frontbuffer = &sldata->shcasters_buffers[0];
sldata->lights->shcaster_backbuffer = &sldata->shcasters_buffers[1];
}
@@ -167,7 +123,10 @@ void EEVEE_lights_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
EEVEE_StorageList *stl = vedata->stl;
EEVEE_PassList *psl = vedata->psl;
- linfo->shcaster_frontbuffer->count = 0;
+ EEVEE_ShadowCasterBuffer *backbuffer = linfo->shcaster_backbuffer;
+ EEVEE_ShadowCasterBuffer *frontbuffer = linfo->shcaster_frontbuffer;
+
+ frontbuffer->count = 0;
linfo->num_light = 0;
linfo->num_cube_layer = 0;
linfo->num_cascade_layer = 0;
@@ -176,13 +135,11 @@ void EEVEE_lights_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
memset(linfo->light_ref, 0, sizeof(linfo->light_ref));
memset(linfo->shadow_cube_ref, 0, sizeof(linfo->shadow_cube_ref));
memset(linfo->shadow_cascade_ref, 0, sizeof(linfo->shadow_cascade_ref));
- memset(linfo->new_shadow_id, -1, sizeof(linfo->new_shadow_id));
/* Shadow Casters: Reset flags. */
- memset(linfo->shcaster_backbuffer->flags,
- (char)SHADOW_CASTER_PRUNED,
- linfo->shcaster_backbuffer->alloc_count);
- memset(linfo->shcaster_frontbuffer->flags, 0x00, linfo->shcaster_frontbuffer->alloc_count);
+ BLI_bitmap_set_all(backbuffer->update, true, backbuffer->alloc_count);
+ /* Is this one needed? */
+ BLI_bitmap_set_all(frontbuffer->update, false, frontbuffer->alloc_count);
INIT_MINMAX(linfo->shcaster_aabb.min, linfo->shcaster_aabb.max);
@@ -228,12 +185,8 @@ void EEVEE_lights_cache_add(EEVEE_ViewLayerData *sldata, Object *ob)
EEVEE_LightEngineData *led = EEVEE_light_data_ensure(ob);
- /* Save previous shadow id. */
- int prev_cube_sh_id = led->prev_cube_shadow_id;
-
/* Default light without shadows */
led->data.ld.shadow_id = -1;
- led->prev_cube_shadow_id = -1;
if (la->mode & LA_SHADOW) {
if (la->type == LA_SUN) {
@@ -262,12 +215,6 @@ void EEVEE_lights_cache_add(EEVEE_ViewLayerData *sldata, Object *ob)
/* Save Light object. */
linfo->shadow_cube_ref[linfo->cpu_cube_len] = ob;
- /* For light update tracking. */
- if ((prev_cube_sh_id >= 0) && (prev_cube_sh_id < linfo->shcaster_backbuffer->count)) {
- linfo->new_shadow_id[prev_cube_sh_id] = linfo->cpu_cube_len;
- }
- led->prev_cube_shadow_id = linfo->cpu_cube_len;
-
/* Saving light bounds for later. */
BLI_assert(linfo->cpu_cube_len >= 0 && linfo->cpu_cube_len < MAX_LIGHT);
copy_v3_v3(linfo->shadow_bounds[linfo->cpu_cube_len].center, ob->obmat[3]);
@@ -338,42 +285,39 @@ void EEVEE_lights_cache_shcaster_material_add(EEVEE_ViewLayerData *sldata,
/* Make that object update shadow casting lights inside its influence bounding box. */
void EEVEE_lights_cache_shcaster_object_add(EEVEE_ViewLayerData *sldata, Object *ob)
{
- if ((ob->base_flag & BASE_FROM_DUPLI) != 0) {
- /* TODO: Special case for dupli objects because we cannot save the object pointer. */
- return;
- }
-
- EEVEE_ObjectEngineData *oedata = EEVEE_object_data_ensure(ob);
EEVEE_LightsInfo *linfo = sldata->lights;
EEVEE_ShadowCasterBuffer *backbuffer = linfo->shcaster_backbuffer;
EEVEE_ShadowCasterBuffer *frontbuffer = linfo->shcaster_frontbuffer;
- int past_id = oedata->shadow_caster_id;
-
- /* Update flags in backbuffer. */
- if (past_id > -1 && past_id < backbuffer->count) {
- backbuffer->flags[past_id] &= ~SHADOW_CASTER_PRUNED;
-
- if (oedata->need_update) {
- backbuffer->flags[past_id] |= SHADOW_CASTER_UPDATED;
- }
- }
-
- /* Update id. */
- oedata->shadow_caster_id = frontbuffer->count++;
+ bool update = true;
+ int id = frontbuffer->count;
/* Make sure shadow_casters is big enough. */
- if (oedata->shadow_caster_id >= frontbuffer->alloc_count) {
- frontbuffer->alloc_count += SHADOW_CASTER_ALLOC_CHUNK;
- frontbuffer->shadow_casters = MEM_reallocN(
- frontbuffer->shadow_casters, sizeof(EEVEE_ShadowCaster) * frontbuffer->alloc_count);
- frontbuffer->flags = MEM_reallocN(frontbuffer->flags,
- sizeof(EEVEE_ShadowCaster) * frontbuffer->alloc_count);
+ if (id + 1 >= frontbuffer->alloc_count) {
+ frontbuffer->alloc_count += SH_CASTER_ALLOC_CHUNK;
+ frontbuffer->bbox = MEM_reallocN(frontbuffer->bbox,
+ sizeof(EEVEE_BoundBox) * frontbuffer->alloc_count);
+ BLI_BITMAP_RESIZE(frontbuffer->update, frontbuffer->alloc_count);
}
- EEVEE_ShadowCaster *shcaster = frontbuffer->shadow_casters + oedata->shadow_caster_id;
+ if (ob->base_flag & BASE_FROM_DUPLI) {
+ /* Duplis will always refresh the shadowmaps as if they were deleted each frame. */
+ /* TODO(fclem) fix this. */
+ update = true;
+ }
+ else {
+ EEVEE_ObjectEngineData *oedata = EEVEE_object_data_ensure(ob);
+ int past_id = oedata->shadow_caster_id;
+ oedata->shadow_caster_id = id;
+ /* Update flags in backbuffer. */
+ if (past_id > -1 && past_id < backbuffer->count) {
+ BLI_BITMAP_SET(backbuffer->update, past_id, oedata->need_update);
+ }
+ update = oedata->need_update;
+ oedata->need_update = false;
+ }
- if (oedata->need_update) {
- frontbuffer->flags[oedata->shadow_caster_id] = SHADOW_CASTER_UPDATED;
+ if (update) {
+ BLI_BITMAP_ENABLE(frontbuffer->update, id);
}
/* Update World AABB in frontbuffer. */
@@ -387,7 +331,7 @@ void EEVEE_lights_cache_shcaster_object_add(EEVEE_ViewLayerData *sldata, Object
minmax_v3v3_v3(min, max, vec);
}
- EEVEE_BoundBox *aabb = &shcaster->bbox;
+ EEVEE_BoundBox *aabb = &frontbuffer->bbox[id];
add_v3_v3v3(aabb->center, min, max);
mul_v3_fl(aabb->center, 0.5f);
sub_v3_v3v3(aabb->halfdim, aabb->center, max);
@@ -399,7 +343,7 @@ void EEVEE_lights_cache_shcaster_object_add(EEVEE_ViewLayerData *sldata, Object
minmax_v3v3_v3(linf
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list