summaryrefslogtreecommitdiff
path: root/src/modules/evas/engines/gl_common/evas_gl_shader.c
diff options
context:
space:
mode:
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.c47
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);