int foc, z0, px, py;
int ax, ay;
GLfloat proj[16];
+
+ Eina_Bool needs_shaders_flush : 1;
};
typedef enum _Shader_Sampling Shader_Sampling;
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,
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);
}
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