diff options
Diffstat (limited to 'source/blender/draw/intern')
-rw-r--r-- | source/blender/draw/intern/draw_cache.c | 5 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 12 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.h | 3 |
3 files changed, 17 insertions, 3 deletions
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index c23ea3d7c82..af5b9cd05dd 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -3552,6 +3552,11 @@ void drw_batch_cache_generate_requested(Object *ob) } } +void drw_batch_cache_generate_requested_delayed(Object *ob) +{ + BLI_gset_add(DST.delayed_extraction, ob); +} + void DRW_batch_cache_free_old(Object *ob, int ctime) { struct Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 2ba766f4729..10ef8d9c4c8 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -132,11 +132,17 @@ static void drw_task_graph_init(void) { BLI_assert(DST.task_graph == NULL); DST.task_graph = BLI_task_graph_create(); + DST.delayed_extraction = BLI_gset_ptr_new(__func__); } static void drw_task_graph_deinit(void) { BLI_task_graph_work_and_wait(DST.task_graph); + + BLI_gset_free(DST.delayed_extraction, (void (*)(void *key))drw_batch_cache_generate_requested); + DST.delayed_extraction = NULL; + BLI_task_graph_work_and_wait(DST.task_graph); + BLI_task_graph_free(DST.task_graph); DST.task_graph = NULL; } @@ -1486,6 +1492,7 @@ void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph, drw_duplidata_free(); drw_engines_cache_finish(); + drw_task_graph_deinit(); DRW_render_instance_buffer_finish(); #ifdef USE_PROFILE @@ -1494,7 +1501,6 @@ void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph, #endif } - drw_task_graph_deinit(); DRW_stats_begin(); GPU_framebuffer_bind(DST.default_framebuffer); @@ -2292,9 +2298,9 @@ static void drw_draw_depth_loop_imp(struct Depsgraph *depsgraph, drw_duplidata_free(); drw_engines_cache_finish(); + drw_task_graph_deinit(); DRW_render_instance_buffer_finish(); } - drw_task_graph_deinit(); /* Start Drawing */ DRW_state_reset(); @@ -2411,6 +2417,7 @@ void DRW_draw_select_id(Depsgraph *depsgraph, ARegion *region, View3D *v3d, cons drw_engines_cache_finish(); + drw_task_graph_deinit(); #if 0 /* This is a workaround to a nasty bug that seems to be a nasty driver bug. (See T69377) */ DRW_render_instance_buffer_finish(); #else @@ -2419,7 +2426,6 @@ void DRW_draw_select_id(Depsgraph *depsgraph, ARegion *region, View3D *v3d, cons drw_resource_buffer_finish(DST.vmempool); #endif } - drw_task_graph_deinit(); /* Start Drawing */ DRW_state_reset(); diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h index 6cae2a4f9f6..31a2dd7f0fe 100644 --- a/source/blender/draw/intern/draw_manager.h +++ b/source/blender/draw/intern/draw_manager.h @@ -548,6 +548,8 @@ typedef struct DRWManager { #endif struct TaskGraph *task_graph; + /* Contains list of objects that needs to be extracted from other objects. */ + struct GSet *delayed_extraction; /* ---------- Nothing after this point is cleared after use ----------- */ @@ -585,6 +587,7 @@ eDRWCommandType command_type_get(uint64_t *command_type_bits, int index); void drw_batch_cache_validate(Object *ob); void drw_batch_cache_generate_requested(struct Object *ob); +void drw_batch_cache_generate_requested_delayed(Object *ob); void drw_resource_buffer_finish(ViewportMemoryPool *vmempool); |