1 #include "evas_gl_private.h"
3 /////////////////////////////////////////////
4 #if defined (GLES_VARIETY_S3C6410)
5 const unsigned int rect_frag_bin[] =
7 # include "shader/rect_frag_bin_s3c6410.h"
11 const char rect_frag_glsl[] =
12 #include "shader/rect_frag.h"
14 Evas_GL_Program_Source shader_rect_frag_src =
17 #if defined (GLES_VARIETY_S3C6410)
18 rect_frag_bin, sizeof(rect_frag_bin)
24 #if defined (GLES_VARIETY_S3C6410)
25 const unsigned int rect_vert_bin[] =
27 # include "shader/rect_vert_bin_s3c6410.h"
30 const char rect_vert_glsl[] =
31 #include "shader/rect_vert.h"
33 Evas_GL_Program_Source shader_rect_vert_src =
36 #if defined (GLES_VARIETY_S3C6410)
37 rect_vert_bin, sizeof(rect_vert_bin)
43 /////////////////////////////////////////////
44 #if defined (GLES_VARIETY_S3C6410)
45 const unsigned int font_frag_bin[] =
47 # include "shader/font_frag_bin_s3c6410.h"
51 const char font_frag_glsl[] =
52 #include "shader/font_frag.h"
54 Evas_GL_Program_Source shader_font_frag_src =
57 #if defined (GLES_VARIETY_S3C6410)
58 font_frag_bin, sizeof(font_frag_bin)
64 #if defined (GLES_VARIETY_S3C6410)
65 const unsigned int font_vert_bin[] =
67 # include "shader/font_vert_bin_s3c6410.h"
70 const char font_vert_glsl[] =
71 #include "shader/font_vert.h"
73 Evas_GL_Program_Source shader_font_vert_src =
76 #if defined (GLES_VARIETY_S3C6410)
77 font_vert_bin, sizeof(font_vert_bin)
83 /////////////////////////////////////////////
84 #if defined (GLES_VARIETY_S3C6410)
85 const unsigned int yuv_frag_bin[] =
87 # include "shader/yuv_frag_bin_s3c6410.h"
91 const char yuv_frag_glsl[] =
92 #include "shader/yuv_frag.h"
94 Evas_GL_Program_Source shader_yuv_frag_src =
97 #if defined (GLES_VARIETY_S3C6410)
98 yuv_frag_bin, sizeof(yuv_frag_bin)
104 #if defined (GLES_VARIETY_S3C6410)
105 const unsigned int yuv_vert_bin[] =
107 # include "shader/yuv_vert_bin_s3c6410.h"
110 const char yuv_vert_glsl[] =
111 #include "shader/yuv_vert.h"
113 Evas_GL_Program_Source shader_yuv_vert_src =
116 #if defined (GLES_VARIETY_S3C6410)
117 yuv_vert_bin, sizeof(yuv_vert_bin)
123 /////////////////////////////////////////////
124 #if defined (GLES_VARIETY_S3C6410)
125 const unsigned int yuy2_frag_bin[] =
127 # include "shader/yuy2_frag_bin_s3c6410.h"
131 const char yuy2_frag_glsl[] =
132 #include "shader/yuy2_frag.h"
134 Evas_GL_Program_Source shader_yuy2_frag_src =
137 #if defined (GLES_VARIETY_S3C6410)
138 yuy2_frag_bin, sizeof(yuy2_frag_bin)
144 #if defined (GLES_VARIETY_S3C6410)
145 const unsigned int yuy2_vert_bin[] =
147 # include "shader/yuy2_vert_bin_s3c6410.h"
150 const char yuy2_vert_glsl[] =
151 #include "shader/yuy2_vert.h"
153 Evas_GL_Program_Source shader_yuy2_vert_src =
156 #if defined (GLES_VARIETY_S3C6410)
157 yuy2_vert_bin, sizeof(yuy2_vert_bin)
163 /////////////////////////////////////////////
164 #if defined (GLES_VARIETY_S3C6410)
165 const unsigned int yuy2_nomul_frag_bin[] =
167 # include "shader/yuy2_nomul_frag_bin_s3c6410.h"
171 const char yuy2_nomul_frag_glsl[] =
172 #include "shader/yuy2_nomul_frag.h"
174 Evas_GL_Program_Source shader_yuy2_nomul_frag_src =
176 yuy2_nomul_frag_glsl,
177 #if defined (GLES_VARIETY_S3C6410)
178 yuy2_nomul_frag_bin, sizeof(yuy2_nomul_frag_bin)
184 #if defined (GLES_VARIETY_S3C6410)
185 const unsigned int yuy2_nomul_vert_bin[] =
187 # include "shader/yuy2_nomul_vert_bin_s3c6410.h"
190 const char yuy2_nomul_vert_glsl[] =
191 #include "shader/yuy2_nomul_vert.h"
193 Evas_GL_Program_Source shader_yuy2_nomul_vert_src =
195 yuy2_nomul_vert_glsl,
196 #if defined (GLES_VARIETY_S3C6410)
197 yuy2_nomul_vert_bin, sizeof(yuy2_nomul_vert_bin)
203 /////////////////////////////////////////////
204 #if defined (GLES_VARIETY_S3C6410)
205 const unsigned int nv12_nomul_vert_bin[] =
207 # include "shader/nv12_nomul_vert_bin_s3c6410.h"
210 const char nv12_nomul_vert_glsl[] =
211 #include "shader/nv12_nomul_vert.h"
213 Evas_GL_Program_Source shader_nv12_nomul_vert_src =
215 nv12_nomul_vert_glsl,
216 #if defined (GLES_VARIETY_S3C6410)
217 nv12_nomul_vert_bin, sizeof(nv12_nomul_vert_bin)
223 #if defined (GLES_VARIETY_S3C6410)
224 const unsigned int nv12_vert_bin[] =
226 # include "shader/nv12_vert_bin_s3c6410.h"
229 const char nv12_vert_glsl[] =
230 #include "shader/nv12_vert.h"
232 Evas_GL_Program_Source shader_nv12_vert_src =
235 #if defined (GLES_VARIETY_S3C6410)
236 nv12_vert_bin, sizeof(nv12_vert_bin)
242 #if defined (GLES_VARIETY_S3C6410)
243 const unsigned int nv12_nomul_frag_bin[] =
245 # include "shader/nv12_nomul_frag_bin_s3c6410.h"
249 const char nv12_frag_glsl[] =
250 #include "shader/nv12_frag.h"
252 Evas_GL_Program_Source shader_nv12_frag_src =
255 #if defined (GLES_VARIETY_S3C6410)
256 nv12_frag_bin, sizeof(nv12_frag_bin)
262 #if defined (GLES_VARIETY_S3C6410)
263 const unsigned int nv12_nomul_frag_bin[] =
265 # include "shader/nv12_nomul_frag_bin_s3c6410.h"
269 const char nv12_nomul_frag_glsl[] =
270 #include "shader/nv12_nomul_frag.h"
272 Evas_GL_Program_Source shader_nv12_nomul_frag_src =
274 nv12_nomul_frag_glsl,
275 #if defined (GLES_VARIETY_S3C6410)
276 nv12_nomul_frag_bin, sizeof(nv12_nomul_frag_bin)
282 /////////////////////////////////////////////
283 #if defined (GLES_VARIETY_S3C6410)
284 const unsigned int yuv_nomul_frag_bin[] =
286 # include "shader/yuv_nomul_frag_bin_s3c6410.h"
290 const char yuv_nomul_frag_glsl[] =
291 #include "shader/yuv_nomul_frag.h"
293 Evas_GL_Program_Source shader_yuv_nomul_frag_src =
296 #if defined (GLES_VARIETY_S3C6410)
297 yuv_nomul_frag_bin, sizeof(yuv_nomul_frag_bin)
303 #if defined (GLES_VARIETY_S3C6410)
304 const unsigned int yuv_nomul_vert_bin[] =
306 # include "shader/yuv_nomul_vert_bin_s3c6410.h"
309 const char yuv_nomul_vert_glsl[] =
310 #include "shader/yuv_nomul_vert.h"
312 Evas_GL_Program_Source shader_yuv_nomul_vert_src =
315 #if defined (GLES_VARIETY_S3C6410)
316 yuv_nomul_vert_bin, sizeof(yuv_nomul_vert_bin)
322 /////////////////////////////////////////////
323 #if defined (GLES_VARIETY_S3C6410)
324 const unsigned int tex_frag_bin[] =
326 # include "shader/tex_frag_bin_s3c6410.h"
330 const char tex_frag_glsl[] =
331 #include "shader/tex_frag.h"
333 Evas_GL_Program_Source shader_tex_frag_src =
336 #if defined (GLES_VARIETY_S3C6410)
337 tex_frag_bin, sizeof(tex_frag_bin)
343 #if defined (GLES_VARIETY_S3C6410)
344 const unsigned int tex_vert_bin[] =
346 # include "shader/tex_vert_bin_s3c6410.h"
349 const char tex_vert_glsl[] =
350 #include "shader/tex_vert.h"
352 Evas_GL_Program_Source shader_tex_vert_src =
355 #if defined (GLES_VARIETY_S3C6410)
356 tex_vert_bin, sizeof(tex_vert_bin)
362 /////////////////////////////////////////////
363 #if defined (GLES_VARIETY_S3C6410)
364 const unsigned int tex_nomul_frag_bin[] =
366 # include "shader/tex_nomul_frag_bin_s3c6410.h"
370 const char tex_nomul_frag_glsl[] =
371 #include "shader/tex_nomul_frag.h"
373 Evas_GL_Program_Source shader_tex_nomul_frag_src =
376 #if defined (GLES_VARIETY_S3C6410)
377 tex_nomul_frag_bin, sizeof(tex_nomul_frag_bin)
383 #if defined (GLES_VARIETY_S3C6410)
384 const unsigned int tex_nomul_vert_bin[] =
386 # include "shader/tex_nomul_vert_bin_s3c6410.h"
389 const char tex_nomul_vert_glsl[] =
390 #include "shader/tex_nomul_vert.h"
392 Evas_GL_Program_Source shader_tex_nomul_vert_src =
395 #if defined (GLES_VARIETY_S3C6410)
396 tex_nomul_vert_bin, sizeof(tex_nomul_vert_bin)
402 /////////////////////////////////////////////
403 #if defined (GLES_VARIETY_S3C6410)
404 const unsigned int img_frag_bin[] =
406 # include "shader/img_frag_bin_s3c6410.h"
410 const char img_frag_glsl[] =
411 #include "shader/img_frag.h"
413 Evas_GL_Program_Source shader_img_frag_src =
416 #if defined (GLES_VARIETY_S3C6410)
417 img_frag_bin, sizeof(img_frag_bin)
423 #if defined (GLES_VARIETY_S3C6410)
424 const unsigned int img_vert_bin[] =
426 # include "shader/img_vert_bin_s3c6410.h"
429 const char img_vert_glsl[] =
430 #include "shader/img_vert.h"
432 Evas_GL_Program_Source shader_img_vert_src =
435 #if defined (GLES_VARIETY_S3C6410)
436 img_vert_bin, sizeof(img_vert_bin)
442 /////////////////////////////////////////////
443 #if defined (GLES_VARIETY_S3C6410)
444 const unsigned int img_nomul_frag_bin[] =
446 # include "shader/img_nomul_frag_bin_s3c6410.h"
450 const char img_nomul_frag_glsl[] =
451 #include "shader/img_nomul_frag.h"
453 Evas_GL_Program_Source shader_img_nomul_frag_src =
456 #if defined (GLES_VARIETY_S3C6410)
457 img_nomul_frag_bin, sizeof(img_nomul_frag_bin)
463 #if defined (GLES_VARIETY_S3C6410)
464 const unsigned int img_nomul_vert_bin[] =
466 # include "shader/img_nomul_vert_bin_s3c6410.h"
469 const char img_nomul_vert_glsl[] =
470 #include "shader/img_nomul_vert.h"
472 Evas_GL_Program_Source shader_img_nomul_vert_src =
475 #if defined (GLES_VARIETY_S3C6410)
476 img_nomul_vert_bin, sizeof(img_nomul_vert_bin)
482 /////////////////////////////////////////////
483 #if defined (GLES_VARIETY_S3C6410)
484 const unsigned int img_bgra_frag_bin[] =
486 # include "shader/img_bgra_frag_bin_s3c6410.h"
490 const char img_bgra_frag_glsl[] =
491 #include "shader/img_bgra_frag.h"
493 Evas_GL_Program_Source shader_img_bgra_frag_src =
496 #if defined (GLES_VARIETY_S3C6410)
497 img_bgra_frag_bin, sizeof(img_bgra_frag_bin)
503 #if defined (GLES_VARIETY_S3C6410)
504 const unsigned int img_bgra_vert_bin[] =
506 # include "shader/img_bgra_vert_bin_s3c6410.h"
509 const char img_bgra_vert_glsl[] =
510 #include "shader/img_bgra_vert.h"
512 Evas_GL_Program_Source shader_img_bgra_vert_src =
515 #if defined (GLES_VARIETY_S3C6410)
516 img_bgra_vert_bin, sizeof(img_bgra_vert_bin)
523 /////////////////////////////////////////////
524 #if defined (GLES_VARIETY_S3C6410)
525 const unsigned int img_mask_frag_bin[] =
527 # include "shader/img_mask_frag_bin_s3c6410.h"
531 const char img_mask_frag_glsl[] =
532 #include "shader/img_mask_frag.h"
534 Evas_GL_Program_Source shader_img_mask_frag_src =
537 #if defined (GLES_VARIETY_S3C6410)
538 img_mask_frag_bin, sizeof(img_mask_frag_bin)
544 #if defined (GLES_VARIETY_S3C6410)
545 const unsigned int img_mask_vert_bin[] =
547 # include "shader/img_mask_vert_bin_s3c6410.h"
550 const char img_mask_vert_glsl[] =
551 #include "shader/img_mask_vert.h"
553 Evas_GL_Program_Source shader_img_mask_vert_src =
556 #if defined (GLES_VARIETY_S3C6410)
557 img_mask_vert_bin, sizeof(img_mask_vert_bin)
564 /////////////////////////////////////////////
565 #if defined (GLES_VARIETY_S3C6410)
566 const unsigned int img_bgra_nomul_frag_bin[] =
568 # include "shader/img_bgra_nomul_frag_bin_s3c6410.h"
572 const char img_bgra_nomul_frag_glsl[] =
573 #include "shader/img_bgra_nomul_frag.h"
575 Evas_GL_Program_Source shader_img_bgra_nomul_frag_src =
577 img_bgra_nomul_frag_glsl,
578 #if defined (GLES_VARIETY_S3C6410)
579 img_bgra_nomul_frag_bin, sizeof(img_bgra_nomul_frag_bin)
585 #if defined (GLES_VARIETY_S3C6410)
586 const unsigned int img_bgra_nomul_vert_bin[] =
588 # include "shader/img_bgra_nomul_vert_bin_s3c6410.h"
591 const char img_bgra_nomul_vert_glsl[] =
592 #include "shader/img_bgra_nomul_vert.h"
594 Evas_GL_Program_Source shader_img_bgra_nomul_vert_src =
596 img_bgra_nomul_vert_glsl,
597 #if defined (GLES_VARIETY_S3C6410)
598 img_bgra_nomul_vert_bin, sizeof(img_bgra_nomul_vert_bin)
604 /////////////////////////////////////////////
605 const char filter_invert_frag_glsl[] =
606 #include "shader/filter_invert.h"
608 Evas_GL_Program_Source shader_filter_invert_frag_src =
610 filter_invert_frag_glsl,
614 const char filter_invert_nomul_frag_glsl[] =
615 #include "shader/filter_invert_nomul.h"
617 Evas_GL_Program_Source shader_filter_invert_nomul_frag_src =
619 filter_invert_nomul_frag_glsl,
623 const char filter_invert_bgra_frag_glsl[] =
624 #include "shader/filter_invert_bgra.h"
626 Evas_GL_Program_Source shader_filter_invert_bgra_frag_src =
628 filter_invert_bgra_frag_glsl,
631 const char filter_invert_bgra_nomul_frag_glsl[] =
632 #include "shader/filter_invert_bgra_nomul.h"
634 Evas_GL_Program_Source shader_filter_invert_bgra_nomul_frag_src =
636 filter_invert_bgra_nomul_frag_glsl,
640 /////////////////////////////////////////////
641 const char filter_greyscale_frag_glsl[] =
642 #include "shader/filter_greyscale.h"
644 Evas_GL_Program_Source shader_filter_greyscale_frag_src =
646 filter_greyscale_frag_glsl,
650 const char filter_greyscale_nomul_frag_glsl[] =
651 #include "shader/filter_greyscale_nomul.h"
653 Evas_GL_Program_Source shader_filter_greyscale_nomul_frag_src =
655 filter_greyscale_nomul_frag_glsl,
659 const char filter_greyscale_bgra_frag_glsl[] =
660 #include "shader/filter_greyscale_bgra.h"
662 Evas_GL_Program_Source shader_filter_greyscale_bgra_frag_src =
664 filter_greyscale_bgra_frag_glsl,
667 const char filter_greyscale_bgra_nomul_frag_glsl[] =
668 #include "shader/filter_greyscale_bgra_nomul.h"
670 Evas_GL_Program_Source shader_filter_greyscale_bgra_nomul_frag_src =
672 filter_greyscale_bgra_nomul_frag_glsl,
676 /////////////////////////////////////////////
677 const char filter_sepia_frag_glsl[] =
678 #include "shader/filter_sepia.h"
680 Evas_GL_Program_Source shader_filter_sepia_frag_src =
682 filter_sepia_frag_glsl,
686 const char filter_sepia_nomul_frag_glsl[] =
687 #include "shader/filter_sepia_nomul.h"
689 Evas_GL_Program_Source shader_filter_sepia_nomul_frag_src =
691 filter_sepia_nomul_frag_glsl,
695 const char filter_sepia_bgra_frag_glsl[] =
696 #include "shader/filter_sepia_bgra.h"
698 Evas_GL_Program_Source shader_filter_sepia_bgra_frag_src =
700 filter_sepia_bgra_frag_glsl,
703 const char filter_sepia_bgra_nomul_frag_glsl[] =
704 #include "shader/filter_sepia_bgra_nomul.h"
706 Evas_GL_Program_Source shader_filter_sepia_bgra_nomul_frag_src =
708 filter_sepia_bgra_nomul_frag_glsl,
712 /////////////////////////////////////////////
714 Blur is a work in progress currently.
715 Mostly because GPUs are so hopeless.
716 const char filter_blur_vert_glsl[] =
717 #include "shader/filter_blur_vert.h"
720 Evas_GL_Program_Source shader_filter_blur_vert_src =
722 filter_blur_vert_glsl,
726 const char filter_blur_frag_glsl[] =
727 #include "shader/filter_blur.h"
729 Evas_GL_Program_Source shader_filter_blur_frag_src =
731 filter_blur_frag_glsl,
735 const char filter_blur_nomul_frag_glsl[] =
736 #include "shader/filter_blur_nomul.h"
738 Evas_GL_Program_Source shader_filter_blur_nomul_frag_src =
740 filter_blur_nomul_frag_glsl,
744 const char filter_blur_bgra_frag_glsl[] =
745 #include "shader/filter_blur_bgra.h"
747 Evas_GL_Program_Source shader_filter_blur_bgra_frag_src =
749 filter_blur_bgra_frag_glsl,
752 const char filter_blur_bgra_nomul_frag_glsl[] =
753 #include "shader/filter_blur_bgra_nomul.h"
755 Evas_GL_Program_Source shader_filter_blur_bgra_nomul_frag_src =
757 filter_blur_bgra_nomul_frag_glsl,
765 /////////////////////////////////////////////
767 gl_compile_link_error(GLuint target, const char *action)
769 int loglen = 0, chars = 0;
772 /* Shader info log */
773 glGetShaderiv(target, GL_INFO_LOG_LENGTH, &loglen);
776 logtxt = calloc(loglen, sizeof(char));
779 glGetShaderInfoLog(target, loglen, &chars, logtxt);
780 ERR("Failed to %s: %s", action, logtxt);
785 /* Program info log */
786 glGetProgramiv(target, GL_INFO_LOG_LENGTH, &loglen);
789 logtxt = calloc(loglen, sizeof(char));
792 glGetProgramInfoLog(target, loglen, &chars, logtxt);
793 ERR("Failed to %s: %s", action, logtxt);
799 static mode_t default_mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
802 _evas_gl_shader_file_is_dir(const char *file)
806 if (stat(file, &st) < 0) return EINA_FALSE;
807 if (S_ISDIR(st.st_mode)) return EINA_TRUE;
812 _evas_gl_shader_file_mkdir(const char *dir)
814 /* evas gl shader only call this function when the dir is not exist */
815 if (mkdir(dir, default_mode) < 0) return EINA_FALSE;
820 _evas_gl_shader_file_exists(const char *file)
823 if (!file) return EINA_FALSE;
824 if (stat(file, &st) < 0) return EINA_FALSE;
828 static inline Eina_Bool
829 _evas_gl_shader_file_mkpath_if_not_exists(const char *path)
833 if (stat(path, &st) < 0)
834 return _evas_gl_shader_file_mkdir(path);
835 else if (!S_ISDIR(st.st_mode))
842 _evas_gl_shader_file_mkpath(const char *path)
847 if (_evas_gl_shader_file_is_dir(path)) return EINA_TRUE;
849 for (i = 0; path[i]; ss[i] = path[i], i++)
851 if (i == sizeof(ss) - 1) return EINA_FALSE;
852 if ((path[i] == '/') && (i > 0))
855 if (!_evas_gl_shader_file_mkpath_if_not_exists(ss))
860 return _evas_gl_shader_file_mkpath_if_not_exists(ss);
864 _evas_gl_shader_dir_check(char *bin_shader_dir, int num)
867 char *subdir = ".cache/evas_gl_common_shaders";
869 home = getenv("HOME");
870 if ((!home) || (!home[0])) return 0;
872 snprintf(bin_shader_dir, num, "%s/%s", home, subdir);
873 return _evas_gl_shader_file_exists(bin_shader_dir);
877 _evas_gl_shader_file_check(const char *bin_shader_dir, char *bin_shader_file, int dir_num)
879 char before_name[PATH_MAX];
880 char after_name[PATH_MAX];
881 int new_path_len = 0;
886 char *version = NULL;
888 vendor = (char *)glGetString(GL_VENDOR);
889 driver = (char *)glGetString(GL_RENDERER);
890 version = (char *)glGetString(GL_VERSION);
892 new_path_len = snprintf(before_name, sizeof(before_name), "%s::%s::%s::%s::binary_shader.eet", vendor, version, driver, MODULE_ARCH);
894 /* remove '/' from file name */
895 for (i = 0; i < new_path_len; i++)
897 if (before_name[i] != '/')
899 after_name[j] = before_name[i];
905 snprintf(bin_shader_file, dir_num, "%s/%s", bin_shader_dir, after_name);
907 return _evas_gl_shader_file_exists(bin_shader_file);
911 _evas_gl_common_shader_program_binary_init(Evas_GL_Program *p,
915 int res = 0, num = 0, length = 0;
922 data = eet_read(ef, pname, &length);
923 if ((!data) || (length <= 0)) goto finish;
925 glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &num);
926 if (num <= 0) goto finish;
928 formats = calloc(num, sizeof(int));
929 if (!formats) goto finish;
931 glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, formats);
932 if (!formats[0]) goto finish;
934 p->prog = glCreateProgram();
936 glsym_glProgramBinary(p->prog, formats[0], data, length);
938 glBindAttribLocation(p->prog, SHAD_VERTEX, "vertex");
939 glBindAttribLocation(p->prog, SHAD_COLOR, "color");
940 glBindAttribLocation(p->prog, SHAD_TEXUV, "tex_coord");
941 glBindAttribLocation(p->prog, SHAD_TEXUV2, "tex_coord2");
942 glBindAttribLocation(p->prog, SHAD_TEXUV3, "tex_coord3");
943 glBindAttribLocation(p->prog, SHAD_TEXM, "tex_coordm");
945 glGetProgramiv(p->prog, GL_LINK_STATUS, &ok);
946 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
949 gl_compile_link_error(p->prog, "load a program object");
950 ERR("Abort load of program (%s)", pname);
957 if (formats) free(formats);
958 if (data) free(data);
959 if ((!res) && (p->prog))
961 glDeleteProgram(p->prog);
968 _evas_gl_common_shader_program_binary_save(Evas_GL_Program *p,
974 int length = 0, size = 0;
976 if (!glsym_glGetProgramBinary) return 0;
978 glGetProgramiv(p->prog, GL_PROGRAM_BINARY_LENGTH, &length);
979 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
980 if (length <= 0) return 0;
982 data = malloc(length);
985 glsym_glGetProgramBinary(p->prog, length, &size, &format, data);
986 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
994 if (eet_write(ef, pname, data, length, 0) < 0)
996 if (data) free(data);
999 if (data) free(data);
1004 _evas_gl_common_shader_program_source_init(Evas_GL_Program *p,
1005 Evas_GL_Program_Source *vert,
1006 Evas_GL_Program_Source *frag,
1011 p->vert = glCreateShader(GL_VERTEX_SHADER);
1012 p->frag = glCreateShader(GL_FRAGMENT_SHADER);
1013 #if defined (GLES_VARIETY_S3C6410)
1014 glShaderBinary(1, &(p->vert), 0, vert->bin, vert->bin_size);
1015 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1016 glShaderBinary(1, &(p->frag), 0, frag->bin, frag->bin_size);
1017 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1019 glShaderSource(p->vert, 1,
1020 (const char **)&(vert->src), NULL);
1021 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1022 glCompileShader(p->vert);
1023 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1025 glGetShaderiv(p->vert, GL_COMPILE_STATUS, &ok);
1026 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1029 gl_compile_link_error(p->vert, "compile vertex shader");
1030 ERR("Abort compile of shader vert (%s): %s", name, vert->src);
1033 glShaderSource(p->frag, 1,
1034 (const char **)&(frag->src), NULL);
1035 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1036 glCompileShader(p->frag);
1037 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1039 glGetShaderiv(p->frag, GL_COMPILE_STATUS, &ok);
1040 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1043 gl_compile_link_error(p->frag, "compile fragment shader");
1044 ERR("Abort compile of shader frag (%s): %s", name, frag->src);
1048 p->prog = glCreateProgram();
1049 #if defined(GLES_VARIETY_S3C6410) || defined(GLES_VARIETY_SGX)
1051 if ((glsym_glGetProgramBinary) && (glsym_glProgramParameteri))
1052 glsym_glProgramParameteri(p->prog, GL_PROGRAM_BINARY_RETRIEVABLE_HINT,
1055 glAttachShader(p->prog, p->vert);
1056 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1057 glAttachShader(p->prog, p->frag);
1058 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1060 glBindAttribLocation(p->prog, SHAD_VERTEX, "vertex");
1061 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1062 glBindAttribLocation(p->prog, SHAD_COLOR, "color");
1063 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1064 glBindAttribLocation(p->prog, SHAD_TEXUV, "tex_coord");
1065 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1066 glBindAttribLocation(p->prog, SHAD_TEXUV2, "tex_coord2");
1067 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1068 glBindAttribLocation(p->prog, SHAD_TEXUV3, "tex_coord3");
1069 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1070 glBindAttribLocation(p->prog, SHAD_TEXM, "tex_coordm");
1071 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1073 glLinkProgram(p->prog);
1074 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1076 glGetProgramiv(p->prog, GL_LINK_STATUS, &ok);
1077 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1080 gl_compile_link_error(p->prog, "link fragment and vertex shaders");
1081 ERR("Abort compile of shader frag (%s): %s", name, frag->src);
1082 ERR("Abort compile of shader vert (%s): %s", name, vert->src);
1088 #define SHADER_SOURCE_LINE(Big, Small) \
1089 { SHADER_##Big, &(shader_##Small##_vert_src), &(shader_##Small##_frag_src), #Small }
1091 #define SHADER_SOURCE_FILTER_LINE(Big, Small) \
1092 { SHADER_##Big, &(shader_img_vert_src), &(shader_##Small##_frag_src), #Small }
1094 static const struct {
1096 Evas_GL_Program_Source *vert;
1097 Evas_GL_Program_Source *frag;
1099 } _shaders_source[] = {
1100 SHADER_SOURCE_LINE(RECT, rect),
1101 SHADER_SOURCE_LINE(FONT, font),
1102 SHADER_SOURCE_LINE(IMG, img),
1103 SHADER_SOURCE_LINE(IMG_NOMUL, img_nomul),
1104 SHADER_SOURCE_LINE(IMG_BGRA, img_bgra),
1105 SHADER_SOURCE_LINE(IMG_BGRA_NOMUL, img_bgra_nomul),
1106 SHADER_SOURCE_LINE(IMG_MASK, img_mask),
1107 SHADER_SOURCE_LINE(YUV, yuv),
1108 SHADER_SOURCE_LINE(YUV_NOMUL, yuv_nomul),
1109 SHADER_SOURCE_LINE(YUY2, yuy2),
1110 SHADER_SOURCE_LINE(YUY2_NOMUL, yuy2_nomul),
1111 SHADER_SOURCE_LINE(NV12, nv12),
1112 SHADER_SOURCE_LINE(NV12_NOMUL, nv12_nomul),
1113 SHADER_SOURCE_LINE(TEX, tex),
1114 SHADER_SOURCE_LINE(TEX_NOMUL, tex_nomul),
1115 /* Most of the filters use the image fragment shader */
1116 SHADER_SOURCE_FILTER_LINE(FILTER_INVERT, filter_invert),
1117 SHADER_SOURCE_FILTER_LINE(FILTER_INVERT_NOMUL, filter_invert_nomul),
1118 SHADER_SOURCE_FILTER_LINE(FILTER_INVERT_BGRA, filter_invert_bgra),
1119 SHADER_SOURCE_FILTER_LINE(FILTER_INVERT_BGRA_NOMUL, filter_invert_bgra_nomul),
1120 SHADER_SOURCE_FILTER_LINE(FILTER_GREYSCALE, filter_greyscale),
1121 SHADER_SOURCE_FILTER_LINE(FILTER_GREYSCALE_NOMUL, filter_greyscale_nomul),
1122 SHADER_SOURCE_FILTER_LINE(FILTER_GREYSCALE_BGRA, filter_greyscale_bgra),
1123 SHADER_SOURCE_FILTER_LINE(FILTER_GREYSCALE_BGRA_NOMUL, filter_greyscale_bgra_nomul),
1124 SHADER_SOURCE_FILTER_LINE(FILTER_SEPIA, filter_sepia),
1125 SHADER_SOURCE_FILTER_LINE(FILTER_SEPIA_NOMUL, filter_sepia_nomul),
1126 SHADER_SOURCE_FILTER_LINE(FILTER_SEPIA_BGRA, filter_sepia_bgra),
1127 SHADER_SOURCE_FILTER_LINE(FILTER_SEPIA_BGRA_NOMUL, filter_sepia_bgra_nomul)/* , */
1128 /* SHADER_SOURCE_LINE(FILTER_BLUR, filter_blur), */
1129 /* SHADER_SOURCE_LINE(FILTER_BLUR_NOMUL, filter_blur_nomul), */
1130 /* SHADER_SOURCE_LINE(FILTER_BLUR_BGRA, filter_blur_bgra), */
1131 /* SHADER_SOURCE_LINE(FILTER_BLUR_BGRA_NOMUL, filter_blur_bgra_nomul) */
1135 _evas_gl_common_shader_source_init(Evas_GL_Shared *shared)
1139 for (i = 0; i < sizeof (_shaders_source) / sizeof (_shaders_source[0]); ++i)
1140 if (!_evas_gl_common_shader_program_source_init(&(shared->shader[_shaders_source[i].id]),
1141 _shaders_source[i].vert,
1142 _shaders_source[i].frag,
1143 _shaders_source[i].name))
1150 _evas_gl_common_shader_binary_init(Evas_GL_Shared *shared)
1153 Eet_File *et = NULL;
1154 char bin_dir_path[PATH_MAX];
1155 char bin_file_path[PATH_MAX];
1158 if (!_evas_gl_shader_dir_check(bin_dir_path, sizeof(bin_dir_path)))
1161 if (!_evas_gl_shader_file_check(bin_dir_path, bin_file_path,
1162 sizeof(bin_dir_path)))
1166 if (!eet_init()) return 0;
1167 et = eet_open(bin_file_path, EET_FILE_MODE_READ);
1168 if (!et) goto error;
1170 for (i = 0; i < sizeof (_shaders_source) / sizeof (_shaders_source[0]); ++i)
1171 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader[_shaders_source[i].id]),
1172 _shaders_source[i].name,
1176 if (et) eet_close(et);
1181 if (et) eet_close(et);
1187 _evas_gl_common_shader_binary_save(Evas_GL_Shared *shared)
1190 Eet_File *et = NULL; //check eet file
1193 char bin_dir_path[PATH_MAX];
1194 char bin_file_path[PATH_MAX];
1195 char tmp_file[PATH_MAX];
1198 if (!_evas_gl_shader_dir_check(bin_dir_path, sizeof(bin_dir_path)))
1199 res = _evas_gl_shader_file_mkpath(bin_dir_path);
1200 if (!res) return 0; /* we can't make directory */
1202 _evas_gl_shader_file_check(bin_dir_path, bin_file_path,
1203 sizeof(bin_dir_path));
1205 /* use mkstemp for writing */
1206 snprintf(tmp_file, sizeof(tmp_file), "%s.XXXXXX", bin_file_path);
1207 tmpfd = mkstemp(tmp_file);
1208 if (tmpfd < 0) goto error;
1212 if (!eet_init()) goto error;
1214 et = eet_open(tmp_file, EET_FILE_MODE_WRITE);
1215 if (!et) goto error;
1217 for (i = 0; i < sizeof (_shaders_source) / sizeof (_shaders_source[0]); ++i)
1218 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader[_shaders_source[i].id]),
1219 _shaders_source[i].name,
1223 if (eet_close(et) != EET_ERROR_NONE) goto error;
1224 if (rename(tmp_file,bin_file_path) < 0) goto error;
1229 if (et) eet_close(et);
1230 if (_evas_gl_shader_file_exists(tmp_file)) unlink(tmp_file);
1236 evas_gl_common_shader_program_init(Evas_GL_Shared *shared)
1238 // gl support binary shader and get env of binary shader path
1239 if (shared->info.bin_program &&
1240 _evas_gl_common_shader_binary_init(shared)) return 1;
1241 /* compile all shader.*/
1242 if (!_evas_gl_common_shader_source_init(shared)) return 0;
1243 /* success compile all shader. if gl support binary shader, we need to save */
1244 if (shared->info.bin_program) _evas_gl_common_shader_binary_save(shared);
1249 evas_gl_common_shader_program_init_done(void)
1251 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
1252 glReleaseShaderCompiler();
1254 if (glsym_glReleaseShaderCompiler) glsym_glReleaseShaderCompiler();
1259 evas_gl_common_shader_program_shutdown(Evas_GL_Program *p)
1261 if (p->vert) glDeleteShader(p->vert);
1262 if (p->frag) glDeleteShader(p->frag);
1263 if (p->prog) glDeleteProgram(p->prog);