[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