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

-- 


Reply via email to