diff options
author | Julian Eisel <eiseljulian@gmail.com> | 2019-08-02 14:40:48 +0300 |
---|---|---|
committer | Julian Eisel <eiseljulian@gmail.com> | 2019-08-02 14:45:11 +0300 |
commit | 7a711e133c9bd1f7a6df8320a82ee69c749d3d2f (patch) | |
tree | a92f151eb6f916f4860fb10180092bef77dae19f /source/blender/draw | |
parent | 7922bd26a2517a9b2ad9496c0e6e7324a4dd8a4b (diff) |
Keep a single OpenGL/GPU context alive on the drawing thread
Avoids expensive context switches.
Diffstat (limited to 'source/blender/draw')
-rw-r--r-- | source/blender/draw/DRW_engine.h | 8 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 28 |
2 files changed, 29 insertions, 7 deletions
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h index 6c853d27f67..f9963fa67b7 100644 --- a/source/blender/draw/DRW_engine.h +++ b/source/blender/draw/DRW_engine.h @@ -171,8 +171,12 @@ void DRW_cache_free_old_batches(struct Main *bmain); void DRW_opengl_context_enable_ex(bool restore); void DRW_opengl_context_disable_ex(bool restore); +void DRW_opengl_render_context_enable_ex(void *re_gl_context); void DRW_opengl_render_context_enable(void *re_gl_context); +void DRW_opengl_render_context_disable_ex(void *re_gl_context); void DRW_opengl_render_context_disable(void *re_gl_context); +void DRW_render_context_draw_begin(); +void DRW_render_context_draw_end(); void DRW_gawain_render_context_enable(void *re_gpu_context); void DRW_gawain_render_context_disable(void *re_gpu_context); @@ -182,9 +186,7 @@ struct DrawDataList *DRW_drawdatalist_from_id(struct ID *id); void DRW_drawdata_free(struct ID *id); /* select_engine.c */ -void DRW_select_context_create(struct Base **bases, - const uint bases_len, - short select_mode); +void DRW_select_context_create(struct Base **bases, const uint bases_len, short select_mode); bool DRW_select_elem_get(const uint sel_id, uint *r_elem, uint *r_base_index, char *r_elem_type); uint DRW_select_context_offset_for_object_elem(const uint base_index, char elem_type); uint DRW_select_context_elem_len(void); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 26ad9a54189..4b958a74bf9 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -3020,20 +3020,40 @@ void *DRW_gpu_context_get(void) return DST.gpu_context; } -void DRW_opengl_render_context_enable(void *re_gl_context) +void DRW_opengl_render_context_enable_ex(void *re_gl_context) { /* If thread is main you should use DRW_opengl_context_enable(). */ BLI_assert(!BLI_thread_is_main()); - /* TODO get rid of the blocking. Only here because of the static global DST. */ - BLI_ticket_mutex_lock(DST.gl_context_mutex); WM_opengl_context_activate(re_gl_context); } +void DRW_opengl_render_context_enable(void *re_gl_context) +{ + DRW_opengl_render_context_enable_ex(re_gl_context); + DRW_render_context_draw_begin(); +} -void DRW_opengl_render_context_disable(void *re_gl_context) +void DRW_opengl_render_context_disable_ex(void *re_gl_context) { GPU_flush(); WM_opengl_context_release(re_gl_context); +} +void DRW_opengl_render_context_disable(void *re_gl_context) +{ + DRW_opengl_render_context_disable_ex(re_gl_context); + DRW_render_context_draw_end(); +} + +void DRW_render_context_draw_begin() +{ + BLI_assert(!BLI_thread_is_main()); + /* TODO get rid of the blocking. */ + BLI_ticket_mutex_lock(DST.gl_context_mutex); +} + +void DRW_render_context_draw_end() +{ + // GPU_flush(); /* TODO get rid of the blocking. */ BLI_ticket_mutex_unlock(DST.gl_context_mutex); } |