Commit: 1ba96857d1ea50d97d0b305c270414ac4df5ac16
Author: Clément Foucault
Date:   Wed Feb 28 04:04:40 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB1ba96857d1ea50d97d0b305c270414ac4df5ac16

DRW: Merge calls_generate pool with calls pool & add DRWCallState pool.

===================================================================

M       source/blender/draw/intern/draw_manager.c
M       source/blender/draw/intern/draw_manager.h
M       source/blender/draw/intern/draw_manager_data.c
M       source/blender/draw/intern/draw_manager_exec.c
M       source/blender/gpu/GPU_viewport.h
M       source/blender/gpu/intern/gpu_viewport.c

===================================================================

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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to