diff options
author | Jean-Philippe Andre <jp.andre@samsung.com> | 2015-11-06 17:06:17 +0900 |
---|---|---|
committer | Jean-Philippe Andre <jp.andre@samsung.com> | 2015-11-06 17:16:28 +0900 |
commit | 1786d5bf4165fa6c2f4ea049b73fd0c6a93064e8 (patch) | |
tree | 943d13c04cc92a66eae8c17d4d7e8f54ce7d3fd1 | |
parent | f36309f39fa5d9218f5fd6f4e1200cf90956088f (diff) | |
download | efl-1786d5bf4165fa6c2f4ea049b73fd0c6a93064e8.tar.gz |
Evas GL: Save all binary shaders during idle_flush
-rw-r--r-- | src/modules/evas/engines/gl_common/evas_gl_common.h | 4 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_common/evas_gl_shader.c | 37 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_x11/evas_engine.c | 4 |
3 files changed, 35 insertions, 10 deletions
diff --git a/src/modules/evas/engines/gl_common/evas_gl_common.h b/src/modules/evas/engines/gl_common/evas_gl_common.h index 342189a952..307aa6af6e 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_common.h +++ b/src/modules/evas/engines/gl_common/evas_gl_common.h @@ -198,6 +198,8 @@ struct _Evas_GL_Shared int foc, z0, px, py; int ax, ay; GLfloat proj[16]; + + Eina_Bool needs_shaders_flush : 1; }; typedef enum _Shader_Sampling Shader_Sampling; @@ -594,7 +596,7 @@ void evas_gl_common_context_image_map_push(Evas_Engine_GL_Context *g int evas_gl_common_shader_program_init(Evas_GL_Shared *shared); void evas_gl_common_shader_program_shutdown(Evas_GL_Shared *shared); -EAPI void evas_gl_common_shaders_flush(void); +EAPI void evas_gl_common_shaders_flush(Evas_GL_Shared *shared); Evas_GL_Program *evas_gl_common_shader_program_get(Evas_Engine_GL_Context *gc, Shader_Type type, diff --git a/src/modules/evas/engines/gl_common/evas_gl_shader.c b/src/modules/evas/engines/gl_common/evas_gl_shader.c index 5eb8364ab4..df8cee8e2d 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_shader.c +++ b/src/modules/evas/engines/gl_common/evas_gl_shader.c @@ -526,6 +526,7 @@ evas_gl_common_shader_generate_and_compile(Evas_GL_Shared *shared, unsigned int p = evas_gl_common_shader_compile(flags, vertex, fragment); if (p) { + shared->needs_shaders_flush = 1; evas_gl_common_shader_textures_bind(p); eina_hash_add(shared->shaders_hash, &flags, p); } @@ -595,23 +596,45 @@ evas_gl_common_shader_program_init(Evas_GL_Shared *shared) p = eina_hash_find(shared->shaders_hash, &autoload[i]); if (p) p->delete_me = 0; } - evas_gl_common_shaders_flush(); + evas_gl_common_shaders_flush(shared); } return 1; } EAPI void -evas_gl_common_shaders_flush(void) +evas_gl_common_shaders_flush(Evas_GL_Shared *shared) { - if (compiler_released) return; - compiler_released = EINA_TRUE; + + if (!shared) return; + if (!compiler_released) + { + compiler_released = EINA_TRUE; #ifdef GL_GLES - glReleaseShaderCompiler(); + glReleaseShaderCompiler(); #else - if (glsym_glReleaseShaderCompiler) - glsym_glReleaseShaderCompiler(); + if (glsym_glReleaseShaderCompiler) + glsym_glReleaseShaderCompiler(); #endif + } + if (shared->needs_shaders_flush) + { + Eina_List *to_delete = NULL; + Eina_Iterator *it; + Evas_GL_Program *p; + + _evas_gl_common_shader_binary_save(shared); + + it = eina_hash_iterator_data_new(shared->shaders_hash); + EINA_ITERATOR_FOREACH(it, p) + { + if (p->delete_me) + to_delete = eina_list_append(to_delete, p); + } + + EINA_LIST_FREE(to_delete, p) + eina_hash_del(shared->shaders_hash, &p->flags, p); + } } void diff --git a/src/modules/evas/engines/gl_x11/evas_engine.c b/src/modules/evas/engines/gl_x11/evas_engine.c index 9723e1fc38..75a389205d 100644 --- a/src/modules/evas/engines/gl_x11/evas_engine.c +++ b/src/modules/evas/engines/gl_x11/evas_engine.c @@ -1485,10 +1485,10 @@ eng_info_free(Evas *eo_e EINA_UNUSED, void *info) } static void -eng_outbuf_idle_flush(Outbuf *ob EINA_UNUSED) +eng_outbuf_idle_flush(Outbuf *ob) { if (glsym_evas_gl_common_shaders_flush) - glsym_evas_gl_common_shaders_flush(); + glsym_evas_gl_common_shaders_flush(ob->gl_context->shared); } static void |