jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=c70ba9e13bd8dcdb892f666fbeb354e84b13eb31
commit c70ba9e13bd8dcdb892f666fbeb354e84b13eb31 Author: Jean-Philippe Andre <jp.an...@samsung.com> Date: Fri Nov 6 17:06:17 2015 +0900 Evas GL: Save all binary shaders during idle_flush --- .../evas/engines/gl_common/evas_gl_common.h | 4 ++- .../evas/engines/gl_common/evas_gl_shader.c | 37 ++++++++++++++++++---- 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 342189a..307aa6a 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 02c1a3f..08f04d4 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_shader.c +++ b/src/modules/evas/engines/gl_common/evas_gl_shader.c @@ -515,6 +515,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); } @@ -584,23 +585,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 9723e1f..75a3892 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 --