[Bf-blender-cvs] [0c9a2def8b1] blender2.8: Draw Engine: remove hard coded limit on array sizes

Campbell Barton noreply at git.blender.org
Wed Apr 12 11:56:34 CEST 2017


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. @@




More information about the Bf-blender-cvs mailing list