221fca86c7fd4eb8d025b1618e3bc0820b732bbc
[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 #if defined (GLES_VARIETY_S3C6410)
365 const unsigned int img_bgra_nomul_frag_bin[] =
366 {
367 # include "shader/img_bgra_nomul_frag_bin_s3c6410.h"
368 };
369 #endif
370
371 const char img_bgra_nomul_frag_glsl[] =
372 #include "shader/img_bgra_nomul_frag.h"
373   ;
374 Evas_GL_Program_Source shader_img_bgra_nomul_frag_src =
375 {
376    img_bgra_nomul_frag_glsl,
377 #if defined (GLES_VARIETY_S3C6410)
378      img_bgra_nomul_frag_bin, sizeof(img_bgra_nomul_frag_bin)
379 #else     
380      NULL, 0
381 #endif     
382 };
383
384 #if defined (GLES_VARIETY_S3C6410)
385 const unsigned int img_bgra_nomul_vert_bin[] =
386 {
387 # include "shader/img_bgra_nomul_vert_bin_s3c6410.h"
388 };
389 #endif
390 const char img_bgra_nomul_vert_glsl[] =
391 #include "shader/img_bgra_nomul_vert.h"
392   ;
393 Evas_GL_Program_Source shader_img_bgra_nomul_vert_src =
394 {
395    img_bgra_nomul_vert_glsl,
396 #if defined (GLES_VARIETY_S3C6410)
397      img_bgra_nomul_vert_bin, sizeof(img_bgra_nomul_vert_bin)
398 #else     
399      NULL, 0
400 #endif     
401 };
402
403 /////////////////////////////////////////////
404 static void
405 gl_compile_link_error(GLuint target, const char *action)
406 {
407    int loglen = 0, chars = 0;
408    char *logtxt;
409
410    /* Shader info log */
411    glGetShaderiv(target, GL_INFO_LOG_LENGTH, &loglen);
412    if (loglen > 0)
413      {
414         logtxt = calloc(loglen, sizeof(char));
415         if (logtxt)
416           {
417              glGetShaderInfoLog(target, loglen, &chars, logtxt);
418              ERR("Failed to %s: %s", action, logtxt);
419              free(logtxt);
420           }
421      }
422    
423    /* Program info log */
424    glGetProgramiv(target, GL_INFO_LOG_LENGTH, &loglen);
425    if (loglen > 0)
426      {
427         logtxt = calloc(loglen, sizeof(char));
428         if (logtxt)
429           {
430              glGetProgramInfoLog(target, loglen, &chars, logtxt);
431              ERR("Failed to %s: %s", action, logtxt);
432              free(logtxt);
433           }
434      }
435 }
436
437 int
438 evas_gl_common_shader_program_init(Evas_GL_Program *p, 
439                                    Evas_GL_Program_Source *vert,
440                                    Evas_GL_Program_Source *frag,
441                                    const char *name)
442 {
443    GLint ok;
444
445    p->vert = glCreateShader(GL_VERTEX_SHADER);
446    p->frag = glCreateShader(GL_FRAGMENT_SHADER);
447 #if defined (GLES_VARIETY_S3C6410)
448    glShaderBinary(1, &(p->vert), 0, vert->bin, vert->bin_size);
449    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
450    glShaderBinary(1, &(p->frag), 0, frag->bin, frag->bin_size);
451    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
452 #else 
453    glShaderSource(p->vert, 1,
454                   (const char **)&(vert->src), NULL);
455    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
456    glCompileShader(p->vert);
457    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
458    ok = 0;
459    glGetShaderiv(p->vert, GL_COMPILE_STATUS, &ok);
460    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
461    if (!ok)
462      {
463         gl_compile_link_error(p->vert, "compile vertex shader");
464         ERR("Abort compile of shader vert (%s): %s", name, vert->src);
465         return 0;
466      }
467    glShaderSource(p->frag, 1,
468                   (const char **)&(frag->src), NULL);
469    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
470    glCompileShader(p->frag);
471    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
472    ok = 0;
473    glGetShaderiv(p->frag, GL_COMPILE_STATUS, &ok);
474    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
475    if (!ok)
476      {
477         gl_compile_link_error(p->frag, "compile fragment shader");
478         ERR("Abort compile of shader frag (%s): %s", name, frag->src);
479         return 0;
480      }
481 #endif
482    p->prog = glCreateProgram();
483    glAttachShader(p->prog, p->vert);
484    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
485    glAttachShader(p->prog, p->frag);
486    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
487    
488    glBindAttribLocation(p->prog, SHAD_VERTEX, "vertex");
489    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
490    glBindAttribLocation(p->prog, SHAD_COLOR,  "color");
491    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
492    glBindAttribLocation(p->prog, SHAD_TEXUV,  "tex_coord");
493    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
494    glBindAttribLocation(p->prog, SHAD_TEXUV2, "tex_coord2");
495    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
496    glBindAttribLocation(p->prog, SHAD_TEXUV3, "tex_coord3");
497    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
498    
499    glLinkProgram(p->prog);
500    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
501    ok = 0;
502    glGetProgramiv(p->prog, GL_LINK_STATUS, &ok);
503    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
504    if (!ok)
505      {
506         gl_compile_link_error(p->prog, "link fragment and vertex shaders");
507         ERR("Abort compile of shader frag (%s): %s", name, frag->src);
508         ERR("Abort compile of shader vert (%s): %s", name, vert->src);
509         return 0;
510      }
511    return 1;
512 }
513
514 void
515 evas_gl_common_shader_program_shutdown(Evas_GL_Program *p)
516 {
517    glDeleteShader(p->vert);
518    glDeleteShader(p->frag);
519    glDeleteProgram(p->prog);
520 }