merged evas image masking code from brett
[framework/uifw/evas.git] / src / modules / engines / gl_common / evas_gl_shader.c
1 #include "evas_gl_private.h"
2
3 /////////////////////////////////////////////
4 #if defined (GLES_VARIETY_S3C6410)
5 const unsigned int rect_frag_bin[] =
6 {
7 # include "shader/rect_frag_bin_s3c6410.h"
8 };
9 #endif
10
11 const char rect_frag_glsl[] =
12 #include "shader/rect_frag.h"
13   ;
14 Evas_GL_Program_Source shader_rect_frag_src =
15 {
16    rect_frag_glsl,
17 #if defined (GLES_VARIETY_S3C6410)
18      rect_frag_bin, sizeof(rect_frag_bin)
19 #else     
20      NULL, 0
21 #endif     
22 };
23
24 #if defined (GLES_VARIETY_S3C6410)
25 const unsigned int rect_vert_bin[] =
26 {
27 # include "shader/rect_vert_bin_s3c6410.h"
28 };
29 #endif
30 const char rect_vert_glsl[] =
31 #include "shader/rect_vert.h"
32   ;
33 Evas_GL_Program_Source shader_rect_vert_src =
34 {
35    rect_vert_glsl,
36 #if defined (GLES_VARIETY_S3C6410)
37      rect_vert_bin, sizeof(rect_vert_bin)
38 #else     
39      NULL, 0
40 #endif     
41 };
42
43 /////////////////////////////////////////////
44 #if defined (GLES_VARIETY_S3C6410)
45 const unsigned int font_frag_bin[] =
46 {
47 # include "shader/font_frag_bin_s3c6410.h"
48 };
49 #endif
50
51 const char font_frag_glsl[] =
52 #include "shader/font_frag.h"
53   ;
54 Evas_GL_Program_Source shader_font_frag_src =
55 {
56    font_frag_glsl,
57 #if defined (GLES_VARIETY_S3C6410)
58      font_frag_bin, sizeof(font_frag_bin)
59 #else     
60      NULL, 0
61 #endif     
62 };
63
64 #if defined (GLES_VARIETY_S3C6410)
65 const unsigned int font_vert_bin[] =
66 {
67 # include "shader/font_vert_bin_s3c6410.h"
68 };
69 #endif
70 const char font_vert_glsl[] =
71 #include "shader/font_vert.h"
72   ;
73 Evas_GL_Program_Source shader_font_vert_src =
74 {
75    font_vert_glsl,
76 #if defined (GLES_VARIETY_S3C6410)
77      font_vert_bin, sizeof(font_vert_bin)
78 #else     
79      NULL, 0
80 #endif     
81 };
82
83 /////////////////////////////////////////////
84 #if defined (GLES_VARIETY_S3C6410)
85 const unsigned int yuv_frag_bin[] =
86 {
87 # include "shader/yuv_frag_bin_s3c6410.h"
88 };
89 #endif
90
91 const char yuv_frag_glsl[] =
92 #include "shader/yuv_frag.h"
93   ;
94 Evas_GL_Program_Source shader_yuv_frag_src =
95 {
96    yuv_frag_glsl,
97 #if defined (GLES_VARIETY_S3C6410)
98      yuv_frag_bin, sizeof(yuv_frag_bin)
99 #else     
100      NULL, 0
101 #endif     
102 };
103
104 #if defined (GLES_VARIETY_S3C6410)
105 const unsigned int yuv_vert_bin[] =
106 {
107 # include "shader/yuv_vert_bin_s3c6410.h"
108 };
109 #endif
110 const char yuv_vert_glsl[] =
111 #include "shader/yuv_vert.h"
112   ;
113 Evas_GL_Program_Source shader_yuv_vert_src =
114 {
115    yuv_vert_glsl,
116 #if defined (GLES_VARIETY_S3C6410)
117      yuv_vert_bin, sizeof(yuv_vert_bin)
118 #else     
119      NULL, 0
120 #endif     
121 };
122
123 /////////////////////////////////////////////
124 #if defined (GLES_VARIETY_S3C6410)
125 const unsigned int yuv_nomul_frag_bin[] =
126 {
127 # include "shader/yuv_nomul_frag_bin_s3c6410.h"
128 };
129 #endif
130
131 const char yuv_nomul_frag_glsl[] =
132 #include "shader/yuv_nomul_frag.h"
133   ;
134 Evas_GL_Program_Source shader_yuv_nomul_frag_src =
135 {
136    yuv_nomul_frag_glsl,
137 #if defined (GLES_VARIETY_S3C6410)
138      yuv_nomul_frag_bin, sizeof(yuv_nomul_frag_bin)
139 #else     
140      NULL, 0
141 #endif     
142 };
143
144 #if defined (GLES_VARIETY_S3C6410)
145 const unsigned int yuv_nomul_vert_bin[] =
146 {
147 # include "shader/yuv_nomul_vert_bin_s3c6410.h"
148 };
149 #endif
150 const char yuv_nomul_vert_glsl[] =
151 #include "shader/yuv_nomul_vert.h"
152   ;
153 Evas_GL_Program_Source shader_yuv_nomul_vert_src =
154 {
155    yuv_nomul_vert_glsl,
156 #if defined (GLES_VARIETY_S3C6410)
157      yuv_nomul_vert_bin, sizeof(yuv_nomul_vert_bin)
158 #else     
159      NULL, 0
160 #endif     
161 };
162
163 /////////////////////////////////////////////
164 #if defined (GLES_VARIETY_S3C6410)
165 const unsigned int tex_frag_bin[] =
166 {
167 # include "shader/tex_frag_bin_s3c6410.h"
168 };
169 #endif
170
171 const char tex_frag_glsl[] =
172 #include "shader/tex_frag.h"
173   ;
174 Evas_GL_Program_Source shader_tex_frag_src =
175 {
176    tex_frag_glsl,
177 #if defined (GLES_VARIETY_S3C6410)
178      tex_frag_bin, sizeof(tex_frag_bin)
179 #else     
180      NULL, 0
181 #endif     
182 };
183
184 #if defined (GLES_VARIETY_S3C6410)
185 const unsigned int tex_vert_bin[] =
186 {
187 # include "shader/tex_vert_bin_s3c6410.h"
188 };
189 #endif
190 const char tex_vert_glsl[] =
191 #include "shader/tex_vert.h"
192   ;
193 Evas_GL_Program_Source shader_tex_vert_src =
194 {
195    tex_vert_glsl,
196 #if defined (GLES_VARIETY_S3C6410)
197      tex_vert_bin, sizeof(tex_vert_bin)
198 #else     
199      NULL, 0
200 #endif     
201 };
202
203 /////////////////////////////////////////////
204 #if defined (GLES_VARIETY_S3C6410)
205 const unsigned int tex_nomul_frag_bin[] =
206 {
207 # include "shader/tex_nomul_frag_bin_s3c6410.h"
208 };
209 #endif
210
211 const char tex_nomul_frag_glsl[] =
212 #include "shader/tex_nomul_frag.h"
213   ;
214 Evas_GL_Program_Source shader_tex_nomul_frag_src =
215 {
216    tex_nomul_frag_glsl,
217 #if defined (GLES_VARIETY_S3C6410)
218      tex_nomul_frag_bin, sizeof(tex_nomul_frag_bin)
219 #else     
220      NULL, 0
221 #endif     
222 };
223
224 #if defined (GLES_VARIETY_S3C6410)
225 const unsigned int tex_nomul_vert_bin[] =
226 {
227 # include "shader/tex_nomul_vert_bin_s3c6410.h"
228 };
229 #endif
230 const char tex_nomul_vert_glsl[] =
231 #include "shader/tex_nomul_vert.h"
232   ;
233 Evas_GL_Program_Source shader_tex_nomul_vert_src =
234 {
235    tex_nomul_vert_glsl,
236 #if defined (GLES_VARIETY_S3C6410)
237      tex_nomul_vert_bin, sizeof(tex_nomul_vert_bin)
238 #else     
239      NULL, 0
240 #endif     
241 };
242
243 /////////////////////////////////////////////
244 #if defined (GLES_VARIETY_S3C6410)
245 const unsigned int img_frag_bin[] =
246 {
247 # include "shader/img_frag_bin_s3c6410.h"
248 };
249 #endif
250
251 const char img_frag_glsl[] =
252 #include "shader/img_frag.h"
253   ;
254 Evas_GL_Program_Source shader_img_frag_src =
255 {
256    img_frag_glsl,
257 #if defined (GLES_VARIETY_S3C6410)
258      img_frag_bin, sizeof(img_frag_bin)
259 #else     
260      NULL, 0
261 #endif     
262 };
263
264 #if defined (GLES_VARIETY_S3C6410)
265 const unsigned int img_vert_bin[] =
266 {
267 # include "shader/img_vert_bin_s3c6410.h"
268 };
269 #endif
270 const char img_vert_glsl[] =
271 #include "shader/img_vert.h"
272   ;
273 Evas_GL_Program_Source shader_img_vert_src =
274 {
275    img_vert_glsl,
276 #if defined (GLES_VARIETY_S3C6410)
277      img_vert_bin, sizeof(img_vert_bin)
278 #else     
279      NULL, 0
280 #endif     
281 };
282
283 /////////////////////////////////////////////
284 #if defined (GLES_VARIETY_S3C6410)
285 const unsigned int img_nomul_frag_bin[] =
286 {
287 # include "shader/img_nomul_frag_bin_s3c6410.h"
288 };
289 #endif
290
291 const char img_nomul_frag_glsl[] =
292 #include "shader/img_nomul_frag.h"
293   ;
294 Evas_GL_Program_Source shader_img_nomul_frag_src =
295 {
296    img_nomul_frag_glsl,
297 #if defined (GLES_VARIETY_S3C6410)
298      img_nomul_frag_bin, sizeof(img_nomul_frag_bin)
299 #else     
300      NULL, 0
301 #endif     
302 };
303
304 #if defined (GLES_VARIETY_S3C6410)
305 const unsigned int img_nomul_vert_bin[] =
306 {
307 # include "shader/img_nomul_vert_bin_s3c6410.h"
308 };
309 #endif
310 const char img_nomul_vert_glsl[] =
311 #include "shader/img_nomul_vert.h"
312   ;
313 Evas_GL_Program_Source shader_img_nomul_vert_src =
314 {
315    img_nomul_vert_glsl,
316 #if defined (GLES_VARIETY_S3C6410)
317      img_nomul_vert_bin, sizeof(img_nomul_vert_bin)
318 #else     
319      NULL, 0
320 #endif     
321 };
322
323 /////////////////////////////////////////////
324 #if defined (GLES_VARIETY_S3C6410)
325 const unsigned int img_bgra_frag_bin[] =
326 {
327 # include "shader/img_bgra_frag_bin_s3c6410.h"
328 };
329 #endif
330
331 const char img_bgra_frag_glsl[] =
332 #include "shader/img_bgra_frag.h"
333   ;
334 Evas_GL_Program_Source shader_img_bgra_frag_src =
335 {
336    img_bgra_frag_glsl,
337 #if defined (GLES_VARIETY_S3C6410)
338      img_bgra_frag_bin, sizeof(img_bgra_frag_bin)
339 #else     
340      NULL, 0
341 #endif     
342 };
343
344 #if defined (GLES_VARIETY_S3C6410)
345 const unsigned int img_bgra_vert_bin[] =
346 {
347 # include "shader/img_bgra_vert_bin_s3c6410.h"
348 };
349 #endif
350 const char img_bgra_vert_glsl[] =
351 #include "shader/img_bgra_vert.h"
352   ;
353 Evas_GL_Program_Source shader_img_bgra_vert_src =
354 {
355    img_bgra_vert_glsl,
356 #if defined (GLES_VARIETY_S3C6410)
357      img_bgra_vert_bin, sizeof(img_bgra_vert_bin)
358 #else     
359      NULL, 0
360 #endif     
361 };
362
363
364 /////////////////////////////////////////////
365 #if defined (GLES_VARIETY_S3C6410)
366 const unsigned int img_mask_frag_bin[] =
367 {
368 # include "shader/img_mask_frag_bin_s3c6410.h"
369 };
370 #endif
371
372 const char img_mask_frag_glsl[] =
373 #include "shader/img_mask_frag.h"
374   ;
375 Evas_GL_Program_Source shader_img_mask_frag_src =
376 {
377    img_mask_frag_glsl,
378 #if defined (GLES_VARIETY_S3C6410)
379      img_mask_frag_bin, sizeof(img_mask_frag_bin)
380 #else
381      NULL, 0
382 #endif
383 };
384
385 #if defined (GLES_VARIETY_S3C6410)
386 const unsigned int img_mask_vert_bin[] =
387 {
388 # include "shader/img_mask_vert_bin_s3c6410.h"
389 };
390 #endif
391 const char img_mask_vert_glsl[] =
392 #include "shader/img_mask_vert.h"
393   ;
394 Evas_GL_Program_Source shader_img_mask_vert_src =
395 {
396    img_mask_vert_glsl,
397 #if defined (GLES_VARIETY_S3C6410)
398      img_mask_vert_bin, sizeof(img_mask_vert_bin)
399 #else
400      NULL, 0
401 #endif
402 };
403
404
405 /////////////////////////////////////////////
406 #if defined (GLES_VARIETY_S3C6410)
407 const unsigned int img_bgra_nomul_frag_bin[] =
408 {
409 # include "shader/img_bgra_nomul_frag_bin_s3c6410.h"
410 };
411 #endif
412
413 const char img_bgra_nomul_frag_glsl[] =
414 #include "shader/img_bgra_nomul_frag.h"
415   ;
416 Evas_GL_Program_Source shader_img_bgra_nomul_frag_src =
417 {
418    img_bgra_nomul_frag_glsl,
419 #if defined (GLES_VARIETY_S3C6410)
420      img_bgra_nomul_frag_bin, sizeof(img_bgra_nomul_frag_bin)
421 #else     
422      NULL, 0
423 #endif     
424 };
425
426 #if defined (GLES_VARIETY_S3C6410)
427 const unsigned int img_bgra_nomul_vert_bin[] =
428 {
429 # include "shader/img_bgra_nomul_vert_bin_s3c6410.h"
430 };
431 #endif
432 const char img_bgra_nomul_vert_glsl[] =
433 #include "shader/img_bgra_nomul_vert.h"
434   ;
435 Evas_GL_Program_Source shader_img_bgra_nomul_vert_src =
436 {
437    img_bgra_nomul_vert_glsl,
438 #if defined (GLES_VARIETY_S3C6410)
439      img_bgra_nomul_vert_bin, sizeof(img_bgra_nomul_vert_bin)
440 #else     
441      NULL, 0
442 #endif     
443 };
444
445 /////////////////////////////////////////////
446 static void
447 gl_compile_link_error(GLuint target, const char *action)
448 {
449    int loglen = 0, chars = 0;
450    char *logtxt;
451
452    /* Shader info log */
453    glGetShaderiv(target, GL_INFO_LOG_LENGTH, &loglen);
454    if (loglen > 0)
455      {
456         logtxt = calloc(loglen, sizeof(char));
457         if (logtxt)
458           {
459              glGetShaderInfoLog(target, loglen, &chars, logtxt);
460              ERR("Failed to %s: %s", action, logtxt);
461              free(logtxt);
462           }
463      }
464    
465    /* Program info log */
466    glGetProgramiv(target, GL_INFO_LOG_LENGTH, &loglen);
467    if (loglen > 0)
468      {
469         logtxt = calloc(loglen, sizeof(char));
470         if (logtxt)
471           {
472              glGetProgramInfoLog(target, loglen, &chars, logtxt);
473              ERR("Failed to %s: %s", action, logtxt);
474              free(logtxt);
475           }
476      }
477 }
478
479 int
480 evas_gl_common_shader_program_init(Evas_GL_Program *p, 
481                                    Evas_GL_Program_Source *vert,
482                                    Evas_GL_Program_Source *frag,
483                                    const char *name)
484 {
485    GLint ok;
486
487    p->vert = glCreateShader(GL_VERTEX_SHADER);
488    p->frag = glCreateShader(GL_FRAGMENT_SHADER);
489 #if defined (GLES_VARIETY_S3C6410)
490    glShaderBinary(1, &(p->vert), 0, vert->bin, vert->bin_size);
491    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
492    glShaderBinary(1, &(p->frag), 0, frag->bin, frag->bin_size);
493    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
494 #else 
495    glShaderSource(p->vert, 1,
496                   (const char **)&(vert->src), NULL);
497    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
498    glCompileShader(p->vert);
499    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
500    ok = 0;
501    glGetShaderiv(p->vert, GL_COMPILE_STATUS, &ok);
502    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
503    if (!ok)
504      {
505         gl_compile_link_error(p->vert, "compile vertex shader");
506         ERR("Abort compile of shader vert (%s): %s", name, vert->src);
507         return 0;
508      }
509    glShaderSource(p->frag, 1,
510                   (const char **)&(frag->src), NULL);
511    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
512    glCompileShader(p->frag);
513    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
514    ok = 0;
515    glGetShaderiv(p->frag, GL_COMPILE_STATUS, &ok);
516    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
517    if (!ok)
518      {
519         gl_compile_link_error(p->frag, "compile fragment shader");
520         ERR("Abort compile of shader frag (%s): %s", name, frag->src);
521         return 0;
522      }
523 #endif
524    p->prog = glCreateProgram();
525    glAttachShader(p->prog, p->vert);
526    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
527    glAttachShader(p->prog, p->frag);
528    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
529    
530    glBindAttribLocation(p->prog, SHAD_VERTEX, "vertex");
531    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
532    glBindAttribLocation(p->prog, SHAD_COLOR,  "color");
533    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
534    glBindAttribLocation(p->prog, SHAD_TEXUV,  "tex_coord");
535    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
536    glBindAttribLocation(p->prog, SHAD_TEXUV2, "tex_coord2");
537    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
538    glBindAttribLocation(p->prog, SHAD_TEXUV3, "tex_coord3");
539    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
540    glBindAttribLocation(p->prog, SHAD_TEXM, "tex_coordm");
541    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
542    
543    glLinkProgram(p->prog);
544    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
545    ok = 0;
546    glGetProgramiv(p->prog, GL_LINK_STATUS, &ok);
547    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
548    if (!ok)
549      {
550         gl_compile_link_error(p->prog, "link fragment and vertex shaders");
551         ERR("Abort compile of shader frag (%s): %s", name, frag->src);
552         ERR("Abort compile of shader vert (%s): %s", name, vert->src);
553         return 0;
554      }
555    return 1;
556 }
557
558 void
559 evas_gl_common_shader_program_shutdown(Evas_GL_Program *p)
560 {
561    glDeleteShader(p->vert);
562    glDeleteShader(p->frag);
563    glDeleteProgram(p->prog);
564 }