[Bf-blender-cvs] [acf07e73666] blender2.8: Draw Manager: store context vars per draw

Campbell Barton noreply at git.blender.org
Tue Apr 25 16:37:05 CEST 2017


Commit: acf07e73666a4a3edaeeb36489902b9373a9779d
Author: Campbell Barton
Date:   Wed Apr 26 00:35:08 2017 +1000
Branches: blender2.8
https://developer.blender.org/rBacf07e73666a4a3edaeeb36489902b9373a9779d

Draw Manager: store context vars per draw

Was performing context access per object for scene, region etc.
While not very slow they don't change during drawing so cache in a struct.

This also makes it possible to draw in views besides the current context.

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

M	source/blender/draw/engines/eevee/eevee_probes.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/intern/draw_view.c
M	source/blender/draw/modes/edit_curve_mode.c
M	source/blender/draw/modes/edit_lattice_mode.c
M	source/blender/draw/modes/edit_mesh_mode.c
M	source/blender/draw/modes/edit_text_mode.c
M	source/blender/draw/modes/object_mode.c

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

diff --git a/source/blender/draw/engines/eevee/eevee_probes.c b/source/blender/draw/engines/eevee/eevee_probes.c
index a0e01ee1d80..213f470e3a7 100644
--- a/source/blender/draw/engines/eevee/eevee_probes.c
+++ b/source/blender/draw/engines/eevee/eevee_probes.c
@@ -133,8 +133,8 @@ void EEVEE_refresh_probe(EEVEE_Data *vedata)
 	EEVEE_StorageList *stl = vedata->stl;
 	EEVEE_ProbesInfo *pinfo = stl->probes;
 
-	const bContext *C = DRW_get_context();
-	Scene *scene = CTX_data_scene(C);
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	Scene *scene = draw_ctx->scene;
 	World *world = scene->world;
 
 	float projmat[4][4];
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 50e5741b527..cf86a6a81e8 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -316,5 +316,21 @@ void DRW_state_reset(void);
 
 /* Other */
 void DRW_get_dfdy_factors(float dfdyfac[2]);
-const struct bContext *DRW_get_context(void);
+
+/* Avoid too many lookups while drawing */
+typedef struct DRWContextState {
+	struct ARegion *ar;
+	struct RegionView3D *rv3d;
+	struct View3D *v3d;
+
+	struct Scene *scene;    /* CTX_data_scene(C) */
+	struct SceneLayer *sl;  /* CTX_data_scene_layer(C) */
+
+	/* last resort (some functions take this as an arg so we can't easily avoid) */
+	const struct bContext *evil_C;
+} DRWContextState;
+
+void DRW_context_state_init(const struct bContext *C, DRWContextState *r_draw_ctx);
+const DRWContextState *DRW_context_state_get(void);
+
 #endif /* __DRW_RENDER_H__ */
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 9f7729e0fd8..d84f2e3dfcb 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -205,7 +205,8 @@ static struct DRWGlobalState {
 	float pixsize;
 
 	/* Current rendering context */
-	const struct bContext *context;
+	DRWContextState draw_ctx;
+
 	ListBase enabled_engines; /* RenderEngineType */
 } DST = {NULL};
 
@@ -957,7 +958,7 @@ typedef struct DRWBoundTexture {
 
 static void draw_geometry(DRWShadingGroup *shgroup, Batch *geom, const float (*obmat)[4])
 {
-	RegionView3D *rv3d = CTX_wm_region_view3d(DST.context);
+	RegionView3D *rv3d = DST.draw_ctx.rv3d;
 	DRWInterface *interface = shgroup->interface;
 
 	float mvp[4][4], mv[4][4], n[3][3], wn[3][3];
@@ -1178,24 +1179,18 @@ void DRW_draw_pass(DRWPass *pass)
 
 void DRW_draw_callbacks_pre_scene(void)
 {
-	struct ARegion *ar = CTX_wm_region(DST.context);
-	RegionView3D *rv3d = CTX_wm_region_view3d(DST.context);
+	RegionView3D *rv3d = DST.draw_ctx.rv3d;
 
 	gpuLoadProjectionMatrix(rv3d->winmat);
 	gpuLoadMatrix(rv3d->viewmat);
-
-	ED_region_draw_cb_draw(DST.context, ar, REGION_DRAW_PRE_VIEW);
 }
 
 void DRW_draw_callbacks_post_scene(void)
 {
-	struct ARegion *ar = CTX_wm_region(DST.context);
-	RegionView3D *rv3d = CTX_wm_region_view3d(DST.context);
+	RegionView3D *rv3d = DST.draw_ctx.rv3d;
 
 	gpuLoadProjectionMatrix(rv3d->winmat);
 	gpuLoadMatrix(rv3d->viewmat);
-
-	ED_region_draw_cb_draw(DST.context, ar, REGION_DRAW_POST_VIEW);
 }
 
 /* Reset state to not interfer with other UI drawcall */
@@ -1222,7 +1217,7 @@ void DRW_state_reset(void) {}
 
 bool DRW_is_object_renderable(Object *ob)
 {
-	Scene *scene = CTX_data_scene(DST.context);
+	Scene *scene = DST.draw_ctx.scene;
 	Object *obedit = scene->obedit;
 
 	if (ob->type == OB_MESH) {
@@ -1405,7 +1400,10 @@ const float *DRW_viewport_pixelsize_get(void)
  * if this value change per viewport */
 static void DRW_viewport_var_init(const bContext *C)
 {
-	RegionView3D *rv3d = CTX_wm_region_view3d(C);
+	/* Save context for all later needs */
+	DRW_context_state_init(C, &DST.draw_ctx);
+
+	RegionView3D *rv3d = DST.draw_ctx.rv3d;
 
 	/* Refresh DST.size */
 	int size[2];
@@ -1424,14 +1422,11 @@ static void DRW_viewport_var_init(const bContext *C)
 
 	/* Refresh DST.pixelsize */
 	DST.pixsize = rv3d->pixsize;
-
-	/* Save context for all later needs */
-	DST.context = C;
 }
 
 void DRW_viewport_matrix_get(float mat[4][4], DRWViewportMatrixType type)
 {
-	RegionView3D *rv3d = CTX_wm_region_view3d(DST.context);
+	RegionView3D *rv3d = DST.draw_ctx.rv3d;
 
 	if (type == DRW_MAT_PERS)
 		copy_m4_m4(mat, rv3d->persmat);
@@ -1445,7 +1440,7 @@ void DRW_viewport_matrix_get(float mat[4][4], DRWViewportMatrixType type)
 
 bool DRW_viewport_is_persp_get(void)
 {
-	RegionView3D *rv3d = CTX_wm_region_view3d(DST.context);
+	RegionView3D *rv3d = DST.draw_ctx.rv3d;
 	return rv3d->is_persp;
 }
 
@@ -1499,7 +1494,7 @@ LampEngineData *DRW_lamp_engine_data_get(Object *ob, RenderEngineType *engine_ty
 {
 	BLI_assert(ob->type == OB_LAMP);
 
-	Scene *scene = CTX_data_scene(DST.context);
+	Scene *scene = DST.draw_ctx.scene;
 
 	/* TODO Dupliobjects */
 	return GPU_lamp_engine_data_get(scene, ob, NULL, engine_type);
@@ -1711,7 +1706,7 @@ static void DRW_debug_cpu_stats(void)
 	double cache_tot_time = 0.0, init_tot_time = 0.0, background_tot_time = 0.0, render_tot_time = 0.0, tot_time = 0.0;
 	/* local coordinate visible rect inside region, to accomodate overlapping ui */
 	rcti rect;
-	struct ARegion *ar = CTX_wm_region(DST.context);
+	struct ARegion *ar = DST.draw_ctx.ar;
 	ED_region_visible_rect(ar, &rect);
 
 	UI_FontThemeColor(BLF_default(), TH_TEXT_HI);
@@ -1786,7 +1781,7 @@ static void DRW_debug_gpu_stats(void)
 {
 	/* local coordinate visible rect inside region, to accomodate overlapping ui */
 	rcti rect;
-	struct ARegion *ar = CTX_wm_region(DST.context);
+	struct ARegion *ar = DST.draw_ctx.ar;
 	ED_region_visible_rect(ar, &rect);
 
 	UI_FontThemeColor(BLF_default(), TH_TEXT_HI);
@@ -1879,8 +1874,12 @@ void DRW_draw_view(const bContext *C)
 	DRW_engines_draw_background();
 
 	DRW_draw_callbacks_pre_scene();
+	ED_region_draw_cb_draw(C, DST.draw_ctx.ar, REGION_DRAW_PRE_VIEW);
+
 	DRW_engines_draw_scene();
+
 	DRW_draw_callbacks_post_scene();
+	ED_region_draw_cb_draw(C, DST.draw_ctx.ar, REGION_DRAW_POST_VIEW);
 
 	DRW_draw_manipulator();
 
@@ -1897,9 +1896,22 @@ void DRW_draw_view(const bContext *C)
 
 /* ****************************************** OTHER ***************************************** */
 
-const bContext *DRW_get_context(void)
+void DRW_context_state_init(const bContext *C, DRWContextState *r_draw_ctx)
+{
+	r_draw_ctx->ar = CTX_wm_region(C);
+	r_draw_ctx->rv3d = CTX_wm_region_view3d(C);
+	r_draw_ctx->v3d = CTX_wm_view3d(C);
+
+	r_draw_ctx->scene = CTX_data_scene(C);
+	r_draw_ctx->sl = CTX_data_scene_layer(C);
+
+	/* grr, cant avoid! */
+	r_draw_ctx->evil_C = C;
+}
+
+const DRWContextState *DRW_context_state_get(void)
 {
-	return DST.context;
+	return &DST.draw_ctx;
 }
 
 /* ****************************************** INIT ***************************************** */
diff --git a/source/blender/draw/intern/draw_view.c b/source/blender/draw/intern/draw_view.c
index e10036916a0..1a806212206 100644
--- a/source/blender/draw/intern/draw_view.c
+++ b/source/blender/draw/intern/draw_view.c
@@ -59,11 +59,11 @@
 
 void DRW_draw_region_info(void)
 {
-	const bContext *C = DRW_get_context();
-	ARegion *ar = CTX_wm_region(C);
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	ARegion *ar = draw_ctx->ar;
 
 	DRW_draw_cursor();
-	view3d_draw_region_info(C, ar);
+	view3d_draw_region_info(draw_ctx->evil_C, ar);
 }
 
 /* ************************* Grid ************************** */
@@ -511,11 +511,11 @@ void DRW_draw_grid(void)
 	 *
 	 * 'RegionView3D.pixsize' is used for viewport drawing, not rendering.
 	 */
-	const bContext *C = DRW_get_context();
-	Scene *scene = CTX_data_scene(C);
-	View3D *v3d = CTX_wm_view3d(C);
-	ARegion *ar = CTX_wm_region(C);
-	RegionView3D *rv3d = ar->regiondata;
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	Scene *scene = draw_ctx->scene;
+	View3D *v3d = draw_ctx->v3d;
+	ARegion *ar = draw_ctx->ar;
+	RegionView3D *rv3d = draw_ctx->rv3d;
 
 	const bool draw_floor = (rv3d->view == RV3D_VIEW_USER) || (rv3d->persp != RV3D_ORTHO);
 	const char *grid_unit = NULL;
@@ -633,11 +633,11 @@ static bool is_cursor_visible(Scene *scene, SceneLayer *sl)
 
 void DRW_draw_cursor(void)
 {
-	const bContext *C = DRW_get_context();
-	View3D *v3d = CTX_wm_view3d(C);
-	RegionView3D *rv3d = CTX_wm_region_view3d(C);
-	Scene *scene = CTX_data_scene(C);
-	SceneLayer *sl = CTX_data_scene_layer(C);
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	View3D *v3d = draw_ctx->v3d;
+	RegionView3D *rv3d = draw_ctx->rv3d;
+	Scene *scene = draw_ctx->scene;
+	SceneLayer *sl = draw_ctx->sl;
 
 	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
 	glDepthMask(GL_FALSE);
@@ -707,10 +707,10 @@ void DRW_draw_cursor(void)
 
 void DRW_draw_manipulator(void)
 {
-	const bContext *C = DRW_get_context();
-	View3D *v3d = CTX_wm_view3d(C);
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	View3D *v3d = draw_ctx->v3d;
 	v3d->zbuf = false;
-	ARegion *ar = CTX_wm_region(C);
+	ARegion *ar = draw_ctx->ar;
 
 
 	/* TODO, only draws 3D manipulators right now, need to see how 2D drawing will work in new viewport */
@@ -718,5 +718,5 @@ void DRW_draw_manipulator(void)
 	/* draw depth culled manipulators - manipulators need to be updated *after* view matrix was set up */
 	/* TODO depth culling manipulators is not yet supported, just drawing _3D here, should
 	 * later become _IN_SCENE (and draw _3D separate) */
-	WM_manipulatormap_draw(ar->manipulator_map, C, WM_MANIPULATORMAP_DRAWSTEP_3D);
+	WM_manipulatormap_draw(ar->manipulator_map, draw_ctx->evil_C, WM_MANIPULATORMAP_DRAWSTEP_3D);
 }
diff --git a/source/blender/draw/modes/edit_curve_mode.c b/source/blender/draw/modes/edit_curve_mode.c
index 3e316293a57..f2834bfb0ec 100644
--- a/source/blender/draw/modes/edit_curve_mode.c
+++ b/source/blender/draw/modes/edit_curve_mode.c
@@ -212,9 +212,9 @@ static void EDIT_CURVE_cache_populate(void *vedata, Object *ob)
 {
 	EDIT_CURVE_PassList *psl = ((EDIT_CURVE_Data *)vedata)->psl;
 	EDIT_CURVE_StorageList *stl = ((EDIT_CURVE_Data *)vedata)->stl;
-	const struct bContext *C = DRW_get_context();
-	Scene *scene = CTX_data_scene(C);
-	Object *obedit = scene->obedit;
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	const Scene *scene = draw_ctx->scene;
+	

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list