[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