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.
This commit is contained in:
@@ -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];
|
||||
|
||||
@@ -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__ */
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
return DST.context;
|
||||
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.draw_ctx;
|
||||
}
|
||||
|
||||
/* ****************************************** INIT ***************************************** */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
const Object *obedit = scene->obedit;
|
||||
|
||||
UNUSED_VARS(psl, stl);
|
||||
|
||||
|
||||
@@ -185,8 +185,8 @@ static void EDIT_LATTICE_cache_populate(void *vedata, Object *ob)
|
||||
{
|
||||
EDIT_LATTICE_PassList *psl = ((EDIT_LATTICE_Data *)vedata)->psl;
|
||||
EDIT_LATTICE_StorageList *stl = ((EDIT_LATTICE_Data *)vedata)->stl;
|
||||
const struct bContext *C = DRW_get_context();
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
const DRWContextState *draw_ctx = DRW_context_state_get();
|
||||
Scene *scene = draw_ctx->scene;
|
||||
Object *obedit = scene->obedit;
|
||||
|
||||
UNUSED_VARS(psl);
|
||||
|
||||
@@ -232,9 +232,9 @@ static DRWPass *edit_mesh_create_overlay_pass(
|
||||
DRWShadingGroup **r_lverts_shgrp, DRWShadingGroup **r_facedot_shgrp)
|
||||
{
|
||||
GPUShader *tri_sh, *ledge_sh;
|
||||
const struct bContext *C = DRW_get_context();
|
||||
RegionView3D *rv3d = CTX_wm_region_view3d(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
const DRWContextState *draw_ctx = DRW_context_state_get();
|
||||
RegionView3D *rv3d = draw_ctx->rv3d;
|
||||
Scene *scene = draw_ctx->scene;
|
||||
ToolSettings *tsettings = scene->toolsettings;
|
||||
|
||||
if ((tsettings->selectmode & SCE_SELECT_VERTEX) != 0) {
|
||||
@@ -289,8 +289,8 @@ static void EDIT_MESH_cache_init(void *vedata)
|
||||
EDIT_MESH_StorageList *stl = ((EDIT_MESH_Data *)vedata)->stl;
|
||||
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
|
||||
|
||||
const struct bContext *C = DRW_get_context();
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
const DRWContextState *draw_ctx = DRW_context_state_get();
|
||||
View3D *v3d = draw_ctx->v3d;
|
||||
|
||||
bool do_zbufclip = ((v3d->flag & V3D_ZBUF_SELECT) == 0);
|
||||
|
||||
@@ -392,9 +392,9 @@ static void edit_mesh_add_ob_to_pass(
|
||||
static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
|
||||
{
|
||||
EDIT_MESH_StorageList *stl = ((EDIT_MESH_Data *)vedata)->stl;
|
||||
const struct bContext *C = DRW_get_context();
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
const DRWContextState *draw_ctx = DRW_context_state_get();
|
||||
View3D *v3d = draw_ctx->v3d;
|
||||
Scene *scene = draw_ctx->scene;
|
||||
Object *obedit = scene->obedit;
|
||||
struct Batch *geom;
|
||||
|
||||
|
||||
@@ -189,8 +189,8 @@ static void EDIT_TEXT_cache_populate(void *vedata, Object *ob)
|
||||
{
|
||||
EDIT_TEXT_PassList *psl = ((EDIT_TEXT_Data *)vedata)->psl;
|
||||
EDIT_TEXT_StorageList *stl = ((EDIT_TEXT_Data *)vedata)->stl;
|
||||
const struct bContext *C = DRW_get_context();
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
const DRWContextState *draw_ctx = DRW_context_state_get();
|
||||
Scene *scene = draw_ctx->scene;
|
||||
Object *obedit = scene->obedit;
|
||||
|
||||
UNUSED_VARS(psl, stl);
|
||||
|
||||
@@ -252,10 +252,10 @@ static void OBJECT_engine_init(void *vedata)
|
||||
{
|
||||
/* Grid precompute */
|
||||
float viewinvmat[4][4], winmat[4][4], invwinmat[4][4], viewmat[4][4];
|
||||
const bContext *C = DRW_get_context();
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
RegionView3D *rv3d = CTX_wm_region_view3d(C);
|
||||
const DRWContextState *draw_ctx = DRW_context_state_get();
|
||||
View3D *v3d = draw_ctx->v3d;
|
||||
Scene *scene = draw_ctx->scene;
|
||||
RegionView3D *rv3d = draw_ctx->rv3d;
|
||||
float grid_scale = ED_view3d_grid_scale(scene, v3d, NULL);
|
||||
float grid_res, offs;
|
||||
|
||||
@@ -912,9 +912,9 @@ static void DRW_shgroup_lamp(OBJECT_StorageList *stl, Object *ob, SceneLayer *sl
|
||||
|
||||
static void DRW_shgroup_camera(OBJECT_StorageList *stl, Object *ob, SceneLayer *sl)
|
||||
{
|
||||
const struct bContext *C = DRW_get_context();
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
const DRWContextState *draw_ctx = DRW_context_state_get();
|
||||
View3D *v3d = draw_ctx->v3d;
|
||||
Scene *scene = draw_ctx->scene;
|
||||
|
||||
Camera *cam = ob->data;
|
||||
const bool is_active = (ob == v3d->camera);
|
||||
@@ -1172,9 +1172,9 @@ static void DRW_shgroup_object_center(OBJECT_StorageList *stl, Object *ob)
|
||||
static void OBJECT_cache_populate(void *vedata, Object *ob)
|
||||
{
|
||||
OBJECT_StorageList *stl = ((OBJECT_Data *)vedata)->stl;
|
||||
const struct bContext *C = DRW_get_context();
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
SceneLayer *sl = CTX_data_scene_layer(C);
|
||||
const DRWContextState *draw_ctx = DRW_context_state_get();
|
||||
Scene *scene = draw_ctx->scene;
|
||||
SceneLayer *sl = draw_ctx->sl;
|
||||
|
||||
//CollectionEngineSettings *ces_mode_ob = BKE_object_collection_engine_get(ob, COLLECTION_MODE_OBJECT, "");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user