diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-02-28 06:04:40 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-03-01 05:53:25 +0300 |
commit | 1ba96857d1ea50d97d0b305c270414ac4df5ac16 (patch) | |
tree | ddaa57b92c1f87ef23b33d289aa7980e7c03fae7 /source | |
parent | d1da7dba47b6d520fd9fc93d0aa327144d7fc6ae (diff) |
DRW: Merge calls_generate pool with calls pool & add DRWCallState pool.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 8 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.h | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager_data.c | 33 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager_exec.c | 8 | ||||
-rw-r--r-- | source/blender/gpu/GPU_viewport.h | 2 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_viewport.c | 4 |
6 files changed, 30 insertions, 29 deletions
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index f25ef47685b..a0643184690 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -315,7 +315,7 @@ static void drw_viewport_cache_resize(void) if (DST.vmempool != NULL) { BLI_mempool_clear_ex(DST.vmempool->calls, BLI_mempool_len(DST.vmempool->calls)); - BLI_mempool_clear_ex(DST.vmempool->calls_generate, BLI_mempool_len(DST.vmempool->calls_generate)); + BLI_mempool_clear_ex(DST.vmempool->states, BLI_mempool_len(DST.vmempool->states)); BLI_mempool_clear_ex(DST.vmempool->shgroups, BLI_mempool_len(DST.vmempool->shgroups)); BLI_mempool_clear_ex(DST.vmempool->uniforms, BLI_mempool_len(DST.vmempool->uniforms)); BLI_mempool_clear_ex(DST.vmempool->passes, BLI_mempool_len(DST.vmempool->passes)); @@ -369,10 +369,10 @@ static void drw_viewport_var_init(void) DST.vmempool = GPU_viewport_mempool_get(DST.viewport); if (DST.vmempool->calls == NULL) { - DST.vmempool->calls = BLI_mempool_create(sizeof(DRWCall), 0, 512, 0); + DST.vmempool->calls = BLI_mempool_create(MAX2(sizeof(DRWCall), sizeof(DRWCallGenerate)), 0, 512, 0); } - if (DST.vmempool->calls_generate == NULL) { - DST.vmempool->calls_generate = BLI_mempool_create(sizeof(DRWCallGenerate), 0, 512, 0); + if (DST.vmempool->states == NULL) { + DST.vmempool->states = BLI_mempool_create(sizeof(DRWCallState), 0, 512, 0); } if (DST.vmempool->shgroups == NULL) { DST.vmempool->shgroups = BLI_mempool_create(sizeof(DRWShadingGroup), 0, 256, 0); diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h index b6da79fc97a..3253cb1bfb4 100644 --- a/source/blender/draw/intern/draw_manager.h +++ b/source/blender/draw/intern/draw_manager.h @@ -113,14 +113,14 @@ typedef struct DRWCallState { typedef struct DRWCall { DRWCallHeader head; - DRWCallState state; /* For now integrated to the struct. */ + DRWCallState *state; Gwn_Batch *geometry; } DRWCall; typedef struct DRWCallGenerate { DRWCallHeader head; - DRWCallState state; /* For now integrated to the struct. */ + DRWCallState *state; DRWCallGenerateFn *geometry_fn; void *user_data; diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index 20a859d48e2..f2affa75753 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -246,8 +246,14 @@ static void drw_call_calc_orco(ID *ob_data, float (*r_orcofacs)[3]) } } -static void drw_call_set_matrices(DRWCallState *state, float (*obmat)[4], ID *ob_data) +static void drw_call_state_init(DRWCallState *state, DRWShadingGroup *shgroup, float (*obmat)[4], ID *ob_data) { + state->flag = 0; + state->matflag = shgroup->matflag; + + /* TODO Set culling bsphere IF needed by the DRWPass */ + state->bsphere.rad = -1.0f; + /* Matrices */ if (obmat != NULL) { copy_m4_m4(state->model, obmat); @@ -265,9 +271,6 @@ static void drw_call_set_matrices(DRWCallState *state, float (*obmat)[4], ID *ob drw_call_calc_orco(ob_data, state->orcotexfac); state->matflag &= ~DRW_CALL_ORCOTEXFAC; } - - /* TODO Set culling bsphere IF needed by the DRWPass */ - state->bsphere.rad = -1.0f; } void DRW_shgroup_call_add(DRWShadingGroup *shgroup, Gwn_Batch *geom, float (*obmat)[4]) @@ -276,31 +279,30 @@ void DRW_shgroup_call_add(DRWShadingGroup *shgroup, Gwn_Batch *geom, float (*obm BLI_assert(shgroup->type == DRW_SHG_NORMAL); DRWCall *call = BLI_mempool_alloc(DST.vmempool->calls); + call->state = BLI_mempool_alloc(DST.vmempool->states); call->head.type = DRW_CALL_SINGLE; - call->state.flag = 0; - call->state.matflag = shgroup->matflag; #ifdef USE_GPU_SELECT call->head.select_id = DST.select_id; #endif call->geometry = geom; - drw_call_set_matrices(&call->state, obmat, NULL); + drw_call_state_init(call->state, shgroup, obmat, NULL); BLI_LINKS_APPEND(&shgroup->calls, (DRWCallHeader *)call); } +/* These calls can be culled and are optimized for redraw */ void DRW_shgroup_call_object_add(DRWShadingGroup *shgroup, Gwn_Batch *geom, Object *ob) { BLI_assert(geom != NULL); BLI_assert(shgroup->type == DRW_SHG_NORMAL); DRWCall *call = BLI_mempool_alloc(DST.vmempool->calls); + call->state = BLI_mempool_alloc(DST.vmempool->states); call->head.type = DRW_CALL_SINGLE; - call->state.flag = 0; - call->state.matflag = shgroup->matflag; #ifdef USE_GPU_SELECT call->head.select_id = DST.select_id; #endif call->geometry = geom; - drw_call_set_matrices(&call->state, ob->obmat, ob->data); + drw_call_state_init(call->state, shgroup, ob->obmat, ob->data); BLI_LINKS_APPEND(&shgroup->calls, (DRWCallHeader *)call); } @@ -312,16 +314,15 @@ void DRW_shgroup_call_generate_add( BLI_assert(geometry_fn != NULL); BLI_assert(shgroup->type == DRW_SHG_NORMAL); - DRWCallGenerate *call = BLI_mempool_alloc(DST.vmempool->calls_generate); + DRWCallGenerate *call = BLI_mempool_alloc(DST.vmempool->calls); + call->state = BLI_mempool_alloc(DST.vmempool->states); call->head.type = DRW_CALL_GENERATE; - call->state.flag = 0; - call->state.matflag = shgroup->matflag; #ifdef USE_GPU_SELECT call->head.select_id = DST.select_id; #endif call->geometry_fn = geometry_fn; call->user_data = user_data; - drw_call_set_matrices(&call->state, obmat, NULL); + drw_call_state_init(call->state, shgroup, obmat, NULL); BLI_LINKS_APPEND(&shgroup->calls, (DRWCallHeader *)call); } @@ -809,9 +810,9 @@ static int pass_shgroup_dist_sort(void *thunk, const void *a, const void *b) if (call_b == NULL) return -1; float tmp[3]; - sub_v3_v3v3(tmp, zsortdata->origin, call_a->state.model[3]); + sub_v3_v3v3(tmp, zsortdata->origin, call_a->state->model[3]); const float a_sq = dot_v3v3(zsortdata->axis, tmp); - sub_v3_v3v3(tmp, zsortdata->origin, call_b->state.model[3]); + sub_v3_v3v3(tmp, zsortdata->origin, call_b->state->model[3]); const float b_sq = dot_v3v3(zsortdata->axis, tmp); if (a_sq < b_sq) return 1; diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c index 251370d2050..f5284a1376f 100644 --- a/source/blender/draw/intern/draw_manager_exec.c +++ b/source/blender/draw/intern/draw_manager_exec.c @@ -667,11 +667,11 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state) else { bool prev_neg_scale = false; for (DRWCall *call = (DRWCall *)shgroup->calls.first; call; call = (DRWCall *)call->head.next) { - if ((call->state.flag & DRW_CALL_CULLED) != 0) + if ((call->state->flag & DRW_CALL_CULLED) != 0) continue; /* Negative scale objects */ - bool neg_scale = call->state.flag & DRW_CALL_NEGSCALE; + bool neg_scale = call->state->flag & DRW_CALL_NEGSCALE; if (neg_scale != prev_neg_scale) { glFrontFace((neg_scale) ? DST.backface : DST.frontface); prev_neg_scale = neg_scale; @@ -680,13 +680,13 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state) GPU_SELECT_LOAD_IF_PICKSEL_CALL(call); if (call->head.type == DRW_CALL_SINGLE) { - draw_geometry_prepare(shgroup, &call->state); + draw_geometry_prepare(shgroup, call->state); draw_geometry_execute(shgroup, call->geometry); } else { BLI_assert(call->head.type == DRW_CALL_GENERATE); DRWCallGenerate *callgen = ((DRWCallGenerate *)call); - draw_geometry_prepare(shgroup, &callgen->state); + draw_geometry_prepare(shgroup, callgen->state); callgen->geometry_fn(shgroup, draw_geometry_execute, callgen->user_data); } } diff --git a/source/blender/gpu/GPU_viewport.h b/source/blender/gpu/GPU_viewport.h index dff7e278ae1..b733027b0f3 100644 --- a/source/blender/gpu/GPU_viewport.h +++ b/source/blender/gpu/GPU_viewport.h @@ -46,7 +46,7 @@ typedef struct GPUViewport GPUViewport; /* Contains memory pools informations */ typedef struct ViewportMemoryPool { struct BLI_mempool *calls; - struct BLI_mempool *calls_generate; + struct BLI_mempool *states; struct BLI_mempool *shgroups; struct BLI_mempool *uniforms; struct BLI_mempool *passes; diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c index ee9d175e217..25bd265d1a6 100644 --- a/source/blender/gpu/intern/gpu_viewport.c +++ b/source/blender/gpu/intern/gpu_viewport.c @@ -603,8 +603,8 @@ void GPU_viewport_free(GPUViewport *viewport) if (viewport->vmempool.calls != NULL) { BLI_mempool_destroy(viewport->vmempool.calls); } - if (viewport->vmempool.calls_generate != NULL) { - BLI_mempool_destroy(viewport->vmempool.calls_generate); + if (viewport->vmempool.states != NULL) { + BLI_mempool_destroy(viewport->vmempool.states); } if (viewport->vmempool.shgroups != NULL) { BLI_mempool_destroy(viewport->vmempool.shgroups); |