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 yuv_nomul_frag_bin[] =
127 # include "shader/yuv_nomul_frag_bin_s3c6410.h"
131 const char yuv_nomul_frag_glsl[] =
132 #include "shader/yuv_nomul_frag.h"
134 Evas_GL_Program_Source shader_yuv_nomul_frag_src =
137 #if defined (GLES_VARIETY_S3C6410)
138 yuv_nomul_frag_bin, sizeof(yuv_nomul_frag_bin)
144 #if defined (GLES_VARIETY_S3C6410)
145 const unsigned int yuv_nomul_vert_bin[] =
147 # include "shader/yuv_nomul_vert_bin_s3c6410.h"
150 const char yuv_nomul_vert_glsl[] =
151 #include "shader/yuv_nomul_vert.h"
153 Evas_GL_Program_Source shader_yuv_nomul_vert_src =
156 #if defined (GLES_VARIETY_S3C6410)
157 yuv_nomul_vert_bin, sizeof(yuv_nomul_vert_bin)
163 /////////////////////////////////////////////
164 #if defined (GLES_VARIETY_S3C6410)
165 const unsigned int tex_frag_bin[] =
167 # include "shader/tex_frag_bin_s3c6410.h"
171 const char tex_frag_glsl[] =
172 #include "shader/tex_frag.h"
174 Evas_GL_Program_Source shader_tex_frag_src =
177 #if defined (GLES_VARIETY_S3C6410)
178 tex_frag_bin, sizeof(tex_frag_bin)
184 #if defined (GLES_VARIETY_S3C6410)
185 const unsigned int tex_vert_bin[] =
187 # include "shader/tex_vert_bin_s3c6410.h"
190 const char tex_vert_glsl[] =
191 #include "shader/tex_vert.h"
193 Evas_GL_Program_Source shader_tex_vert_src =
196 #if defined (GLES_VARIETY_S3C6410)
197 tex_vert_bin, sizeof(tex_vert_bin)
203 /////////////////////////////////////////////
204 #if defined (GLES_VARIETY_S3C6410)
205 const unsigned int tex_nomul_frag_bin[] =
207 # include "shader/tex_nomul_frag_bin_s3c6410.h"
211 const char tex_nomul_frag_glsl[] =
212 #include "shader/tex_nomul_frag.h"
214 Evas_GL_Program_Source shader_tex_nomul_frag_src =
217 #if defined (GLES_VARIETY_S3C6410)
218 tex_nomul_frag_bin, sizeof(tex_nomul_frag_bin)
224 #if defined (GLES_VARIETY_S3C6410)
225 const unsigned int tex_nomul_vert_bin[] =
227 # include "shader/tex_nomul_vert_bin_s3c6410.h"
230 const char tex_nomul_vert_glsl[] =
231 #include "shader/tex_nomul_vert.h"
233 Evas_GL_Program_Source shader_tex_nomul_vert_src =
236 #if defined (GLES_VARIETY_S3C6410)
237 tex_nomul_vert_bin, sizeof(tex_nomul_vert_bin)
243 /////////////////////////////////////////////
244 #if defined (GLES_VARIETY_S3C6410)
245 const unsigned int img_frag_bin[] =
247 # include "shader/img_frag_bin_s3c6410.h"
251 const char img_frag_glsl[] =
252 #include "shader/img_frag.h"
254 Evas_GL_Program_Source shader_img_frag_src =
257 #if defined (GLES_VARIETY_S3C6410)
258 img_frag_bin, sizeof(img_frag_bin)
264 #if defined (GLES_VARIETY_S3C6410)
265 const unsigned int img_vert_bin[] =
267 # include "shader/img_vert_bin_s3c6410.h"
270 const char img_vert_glsl[] =
271 #include "shader/img_vert.h"
273 Evas_GL_Program_Source shader_img_vert_src =
276 #if defined (GLES_VARIETY_S3C6410)
277 img_vert_bin, sizeof(img_vert_bin)
283 /////////////////////////////////////////////
284 #if defined (GLES_VARIETY_S3C6410)
285 const unsigned int img_nomul_frag_bin[] =
287 # include "shader/img_nomul_frag_bin_s3c6410.h"
291 const char img_nomul_frag_glsl[] =
292 #include "shader/img_nomul_frag.h"
294 Evas_GL_Program_Source shader_img_nomul_frag_src =
297 #if defined (GLES_VARIETY_S3C6410)
298 img_nomul_frag_bin, sizeof(img_nomul_frag_bin)
304 #if defined (GLES_VARIETY_S3C6410)
305 const unsigned int img_nomul_vert_bin[] =
307 # include "shader/img_nomul_vert_bin_s3c6410.h"
310 const char img_nomul_vert_glsl[] =
311 #include "shader/img_nomul_vert.h"
313 Evas_GL_Program_Source shader_img_nomul_vert_src =
316 #if defined (GLES_VARIETY_S3C6410)
317 img_nomul_vert_bin, sizeof(img_nomul_vert_bin)
323 /////////////////////////////////////////////
324 #if defined (GLES_VARIETY_S3C6410)
325 const unsigned int img_bgra_frag_bin[] =
327 # include "shader/img_bgra_frag_bin_s3c6410.h"
331 const char img_bgra_frag_glsl[] =
332 #include "shader/img_bgra_frag.h"
334 Evas_GL_Program_Source shader_img_bgra_frag_src =
337 #if defined (GLES_VARIETY_S3C6410)
338 img_bgra_frag_bin, sizeof(img_bgra_frag_bin)
344 #if defined (GLES_VARIETY_S3C6410)
345 const unsigned int img_bgra_vert_bin[] =
347 # include "shader/img_bgra_vert_bin_s3c6410.h"
350 const char img_bgra_vert_glsl[] =
351 #include "shader/img_bgra_vert.h"
353 Evas_GL_Program_Source shader_img_bgra_vert_src =
356 #if defined (GLES_VARIETY_S3C6410)
357 img_bgra_vert_bin, sizeof(img_bgra_vert_bin)
364 /////////////////////////////////////////////
365 #if defined (GLES_VARIETY_S3C6410)
366 const unsigned int img_mask_frag_bin[] =
368 # include "shader/img_mask_frag_bin_s3c6410.h"
372 const char img_mask_frag_glsl[] =
373 #include "shader/img_mask_frag.h"
375 Evas_GL_Program_Source shader_img_mask_frag_src =
378 #if defined (GLES_VARIETY_S3C6410)
379 img_mask_frag_bin, sizeof(img_mask_frag_bin)
385 #if defined (GLES_VARIETY_S3C6410)
386 const unsigned int img_mask_vert_bin[] =
388 # include "shader/img_mask_vert_bin_s3c6410.h"
391 const char img_mask_vert_glsl[] =
392 #include "shader/img_mask_vert.h"
394 Evas_GL_Program_Source shader_img_mask_vert_src =
397 #if defined (GLES_VARIETY_S3C6410)
398 img_mask_vert_bin, sizeof(img_mask_vert_bin)
405 /////////////////////////////////////////////
406 #if defined (GLES_VARIETY_S3C6410)
407 const unsigned int img_bgra_nomul_frag_bin[] =
409 # include "shader/img_bgra_nomul_frag_bin_s3c6410.h"
413 const char img_bgra_nomul_frag_glsl[] =
414 #include "shader/img_bgra_nomul_frag.h"
416 Evas_GL_Program_Source shader_img_bgra_nomul_frag_src =
418 img_bgra_nomul_frag_glsl,
419 #if defined (GLES_VARIETY_S3C6410)
420 img_bgra_nomul_frag_bin, sizeof(img_bgra_nomul_frag_bin)
426 #if defined (GLES_VARIETY_S3C6410)
427 const unsigned int img_bgra_nomul_vert_bin[] =
429 # include "shader/img_bgra_nomul_vert_bin_s3c6410.h"
432 const char img_bgra_nomul_vert_glsl[] =
433 #include "shader/img_bgra_nomul_vert.h"
435 Evas_GL_Program_Source shader_img_bgra_nomul_vert_src =
437 img_bgra_nomul_vert_glsl,
438 #if defined (GLES_VARIETY_S3C6410)
439 img_bgra_nomul_vert_bin, sizeof(img_bgra_nomul_vert_bin)
445 /////////////////////////////////////////////
446 const char filter_invert_frag_glsl[] =
447 #include "shader/filter_invert.h"
449 Evas_GL_Program_Source shader_filter_invert_frag_src =
451 filter_invert_frag_glsl,
455 const char filter_invert_nomul_frag_glsl[] =
456 #include "shader/filter_invert_nomul.h"
458 Evas_GL_Program_Source shader_filter_invert_nomul_frag_src =
460 filter_invert_nomul_frag_glsl,
464 const char filter_invert_bgra_frag_glsl[] =
465 #include "shader/filter_invert_bgra.h"
467 Evas_GL_Program_Source shader_filter_invert_bgra_frag_src =
469 filter_invert_bgra_frag_glsl,
472 const char filter_invert_bgra_nomul_frag_glsl[] =
473 #include "shader/filter_invert_bgra_nomul.h"
475 Evas_GL_Program_Source shader_filter_invert_bgra_nomul_frag_src =
477 filter_invert_bgra_nomul_frag_glsl,
481 /////////////////////////////////////////////
482 const char filter_greyscale_frag_glsl[] =
483 #include "shader/filter_greyscale.h"
485 Evas_GL_Program_Source shader_filter_greyscale_frag_src =
487 filter_greyscale_frag_glsl,
491 const char filter_greyscale_nomul_frag_glsl[] =
492 #include "shader/filter_greyscale_nomul.h"
494 Evas_GL_Program_Source shader_filter_greyscale_nomul_frag_src =
496 filter_greyscale_nomul_frag_glsl,
500 const char filter_greyscale_bgra_frag_glsl[] =
501 #include "shader/filter_greyscale_bgra.h"
503 Evas_GL_Program_Source shader_filter_greyscale_bgra_frag_src =
505 filter_greyscale_bgra_frag_glsl,
508 const char filter_greyscale_bgra_nomul_frag_glsl[] =
509 #include "shader/filter_greyscale_bgra_nomul.h"
511 Evas_GL_Program_Source shader_filter_greyscale_bgra_nomul_frag_src =
513 filter_greyscale_bgra_nomul_frag_glsl,
517 /////////////////////////////////////////////
518 const char filter_sepia_frag_glsl[] =
519 #include "shader/filter_sepia.h"
521 Evas_GL_Program_Source shader_filter_sepia_frag_src =
523 filter_sepia_frag_glsl,
527 const char filter_sepia_nomul_frag_glsl[] =
528 #include "shader/filter_sepia_nomul.h"
530 Evas_GL_Program_Source shader_filter_sepia_nomul_frag_src =
532 filter_sepia_nomul_frag_glsl,
536 const char filter_sepia_bgra_frag_glsl[] =
537 #include "shader/filter_sepia_bgra.h"
539 Evas_GL_Program_Source shader_filter_sepia_bgra_frag_src =
541 filter_sepia_bgra_frag_glsl,
544 const char filter_sepia_bgra_nomul_frag_glsl[] =
545 #include "shader/filter_sepia_bgra_nomul.h"
547 Evas_GL_Program_Source shader_filter_sepia_bgra_nomul_frag_src =
549 filter_sepia_bgra_nomul_frag_glsl,
553 /////////////////////////////////////////////
555 Blur is a work in progress currently.
556 Mostly because GPUs are so hopeless.
557 const char filter_blur_vert_glsl[] =
558 #include "shader/filter_blur_vert.h"
561 Evas_GL_Program_Source shader_filter_blur_vert_src =
563 filter_blur_vert_glsl,
567 const char filter_blur_frag_glsl[] =
568 #include "shader/filter_blur.h"
570 Evas_GL_Program_Source shader_filter_blur_frag_src =
572 filter_blur_frag_glsl,
576 const char filter_blur_nomul_frag_glsl[] =
577 #include "shader/filter_blur_nomul.h"
579 Evas_GL_Program_Source shader_filter_blur_nomul_frag_src =
581 filter_blur_nomul_frag_glsl,
585 const char filter_blur_bgra_frag_glsl[] =
586 #include "shader/filter_blur_bgra.h"
588 Evas_GL_Program_Source shader_filter_blur_bgra_frag_src =
590 filter_blur_bgra_frag_glsl,
593 const char filter_blur_bgra_nomul_frag_glsl[] =
594 #include "shader/filter_blur_bgra_nomul.h"
596 Evas_GL_Program_Source shader_filter_blur_bgra_nomul_frag_src =
598 filter_blur_bgra_nomul_frag_glsl,
606 /////////////////////////////////////////////
608 gl_compile_link_error(GLuint target, const char *action)
610 int loglen = 0, chars = 0;
613 /* Shader info log */
614 glGetShaderiv(target, GL_INFO_LOG_LENGTH, &loglen);
617 logtxt = calloc(loglen, sizeof(char));
620 glGetShaderInfoLog(target, loglen, &chars, logtxt);
621 ERR("Failed to %s: %s", action, logtxt);
626 /* Program info log */
627 glGetProgramiv(target, GL_INFO_LOG_LENGTH, &loglen);
630 logtxt = calloc(loglen, sizeof(char));
633 glGetProgramInfoLog(target, loglen, &chars, logtxt);
634 ERR("Failed to %s: %s", action, logtxt);
640 static mode_t default_mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
643 _evas_gl_shader_file_is_dir(const char *file)
647 if (stat(file, &st) < 0) return EINA_FALSE;
648 if (S_ISDIR(st.st_mode)) return EINA_TRUE;
653 _evas_gl_shader_file_mkdir(const char *dir)
655 /* evas gl shader only call this function when the dir is not exist */
656 if (mkdir(dir, default_mode) < 0) return EINA_FALSE;
661 _evas_gl_shader_file_exists(const char *file)
664 if (!file) return EINA_FALSE;
665 if (stat(file, &st) < 0) return EINA_FALSE;
669 static inline Eina_Bool
670 _evas_gl_shader_file_mkpath_if_not_exists(const char *path)
674 if (stat(path, &st) < 0)
675 return _evas_gl_shader_file_mkdir(path);
676 else if (!S_ISDIR(st.st_mode))
683 _evas_gl_shader_file_mkpath(const char *path)
688 if (_evas_gl_shader_file_is_dir(path)) return EINA_TRUE;
690 for (i = 0; path[i]; ss[i] = path[i], i++)
692 if (i == sizeof(ss) - 1) return EINA_FALSE;
693 if ((path[i] == '/') && (i > 0))
696 if (!_evas_gl_shader_file_mkpath_if_not_exists(ss))
701 return _evas_gl_shader_file_mkpath_if_not_exists(ss);
705 _evas_gl_shader_dir_check(char *bin_shader_dir, int num)
708 char *subdir = ".cache/evas_gl_common_shaders";
710 home = getenv("HOME");
711 if ((!home) || (!home[0])) return 0;
713 snprintf(bin_shader_dir, num, "%s/%s", home, subdir);
714 return _evas_gl_shader_file_exists(bin_shader_dir);
718 _evas_gl_shader_file_check(const char *bin_shader_dir, char *bin_shader_file, int dir_num)
720 char before_name[PATH_MAX];
721 char after_name[PATH_MAX];
722 int new_path_len = 0;
727 char *version = NULL;
729 vendor = (char *)glGetString(GL_VENDOR);
730 driver = (char *)glGetString(GL_RENDERER);
731 version = (char *)glGetString(GL_VERSION);
733 new_path_len = snprintf(before_name, sizeof(before_name), "%s::%s::%s::%s::binary_shader.eet", vendor, version, driver, MODULE_ARCH);
735 /* remove '/' from file name */
736 for (i = 0; i < new_path_len; i++)
738 if (before_name[i] != '/')
740 after_name[j] = before_name[i];
746 snprintf(bin_shader_file, dir_num, "%s/%s", bin_shader_dir, after_name);
748 return _evas_gl_shader_file_exists(bin_shader_file);
752 _evas_gl_common_shader_program_binary_init(Evas_GL_Program *p,
756 int res = 0, num = 0, length = 0;
763 data = eet_read(ef, pname, &length);
764 if ((!data) || (length <= 0)) goto finish;
766 glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &num);
767 if (num <= 0) goto finish;
769 formats = calloc(num, sizeof(int));
770 if (!formats) goto finish;
772 glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, formats);
773 if (!formats[0]) goto finish;
775 p->prog = glCreateProgram();
778 // TODO: invalid rendering error occurs when attempting to use a
779 // glProgramBinary. in order to render correctly we should create a dummy
781 p->vert = glCreateShader(GL_VERTEX_SHADER);
782 glAttachShader(p->prog, p->vert);
783 p->frag = glCreateShader(GL_FRAGMENT_SHADER);
784 glAttachShader(p->prog, p->frag);
786 glsym_glProgramBinary(p->prog, formats[0], data, length);
788 glBindAttribLocation(p->prog, SHAD_VERTEX, "vertex");
789 glBindAttribLocation(p->prog, SHAD_COLOR, "color");
790 glBindAttribLocation(p->prog, SHAD_TEXUV, "tex_coord");
791 glBindAttribLocation(p->prog, SHAD_TEXUV2, "tex_coord2");
792 glBindAttribLocation(p->prog, SHAD_TEXUV3, "tex_coord3");
793 glBindAttribLocation(p->prog, SHAD_TEXM, "tex_coordm");
795 glGetProgramiv(p->prog, GL_LINK_STATUS, &ok);
796 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
799 gl_compile_link_error(p->prog, "load a program object");
800 ERR("Abort load of program (%s)", pname);
807 if (formats) free(formats);
808 if (data) free(data);
809 if ((!res) && (p->prog))
811 glDeleteProgram(p->prog);
818 _evas_gl_common_shader_program_binary_save(Evas_GL_Program *p,
824 int length = 0, size = 0;
826 if (!glsym_glGetProgramBinary) return 0;
828 glGetProgramiv(p->prog, GL_PROGRAM_BINARY_LENGTH, &length);
829 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
830 if (length <= 0) return 0;
832 data = malloc(length);
835 glsym_glGetProgramBinary(p->prog, length, &size, &format, data);
836 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
844 if (eet_write(ef, pname, data, length, 0) < 0)
846 if (data) free(data);
849 if (data) free(data);
854 _evas_gl_common_shader_program_source_init(Evas_GL_Program *p,
855 Evas_GL_Program_Source *vert,
856 Evas_GL_Program_Source *frag,
861 p->vert = glCreateShader(GL_VERTEX_SHADER);
862 p->frag = glCreateShader(GL_FRAGMENT_SHADER);
863 #if defined (GLES_VARIETY_S3C6410)
864 glShaderBinary(1, &(p->vert), 0, vert->bin, vert->bin_size);
865 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
866 glShaderBinary(1, &(p->frag), 0, frag->bin, frag->bin_size);
867 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
869 glShaderSource(p->vert, 1,
870 (const char **)&(vert->src), NULL);
871 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
872 glCompileShader(p->vert);
873 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
875 glGetShaderiv(p->vert, GL_COMPILE_STATUS, &ok);
876 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
879 gl_compile_link_error(p->vert, "compile vertex shader");
880 ERR("Abort compile of shader vert (%s): %s", name, vert->src);
883 glShaderSource(p->frag, 1,
884 (const char **)&(frag->src), NULL);
885 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
886 glCompileShader(p->frag);
887 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
889 glGetShaderiv(p->frag, GL_COMPILE_STATUS, &ok);
890 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
893 gl_compile_link_error(p->frag, "compile fragment shader");
894 ERR("Abort compile of shader frag (%s): %s", name, frag->src);
898 p->prog = glCreateProgram();
899 #if defined(GLES_VARIETY_S3C6410) || defined(GLES_VARIETY_SGX)
901 if ((glsym_glGetProgramBinary) && (glsym_glProgramParameteri))
902 glsym_glProgramParameteri(p->prog, GL_PROGRAM_BINARY_RETRIEVABLE_HINT,
905 glAttachShader(p->prog, p->vert);
906 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
907 glAttachShader(p->prog, p->frag);
908 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
910 glBindAttribLocation(p->prog, SHAD_VERTEX, "vertex");
911 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
912 glBindAttribLocation(p->prog, SHAD_COLOR, "color");
913 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
914 glBindAttribLocation(p->prog, SHAD_TEXUV, "tex_coord");
915 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
916 glBindAttribLocation(p->prog, SHAD_TEXUV2, "tex_coord2");
917 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
918 glBindAttribLocation(p->prog, SHAD_TEXUV3, "tex_coord3");
919 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
920 glBindAttribLocation(p->prog, SHAD_TEXM, "tex_coordm");
921 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
923 glLinkProgram(p->prog);
924 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
926 glGetProgramiv(p->prog, GL_LINK_STATUS, &ok);
927 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
930 gl_compile_link_error(p->prog, "link fragment and vertex shaders");
931 ERR("Abort compile of shader frag (%s): %s", name, frag->src);
932 ERR("Abort compile of shader vert (%s): %s", name, vert->src);
939 _evas_gl_common_shader_source_init(Evas_GL_Shared *shared)
941 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.rect),
942 &(shader_rect_vert_src),
943 &(shader_rect_frag_src),
945 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.font),
946 &(shader_font_vert_src),
947 &(shader_font_frag_src),
949 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.img),
950 &(shader_img_vert_src),
951 &(shader_img_frag_src),
953 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.img_nomul),
954 &(shader_img_nomul_vert_src),
955 &(shader_img_nomul_frag_src),
956 "img_nomul")) return 0;
957 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.img_bgra),
958 &(shader_img_bgra_vert_src),
959 &(shader_img_bgra_frag_src),
960 "img_bgra")) return 0;
961 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.img_bgra_nomul),
962 &(shader_img_bgra_nomul_vert_src),
963 &(shader_img_bgra_nomul_frag_src),
964 "img_bgra_nomul")) return 0;
965 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.img_mask),
966 &(shader_img_mask_vert_src),
967 &(shader_img_mask_frag_src),
968 "img_mask")) return 0;
969 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.tex),
970 &(shader_tex_vert_src),
971 &(shader_tex_frag_src),
973 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.tex_nomul),
974 &(shader_tex_nomul_vert_src),
975 &(shader_tex_nomul_frag_src),
976 "tex_nomul")) return 0;
977 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.yuv),
978 &(shader_yuv_vert_src),
979 &(shader_yuv_frag_src),
981 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.yuv_nomul),
982 &(shader_yuv_nomul_vert_src),
983 &(shader_yuv_nomul_frag_src),
984 "yuv_nomul")) return 0;
986 /* Most of the filters use the image fragment shader */
987 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.filter_invert),
988 &(shader_img_vert_src),
989 &(shader_filter_invert_frag_src),
990 "filter_invert")) return 0;
991 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.filter_invert_nomul),
992 &(shader_img_vert_src),
993 &(shader_filter_invert_nomul_frag_src),
994 "filter_invert_nomul")) return 0;
995 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.filter_invert_bgra),
996 &(shader_img_vert_src),
997 &(shader_filter_invert_bgra_frag_src),
998 "filter_invert_bgra")) return 0;
999 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.filter_invert_bgra_nomul),
1000 &(shader_img_vert_src),
1001 &(shader_filter_invert_bgra_nomul_frag_src),
1002 "filter_invert_bgra_nomul")) return 0;
1004 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.filter_sepia),
1005 &(shader_img_vert_src),
1006 &(shader_filter_sepia_frag_src),
1007 "filter_sepia")) return 0;
1008 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.filter_sepia_nomul),
1009 &(shader_img_vert_src),
1010 &(shader_filter_sepia_nomul_frag_src),
1011 "filter_sepia_nomul")) return 0;
1012 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.filter_sepia_bgra),
1013 &(shader_img_vert_src),
1014 &(shader_filter_sepia_bgra_frag_src),
1015 "filter_sepia_bgra")) return 0;
1016 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.filter_sepia_bgra_nomul),
1017 &(shader_img_vert_src),
1018 &(shader_filter_sepia_bgra_nomul_frag_src),
1019 "filter_sepia_bgra_nomul")) return 0;
1021 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.filter_greyscale),
1022 &(shader_img_vert_src),
1023 &(shader_filter_greyscale_frag_src),
1024 "filter_greyscale")) return 0;
1025 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.filter_greyscale_nomul),
1026 &(shader_img_vert_src),
1027 &(shader_filter_greyscale_nomul_frag_src),
1028 "filter_greyscale_nomul")) return 0;
1029 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.filter_greyscale_bgra),
1030 &(shader_img_vert_src),
1031 &(shader_filter_greyscale_bgra_frag_src),
1032 "filter_greyscale_bgra")) return 0;
1033 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.filter_greyscale_bgra_nomul),
1034 &(shader_img_vert_src),
1035 &(shader_filter_greyscale_bgra_nomul_frag_src),
1036 "filter_greyscale_bgra_nomul")) return 0;
1038 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.filter_blur),
1039 &(shader_filter_blur_vert_src),
1040 &(shader_filter_blur_frag_src),
1041 "filter_blur")) return 0;
1042 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.filter_blur_nomul),
1043 &(shader_filter_blur_vert_src),
1044 &(shader_filter_blur_nomul_frag_src),
1045 "filter_blur_nomul")) return 0;
1046 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.filter_blur_bgra),
1047 &(shader_filter_blur_vert_src),
1048 &(shader_filter_blur_bgra_frag_src),
1049 "filter_blur_bgra")) return 0;
1050 if (!_evas_gl_common_shader_program_source_init(&(shared->shader.filter_blur_bgra_nomul),
1051 &(shader_filter_blur_vert_src),
1052 &(shader_filter_blur_bgra_nomul_frag_src),
1053 "filter_blur_bgra_nomul")) return 0;
1060 _evas_gl_common_shader_binary_init(Evas_GL_Shared *shared)
1063 Eet_File *et = NULL;
1064 char bin_dir_path[PATH_MAX];
1065 char bin_file_path[PATH_MAX];
1067 if (!_evas_gl_shader_dir_check(bin_dir_path, sizeof(bin_dir_path)))
1070 if (!_evas_gl_shader_file_check(bin_dir_path, bin_file_path,
1071 sizeof(bin_dir_path)))
1075 if (!eet_init()) return 0;
1076 et = eet_open(bin_file_path, EET_FILE_MODE_READ);
1077 if (!et) goto error;
1079 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.rect), "rect", et)) goto error;
1080 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.font), "font", et)) goto error;
1081 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.img), "img", et)) goto error;
1082 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.img_nomul), "img_nomul", et)) goto error;
1083 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.img_bgra), "img_bgra", et)) goto error;
1084 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.img_bgra_nomul), "img_bgra_nomul", et)) goto error;
1085 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.img_mask), "img_mask", et)) goto error;
1086 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.tex), "tex", et)) goto error;
1087 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.tex_nomul),"tex_nomul", et)) goto error;
1088 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.yuv), "yuv", et)) goto error;
1089 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.yuv_nomul), "yuv_nomul", et)) goto error;
1091 /* Most of the filters use the image fragment shader */
1092 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.filter_invert), "filter_invert", et)) goto error;
1093 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.filter_invert_nomul), "filter_invert_nomul", et)) goto error;
1094 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.filter_invert_bgra), "filter_invert_bgra", et)) goto error;
1095 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.filter_invert_bgra_nomul), "filter_invert_bgra_nomul", et)) goto error;
1097 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.filter_sepia), "filter_sepia", et)) goto error;
1098 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.filter_sepia_nomul), "filter_sepia_nomul", et)) goto error;
1099 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.filter_sepia_bgra), "filter_sepia_bgra", et)) goto error;
1100 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.filter_sepia_bgra_nomul), "filter_sepia_bgra_nomul", et)) goto error;
1102 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.filter_greyscale), "filter_greyscale", et)) goto error;
1103 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.filter_greyscale_nomul), "filter_greyscale_nomul", et)) goto error;
1104 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.filter_greyscale_bgra), "filter_greyscale_bgra", et)) goto error;
1105 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.filter_greyscale_bgra_nomul), "filter_greyscale_bgra_nomul", et)) goto error;
1107 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.filter_blur), "filter_blur", et)) goto error;
1108 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.filter_blur_nomul), "filter_blur_nomul", et)) goto error;
1109 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.filter_blur_bgra), "filter_blur_bgra", et)) goto error;
1110 if (!_evas_gl_common_shader_program_binary_init(&(shared->shader.filter_blur_bgra_nomul), "filter_blur_bgra_nomul", et)) goto error;
1113 if (et) eet_close(et);
1118 if (et) eet_close(et);
1124 _evas_gl_common_shader_binary_save(Evas_GL_Shared *shared)
1127 Eet_File *et = NULL; //check eet file
1130 char bin_dir_path[PATH_MAX];
1131 char bin_file_path[PATH_MAX];
1132 char tmp_file[PATH_MAX];
1134 if (!_evas_gl_shader_dir_check(bin_dir_path, sizeof(bin_dir_path)))
1135 res = _evas_gl_shader_file_mkpath(bin_dir_path);
1136 if (!res) return 0; /* we can't make directory */
1138 _evas_gl_shader_file_check(bin_dir_path, bin_file_path,
1139 sizeof(bin_dir_path));
1141 /* use mkstemp for writing */
1142 snprintf(tmp_file, sizeof(tmp_file), "%s.XXXXXX", bin_file_path);
1143 tmpfd = mkstemp(tmp_file);
1144 if (tmpfd < 0) goto error;
1148 if (!eet_init()) goto error;
1150 et = eet_open(tmp_file, EET_FILE_MODE_WRITE);
1151 if (!et) goto error;
1153 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.rect), "rect", et)) goto error;
1154 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.font), "font", et)) goto error;
1155 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.img), "img", et)) goto error;
1156 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.img_nomul), "img_nomul", et)) goto error;
1157 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.img_bgra), "img_bgra", et)) goto error;
1158 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.img_bgra_nomul), "img_bgra_nomul", et)) goto error;
1159 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.img_mask), "img_mask", et)) goto error;
1160 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.tex), "tex", et)) goto error;
1161 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.tex_nomul),"tex_nomul", et)) goto error;
1162 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.yuv), "yuv", et)) goto error;
1163 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.yuv_nomul), "yuv_nomul", et)) goto error;
1164 /* Most of the filters use the image fragment shader */
1165 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.filter_invert), "filter_invert", et)) goto error;
1166 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.filter_invert_nomul), "filter_invert_nomul", et)) goto error;
1167 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.filter_invert_bgra), "filter_invert_bgra", et)) goto error;
1168 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.filter_invert_bgra_nomul), "filter_invert_bgra_nomul", et)) goto error;
1170 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.filter_sepia), "filter_sepia", et)) goto error;
1171 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.filter_sepia_nomul), "filter_sepia_nomul", et)) goto error;
1172 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.filter_sepia_bgra), "filter_sepia_bgra", et)) goto error;
1173 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.filter_sepia_bgra_nomul), "filter_sepia_bgra_nomul", et)) goto error;
1175 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.filter_greyscale), "filter_greyscale", et)) goto error;
1176 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.filter_greyscale_nomul), "filter_greyscale_nomul", et)) goto error;
1177 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.filter_greyscale_bgra), "filter_greyscale_bgra", et)) goto error;
1178 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.filter_greyscale_bgra_nomul), "filter_greyscale_bgra_nomul", et)) goto error;
1180 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.filter_blur), "filter_blur", et)) goto error;
1181 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.filter_blur_nomul), "filter_blur_nomul", et)) goto error;
1182 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.filter_blur_bgra), "filter_blur_bgra", et)) goto error;
1183 if (!_evas_gl_common_shader_program_binary_save(&(shared->shader.filter_blur_bgra_nomul), "filter_blur_bgra_nomul", et)) goto error;
1186 if (eet_close(et) != EET_ERROR_NONE) goto error;
1187 if (rename(tmp_file,bin_file_path) < 0) goto error;
1192 if (et) eet_close(et);
1193 if (_evas_gl_shader_file_exists(tmp_file)) unlink(tmp_file);
1199 evas_gl_common_shader_program_init(Evas_GL_Shared *shared)
1201 // gl support binary shader and get env of binary shader path
1202 if (shared->info.bin_program &&
1203 _evas_gl_common_shader_binary_init(shared)) return 1;
1204 /* compile all shader.*/
1205 if (!_evas_gl_common_shader_source_init(shared)) return 0;
1206 /* success compile all shader. if gl support binary shader, we need to save */
1207 if (shared->info.bin_program) _evas_gl_common_shader_binary_save(shared);
1212 evas_gl_common_shader_program_init_done(void)
1214 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
1215 glReleaseShaderCompiler();
1220 evas_gl_common_shader_program_shutdown(Evas_GL_Program *p)
1222 if (p->vert) glDeleteShader(p->vert);
1223 if (p->frag) glDeleteShader(p->frag);
1224 if (p->prog) glDeleteProgram(p->prog);