[Bf-blender-cvs] [1ba96857d1e] blender2.8: DRW: Merge calls_generate pool with calls pool & add DRWCallState pool.

Clément Foucault noreply at git.blender.org
Thu Mar 1 04:07:14 CET 2018


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



More information about the Bf-blender-cvs mailing list