diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-11-29 13:00:50 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-11-29 13:07:52 +0300 |
commit | 69d33ecdec0d131ede1ed488fc1cf16689c07284 (patch) | |
tree | 0524ba73f36ad0d24ff55973354a7107d8e903fe /source/blender/draw | |
parent | dc4c9de91a902b36c0d52a6546e09f649cf42c1e (diff) |
Eevee: Stop depsgraph update callback form allocating unneeded memory
Diffstat (limited to 'source/blender/draw')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_data.c | 24 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_engine.c | 6 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_private.h | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 20 |
5 files changed, 53 insertions, 3 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_data.c b/source/blender/draw/engines/eevee/eevee_data.c index ef1ff026855..d1cd1b1440c 100644 --- a/source/blender/draw/engines/eevee/eevee_data.c +++ b/source/blender/draw/engines/eevee/eevee_data.c @@ -78,6 +78,12 @@ static void eevee_lightprobe_data_free(void *storage) BLI_freelistN(&ped->captured_object_list); } +EEVEE_ViewLayerData *EEVEE_view_layer_data_get(void) +{ + return (EEVEE_ViewLayerData *)DRW_view_layer_engine_data_get( + &draw_engine_eevee_type); +} + EEVEE_ViewLayerData *EEVEE_view_layer_data_ensure(void) { EEVEE_ViewLayerData **sldata = (EEVEE_ViewLayerData **)DRW_view_layer_engine_data_ensure( @@ -90,6 +96,12 @@ EEVEE_ViewLayerData *EEVEE_view_layer_data_ensure(void) return *sldata; } +EEVEE_ObjectEngineData *EEVEE_object_data_get(Object *ob) +{ + return (EEVEE_ObjectEngineData *)DRW_object_engine_data_get( + ob, &draw_engine_eevee_type); +} + EEVEE_ObjectEngineData *EEVEE_object_data_ensure(Object *ob) { EEVEE_ObjectEngineData **oedata = (EEVEE_ObjectEngineData **)DRW_object_engine_data_ensure( @@ -102,6 +114,12 @@ EEVEE_ObjectEngineData *EEVEE_object_data_ensure(Object *ob) return *oedata; } +EEVEE_LightProbeEngineData *EEVEE_lightprobe_data_get(Object *ob) +{ + return (EEVEE_LightProbeEngineData *)DRW_object_engine_data_get( + ob, &draw_engine_eevee_type); +} + EEVEE_LightProbeEngineData *EEVEE_lightprobe_data_ensure(Object *ob) { EEVEE_LightProbeEngineData **pedata = (EEVEE_LightProbeEngineData **)DRW_object_engine_data_ensure( @@ -116,6 +134,12 @@ EEVEE_LightProbeEngineData *EEVEE_lightprobe_data_ensure(Object *ob) return *pedata; } +EEVEE_LampEngineData *EEVEE_lamp_data_get(Object *ob) +{ + return (EEVEE_LampEngineData *)DRW_object_engine_data_get( + ob, &draw_engine_eevee_type); +} + EEVEE_LampEngineData *EEVEE_lamp_data_ensure(Object *ob) { EEVEE_LampEngineData **ledata = (EEVEE_LampEngineData **)DRW_object_engine_data_ensure( diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index e505b705f15..8989213baa0 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -290,15 +290,15 @@ static void EEVEE_id_update(void *UNUSED(vedata), ID *id) const ID_Type id_type = GS(id->name); if (id_type == ID_OB) { Object *object = (Object *)id; - EEVEE_LightProbeEngineData *ped = EEVEE_lightprobe_data_ensure(object); + EEVEE_LightProbeEngineData *ped = EEVEE_lightprobe_data_get(object); if (ped != NULL) { ped->need_full_update = true; } - EEVEE_LampEngineData *led = EEVEE_lamp_data_ensure(object); + EEVEE_LampEngineData *led = EEVEE_lamp_data_get(object); if (led != NULL) { led->need_update = true; } - EEVEE_ObjectEngineData *oedata = EEVEE_object_data_ensure(object); + EEVEE_ObjectEngineData *oedata = EEVEE_object_data_get(object); if (oedata != NULL) { oedata->need_update = true; } diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index 9d35d1658ea..dc99d941db8 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -640,9 +640,13 @@ typedef struct EEVEE_PrivateData { } EEVEE_PrivateData; /* Transient data */ /* eevee_data.c */ +EEVEE_ViewLayerData *EEVEE_view_layer_data_get(void); EEVEE_ViewLayerData *EEVEE_view_layer_data_ensure(void); +EEVEE_ObjectEngineData *EEVEE_object_data_get(Object *ob); EEVEE_ObjectEngineData *EEVEE_object_data_ensure(Object *ob); +EEVEE_LightProbeEngineData *EEVEE_lightprobe_data_get(Object *ob); EEVEE_LightProbeEngineData *EEVEE_lightprobe_data_ensure(Object *ob); +EEVEE_LampEngineData *EEVEE_lamp_data_get(Object *ob); EEVEE_LampEngineData *EEVEE_lamp_data_ensure(Object *ob); /* eevee_materials.c */ diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index a34485e7e40..0753dbc7a1a 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -384,9 +384,11 @@ struct DefaultTextureList *DRW_viewport_texture_list_get(void); void DRW_viewport_request_redraw(void); /* ViewLayers */ +void *DRW_view_layer_engine_data_get(DrawEngineType *engine_type); void **DRW_view_layer_engine_data_ensure(DrawEngineType *engine_type, void (*callback)(void *storage)); /* Objects */ +void *DRW_object_engine_data_get(Object *ob, DrawEngineType *engine_type); void **DRW_object_engine_data_ensure( Object *ob, DrawEngineType *engine_type, void (*callback)(void *storage)); struct LampEngineData *DRW_lamp_engine_data_ensure(Object *ob, struct RenderEngineType *engine_type); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 9efbf067591..806c8cce4d5 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -2702,6 +2702,16 @@ void DRW_viewport_request_redraw(void) /** \name ViewLayers (DRW_scenelayer) * \{ */ +void *DRW_view_layer_engine_data_get(DrawEngineType *engine_type) +{ + for (ViewLayerEngineData *sled = DST.draw_ctx.view_layer->drawdata.first; sled; sled = sled->next) { + if (sled->engine_type == engine_type) { + return sled->storage; + } + } + return NULL; +} + void **DRW_view_layer_engine_data_ensure(DrawEngineType *engine_type, void (*callback)(void *storage)) { ViewLayerEngineData *sled; @@ -2728,6 +2738,16 @@ void **DRW_view_layer_engine_data_ensure(DrawEngineType *engine_type, void (*cal /** \name Objects (DRW_object) * \{ */ +void *DRW_object_engine_data_get(Object *ob, DrawEngineType *engine_type) +{ + for (ObjectEngineData *oed = ob->drawdata.first; oed; oed = oed->next) { + if (oed->engine_type == engine_type) { + return oed->storage; + } + } + return NULL; +} + void **DRW_object_engine_data_ensure( Object *ob, DrawEngineType *engine_type, void (*callback)(void *storage)) { |