Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2018-02-28 06:04:40 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-03-01 05:53:25 +0300
commit1ba96857d1ea50d97d0b305c270414ac4df5ac16 (patch)
treeddaa57b92c1f87ef23b33d289aa7980e7c03fae7
parentd1da7dba47b6d520fd9fc93d0aa327144d7fc6ae (diff)
DRW: Merge calls_generate pool with calls pool & add DRWCallState pool.
-rw-r--r--source/blender/draw/intern/draw_manager.c8
-rw-r--r--source/blender/draw/intern/draw_manager.h4
-rw-r--r--source/blender/draw/intern/draw_manager_data.c33
-rw-r--r--source/blender/draw/intern/draw_manager_exec.c8
-rw-r--r--source/blender/gpu/GPU_viewport.h2
-rw-r--r--source/blender/gpu/intern/gpu_viewport.c4
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);