summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaegeun Park <haegeun.park@samsung.com>2016-11-15 16:18:50 +0900
committerHaegeun Park <haegeun.park@samsung.com>2017-01-11 18:20:38 +0900
commit9d2640526b98d8d4eb2ffa8deaa53c7999568ca2 (patch)
tree241ca4dc9ddbebb96ab53226c25f44e88e1aa0e8
parentf03b03908de8e71af3d9f0e0b683a195cb08474e (diff)
downloadefl-9d2640526b98d8d4eb2ffa8deaa53c7999568ca2.tar.gz
evas/gl_common: (GL thread) Moved shader_array_flush() to worker thread to reduce thread invoking
From moving the function itself, evas_gl_thread_begin()~end() prevents API-level threading and thread invoking is skipped. (it minimizes invoking overhead) Change-Id: I484ba07fb481d2fbfe26a68ee95bdc435412ba8c
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_context.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/src/modules/evas/engines/gl_common/evas_gl_context.c b/src/modules/evas/engines/gl_common/evas_gl_context.c
index c24e77fb72..edfe2850e4 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_context.c
+++ b/src/modules/evas/engines/gl_common/evas_gl_context.c
@@ -3061,7 +3061,7 @@ start_tiling(Evas_Engine_GL_Context *gc EINA_UNUSED,
}
static void
-shader_array_flush(Evas_Engine_GL_Context *gc)
+_orig_shader_array_flush(Evas_Engine_GL_Context *gc)
{
int i, gw, gh, offx = 0, offy = 0;
unsigned int pipe_done = 0; //count pipe iteration for debugging
@@ -3748,6 +3748,41 @@ shader_array_flush(Evas_Engine_GL_Context *gc)
gc->havestuff = EINA_FALSE;
}
+typedef struct
+{
+ Evas_Engine_GL_Context *gc;
+} Evas_Thread_Command_shader_array_flush;
+
+static void
+_gl_thread_shader_array_flush(void *data)
+{
+ Evas_Thread_Command_shader_array_flush *thread_param =
+ (Evas_Thread_Command_shader_array_flush *)data;
+ evas_gl_thread_begin();
+ _orig_shader_array_flush(thread_param->gc);
+ evas_gl_thread_end();
+}
+
+static void
+shader_array_flush(Evas_Engine_GL_Context *gc)
+{
+ if (!evas_gl_thread_enabled())
+ {
+ _orig_shader_array_flush(gc);
+ return;
+ }
+
+ Evas_Thread_Command_shader_array_flush thread_param_local;
+ Evas_Thread_Command_shader_array_flush *thread_param = &thread_param_local;
+ thread_param->gc = gc;
+
+ evas_gl_thread_cmd_enqueue(EVAS_GL_THREAD_TYPE_GL,
+ _gl_thread_shader_array_flush,
+ thread_param,
+ EVAS_GL_THREAD_MODE_FINISH);
+
+}
+
EAPI int
evas_gl_common_buffer_dump(Evas_Engine_GL_Context *gc, const char* dname, const char* buf_name, int frame, const char *suffix)
{