Evas GL: Save all binary shaders during idle_flush
authorJean-Philippe Andre <jp.andre@samsung.com>
Fri, 6 Nov 2015 08:06:17 +0000 (17:06 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Tue, 10 Nov 2015 07:12:21 +0000 (16:12 +0900)
src/modules/evas/engines/gl_common/evas_gl_common.h
src/modules/evas/engines/gl_common/evas_gl_shader.c
src/modules/evas/engines/gl_x11/evas_engine.c

index 342189a..307aa6a 100644 (file)
@@ -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,
index 02c1a3f..08f04d4 100644 (file)
@@ -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
index 9723e1f..75a3892 100644 (file)
@@ -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