Commit: 0c9a2def8b1e40a0b5a3ed348d1fd92cc13096ff
Author: Campbell Barton
Date:   Wed Apr 12 19:49:19 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB0c9a2def8b1e40a0b5a3ed348d1fd92cc13096ff

Draw Engine: remove hard coded limit on array sizes

This removes MAX_STORAGE, MAX_BUFFERS, MAX_TEXTURES, MAX_PASSES limits.

Actual memory saving isn't so important, it just means we don't need to
manually bump these based on changes to engines.

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

M       source/blender/draw/DRW_engine.h
M       source/blender/draw/engines/clay/clay.c
M       source/blender/draw/engines/eevee/eevee.c
M       source/blender/draw/engines/eevee/eevee_private.h
M       source/blender/draw/intern/DRW_render.h
M       source/blender/draw/intern/draw_manager.c
M       source/blender/draw/modes/edit_armature_mode.c
M       source/blender/draw/modes/edit_curve_mode.c
M       source/blender/draw/modes/edit_lattice_mode.c
M       source/blender/draw/modes/edit_mesh_mode.c
M       source/blender/draw/modes/edit_metaball_mode.c
M       source/blender/draw/modes/edit_surface_mode.c
M       source/blender/draw/modes/edit_text_mode.c
M       source/blender/draw/modes/object_mode.c
M       source/blender/draw/modes/paint_texture_mode.c
M       source/blender/draw/modes/paint_vertex_mode.c
M       source/blender/draw/modes/paint_weight_mode.c
M       source/blender/draw/modes/particle_mode.c
M       source/blender/draw/modes/pose_mode.c
M       source/blender/draw/modes/sculpt_mode.c
M       source/blender/gpu/GPU_viewport.h
M       source/blender/gpu/intern/gpu_viewport.c

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

diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 87cfa8e8e3b..60e8e40ea61 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -49,6 +49,9 @@ void DRW_engines_register(void);
 void DRW_engines_free(void);
 
 void DRW_engine_register(struct DrawEngineType *draw_engine_type);
+void DRW_engine_viewport_data_size_get(
+        const void *engine_type,
+        int *r_fbl_len, int *r_txl_len, int *r_psl_len, int *r_stl_len);
 
 void DRW_draw_view(const struct bContext *C);
 
diff --git a/source/blender/draw/engines/clay/clay.c 
b/source/blender/draw/engines/clay/clay.c
index c1e01e3375e..3f65efc2b28 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -73,14 +73,12 @@ typedef struct CLAY_Storage {
        DRWShadingGroup *shgrps[MAX_CLAY_MAT];
 } CLAY_Storage;
 
-/* keep it under MAX_STORAGE */
 typedef struct CLAY_StorageList {
        struct CLAY_Storage *storage;
        struct GPUUniformBuffer *mat_ubo;
        struct g_data *g_data;
 } CLAY_StorageList;
 
-/* keep it under MAX_BUFFERS */
 typedef struct CLAY_FramebufferList {
        /* default */
        struct GPUFrameBuffer *default_fb;
@@ -88,7 +86,6 @@ typedef struct CLAY_FramebufferList {
        struct GPUFrameBuffer *dupli_depth;
 } CLAY_FramebufferList;
 
-/* keep it under MAX_TEXTURES */
 typedef struct CLAY_TextureList {
        /* default */
        struct GPUTexture *color;
@@ -97,7 +94,6 @@ typedef struct CLAY_TextureList {
        struct GPUTexture *depth_dup;
 } CLAY_TextureList;
 
-/* keep it under MAX_PASSES */
 typedef struct CLAY_PassList {
        struct DRWPass *depth_pass;
        struct DRWPass *depth_pass_cull;
@@ -650,9 +646,12 @@ static void CLAY_engine_free(void)
        }
 }
 
+static const DrawEngineDataSize CLAY_data_size = 
DRW_VIEWPORT_DATA_SIZE(CLAY_Data);
+
 DrawEngineType draw_engine_clay_type = {
        NULL, NULL,
        N_("Clay"),
+       &CLAY_data_size,
        &CLAY_engine_init,
        &CLAY_engine_free,
        &CLAY_cache_init,
diff --git a/source/blender/draw/engines/eevee/eevee.c 
b/source/blender/draw/engines/eevee/eevee.c
index 301ec8b11d1..ae345ae97f0 100644
--- a/source/blender/draw/engines/eevee/eevee.c
+++ b/source/blender/draw/engines/eevee/eevee.c
@@ -268,9 +268,12 @@ static void EEVEE_collection_settings_create(RenderEngine 
*UNUSED(engine), IDPro
        // BKE_collection_engine_property_add_int(props, 
"high_quality_sphere_lamps", false);
 }
 
+static const DrawEngineDataSize EEVEE_data_size = 
DRW_VIEWPORT_DATA_SIZE(EEVEE_Data);
+
 DrawEngineType draw_engine_eevee_type = {
        NULL, NULL,
        N_("Eevee"),
+       &EEVEE_data_size,
        &EEVEE_engine_init,
        &EEVEE_engine_free,
        &EEVEE_cache_init,
diff --git a/source/blender/draw/engines/eevee/eevee_private.h 
b/source/blender/draw/engines/eevee/eevee_private.h
index 7ed80ac68c2..59029b1f1af 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -32,7 +32,6 @@ struct Object;
 #define MAX_SHADOW_CASCADE 8
 #define MAX_CASCADE_NUM 4
 
-/* keep it under MAX_PASSES */
 typedef struct EEVEE_PassList {
        struct DRWPass *shadow_pass;
        struct DRWPass *depth_pass;
@@ -41,7 +40,6 @@ typedef struct EEVEE_PassList {
        struct DRWPass *tonemap;
 } EEVEE_PassList;
 
-/* keep it under MAX_BUFFERS */
 typedef struct EEVEE_FramebufferList {
        struct GPUFrameBuffer *main; /* HDR */
        struct GPUFrameBuffer *shadow_cube_fb;
@@ -49,7 +47,6 @@ typedef struct EEVEE_FramebufferList {
        struct GPUFrameBuffer *shadow_cascade_fb;
 } EEVEE_FramebufferList;
 
-/* keep it under MAX_TEXTURES */
 typedef struct EEVEE_TextureList {
        struct GPUTexture *color; /* R11_G11_B10 */
        struct GPUTexture *shadow_depth_cube_pool;
@@ -57,7 +54,6 @@ typedef struct EEVEE_TextureList {
        struct GPUTexture *shadow_depth_cascade_pool;
 } EEVEE_TextureList;
 
-/* keep it under MAX_STORAGE */
 typedef struct EEVEE_StorageList {
        /* Lamps */
        /* XXX this should be per-scenelayer and not per_viewport */
diff --git a/source/blender/draw/intern/DRW_render.h 
b/source/blender/draw/intern/DRW_render.h
index 0a7d4dcbfec..c9435b532f7 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -63,17 +63,38 @@ struct DefaultFramebufferList;
 struct DefaultTextureList;
 struct LampEngineData;
 struct RenderEngineType;
+struct ViewportEngineData;
+struct ViewportEngineData_Info;
 
 typedef struct DRWUniform DRWUniform;
 typedef struct DRWInterface DRWInterface;
 typedef struct DRWPass DRWPass;
 typedef struct DRWShadingGroup DRWShadingGroup;
 
+#define DRW_VIEWPORT_LIST_SIZE(list) (sizeof(list) == sizeof(char) ? 0 : 
((sizeof(list)) / sizeof(void *)))
+
+/* Unused members must be either pass list or 'char *' when not usd. */
+#define DRW_VIEWPORT_DATA_SIZE(ty) { \
+       DRW_VIEWPORT_LIST_SIZE(*(((ty *)NULL)->fbl)), \
+       DRW_VIEWPORT_LIST_SIZE(*(((ty *)NULL)->txl)), \
+       DRW_VIEWPORT_LIST_SIZE(*(((ty *)NULL)->psl)), \
+       DRW_VIEWPORT_LIST_SIZE(*(((ty *)NULL)->stl)) \
+}
+
+typedef struct DrawEngineDataSize {
+       int fbl_len;
+       int txl_len;
+       int psl_len;
+       int stl_len;
+} DrawEngineDataSize;
+
 typedef struct DrawEngineType {
        struct DrawEngineType *next, *prev;
 
        char idname[32];
 
+       const DrawEngineDataSize *vedata_size;
+
        void (*engine_init)(void *vedata);
        void (*engine_free)(void);
 
diff --git a/source/blender/draw/intern/draw_manager.c 
b/source/blender/draw/intern/draw_manager.c
index 5ad46a75da1..e065e14a002 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1308,6 +1308,7 @@ void DRW_framebuffer_blit(struct GPUFrameBuffer *fb_read, 
struct GPUFrameBuffer
 }
 
 /* ****************************************** Viewport 
******************************************/
+
 static void *DRW_viewport_engine_data_get(void *engine_type)
 {
        void *data = GPU_viewport_engine_data_get(DST.viewport, engine_type);
@@ -1318,6 +1319,26 @@ static void *DRW_viewport_engine_data_get(void 
*engine_type)
        return data;
 }
 
+void DRW_engine_viewport_data_size_get(
+        const void *engine_type_v,
+        int *r_fbl_len, int *r_txl_len, int *r_psl_len, int *r_stl_len)
+{
+       const DrawEngineType *engine_type = engine_type_v;
+
+       if (r_fbl_len) {
+               *r_fbl_len = engine_type->vedata_size->fbl_len;
+       }
+       if (r_txl_len) {
+               *r_txl_len = engine_type->vedata_size->txl_len;
+       }
+       if (r_psl_len) {
+               *r_psl_len = engine_type->vedata_size->psl_len;
+       }
+       if (r_stl_len) {
+               *r_stl_len = engine_type->vedata_size->stl_len;
+       }
+}
+
 const float *DRW_viewport_size_get(void)
 {
        return &DST.size[0];
@@ -1739,7 +1760,7 @@ static void DRW_debug_gpu_stats(void)
                draw_stat(&rect, 0, v, engine->idname, sizeof(engine->idname));
                v++;
 
-               for (int i = 0; i < MAX_PASSES; ++i) {
+               for (int i = 0; i < engine->vedata_size->psl_len; ++i) {
                        DRWPass *pass = data->psl->passes[i];
                        if (pass != NULL) {
                                GLuint64 time;
diff --git a/source/blender/draw/modes/edit_armature_mode.c 
b/source/blender/draw/modes/edit_armature_mode.c
index 6111b9b160b..68e3112f03b 100644
--- a/source/blender/draw/modes/edit_armature_mode.c
+++ b/source/blender/draw/modes/edit_armature_mode.c
@@ -35,24 +35,22 @@
 extern GlobalsUboStorage ts;
 
 /* *********** LISTS *********** */
-/* keep it under MAX_PASSES */
 typedef struct EDIT_ARMATURE_PassList {
        struct DRWPass *bone_solid;
        struct DRWPass *bone_wire;
        struct DRWPass *relationship;
 } EDIT_ARMATURE_PassList;
 
-/* keep it under MAX_STORAGE */
 typedef struct EDIT_ARMATURE_StorageList {
        struct g_data *g_data;
 } EDIT_ARMATURE_StorageList;
 
 typedef struct EDIT_ARMATURE_Data {
        void *engine_type;
-       void *fbl;
-       void *txl;
+       char *fbl;
+       char *txl;
        EDIT_ARMATURE_PassList *psl;
-       void *stl;
+       EDIT_ARMATURE_StorageList *stl;
 } EDIT_ARMATURE_Data;
 
 /* *********** STATIC *********** */
@@ -126,9 +124,12 @@ void 
EDIT_ARMATURE_collection_settings_create(CollectionEngineSettings *ces)
 }
 #endif
 
+static const DrawEngineDataSize EDIT_ARMATURE_data_size = 
DRW_VIEWPORT_DATA_SIZE(EDIT_ARMATURE_Data);
+
 DrawEngineType draw_engine_edit_armature_type = {
        NULL, NULL,
        N_("EditArmatureMode"),
+       &EDIT_ARMATURE_data_size,
        NULL,
        NULL,
        &EDIT_ARMATURE_cache_init,
diff --git a/source/blender/draw/modes/edit_curve_mode.c 
b/source/blender/draw/modes/edit_curve_mode.c
index 7a2bfa2792a..2cb03018254 100644
--- a/source/blender/draw/modes/edit_curve_mode.c
+++ b/source/blender/draw/modes/edit_curve_mode.c
@@ -46,7 +46,6 @@ extern struct GlobalsUboStorage ts; /* draw_common.c */
  * initialize most of them and EDIT_CURVE_cache_init()
  * for EDIT_CURVE_PassList */
 
-/* keep it under MAX_PASSES */
 typedef struct EDIT_CURVE_PassList {
        /* Declare all passes here and init them in
         * EDIT_CURVE_cache_init().
@@ -54,14 +53,12 @@ typedef struct EDIT_CURVE_PassList {
        struct DRWPass *pass;
 } EDIT_CURVE_PassList;
 
-/* keep it under MAX_BUFFERS */
 typedef struct EDIT_CURVE_FramebufferList {
        /* Contains all framebuffer objects needed by this engine.
         * Only contains (GPUFrameBuffer *) */
        struct GPUFrameBuffer *fb;
 } EDIT_CURVE_FramebufferList;
 
-/* keep it under MAX_TEXTURES */
 typedef struct EDIT_CURVE_TextureList {
        /* Contains all framebuffer textures / utility textures
         * needed by this engine. Only viewport specific textures
@@ -69,7 +66,6 @@ typedef struct EDIT_CURVE_TextureList {
        struct GPUTexture *texture;
 } EDIT_CURVE_TextureList;
 
-/* keep it under MAX_STORAGE */
 typedef struct EDIT_CURVE_StorageList {
        /* Contains any other memory block that the engine needs.
         * Only directly MEM_(m/c)allocN'ed blocks because they are
@@ -259,9 +255,12 @@ void 
EDIT_CURVE_collection_settings_create(CollectionEngineSettings *ces)
 }
 #endif
 
+static const DrawEngineDataSize EDIT_CURVE_data_size = 
DRW_VIEWPORT_DATA_SIZE(EDIT_CURVE_Data);
+
 DrawEngineType draw_engine_edit_curve_type = {
        NULL, NULL,
        N_("EditCurveMode"),
+       &EDIT_CURVE_data_size,
        &EDIT_CURVE_engine_init,
        &EDIT_CURVE_engine_free,
        &EDIT_CURVE_cache_init,
diff --git a/source/blender/draw/modes/edit_lattice_mode.c 
b/source/blender/draw/modes/edit_lattice_mode.c
index 994682ecbed..ea5256b42a5 100644
--- a/source/blender/draw/modes/edit_lattice_mode.c
+++ b/source/blender/draw/modes/edit_lattice_mode.c
@@ -46,7 +46,6 @@ extern struc

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to