diff options
Diffstat (limited to 'src/modules/evas/engines/gl_common/evas_gl_shader.c')
-rw-r--r-- | src/modules/evas/engines/gl_common/evas_gl_shader.c | 47 |
1 files changed, 32 insertions, 15 deletions
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 5702ce49c3..489ea3d8c5 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_shader.c +++ b/src/modules/evas/engines/gl_common/evas_gl_shader.c @@ -9,13 +9,13 @@ #define SHADER_EET_CHECKSUM "/shader/checksum" #define SHADER_EET_CACHENAME "binary_shader" -#define P(i) ((void*)(intptr_t)i) -#define I(p) ((int)(intptr_t)p) +#define P(i) ((void*)(intptr_t)(i)) +#define I(p) ((int)(intptr_t)(p)) #ifdef WORDS_BIGENDIAN -# define BASEFLAG SHADER_FLAG_BIGENDIAN +# define BASEFLAG SHADER_FLAG_DITHER | SHADER_FLAG_BIGENDIAN #else -# define BASEFLAG 0 +# define BASEFLAG SHADER_FLAG_DITHER #endif typedef enum { @@ -47,8 +47,9 @@ typedef enum { SHADER_FLAG_FILTER_ALPHA_ONLY = (1 << 25), SHADER_FLAG_FILTER_GRAYSCALE = (1 << 26), SHADER_FLAG_FILTER_INVERSE_COLOR = (1 << 27), + SHADER_FLAG_DITHER = (1 << 28), } Shader_Flag; -#define SHADER_FLAG_COUNT 28 +#define SHADER_FLAG_COUNT 29 static const char *_shader_flags[SHADER_FLAG_COUNT] = { "TEX", @@ -79,6 +80,7 @@ static const char *_shader_flags[SHADER_FLAG_COUNT] = { "ALPHA_ONLY", "FILTER_GRAYSCALE", "FILTER_INVERSE_COLOR", + "DITHER", }; static Eina_Bool compiler_released = EINA_FALSE; @@ -325,10 +327,9 @@ _evas_gl_common_shader_binary_save(Evas_GL_Shared *shared) char tmp_file_name[PATH_MAX + PATH_MAX + 128]; int tmpfd = -1, copy; Eina_Tmpstr *tmp_file_path = NULL; - Eet_File *ef = NULL; + Eet_File *ef = NULL, *ef0 = NULL; Evas_GL_Program *p; Eina_Iterator *it; - char pname[32]; /* use eet */ if (!eet_init()) return 0; @@ -360,24 +361,40 @@ _evas_gl_common_shader_binary_save(Evas_GL_Shared *shared) } save: - ef = eet_open(tmp_file_path, copy ? EET_FILE_MODE_READ_WRITE : EET_FILE_MODE_WRITE); + ef = eet_open(tmp_file_path, EET_FILE_MODE_WRITE); if (!ef) goto error; + if (copy) ef0 = shared->shaders_cache; + if (!_evas_gl_common_shader_binary_checksum_write(shared, ef)) goto error; + if (ef0) + { + char **keys; + int keys_num = 0, i; + + keys = eet_list(ef0, "/shader/*", &keys_num); + if (keys) + { + for (i = 0; i < keys_num; i++) + { + int len = 0; + void *data = eet_read(ef0, keys[i], &len); + if ((data) && (len > 0)) + eet_write(ef, keys[i], data, len, SHADER_BINARY_EET_COMPRESS); + free(data); + } + free(keys); + } + } it = eina_hash_iterator_data_new(shared->shaders_hash); EINA_ITERATOR_FOREACH(it, p) { if (!p->bin_saved) { - int len = 0; - sprintf(pname, SHADER_PROG_NAME_FMT, p->flags); - eet_read_direct(ef, pname, &len); - if (len > 0) - p->bin_saved = 1; // assume bin data is correct - else - _evas_gl_common_shader_program_binary_save(p, ef); + if (_evas_gl_common_shader_program_binary_save(p, ef)) + p->bin_saved = 1; } } eina_iterator_free(it); |