Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/draw_manager.c
| Show All 31 Lines | |||||
| #include "BIF_glutil.h" | #include "BIF_glutil.h" | ||||
| #include "BKE_global.h" | #include "BKE_global.h" | ||||
| #include "BKE_mesh.h" | #include "BKE_mesh.h" | ||||
| #include "BKE_object.h" | #include "BKE_object.h" | ||||
| #include "BKE_pbvh.h" | #include "BKE_pbvh.h" | ||||
| #include "BKE_paint.h" | #include "BKE_paint.h" | ||||
| #include "BKE_workspace.h" | |||||
| #include "BLT_translation.h" | #include "BLT_translation.h" | ||||
| #include "BLF_api.h" | #include "BLF_api.h" | ||||
| #include "DRW_engine.h" | #include "DRW_engine.h" | ||||
| #include "DRW_render.h" | #include "DRW_render.h" | ||||
| #include "DNA_camera_types.h" | #include "DNA_camera_types.h" | ||||
| ▲ Show 20 Lines • Show All 2,852 Lines • ▼ Show 20 Lines | static void use_drw_engine(DrawEngineType *engine) | ||||
| LinkData *ld = MEM_callocN(sizeof(LinkData), "enabled engine link data"); | LinkData *ld = MEM_callocN(sizeof(LinkData), "enabled engine link data"); | ||||
| ld->data = engine; | ld->data = engine; | ||||
| BLI_addtail(&DST.enabled_engines, ld); | BLI_addtail(&DST.enabled_engines, ld); | ||||
| } | } | ||||
| /* TODO revisit this when proper layering is implemented */ | /* TODO revisit this when proper layering is implemented */ | ||||
| /* Gather all draw engines needed and store them in DST.enabled_engines | /* Gather all draw engines needed and store them in DST.enabled_engines | ||||
| * That also define the rendering order of engines */ | * That also define the rendering order of engines */ | ||||
| static void DRW_engines_enable_from_engine(const Scene *scene) | static void DRW_engines_enable_from_engine(RenderEngineType *engine) | ||||
| { | { | ||||
| /* TODO layers */ | /* TODO layers */ | ||||
| RenderEngineType *type = RE_engines_find(scene->r.engine); | if (engine->draw_engine != NULL) { | ||||
| if (type->draw_engine != NULL) { | use_drw_engine(engine->draw_engine); | ||||
| use_drw_engine(type->draw_engine); | |||||
| } | } | ||||
| if ((type->flag & RE_INTERNAL) == 0) { | if ((engine->flag & RE_INTERNAL) == 0) { | ||||
| DRW_engines_enable_external(); | DRW_engines_enable_external(); | ||||
| } | } | ||||
| } | } | ||||
| static void DRW_engines_enable_from_object_mode(void) | static void DRW_engines_enable_from_object_mode(void) | ||||
| { | { | ||||
| use_drw_engine(&draw_engine_object_type); | use_drw_engine(&draw_engine_object_type); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 60 Lines • ▼ Show 20 Lines | |||||
| /** | /** | ||||
| * Use for external render engines. | * Use for external render engines. | ||||
| */ | */ | ||||
| static void DRW_engines_enable_external(void) | static void DRW_engines_enable_external(void) | ||||
| { | { | ||||
| use_drw_engine(DRW_engine_viewport_external_type.draw_engine); | use_drw_engine(DRW_engine_viewport_external_type.draw_engine); | ||||
| } | } | ||||
| static void DRW_engines_enable(const Scene *scene, SceneLayer *sl) | static void DRW_engines_enable(const Scene *scene, SceneLayer *sl, RenderEngineType *engine) | ||||
| { | { | ||||
| Object *obact = OBACT_NEW(sl); | Object *obact = OBACT_NEW(sl); | ||||
| const int mode = CTX_data_mode_enum_ex(scene->obedit, obact); | const int mode = CTX_data_mode_enum_ex(scene->obedit, obact); | ||||
| DRW_engines_enable_from_engine(scene); | |||||
| DRW_engines_enable_from_engine(engine); | |||||
| if (DRW_state_draw_support()) { | if (DRW_state_draw_support()) { | ||||
| DRW_engines_enable_from_object_mode(); | DRW_engines_enable_from_object_mode(); | ||||
| DRW_engines_enable_from_mode(mode); | DRW_engines_enable_from_mode(mode); | ||||
| } | } | ||||
| } | } | ||||
| static void DRW_engines_disable(void) | static void DRW_engines_disable(void) | ||||
| ▲ Show 20 Lines • Show All 142 Lines • ▼ Show 20 Lines | |||||
| void DRW_notify_view_update(const bContext *C) | void DRW_notify_view_update(const bContext *C) | ||||
| { | { | ||||
| struct Depsgraph *graph = CTX_data_depsgraph(C); | struct Depsgraph *graph = CTX_data_depsgraph(C); | ||||
| ARegion *ar = CTX_wm_region(C); | ARegion *ar = CTX_wm_region(C); | ||||
| View3D *v3d = CTX_wm_view3d(C); | View3D *v3d = CTX_wm_view3d(C); | ||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| Scene *scene = DEG_get_evaluated_scene(graph); | Scene *scene = DEG_get_evaluated_scene(graph); | ||||
| SceneLayer *sl = DEG_get_evaluated_scene_layer(graph); | RenderEngineType *engine = CTX_data_engine(C); | ||||
| SceneLayer *scene_layer = CTX_data_scene_layer(C); | |||||
| if (rv3d->viewport == NULL) { | if (rv3d->viewport == NULL) { | ||||
| return; | return; | ||||
| } | } | ||||
| /* Reset before using it. */ | /* Reset before using it. */ | ||||
| memset(&DST, 0x0, sizeof(DST)); | memset(&DST, 0x0, sizeof(DST)); | ||||
| DST.viewport = rv3d->viewport; | DST.viewport = rv3d->viewport; | ||||
| DST.draw_ctx = (DRWContextState){ | DST.draw_ctx = (DRWContextState){ | ||||
| ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), C, | ar, rv3d, v3d, scene, scene_layer, OBACT_NEW(scene_layer), engine, C, | ||||
| }; | }; | ||||
| DRW_engines_enable(scene, sl); | DRW_engines_enable(scene, scene_layer, engine); | ||||
| for (LinkData *link = DST.enabled_engines.first; link; link = link->next) { | for (LinkData *link = DST.enabled_engines.first; link; link = link->next) { | ||||
| DrawEngineType *engine = link->data; | DrawEngineType *draw_engine = link->data; | ||||
| ViewportEngineData *data = DRW_viewport_engine_data_get(engine); | ViewportEngineData *data = DRW_viewport_engine_data_get(draw_engine); | ||||
| if (engine->view_update) { | if (draw_engine->view_update) { | ||||
| engine->view_update(data); | draw_engine->view_update(data); | ||||
| } | } | ||||
| } | } | ||||
| DST.viewport = NULL; | DST.viewport = NULL; | ||||
| DRW_engines_disable(); | DRW_engines_disable(); | ||||
| } | } | ||||
| /** \} */ | /** \} */ | ||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| /** \name Main Draw Loops (DRW_draw) | /** \name Main Draw Loops (DRW_draw) | ||||
| * \{ */ | * \{ */ | ||||
| /* Everything starts here. | /* Everything starts here. | ||||
| * This function takes care of calling all cache and rendering functions | * This function takes care of calling all cache and rendering functions | ||||
| * for each relevant engine / mode engine. */ | * for each relevant engine / mode engine. */ | ||||
| void DRW_draw_view(const bContext *C) | void DRW_draw_view(const bContext *C) | ||||
| { | { | ||||
| struct Depsgraph *graph = CTX_data_depsgraph(C); | struct Depsgraph *graph = CTX_data_depsgraph(C); | ||||
| RenderEngineType *engine = CTX_data_engine(C); | |||||
| ARegion *ar = CTX_wm_region(C); | ARegion *ar = CTX_wm_region(C); | ||||
| View3D *v3d = CTX_wm_view3d(C); | View3D *v3d = CTX_wm_view3d(C); | ||||
| /* Reset before using it. */ | /* Reset before using it. */ | ||||
| memset(&DST, 0x0, sizeof(DST)); | memset(&DST, 0x0, sizeof(DST)); | ||||
| DRW_draw_render_loop_ex(graph, ar, v3d, C); | DRW_draw_render_loop_ex(graph, engine, ar, v3d, C); | ||||
| } | } | ||||
| /** | /** | ||||
| * Used for both regular and off-screen drawing. | * Used for both regular and off-screen drawing. | ||||
| * Need to reset DST before calling this function | * Need to reset DST before calling this function | ||||
| */ | */ | ||||
| void DRW_draw_render_loop_ex( | void DRW_draw_render_loop_ex( | ||||
| struct Depsgraph *graph, | struct Depsgraph *graph, | ||||
| RenderEngineType *engine, | |||||
| ARegion *ar, View3D *v3d, | ARegion *ar, View3D *v3d, | ||||
| const bContext *evil_C) | const bContext *evil_C) | ||||
| { | { | ||||
| Scene *scene = DEG_get_evaluated_scene(graph); | Scene *scene = DEG_get_evaluated_scene(graph); | ||||
| SceneLayer *sl = DEG_get_evaluated_scene_layer(graph); | SceneLayer *scene_layer = DEG_get_evaluated_scene_layer(graph); | ||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| DST.draw_ctx.evil_C = evil_C; | DST.draw_ctx.evil_C = evil_C; | ||||
| bool cache_is_dirty; | bool cache_is_dirty; | ||||
| DST.viewport = rv3d->viewport; | DST.viewport = rv3d->viewport; | ||||
| v3d->zbuf = true; | v3d->zbuf = true; | ||||
| /* Setup viewport */ | /* Setup viewport */ | ||||
| cache_is_dirty = GPU_viewport_cache_validate(DST.viewport, DRW_engines_get_hash()); | cache_is_dirty = GPU_viewport_cache_validate(DST.viewport, DRW_engines_get_hash()); | ||||
| DST.draw_ctx = (DRWContextState){ | DST.draw_ctx = (DRWContextState){ | ||||
| ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), | ar, rv3d, v3d, scene, scene_layer, OBACT_NEW(scene_layer), engine, | ||||
| /* reuse if caller sets */ | /* reuse if caller sets */ | ||||
| DST.draw_ctx.evil_C, | DST.draw_ctx.evil_C, | ||||
| }; | }; | ||||
| DRW_viewport_var_init(); | DRW_viewport_var_init(); | ||||
| /* Get list of enabled engines */ | /* Get list of enabled engines */ | ||||
| DRW_engines_enable(scene, sl); | DRW_engines_enable(scene, scene_layer, engine); | ||||
| /* Update ubos */ | /* Update ubos */ | ||||
| DRW_globals_update(); | DRW_globals_update(); | ||||
| /* Init engines */ | /* Init engines */ | ||||
| DRW_engines_init(); | DRW_engines_init(); | ||||
| /* TODO : tag to refresh by the deps graph */ | /* TODO : tag to refresh by the deps graph */ | ||||
| ▲ Show 20 Lines • Show All 63 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| void DRW_draw_render_loop( | void DRW_draw_render_loop( | ||||
| struct Depsgraph *graph, | struct Depsgraph *graph, | ||||
| ARegion *ar, View3D *v3d) | ARegion *ar, View3D *v3d) | ||||
| { | { | ||||
| /* Reset before using it. */ | /* Reset before using it. */ | ||||
| memset(&DST, 0x0, sizeof(DST)); | memset(&DST, 0x0, sizeof(DST)); | ||||
| DRW_draw_render_loop_ex(graph, ar, v3d, NULL); | |||||
| Scene *scene = DEG_get_evaluated_scene(graph); | |||||
| RenderEngineType *engine = RE_engines_find(scene->view_render.engine_id); | |||||
| DRW_draw_render_loop_ex(graph, engine, ar, v3d, NULL); | |||||
| } | } | ||||
| void DRW_draw_render_loop_offscreen( | void DRW_draw_render_loop_offscreen( | ||||
| struct Depsgraph *graph, | struct Depsgraph *graph, RenderEngineType *engine, | ||||
| ARegion *ar, View3D *v3d, GPUOffScreen *ofs) | ARegion *ar, View3D *v3d, GPUOffScreen *ofs) | ||||
| { | { | ||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| /* backup */ | /* backup */ | ||||
| void *backup_viewport = rv3d->viewport; | void *backup_viewport = rv3d->viewport; | ||||
| { | { | ||||
| /* backup (_never_ use rv3d->viewport) */ | /* backup (_never_ use rv3d->viewport) */ | ||||
| rv3d->viewport = GPU_viewport_create_from_offscreen(ofs); | rv3d->viewport = GPU_viewport_create_from_offscreen(ofs); | ||||
| } | } | ||||
| /* Reset before using it. */ | /* Reset before using it. */ | ||||
| memset(&DST, 0x0, sizeof(DST)); | memset(&DST, 0x0, sizeof(DST)); | ||||
| DST.options.is_image_render = true; | DST.options.is_image_render = true; | ||||
| DRW_draw_render_loop_ex(graph, ar, v3d, NULL); | DRW_draw_render_loop_ex(graph, engine, ar, v3d, NULL); | ||||
| /* restore */ | /* restore */ | ||||
| { | { | ||||
| /* don't free data owned by 'ofs' */ | /* don't free data owned by 'ofs' */ | ||||
| GPU_viewport_clear_from_offscreen(rv3d->viewport); | GPU_viewport_clear_from_offscreen(rv3d->viewport); | ||||
| GPU_viewport_free(rv3d->viewport); | GPU_viewport_free(rv3d->viewport); | ||||
| MEM_freeN(rv3d->viewport); | MEM_freeN(rv3d->viewport); | ||||
| rv3d->viewport = backup_viewport; | rv3d->viewport = backup_viewport; | ||||
| } | } | ||||
| /* we need to re-bind (annoying!) */ | /* we need to re-bind (annoying!) */ | ||||
| GPU_offscreen_bind(ofs, false); | GPU_offscreen_bind(ofs, false); | ||||
| } | } | ||||
| /** | /** | ||||
| * object mode select-loop, see: ED_view3d_draw_select_loop (legacy drawing). | * object mode select-loop, see: ED_view3d_draw_select_loop (legacy drawing). | ||||
| */ | */ | ||||
| void DRW_draw_select_loop( | void DRW_draw_select_loop( | ||||
| struct Depsgraph *graph, | struct Depsgraph *graph, | ||||
| ARegion *ar, View3D *v3d, | ARegion *ar, View3D *v3d, | ||||
| bool UNUSED(use_obedit_skip), bool UNUSED(use_nearest), const rcti *rect) | bool UNUSED(use_obedit_skip), bool UNUSED(use_nearest), const rcti *rect) | ||||
| { | { | ||||
| Scene *scene = DEG_get_evaluated_scene(graph); | Scene *scene = DEG_get_evaluated_scene(graph); | ||||
| RenderEngineType *engine = RE_engines_find(scene->view_render.engine_id); | |||||
| SceneLayer *sl = DEG_get_evaluated_scene_layer(graph); | SceneLayer *sl = DEG_get_evaluated_scene_layer(graph); | ||||
| #ifndef USE_GPU_SELECT | #ifndef USE_GPU_SELECT | ||||
| UNUSED_VARS(vc, scene, sl, v3d, ar, rect); | UNUSED_VARS(vc, scene, sl, v3d, ar, rect); | ||||
| #else | #else | ||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| /* Reset before using it. */ | /* Reset before using it. */ | ||||
| memset(&DST, 0x0, sizeof(DST)); | memset(&DST, 0x0, sizeof(DST)); | ||||
| Show All 36 Lines | else { | ||||
| DRW_engines_enable_from_object_mode(); | DRW_engines_enable_from_object_mode(); | ||||
| } | } | ||||
| /* Setup viewport */ | /* Setup viewport */ | ||||
| cache_is_dirty = true; | cache_is_dirty = true; | ||||
| /* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */ | /* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */ | ||||
| DST.draw_ctx = (DRWContextState){ | DST.draw_ctx = (DRWContextState){ | ||||
| ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), (bContext *)NULL, | ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), engine, (bContext *)NULL, | ||||
| }; | }; | ||||
| DRW_viewport_var_init(); | DRW_viewport_var_init(); | ||||
| /* Update ubos */ | /* Update ubos */ | ||||
| DRW_globals_update(); | DRW_globals_update(); | ||||
| /* Init engines */ | /* Init engines */ | ||||
| ▲ Show 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | |||||
| /** | /** | ||||
| * object mode select-loop, see: ED_view3d_draw_depth_loop (legacy drawing). | * object mode select-loop, see: ED_view3d_draw_depth_loop (legacy drawing). | ||||
| */ | */ | ||||
| void DRW_draw_depth_loop( | void DRW_draw_depth_loop( | ||||
| Depsgraph *graph, | Depsgraph *graph, | ||||
| ARegion *ar, View3D *v3d) | ARegion *ar, View3D *v3d) | ||||
| { | { | ||||
| Scene *scene = DEG_get_evaluated_scene(graph); | Scene *scene = DEG_get_evaluated_scene(graph); | ||||
| RenderEngineType *engine = RE_engines_find(scene->view_render.engine_id); | |||||
| SceneLayer *sl = DEG_get_evaluated_scene_layer(graph); | SceneLayer *sl = DEG_get_evaluated_scene_layer(graph); | ||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| /* backup (_never_ use rv3d->viewport) */ | /* backup (_never_ use rv3d->viewport) */ | ||||
| void *backup_viewport = rv3d->viewport; | void *backup_viewport = rv3d->viewport; | ||||
| rv3d->viewport = NULL; | rv3d->viewport = NULL; | ||||
| /* Reset before using it. */ | /* Reset before using it. */ | ||||
| Show All 14 Lines | /* Get list of enabled engines */ | ||||
| DRW_engines_enable_from_object_mode(); | DRW_engines_enable_from_object_mode(); | ||||
| } | } | ||||
| /* Setup viewport */ | /* Setup viewport */ | ||||
| cache_is_dirty = true; | cache_is_dirty = true; | ||||
| /* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */ | /* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */ | ||||
| DST.draw_ctx = (DRWContextState){ | DST.draw_ctx = (DRWContextState){ | ||||
| ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), (bContext *)NULL, | ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), engine, (bContext *)NULL, | ||||
| }; | }; | ||||
| DRW_viewport_var_init(); | DRW_viewport_var_init(); | ||||
| /* Update ubos */ | /* Update ubos */ | ||||
| DRW_globals_update(); | DRW_globals_update(); | ||||
| /* Init engines */ | /* Init engines */ | ||||
| ▲ Show 20 Lines • Show All 225 Lines • Show Last 20 Lines | |||||