[Bf-blender-cvs] [ac2e23c739a] master: DRW: Remove uneeded calls to drw_viewport_engine_data_ensure when iterating

Clément Foucault noreply at git.blender.org
Wed May 8 17:59:03 CEST 2019


Commit: ac2e23c739ab118ad1a6c516c454bc78b5cf6807
Author: Clément Foucault
Date:   Tue May 7 18:40:02 2019 +0200
Branches: master
https://developer.blender.org/rBac2e23c739ab118ad1a6c516c454bc78b5cf6807

DRW: Remove uneeded calls to drw_viewport_engine_data_ensure when iterating

This remove a bit of overhead specially in scene with lots of objects.

===================================================================

M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/intern/draw_manager.h

===================================================================

diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index f0d802c69e1..05fb893bec5 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1043,9 +1043,14 @@ static void drw_engines_init(void)
 
 static void drw_engines_cache_init(void)
 {
-  for (LinkData *link = DST.enabled_engines.first; link; link = link->next) {
+  int enabled_engine_count = BLI_listbase_count(&DST.enabled_engines);
+  DST.vedata_array = MEM_mallocN(sizeof(void *) * enabled_engine_count, __func__);
+
+  int i = 0;
+  for (LinkData *link = DST.enabled_engines.first; link; link = link->next, i++) {
     DrawEngineType *engine = link->data;
     ViewportEngineData *data = drw_viewport_engine_data_ensure(engine);
+    DST.vedata_array[i] = data;
 
     if (data->text_draw_cache) {
       DRW_text_cache_destroy(data->text_draw_cache);
@@ -1087,9 +1092,10 @@ static void drw_engines_cache_populate(Object *ob)
    * ourselves here. */
   drw_drawdata_unlink_dupli((ID *)ob);
 
-  for (LinkData *link = DST.enabled_engines.first; link; link = link->next) {
+  int i = 0;
+  for (LinkData *link = DST.enabled_engines.first; link; link = link->next, i++) {
     DrawEngineType *engine = link->data;
-    ViewportEngineData *data = drw_viewport_engine_data_ensure(engine);
+    ViewportEngineData *data = DST.vedata_array[i];
 
     if (engine->id_update) {
       engine->id_update(data, &ob->id);
@@ -1111,14 +1117,16 @@ static void drw_engines_cache_populate(Object *ob)
 
 static void drw_engines_cache_finish(void)
 {
-  for (LinkData *link = DST.enabled_engines.first; link; link = link->next) {
+  int i = 0;
+  for (LinkData *link = DST.enabled_engines.first; link; link = link->next, i++) {
     DrawEngineType *engine = link->data;
-    ViewportEngineData *data = drw_viewport_engine_data_ensure(engine);
+    ViewportEngineData *data = DST.vedata_array[i];
 
     if (engine->cache_finish) {
       engine->cache_finish(data);
     }
   }
+  MEM_freeN(DST.vedata_array);
 }
 
 static void drw_engines_draw_background(void)
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index 77cf6d20117..6dd112e3ad7 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -364,6 +364,7 @@ typedef struct DRWManager {
   struct DRWTextStore **text_store_p;
 
   ListBase enabled_engines; /* RenderEngineType */
+  void **vedata_array;      /* ViewportEngineData */
 
   bool buffer_finish_called; /* Avoid bad usage of DRW_render_instance_buffer_finish */



More information about the Bf-blender-cvs mailing list