[Bf-blender-cvs] [b4ec0e8cd58] blender2.8: DWM: use generic header for DRWCall
Campbell Barton
noreply at git.blender.org
Wed May 17 04:56:43 CEST 2017
Commit: b4ec0e8cd587a95641215b1d9942c4bcb2640e4d
Author: Campbell Barton
Date: Wed May 17 12:55:21 2017 +1000
Branches: blender2.8
https://developer.blender.org/rBb4ec0e8cd587a95641215b1d9942c4bcb2640e4d
DWM: use generic header for DRWCall
Avoid alignment mis-match casting between different draw-call types.
===================================================================
M source/blender/draw/intern/draw_manager.c
===================================================================
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 91ab4e858ae..253b3463168 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -192,12 +192,17 @@ struct DRWPass {
bool wasdrawn; /* if it was drawn during this frame */
};
-typedef struct DRWCall {
- struct DRWCall *next, *prev;
+typedef struct DRWCallHeader {
+ void *next, *prev;
#ifdef USE_GPU_SELECT
int select_id;
#endif
- int type;
+ uchar type;
+} DRWCallHeader;
+
+typedef struct DRWCall {
+ DRWCallHeader head;
+
float (*obmat)[4];
Batch *geometry;
@@ -205,11 +210,8 @@ typedef struct DRWCall {
} DRWCall;
typedef struct DRWCallGenerate {
- struct DRWCallGenerate *next, *prev;
-#ifdef USE_GPU_SELECT
- int select_id;
-#endif
- int type;
+ DRWCallHeader head;
+
float (*obmat)[4];
DRWCallGenerateFn *geometry_fn;
@@ -217,10 +219,8 @@ typedef struct DRWCallGenerate {
} DRWCallGenerate;
typedef struct DRWCallDynamic {
- struct DRWCallDynamic *next, *prev;
-#ifdef USE_GPU_SELECT
- int select_id;
-#endif
+ DRWCallHeader head;
+
const void *data[];
} DRWCallDynamic;
@@ -253,8 +253,12 @@ enum {
/* Used by DRWCall.type */
enum {
+ /* A single batch */
DRW_CALL_SINGLE,
+ /* Uses a callback to draw with any number of batches. */
DRW_CALL_GENERATE,
+ /* Arbitrary number of multiple args. */
+ DRW_CALL_DYNAMIC,
};
/* only 16 bits long */
@@ -826,14 +830,14 @@ void DRW_shgroup_call_add(DRWShadingGroup *shgroup, Batch *geom, float (*obmat)[
DRWCall *call = MEM_callocN(sizeof(DRWCall), "DRWCall");
- call->type = DRW_CALL_SINGLE;
- call->obmat = obmat;
- call->geometry = geom;
-
+ call->head.type = DRW_CALL_SINGLE;
#ifdef USE_GPU_SELECT
- call->select_id = g_DRW_select_id;
+ call->head.select_id = g_DRW_select_id;
#endif
+ call->obmat = obmat;
+ call->geometry = geom;
+
BLI_addtail(&shgroup->calls, call);
}
@@ -843,15 +847,15 @@ void DRW_shgroup_call_object_add(DRWShadingGroup *shgroup, Batch *geom, Object *
DRWCall *call = MEM_callocN(sizeof(DRWCall), "DRWCall");
- call->type = DRW_CALL_SINGLE;
+ call->head.type = DRW_CALL_SINGLE;
+#ifdef USE_GPU_SELECT
+ call->head.select_id = g_DRW_select_id;
+#endif
+
call->obmat = ob->obmat;
call->geometry = geom;
call->ob = ob;
-#ifdef USE_GPU_SELECT
- call->select_id = g_DRW_select_id;
-#endif
-
BLI_addtail(&shgroup->calls, call);
}
@@ -864,16 +868,16 @@ void DRW_shgroup_call_generate_add(
DRWCallGenerate *call = MEM_callocN(sizeof(DRWCallGenerate), "DRWCallGenerate");
+ call->head.type = DRW_CALL_GENERATE;
+#ifdef USE_GPU_SELECT
+ call->head.select_id = g_DRW_select_id;
+#endif
+
call->obmat = obmat;
- call->type = DRW_CALL_GENERATE;
call->geometry_fn = geometry_fn;
call->user_data = user_data;
-#ifdef USE_GPU_SELECT
- call->select_id = g_DRW_select_id;
-#endif
-
BLI_addtail(&shgroup->calls, call);
}
@@ -920,8 +924,9 @@ void DRW_shgroup_call_dynamic_add_array(DRWShadingGroup *shgroup, const void *at
BLI_assert(attr_len == interface->attribs_count);
+ call->head.type = DRW_CALL_DYNAMIC;
#ifdef USE_GPU_SELECT
- call->select_id = g_DRW_select_id;
+ call->head.select_id = g_DRW_select_id;
#endif
memcpy((void *)call->data, attr, data_size);
@@ -1086,7 +1091,7 @@ static void shgroup_dynamic_batch(DRWShadingGroup *shgroup)
VertexBuffer_allocate_data(vbo, nbr);
int j = 0;
- for (DRWCallDynamic *call = shgroup->calls.first; call; call = call->next, j++) {
+ for (DRWCallDynamic *call = shgroup->calls.first; call; call = call->head.next, j++) {
int i = 0;
for (DRWAttrib *attrib = interface->attribs.first; attrib; attrib = attrib->next, i++) {
VertexBuffer_set_attrib(vbo, attrib->format_id, j, call->data[i]);
@@ -1147,7 +1152,7 @@ static void shgroup_dynamic_instance(DRWShadingGroup *shgroup)
buffer_size = sizeof(float) * interface->attribs_stride * instance_ct;
float *data = MEM_mallocN(buffer_size, "Instance VBO data");
- for (DRWCallDynamic *call = shgroup->calls.first; call; call = call->next) {
+ for (DRWCallDynamic *call = shgroup->calls.first; call; call = call->head.next) {
for (int j = 0; j < interface->attribs_count; ++j) {
memcpy(data + offset, call->data[j], sizeof(float) * interface->attribs_size[j]);
offset += interface->attribs_size[j];
@@ -1688,12 +1693,12 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
/* use the first item because of selection we only ever add one */
# define GPU_SELECT_LOAD_IF_PICKSEL(_call) \
if ((G.f & G_PICKSEL) && (_call)) { \
- GPU_select_load_id((_call)->select_id); \
+ GPU_select_load_id((_call)->head.select_id); \
} ((void)0)
# define GPU_SELECT_LOAD_IF_PICKSEL_LIST(_call_ls) \
if ((G.f & G_PICKSEL) && (_call_ls)->first) { \
BLI_assert(BLI_listbase_is_single(_call_ls)); \
- GPU_select_load_id(((DRWCall *)(_call_ls)->first)->select_id); \
+ GPU_select_load_id(((DRWCall *)(_call_ls)->first)->head.select_id); \
} ((void)0)
#else
# define GPU_SELECT_LOAD_IF_PICKSEL(call)
@@ -1719,7 +1724,7 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
}
}
else {
- for (DRWCall *call = shgroup->calls.first; call; call = call->next) {
+ for (DRWCall *call = shgroup->calls.first; call; call = call->head.next) {
bool neg_scale = call->obmat && is_negative_m4(call->obmat);
/* Negative scale objects */
@@ -1729,10 +1734,11 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
GPU_SELECT_LOAD_IF_PICKSEL(call);
- if (call->type == DRW_CALL_SINGLE) {
+ if (call->head.type == DRW_CALL_SINGLE) {
draw_geometry(shgroup, call->geometry, call->obmat, call->ob);
}
else {
+ BLI_assert(call->head.type == DRW_CALL_GENERATE);
DRWCallGenerate *callgen = ((DRWCallGenerate *)call);
draw_geometry_prepare(shgroup, callgen->obmat, NULL, NULL);
callgen->geometry_fn(shgroup, draw_geometry_execute, callgen->user_data);
More information about the Bf-blender-cvs
mailing list