summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2015-11-06 17:06:17 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2015-11-06 17:16:28 +0900
commit1786d5bf4165fa6c2f4ea049b73fd0c6a93064e8 (patch)
tree943d13c04cc92a66eae8c17d4d7e8f54ce7d3fd1
parentf36309f39fa5d9218f5fd6f4e1200cf90956088f (diff)
downloadefl-1786d5bf4165fa6c2f4ea049b73fd0c6a93064e8.tar.gz
Evas GL: Save all binary shaders during idle_flush
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_common.h4
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_shader.c37
-rw-r--r--src/modules/evas/engines/gl_x11/evas_engine.c4
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