[Bf-blender-cvs] [941fdefdb3b] draw-viewport-data: Move index from DrawEngineType to DRWRegisteredDrawEngine.

Jeroen Bakker noreply at git.blender.org
Mon Oct 4 14:45:56 CEST 2021


Commit: 941fdefdb3b7cac27a0f495fe7c5cd7c0ca48bc0
Author: Jeroen Bakker
Date:   Mon Oct 4 14:20:32 2021 +0200
Branches: draw-viewport-data
https://developer.blender.org/rB941fdefdb3b7cac27a0f495fe7c5cd7c0ca48bc0

Move index from DrawEngineType to DRWRegisteredDrawEngine.

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

M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/intern/draw_manager.h
M	source/blender/draw/intern/draw_view_data.cc
M	source/blender/draw/intern/draw_view_data.h

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

diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index d05592916d9..c1cab931f6a 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -135,10 +135,6 @@ typedef struct DrawEngineType {
                           struct RenderLayer *layer,
                           const struct rcti *rect);
   void (*store_metadata)(void *vedata, struct RenderResult *render_result);
-
-  /** Index of the type in the list. Used for dupli data. Set at runtime. */
-  /** TODO(fclem) Can we avoid this? */
-  int index;
 } DrawEngineType;
 
 /* Textures */
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 5ae0351cdd3..577d0238387 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -84,6 +84,7 @@
 #include "wm_window.h"
 
 #include "draw_color_management.h"
+#include "draw_manager.h"
 #include "draw_manager_profiling.h"
 #include "draw_manager_testing.h"
 #include "draw_manager_text.h"
@@ -776,7 +777,7 @@ void **DRW_duplidata_get(void *vedata)
     return NULL;
   }
   ViewportEngineData *ved = (ViewportEngineData *)vedata;
-  DrawEngineType *engine_type = (DrawEngineType *)ved->engine_type;
+  DRWRegisteredDrawEngine *engine_type = (DRWRegisteredDrawEngine *)ved->engine_type;
   return &DST.dupli_datas[engine_type->index];
 }
 
@@ -2869,9 +2870,12 @@ bool DRW_engine_render_support(DrawEngineType *draw_engine_type)
 
 void DRW_engine_register(DrawEngineType *draw_engine_type)
 {
-  BLI_addtail(&DRW_engines, draw_engine_type);
+  DRWRegisteredDrawEngine *draw_engine = MEM_mallocN(sizeof(DRWRegisteredDrawEngine), __func__);
+  draw_engine->draw_engine = draw_engine_type;
+  draw_engine->index = g_registered_engine_len;
+
+  BLI_addtail(&DRW_engines, draw_engine);
   g_registered_engine_len = BLI_listbase_count(&DRW_engines);
-  draw_engine_type->index = g_registered_engine_len - 1;
 }
 
 void DRW_engines_register(void)
@@ -2942,14 +2946,15 @@ void DRW_engines_free(void)
   DRW_stats_free();
   DRW_globals_free();
 
-  DrawEngineType *next;
-  for (DrawEngineType *type = DRW_engines.first; type; type = next) {
+  DRWRegisteredDrawEngine *next;
+  for (DRWRegisteredDrawEngine *type = DRW_engines.first; type; type = next) {
     next = type->next;
     BLI_remlink(&R_engines, type);
 
-    if (type->engine_free) {
-      type->engine_free();
+    if (type->draw_engine->engine_free) {
+      type->draw_engine->engine_free();
     }
+    MEM_freeN(type);
   }
 
   DRW_UBO_FREE_SAFE(G_draw.block_ubo);
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index abdc543265f..1bb1ee06354 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -97,6 +97,17 @@ struct Object;
 #endif /* USE_PROFILE */
 
 /* ------------ Data Structure --------------- */
+/**
+ * Data structure to for registered draw engines that can store draw manager
+ * specific data.
+ */
+typedef struct DRWRegisteredDrawEngine {
+  void /*DRWRegisteredDrawEngine*/ *next, *prev;
+  DrawEngineType *draw_engine;
+  /** Index of the type in the lists. Index is used for dupli data. */
+  int index;
+} DRWRegisteredDrawEngine;
+
 /**
  * Data structure containing all drawcalls organized by passes and materials.
  * DRWPass > DRWShadingGroup > DRWCall > DRWCallState
diff --git a/source/blender/draw/intern/draw_view_data.cc b/source/blender/draw/intern/draw_view_data.cc
index 4997d9736b9..7b23997d7a6 100644
--- a/source/blender/draw/intern/draw_view_data.cc
+++ b/source/blender/draw/intern/draw_view_data.cc
@@ -30,6 +30,7 @@
 
 #include "draw_manager_text.h"
 
+#include "draw_manager.h"
 #include "draw_view_data.h"
 
 using namespace blender;
@@ -50,12 +51,12 @@ struct DRWViewData {
 };
 
 /* Creates a view data with all possible engines type for this view. */
-DRWViewData *DRW_view_data_create(ListBase *engine_types)
+DRWViewData *DRW_view_data_create(ListBase * /* DRWRegisteredDrawEngine */ engine_types)
 {
   DRWViewData *view_data = new DRWViewData();
-  LISTBASE_FOREACH (DrawEngineType *, type, engine_types) {
+  LISTBASE_FOREACH (DRWRegisteredDrawEngine *, type, engine_types) {
     ViewportEngineData engine = {};
-    engine.engine_type = static_cast<void *>(type);
+    engine.engine_type = type;
     view_data->engines.append(engine);
   }
   return view_data;
@@ -102,7 +103,7 @@ void DRW_view_data_default_lists_from_viewport(DRWViewData *view_data, GPUViewpo
 
 static void draw_viewport_engines_data_clear(ViewportEngineData *data)
 {
-  DrawEngineType *engine_type = static_cast<DrawEngineType *>(data->engine_type);
+  DrawEngineType *engine_type = data->engine_type->draw_engine;
   const DrawEngineDataSize *data_size = engine_type->vedata_size;
 
   for (int i = 0; data->fbl && i < data_size->fbl_len; i++) {
@@ -165,13 +166,12 @@ void DRW_view_data_texture_list_size_validate(DRWViewData *view_data, const int
 }
 
 ViewportEngineData *DRW_view_data_engine_data_get_ensure(DRWViewData *view_data,
-                                                         DrawEngineType *engine_type_)
+                                                         DrawEngineType *engine_type)
 {
-  void *engine_type = static_cast<void *>(engine_type_);
   for (ViewportEngineData &engine : view_data->engines) {
-    if (engine.engine_type == engine_type) {
+    if (engine.engine_type->draw_engine == engine_type) {
       if (engine.fbl == nullptr) {
-        const DrawEngineDataSize *data_size = engine_type_->vedata_size;
+        const DrawEngineDataSize *data_size = engine_type->vedata_size;
         engine.fbl = (FramebufferList *)MEM_calloc_arrayN(
             data_size->fbl_len, sizeof(GPUFrameBuffer *), "FramebufferList");
         engine.txl = (TextureList *)MEM_calloc_arrayN(
diff --git a/source/blender/draw/intern/draw_view_data.h b/source/blender/draw/intern/draw_view_data.h
index 6c1f3ebbf4d..977de6fd657 100644
--- a/source/blender/draw/intern/draw_view_data.h
+++ b/source/blender/draw/intern/draw_view_data.h
@@ -33,6 +33,7 @@ extern "C" {
 
 struct GPUViewport;
 struct DrawEngineType;
+struct DRWRegisteredDrawEngine;
 
 /* NOTE these structs are only here for reading the actual lists from the engine.
  * The actual length of them is stored in a ViewportEngineData_Info.
@@ -55,7 +56,9 @@ typedef struct StorageList {
 } StorageList;
 
 typedef struct ViewportEngineData {
-  void *engine_type;
+  /* Not owning pointer to the draw engine.
+   * Pointer is owned by `DRW_engines`. */
+  struct DRWRegisteredDrawEngine *engine_type;
 
   FramebufferList *fbl;
   TextureList *txl;
@@ -98,7 +101,7 @@ typedef struct DefaultTextureList {
 
 typedef struct DRWViewData DRWViewData;
 
-DRWViewData *DRW_view_data_create(ListBase *engine_types);
+DRWViewData *DRW_view_data_create(ListBase * /* DRWRegisteredDrawEngine */ engine_types);
 void DRW_view_data_free(DRWViewData *view_data);
 
 void DRW_view_data_default_lists_from_viewport(DRWViewData *view_data,
@@ -129,7 +132,8 @@ ViewportEngineData *DRW_view_data_enabled_engine_iter_step(DRWEngineIterator *it
   DRW_view_data_enabled_engine_iter_begin(&iterator, view_data_); \
   /* WATCH Comma operator trickery ahead! This tests engine_ == NULL. */ \
   while ((data_ = DRW_view_data_enabled_engine_iter_step(&iterator), \
-          engine_ = (data_ != NULL) ? (struct DrawEngineType *)data_->engine_type : NULL))
+          engine_ = (data_ != NULL) ? (struct DrawEngineType *)data_->engine_type->draw_engine : \
+                                      NULL))
 
 #ifdef __cplusplus
 }



More information about the Bf-blender-cvs mailing list