[Bf-blender-cvs] [b069218a556] master: DrawManager: Engine Instance Data.

Jeroen Bakker noreply at git.blender.org
Tue Dec 7 10:34:39 CET 2021


Commit: b069218a5563662b08b3057c96e5e0be877c16ca
Author: Jeroen Bakker
Date:   Tue Dec 7 10:33:55 2021 +0100
Branches: master
https://developer.blender.org/rBb069218a5563662b08b3057c96e5e0be877c16ca

DrawManager: Engine Instance Data.

In the original design draw engines had to copy with a limitation that
they were not allowed to reuse complex data structures between drawing
calls. Data that could be reused were limited to:
- GPUFramebuffers
- GPUTextures
- Memory that could be removed calling MEM_freeN (storage list)
- DRWPass

This is fine when the storage list contains arrays or structs but when
more complex data types (vectors, maps) etc wasn't possible.

This patch adds instance_data that can be reused between drawing calls.
The instance_data is controlled by the draw engine and doesn't need to
be limited as described above.

When an engines stores instance_data it must implement the
`DrawEngineType.instance_free` callback to free the data.

The patch originates from eevee rewrite. But was added to master as the
image engine rewrite also has a need for it.

Reviewed By: fclem

Differential Revision: https://developer.blender.org/D13425

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

M	source/blender/draw/engines/basic/basic_engine.c
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/external/external_engine.c
M	source/blender/draw/engines/gpencil/gpencil_engine.c
M	source/blender/draw/engines/image/image_engine.cc
M	source/blender/draw/engines/overlay/overlay_engine.c
M	source/blender/draw/engines/select/select_debug_engine.c
M	source/blender/draw/engines/select/select_engine.c
M	source/blender/draw/engines/workbench/workbench_engine.c
M	source/blender/draw/intern/DRW_render.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/engines/basic/basic_engine.c b/source/blender/draw/engines/basic/basic_engine.c
index 8a825a7c81f..228281af2b0 100644
--- a/source/blender/draw/engines/basic/basic_engine.c
+++ b/source/blender/draw/engines/basic/basic_engine.c
@@ -265,6 +265,7 @@ DrawEngineType draw_engine_basic_type = {
     &basic_data_size,
     NULL,
     &basic_engine_free,
+    NULL, /* instance_free */
     &basic_cache_init,
     &basic_cache_populate,
     &basic_cache_finish,
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index fad9d21b660..fc9b8b0cde4 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -629,6 +629,7 @@ DrawEngineType draw_engine_eevee_type = {
     &eevee_data_size,
     &eevee_engine_init,
     &eevee_engine_free,
+    NULL, /* instance_free */
     &eevee_cache_init,
     &EEVEE_cache_populate,
     &eevee_cache_finish,
diff --git a/source/blender/draw/engines/external/external_engine.c b/source/blender/draw/engines/external/external_engine.c
index cc548a53a8e..1877d3a4b43 100644
--- a/source/blender/draw/engines/external/external_engine.c
+++ b/source/blender/draw/engines/external/external_engine.c
@@ -451,6 +451,7 @@ DrawEngineType draw_engine_external_type = {
     &external_data_size,
     &external_engine_init,
     &external_engine_free,
+    NULL, /* instance_free */
     &external_cache_init,
     &external_cache_populate,
     &external_cache_finish,
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 50e32040522..9bc340a2786 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -990,6 +990,7 @@ DrawEngineType draw_engine_gpencil_type = {
     &GPENCIL_data_size,
     &GPENCIL_engine_init,
     &GPENCIL_engine_free,
+    NULL, /* instance_free */
     &GPENCIL_cache_init,
     &GPENCIL_cache_populate,
     &GPENCIL_cache_finish,
diff --git a/source/blender/draw/engines/image/image_engine.cc b/source/blender/draw/engines/image/image_engine.cc
index 37db7246e67..be5946f34eb 100644
--- a/source/blender/draw/engines/image/image_engine.cc
+++ b/source/blender/draw/engines/image/image_engine.cc
@@ -191,6 +191,7 @@ DrawEngineType draw_engine_image_type = {
     &IMAGE_data_size,      /* vedata_size */
     &IMAGE_engine_init,    /* engine_init */
     &IMAGE_engine_free,    /* engine_free */
+    nullptr,               /* instance_free */
     &IMAGE_cache_init,     /* cache_init */
     &IMAGE_cache_populate, /* cache_populate */
     nullptr,               /* cache_finish */
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index 2bdceb5f3db..12db2bd02cf 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -703,6 +703,7 @@ DrawEngineType draw_engine_overlay_type = {
     &overlay_data_size,
     &OVERLAY_engine_init,
     &OVERLAY_engine_free,
+    NULL, /* instance_free */
     &OVERLAY_cache_init,
     &OVERLAY_cache_populate,
     &OVERLAY_cache_finish,
diff --git a/source/blender/draw/engines/select/select_debug_engine.c b/source/blender/draw/engines/select/select_debug_engine.c
index e9437c5ab92..f66eabdcdcc 100644
--- a/source/blender/draw/engines/select/select_debug_engine.c
+++ b/source/blender/draw/engines/select/select_debug_engine.c
@@ -120,6 +120,7 @@ DrawEngineType draw_engine_debug_select_type = {
     &select_debug_data_size,
     &select_debug_engine_init,
     &select_debug_engine_free,
+    NULL, /* instance_free */
     NULL,
     NULL,
     NULL,
diff --git a/source/blender/draw/engines/select/select_engine.c b/source/blender/draw/engines/select/select_engine.c
index 20edd78597b..7f9645013ce 100644
--- a/source/blender/draw/engines/select/select_engine.c
+++ b/source/blender/draw/engines/select/select_engine.c
@@ -363,6 +363,7 @@ DrawEngineType draw_engine_select_type = {
     &select_data_size,
     &select_engine_init,
     &select_engine_free,
+    NULL, /* instance_free */
     &select_cache_init,
     &select_cache_populate,
     NULL,
diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c
index 4706aeb4477..1db21cb4124 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.c
+++ b/source/blender/draw/engines/workbench/workbench_engine.c
@@ -629,6 +629,7 @@ DrawEngineType draw_engine_workbench = {
     &workbench_data_size,
     &workbench_engine_init,
     &workbench_engine_free,
+    NULL, /* instance_free */
     &workbench_cache_init,
     &workbench_cache_populate,
     &workbench_cache_finish,
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index c1cab931f6a..6491f5ca411 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -121,6 +121,8 @@ typedef struct DrawEngineType {
   void (*engine_init)(void *vedata);
   void (*engine_free)(void);
 
+  void (*instance_free)(void *instance_data);
+
   void (*cache_init)(void *vedata);
   void (*cache_populate)(void *vedata, struct Object *ob);
   void (*cache_finish)(void *vedata);
diff --git a/source/blender/draw/intern/draw_view_data.cc b/source/blender/draw/intern/draw_view_data.cc
index 55ebbf82c29..af85584a054 100644
--- a/source/blender/draw/intern/draw_view_data.cc
+++ b/source/blender/draw/intern/draw_view_data.cc
@@ -120,6 +120,12 @@ static void draw_viewport_engines_data_clear(ViewportEngineData *data)
     MEM_SAFE_FREE(data->stl->storage[i]);
   }
 
+  if (data->instance_data) {
+    BLI_assert(engine_type->instance_free != nullptr);
+    engine_type->instance_free(data->instance_data);
+    data->instance_data = nullptr;
+  }
+
   MEM_SAFE_FREE(data->fbl);
   MEM_SAFE_FREE(data->txl);
   MEM_SAFE_FREE(data->psl);
diff --git a/source/blender/draw/intern/draw_view_data.h b/source/blender/draw/intern/draw_view_data.h
index c8176170a61..01b614fb021 100644
--- a/source/blender/draw/intern/draw_view_data.h
+++ b/source/blender/draw/intern/draw_view_data.h
@@ -63,6 +63,12 @@ typedef struct ViewportEngineData {
   TextureList *txl;
   PassList *psl;
   StorageList *stl;
+  /**
+   * \brief Memory block that can be freely used by the draw engine.
+   * When used the draw engine must implement #DrawEngineType.instance_free callback.
+   */
+  void *instance_data;
+
   char info[GPU_INFO_SIZE];
 
   /* we may want to put this elsewhere */



More information about the Bf-blender-cvs mailing list