diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-06-03 01:53:47 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-06-03 01:54:01 +0300 |
commit | 2851e91db41c45806ca3ed87c8363c44b2d60521 (patch) | |
tree | fb4dfa6b5415a89a04f9a943f429ac840b84e568 /source/blender | |
parent | 433bb91a378fb1053b345f37eac958ff682fbdb7 (diff) |
Eevee: Cleanup. Group data functions into one file.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/draw/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_data.c | 105 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_engine.c | 41 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lights.c | 62 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_private.h | 8 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_probes.c | 13 |
6 files changed, 130 insertions, 100 deletions
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index a8a6d3144ca..a7aabeb4662 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -80,6 +80,7 @@ set(SRC modes/sculpt_mode.c engines/basic/basic_engine.c engines/clay/clay_engine.c + engines/eevee/eevee_data.c engines/eevee/eevee_engine.c engines/eevee/eevee_lights.c engines/eevee/eevee_probes.c diff --git a/source/blender/draw/engines/eevee/eevee_data.c b/source/blender/draw/engines/eevee/eevee_data.c new file mode 100644 index 00000000000..66cb82ae277 --- /dev/null +++ b/source/blender/draw/engines/eevee/eevee_data.c @@ -0,0 +1,105 @@ +/* + * Copyright 2016, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Blender Institute + * + */ + +/* All specific data handler for Objects, Lights, SceneLayers, ... + */ + +/** \file eevee_data.c + * \ingroup draw_engine + */ + +#include "DRW_render.h" + +#include "eevee_private.h" + +static void eevee_scene_layer_data_free(void *storage) +{ + EEVEE_SceneLayerData *sldata = (EEVEE_SceneLayerData *)storage; + + /* Lights */ + MEM_SAFE_FREE(sldata->lamps); + DRW_UBO_FREE_SAFE(sldata->light_ubo); + DRW_UBO_FREE_SAFE(sldata->shadow_ubo); + DRW_UBO_FREE_SAFE(sldata->shadow_render_ubo); + DRW_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cube_target_fb); + DRW_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cube_fb); + DRW_FRAMEBUFFER_FREE_SAFE(sldata->shadow_map_fb); + DRW_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cascade_fb); + DRW_TEXTURE_FREE_SAFE(sldata->shadow_depth_cube_target); + DRW_TEXTURE_FREE_SAFE(sldata->shadow_color_cube_target); + DRW_TEXTURE_FREE_SAFE(sldata->shadow_depth_cube_pool); + DRW_TEXTURE_FREE_SAFE(sldata->shadow_depth_map_pool); + DRW_TEXTURE_FREE_SAFE(sldata->shadow_depth_cascade_pool); + BLI_freelistN(&sldata->shadow_casters); + + /* Probes */ + MEM_SAFE_FREE(sldata->probes); + DRW_UBO_FREE_SAFE(sldata->probe_ubo); + DRW_FRAMEBUFFER_FREE_SAFE(sldata->probe_fb); + DRW_FRAMEBUFFER_FREE_SAFE(sldata->probe_filter_fb); + DRW_FRAMEBUFFER_FREE_SAFE(sldata->probe_sh_fb); + DRW_TEXTURE_FREE_SAFE(sldata->probe_rt); + DRW_TEXTURE_FREE_SAFE(sldata->probe_depth_rt); + DRW_TEXTURE_FREE_SAFE(sldata->probe_pool); + DRW_TEXTURE_FREE_SAFE(sldata->probe_sh); +} + +static void eevee_lamp_data_free(void *storage) +{ + EEVEE_LampEngineData *led = (EEVEE_LampEngineData *)storage; + + MEM_SAFE_FREE(led->storage); + BLI_freelistN(&led->shadow_caster_list); +} + +EEVEE_SceneLayerData *EEVEE_scene_layer_data_get(void) +{ + EEVEE_SceneLayerData **sldata = (EEVEE_SceneLayerData **)DRW_scene_layer_engine_data_get(&draw_engine_eevee_type, &eevee_scene_layer_data_free); + + if (*sldata == NULL) { + *sldata = MEM_callocN(sizeof(**sldata), "EEVEE_SceneLayerData"); + } + + return *sldata; +} + +EEVEE_ObjectEngineData *EEVEE_object_data_get(Object *ob) +{ + EEVEE_ObjectEngineData **oedata = (EEVEE_ObjectEngineData **)DRW_object_engine_data_get(ob, &draw_engine_eevee_type, NULL); + + if (*oedata == NULL) { + *oedata = MEM_callocN(sizeof(**oedata), "EEVEE_ObjectEngineData"); + } + + return *oedata; +} + +EEVEE_LampEngineData *EEVEE_lamp_data_get(Object *ob) +{ + EEVEE_LampEngineData **ledata = (EEVEE_LampEngineData **)DRW_object_engine_data_get(ob, &draw_engine_eevee_type, &eevee_lamp_data_free); + + if (*ledata == NULL) { + *ledata = MEM_callocN(sizeof(**ledata), "EEVEE_LampEngineData"); + (*ledata)->need_update = true; + } + + return *ledata; +} diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index 3e2b47819d7..ab8923109e9 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -88,9 +88,6 @@ extern char datatoc_background_vert_glsl[]; extern Material defmaterial; extern GlobalsUboStorage ts; -/* Prototypes */ -static void EEVEE_scene_layer_data_free(void *storage); - static struct GPUTexture *create_jitter_texture(int w, int h) { struct GPUTexture *tex; @@ -190,11 +187,7 @@ static void EEVEE_engine_init(void *ved) EEVEE_Data *vedata = (EEVEE_Data *)ved; EEVEE_TextureList *txl = vedata->txl; EEVEE_FramebufferList *fbl = vedata->fbl; - EEVEE_SceneLayerData **sldata = (EEVEE_SceneLayerData **)DRW_scene_layer_engine_data_get(&draw_engine_eevee_type, &EEVEE_scene_layer_data_free); - - if (*sldata == NULL) { - *sldata = MEM_callocN(sizeof(EEVEE_SceneLayerData), "EEVEE_SceneLayerData"); - } + EEVEE_SceneLayerData *sldata = EEVEE_scene_layer_data_get(); DRWFboTexture tex = {&txl->color, DRW_TEX_RGB_11_11_10, DRW_TEX_FILTER}; @@ -266,9 +259,9 @@ static void EEVEE_engine_init(void *ved) copy_v3_v3(e_data.camera_pos, viewinvmat[3]); } - EEVEE_lights_init(*sldata); + EEVEE_lights_init(sldata); - EEVEE_probes_init(*sldata); + EEVEE_probes_init(sldata); EEVEE_effects_init(vedata); @@ -291,7 +284,7 @@ static void EEVEE_cache_init(void *vedata) EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl; EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; - EEVEE_SceneLayerData *sldata = *(EEVEE_SceneLayerData **)DRW_scene_layer_engine_data_get(&draw_engine_eevee_type, &EEVEE_scene_layer_data_free); + EEVEE_SceneLayerData *sldata = EEVEE_scene_layer_data_get(); if (!stl->g_data) { @@ -441,22 +434,11 @@ static void EEVEE_cache_init(void *vedata) EEVEE_effects_cache_init(vedata); } -EEVEE_ObjectEngineData *EEVEE_get_object_engine_data(Object *ob) -{ - EEVEE_ObjectEngineData **oedata = (EEVEE_ObjectEngineData **)DRW_object_engine_data_get(ob, &draw_engine_eevee_type, NULL); - - if (*oedata == NULL) { - *oedata = MEM_callocN(sizeof(**oedata), "EEVEE_ObjectEngineData"); - } - - return *oedata; -} - static void EEVEE_cache_populate(void *vedata, Object *ob) { EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl; - EEVEE_SceneLayerData *sldata = *(EEVEE_SceneLayerData **)DRW_scene_layer_engine_data_get(&draw_engine_eevee_type, &EEVEE_scene_layer_data_free); + EEVEE_SceneLayerData *sldata = EEVEE_scene_layer_data_get(); const DRWContextState *draw_ctx = DRW_context_state_get(); const bool is_active = (ob == draw_ctx->obact); @@ -577,7 +559,7 @@ static void EEVEE_cache_populate(void *vedata, Object *ob) if (cast_shadow) { EEVEE_lights_cache_shcaster_add(sldata, psl, geom, ob->obmat); BLI_addtail(&sldata->shadow_casters, BLI_genericNodeN(ob)); - EEVEE_ObjectEngineData *oedata = EEVEE_get_object_engine_data(ob); + EEVEE_ObjectEngineData *oedata = EEVEE_object_data_get(ob); oedata->need_update = ((ob->deg_update_flag & DEG_RUNTIME_DATA_UPDATE) != 0); } } @@ -601,7 +583,7 @@ static void eevee_bind_shadow(void *data, DRWShadingGroup *shgrp) static void EEVEE_cache_finish(void *vedata) { EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl; - EEVEE_SceneLayerData *sldata = *(EEVEE_SceneLayerData **)DRW_scene_layer_engine_data_get(&draw_engine_eevee_type, &EEVEE_scene_layer_data_free); + EEVEE_SceneLayerData *sldata = EEVEE_scene_layer_data_get(); EEVEE_lights_cache_finish(sldata); EEVEE_probes_cache_finish(sldata); @@ -620,7 +602,7 @@ static void EEVEE_draw_scene(void *vedata) { EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl; EEVEE_FramebufferList *fbl = ((EEVEE_Data *)vedata)->fbl; - EEVEE_SceneLayerData *sldata = *(EEVEE_SceneLayerData **)DRW_scene_layer_engine_data_get(&draw_engine_eevee_type, &EEVEE_scene_layer_data_free); + EEVEE_SceneLayerData *sldata = EEVEE_scene_layer_data_get(); /* Default framebuffer and texture */ DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); @@ -664,13 +646,6 @@ static void EEVEE_engine_free(void) DRW_TEXTURE_FREE_SAFE(e_data.jitter); } -static void EEVEE_scene_layer_data_free(void *storage) -{ - EEVEE_SceneLayerData *sldata = (EEVEE_SceneLayerData *)storage; - EEVEE_scene_layer_lights_free(sldata); - EEVEE_scene_layer_probes_free(sldata); -} - static void EEVEE_layer_collection_settings_create(RenderEngine *UNUSED(engine), IDProperty *props) { BLI_assert(props && diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c index 1685d71dfbe..0c27ede2148 100644 --- a/source/blender/draw/engines/eevee/eevee_lights.c +++ b/source/blender/draw/engines/eevee/eevee_lights.c @@ -69,25 +69,6 @@ extern char datatoc_shadow_store_frag_glsl[]; /* *********** FUNCTIONS *********** */ -static void eevee_lamp_engine_data_free(void *storage) -{ - EEVEE_LampEngineData *led = (EEVEE_LampEngineData *)storage; - MEM_SAFE_FREE(led->storage); - BLI_freelistN(&led->shadow_caster_list); -} - -static EEVEE_LampEngineData *eevee_get_lamp_engine_data(Object *ob) -{ - EEVEE_LampEngineData **ledata = (EEVEE_LampEngineData **)DRW_object_engine_data_get(ob, &draw_engine_eevee_type, &eevee_lamp_engine_data_free); - - if (*ledata == NULL) { - *ledata = MEM_callocN(sizeof(**ledata), "EEVEE_LampEngineData"); - (*ledata)->need_update = true; - } - - return *ledata; -} - void EEVEE_lights_init(EEVEE_SceneLayerData *sldata) { const unsigned int shadow_ubo_size = sizeof(EEVEE_ShadowCube) * MAX_SHADOW_CUBE + @@ -152,7 +133,7 @@ void EEVEE_lights_cache_add(EEVEE_SceneLayerData *sldata, Object *ob) } else { Lamp *la = (Lamp *)ob->data; - EEVEE_LampEngineData *led = eevee_get_lamp_engine_data(ob); + EEVEE_LampEngineData *led = EEVEE_lamp_data_get(ob); if ((ob->deg_update_flag & DEG_RUNTIME_DATA_UPDATE) != 0) { led->need_update = true; @@ -633,7 +614,7 @@ static void delete_pruned_shadowcaster(EEVEE_LampEngineData *led) static void light_tag_shadow_update(Object *lamp, Object *ob) { Lamp *la = lamp->data; - EEVEE_LampEngineData *led = eevee_get_lamp_engine_data(lamp); + EEVEE_LampEngineData *led = EEVEE_lamp_data_get(lamp); bool is_inside_range = cube_bbox_intersect(lamp->obmat[3], la->clipend, BKE_object_boundbox_get(ob), ob->obmat); ShadowCaster *ldata = search_object_in_list(&led->shadow_caster_list, ob); @@ -647,7 +628,7 @@ static void light_tag_shadow_update(Object *lamp, Object *ob) led->need_update = true; } else { - EEVEE_ObjectEngineData *oedata = EEVEE_get_object_engine_data(ob); + EEVEE_ObjectEngineData *oedata = EEVEE_object_data_get(ob); if (oedata->need_update) { led->need_update = true; } @@ -682,7 +663,7 @@ void EEVEE_lights_update(EEVEE_SceneLayerData *sldata) /* Prune shadow casters to remove if object does not exists anymore (unprune them if object exists) */ Object *lamp; for (i = 0; (lamp = linfo->shadow_cube_ref[i]) && (i < MAX_SHADOW_CUBE); i++) { - EEVEE_LampEngineData *led = eevee_get_lamp_engine_data(lamp); + EEVEE_LampEngineData *led = EEVEE_lamp_data_get(lamp); if ((linfo->update_flag & LIGHT_UPDATE_SHADOW_CUBE) != 0) { led->need_update = true; @@ -698,23 +679,23 @@ void EEVEE_lights_update(EEVEE_SceneLayerData *sldata) } for (i = 0; (ob = linfo->light_ref[i]) && (i < MAX_LIGHT); i++) { - EEVEE_LampEngineData *led = eevee_get_lamp_engine_data(ob); + EEVEE_LampEngineData *led = EEVEE_lamp_data_get(ob); eevee_light_setup(ob, linfo, led); } for (i = 0; (ob = linfo->shadow_cube_ref[i]) && (i < MAX_SHADOW_CUBE); i++) { - EEVEE_LampEngineData *led = eevee_get_lamp_engine_data(ob); + EEVEE_LampEngineData *led = EEVEE_lamp_data_get(ob); eevee_shadow_cube_setup(ob, linfo, led); delete_pruned_shadowcaster(led); } for (i = 0; (ob = linfo->shadow_map_ref[i]) && (i < MAX_SHADOW_MAP); i++) { - EEVEE_LampEngineData *led = eevee_get_lamp_engine_data(ob); + EEVEE_LampEngineData *led = EEVEE_lamp_data_get(ob); eevee_shadow_map_setup(ob, linfo, led); } for (i = 0; (ob = linfo->shadow_cascade_ref[i]) && (i < MAX_SHADOW_CASCADE); i++) { - EEVEE_LampEngineData *led = eevee_get_lamp_engine_data(ob); + EEVEE_LampEngineData *led = EEVEE_lamp_data_get(ob); eevee_shadow_cascade_setup(ob, linfo, led); } @@ -733,7 +714,7 @@ void EEVEE_draw_shadows(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl) /* Cube Shadow Maps */ /* Render each shadow to one layer of the array */ for (i = 0; (ob = linfo->shadow_cube_ref[i]) && (i < MAX_SHADOW_CUBE); i++) { - EEVEE_LampEngineData *led = eevee_get_lamp_engine_data(ob); + EEVEE_LampEngineData *led = EEVEE_lamp_data_get(ob); Lamp *la = (Lamp *)ob->data; if (led->need_update) { @@ -769,7 +750,7 @@ void EEVEE_draw_shadows(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl) /* Render each shadow to one layer of the array */ for (i = 0; (ob = linfo->shadow_map_ref[i]) && (i < MAX_SHADOW_MAP); i++) { - EEVEE_LampEngineData *led = eevee_get_lamp_engine_data(ob); + EEVEE_LampEngineData *led = EEVEE_lamp_data_get(ob); EEVEE_ShadowMapData *evsmd = (EEVEE_ShadowMapData *)led->storage; linfo->layer = i; @@ -784,7 +765,7 @@ void EEVEE_draw_shadows(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl) // /* Render each shadow to one layer of the array */ // for (i = 0; (ob = linfo->shadow_cascade_ref[i]) && (i < MAX_SHADOW_CASCADE); i++) { -// EEVEE_LampEngineData *led = eevee_get_lamp_engine_data(ob); +// EEVEE_LampEngineData *led = EEVEE_lamp_data_get(ob); // EEVEE_ShadowCascadeData *evscd = (EEVEE_ShadowCascadeData *)led->storage; // EEVEE_ShadowRender *srd = &linfo->shadow_render_data; @@ -802,23 +783,4 @@ void EEVEE_lights_free(void) { DRW_SHADER_FREE_SAFE(e_data.shadow_sh); DRW_SHADER_FREE_SAFE(e_data.shadow_store_sh); -} - -void EEVEE_scene_layer_lights_free(EEVEE_SceneLayerData *sldata) -{ - MEM_SAFE_FREE(sldata->lamps); - DRW_UBO_FREE_SAFE(sldata->light_ubo); - DRW_UBO_FREE_SAFE(sldata->shadow_ubo); - DRW_UBO_FREE_SAFE(sldata->shadow_render_ubo); - DRW_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cube_target_fb); - DRW_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cube_fb); - DRW_FRAMEBUFFER_FREE_SAFE(sldata->shadow_map_fb); - DRW_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cascade_fb); - DRW_TEXTURE_FREE_SAFE(sldata->shadow_depth_cube_target); - DRW_TEXTURE_FREE_SAFE(sldata->shadow_color_cube_target); - DRW_TEXTURE_FREE_SAFE(sldata->shadow_depth_cube_pool); - DRW_TEXTURE_FREE_SAFE(sldata->shadow_depth_map_pool); - DRW_TEXTURE_FREE_SAFE(sldata->shadow_depth_cascade_pool); - - BLI_freelistN(&sldata->shadow_casters); -} +}
\ No newline at end of file diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index 2f7beead1af..39adf1bdfe7 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -284,8 +284,10 @@ typedef struct EEVEE_PrivateData { struct DRWShadingGroup *depth_shgrp_cull; } EEVEE_PrivateData; /* Transient data */ -/* eevee_engine.c */ -EEVEE_ObjectEngineData *EEVEE_get_object_engine_data(Object *ob); +/* eevee_data.c */ +EEVEE_SceneLayerData *EEVEE_scene_layer_data_get(void); +EEVEE_ObjectEngineData *EEVEE_object_data_get(Object *ob); +EEVEE_LampEngineData *EEVEE_lamp_data_get(Object *ob); /* eevee_lights.c */ void EEVEE_lights_init(EEVEE_SceneLayerData *sldata); @@ -296,7 +298,6 @@ void EEVEE_lights_cache_finish(EEVEE_SceneLayerData *sldata); void EEVEE_lights_update(EEVEE_SceneLayerData *sldata); void EEVEE_draw_shadows(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl); void EEVEE_lights_free(void); -void EEVEE_scene_layer_lights_free(EEVEE_SceneLayerData *sldata); /* eevee_probes.c */ void EEVEE_probes_init(EEVEE_SceneLayerData *sldata); @@ -306,7 +307,6 @@ void EEVEE_probes_cache_finish(EEVEE_SceneLayerData *sldata); void EEVEE_probes_update(EEVEE_SceneLayerData *sldata); void EEVEE_refresh_probe(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl); void EEVEE_probes_free(void); -void EEVEE_scene_layer_probes_free(EEVEE_SceneLayerData *sldata); /* eevee_effects.c */ void EEVEE_effects_init(EEVEE_Data *vedata); diff --git a/source/blender/draw/engines/eevee/eevee_probes.c b/source/blender/draw/engines/eevee/eevee_probes.c index 9c9fc052b3f..3368b9ea4f3 100644 --- a/source/blender/draw/engines/eevee/eevee_probes.c +++ b/source/blender/draw/engines/eevee/eevee_probes.c @@ -295,16 +295,3 @@ void EEVEE_probes_free(void) DRW_SHADER_FREE_SAFE(e_data.probe_spherical_harmonic_sh); DRW_TEXTURE_FREE_SAFE(e_data.hammersley); } - -void EEVEE_scene_layer_probes_free(EEVEE_SceneLayerData *sldata) -{ - MEM_SAFE_FREE(sldata->probes); - DRW_UBO_FREE_SAFE(sldata->probe_ubo); - DRW_FRAMEBUFFER_FREE_SAFE(sldata->probe_fb); - DRW_FRAMEBUFFER_FREE_SAFE(sldata->probe_filter_fb); - DRW_FRAMEBUFFER_FREE_SAFE(sldata->probe_sh_fb); - DRW_TEXTURE_FREE_SAFE(sldata->probe_rt); - DRW_TEXTURE_FREE_SAFE(sldata->probe_depth_rt); - DRW_TEXTURE_FREE_SAFE(sldata->probe_pool); - DRW_TEXTURE_FREE_SAFE(sldata->probe_sh); -} |