[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