Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Eisel <eiseljulian@gmail.com>2019-08-02 14:40:48 +0300
committerJulian Eisel <eiseljulian@gmail.com>2019-08-02 14:45:11 +0300
commit7a711e133c9bd1f7a6df8320a82ee69c749d3d2f (patch)
treea92f151eb6f916f4860fb10180092bef77dae19f /source/blender/draw
parent7922bd26a2517a9b2ad9496c0e6e7324a4dd8a4b (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.h8
-rw-r--r--source/blender/draw/intern/draw_manager.c28
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);
}