[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