From 7cdd5ed7bd228d46b5eecc3355b01d00f26d1ca2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Thu, 30 May 2019 00:36:54 +0200 Subject: DRW: Add unit_state to avoid lots of DRWCallState duplication A lot of drawcalls don't use the object's properties and don't need a dedicated DRWCallState. We allocate a unique one at the begining and use it for all calls that uses the default unit matrix. --- source/blender/draw/intern/draw_manager.c | 28 ++++++++++++++++++++++++++ source/blender/draw/intern/draw_manager.h | 2 ++ source/blender/draw/intern/draw_manager_data.c | 15 +++++--------- 3 files changed, 35 insertions(+), 10 deletions(-) (limited to 'source/blender/draw') diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 8897d14c5fd..bfb38a12fa9 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -587,6 +587,29 @@ static void drw_context_state_init(void) } } +static DRWCallState *draw_unit_state_create(void) +{ + DRWCallState *state = BLI_memblock_alloc(DST.vmempool->states); + state->flag = 0; + state->matflag = 0; + + unit_m4(state->model); + unit_m4(state->modelinverse); + + copy_v3_fl(state->orcotexfac[0], 0.0f); + copy_v3_fl(state->orcotexfac[1], 1.0f); + + state->ob_index = 0; + state->ob_random = 0.0f; + + /* TODO(fclem) get rid of this. */ + state->culling = BLI_memblock_alloc(DST.vmempool->cullstates); + state->culling->bsphere.radius = -1.0f; + state->culling->user_data = NULL; + + return state; +} + /* It also stores viewport variable to an immutable place: DST * This is because a cache uniform only store reference * to its value. And we don't want to invalidate the cache @@ -634,6 +657,9 @@ static void drw_viewport_var_init(void) DST.vmempool->images = BLI_memblock_create(sizeof(GPUTexture *)); } + /* Alloc default unit state */ + DST.unit_state = draw_unit_state_create(); + DST.idatalist = GPU_viewport_instance_data_list_get(DST.viewport); DRW_instance_data_list_reset(DST.idatalist); } @@ -646,6 +672,8 @@ static void drw_viewport_var_init(void) DST.default_framebuffer = NULL; DST.vmempool = NULL; + + DST.unit_state = NULL; } DST.primary_view_ct = 0; diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h index 6cf70f555eb..867d7132c20 100644 --- a/source/blender/draw/intern/draw_manager.h +++ b/source/blender/draw/intern/draw_manager.h @@ -283,6 +283,8 @@ typedef struct DRWManager { ViewportMemoryPool *vmempool; DRWInstanceDataList *idatalist; DRWInstanceData *object_instance_data[MAX_INSTANCE_DATA_SIZE]; + /* Default Unit model matrix state without culling. */ + DRWCallState *unit_state; /* State of the object being evaluated if already allocated. */ DRWCallState *ob_state; struct DupliObject *dupli_source; diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index 5aec14a3100..7ac7fdf1ff2 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -396,15 +396,10 @@ static DRWCallState *drw_call_state_create(DRWShadingGroup *shgroup, float (*obm state->matflag = 0; /* Matrices */ - if (obmat != NULL) { - copy_m4_m4(state->model, obmat); + copy_m4_m4(state->model, obmat); - if (ob && (ob->transflag & OB_NEG_SCALE)) { - state->flag |= DRW_CALL_NEGSCALE; - } - } - else { - unit_m4(state->model); + if (ob && (ob->transflag & OB_NEG_SCALE)) { + state->flag |= DRW_CALL_NEGSCALE; } drw_call_state_update_matflag(state, shgroup, ob); @@ -435,8 +430,8 @@ static DRWCallState *drw_call_state_object(DRWShadingGroup *shgroup, float (*obm { if (ob == NULL) { if (obmat == NULL) { - /* TODO return unitmat state. */ - return drw_call_state_create(shgroup, obmat, ob); + BLI_assert(DST.unit_state); + return DST.unit_state; } else { return drw_call_state_create(shgroup, obmat, ob); -- cgit v1.2.3