comparison libvo/gl_common.c @ 36126:fd34a83228ca

Switch OpenGL ES renderer to 2.0. 1.0 is too limited to be really useful for video, and 2.0 is almost universally available anyway. This also adds support for YUV conversion in hardware, however this code is still very rough and limited in features. A lot of work, like being able to change the coefficients, supporting gamma, supporting EOSD (ASS rendering) still needs to be done for this to be really usable. Unfortunately development is difficult since almost no working implementations are available: MESA seems currently completely broken unless you use and Intel card _and_ force software rendering, Galaxy S2 still crashes regularly (certainly in part my fault for doing something weird, but still).
author reimar
date Sat, 04 May 2013 13:28:14 +0000
parents c4075d9e329d
children 18c289284727
comparison
equal deleted inserted replaced
36125:c4075d9e329d 36126:fd34a83228ca
48 void (GLAPIENTRY *mpglBegin)(GLenum); 48 void (GLAPIENTRY *mpglBegin)(GLenum);
49 void (GLAPIENTRY *mpglEnd)(void); 49 void (GLAPIENTRY *mpglEnd)(void);
50 void (GLAPIENTRY *mpglViewport)(GLint, GLint, GLsizei, GLsizei); 50 void (GLAPIENTRY *mpglViewport)(GLint, GLint, GLsizei, GLsizei);
51 void (GLAPIENTRY *mpglMatrixMode)(GLenum); 51 void (GLAPIENTRY *mpglMatrixMode)(GLenum);
52 void (GLAPIENTRY *mpglLoadIdentity)(void); 52 void (GLAPIENTRY *mpglLoadIdentity)(void);
53 void (GLAPIENTRY *mpglLoadMatrixf)(float *); 53 void (GLAPIENTRY *mpglLoadMatrixf)(const float *);
54 void (GLAPIENTRY *mpglClear)(GLbitfield); 54 void (GLAPIENTRY *mpglClear)(GLbitfield);
55 GLuint (GLAPIENTRY *mpglGenLists)(GLsizei); 55 GLuint (GLAPIENTRY *mpglGenLists)(GLsizei);
56 void (GLAPIENTRY *mpglDeleteLists)(GLuint, GLsizei); 56 void (GLAPIENTRY *mpglDeleteLists)(GLuint, GLsizei);
57 void (GLAPIENTRY *mpglNewList)(GLuint, GLenum); 57 void (GLAPIENTRY *mpglNewList)(GLuint, GLenum);
58 void (GLAPIENTRY *mpglEndList)(void); 58 void (GLAPIENTRY *mpglEndList)(void);
143 void (GLAPIENTRY *mpglVertexPointer)(GLint, GLenum, GLsizei, const GLvoid *); 143 void (GLAPIENTRY *mpglVertexPointer)(GLint, GLenum, GLsizei, const GLvoid *);
144 void (GLAPIENTRY *mpglTexCoordPointer)(GLint, GLenum, GLsizei, const GLvoid *); 144 void (GLAPIENTRY *mpglTexCoordPointer)(GLint, GLenum, GLsizei, const GLvoid *);
145 void (GLAPIENTRY *mpglClientActiveTexture)(GLenum); 145 void (GLAPIENTRY *mpglClientActiveTexture)(GLenum);
146 void (GLAPIENTRY *mpglEnableClientState)(GLenum); 146 void (GLAPIENTRY *mpglEnableClientState)(GLenum);
147 void (GLAPIENTRY *mpglDisableClientState)(GLenum); 147 void (GLAPIENTRY *mpglDisableClientState)(GLenum);
148
149 void (GLAPIENTRY *mpglVertexAttribPointer)(GLuint, GLint, GLenum, GLboolean, GLsizei, const void *);
150 void (GLAPIENTRY *mpglEnableVertexAttribArray)(GLuint);
148 void (GLAPIENTRY *mpglDrawArrays)(GLenum, GLint, GLsizei); 151 void (GLAPIENTRY *mpglDrawArrays)(GLenum, GLint, GLsizei);
152
153 GLuint (GLAPIENTRY *mpglCreateProgram)(void);
154 GLuint (GLAPIENTRY *mpglCreateShader)(GLenum);
155 void (GLAPIENTRY *mpglShaderSource)(GLuint, GLsizei, const char **, const GLint *);
156 void (GLAPIENTRY *mpglCompileShader)(GLuint);
157 void (GLAPIENTRY *mpglGetShaderiv)(GLuint, GLenum, GLint *);
158 void (GLAPIENTRY *mpglGetShaderInfoLog)(GLuint, GLsizei, GLsizei *, char *);
159 void (GLAPIENTRY *mpglAttachShader)(GLuint, GLuint);
160 void (GLAPIENTRY *mpglDetachShader)(GLuint, GLuint);
161 void (GLAPIENTRY *mpglDeleteShader)(GLuint);
162 void (GLAPIENTRY *mpglBindAttribLocation)(GLuint, GLuint, const char *);
163 void (GLAPIENTRY *mpglLinkProgram)(GLuint);
164 void (GLAPIENTRY *mpglGetProgramInfoLog)(GLuint, GLsizei, GLsizei *, char *);
165 void (GLAPIENTRY *mpglUseProgram)(GLuint);
166 GLint (GLAPIENTRY *mpglGetUniformLocation)(GLuint, const char *);
167 void (GLAPIENTRY *mpglUniform1iv)(GLint, GLsizei, const GLint *);
168 void (GLAPIENTRY *mpglUniformMatrix4fv)(GLint, GLsizei, GLboolean, const float *);
149 169
150 //! \defgroup glgeneral OpenGL general helper functions 170 //! \defgroup glgeneral OpenGL general helper functions
151 171
152 //! \defgroup glcontext OpenGL context management helper functions 172 //! \defgroup glcontext OpenGL context management helper functions
153 173
156 //! \defgroup glconversion OpenGL conversion helper functions 176 //! \defgroup glconversion OpenGL conversion helper functions
157 177
158 static GLint hqtexfmt; 178 static GLint hqtexfmt;
159 static int use_depth_l16; 179 static int use_depth_l16;
160 static GLenum l16_format; 180 static GLenum l16_format;
181 static GLuint gpu_def_sl_program;
182 static GLuint gpu_yuv_sl_program;
183 static GLuint gpu_cur_sl_program;
184 static float transform_matrix[16];
161 185
162 /** 186 /**
163 * \brief adjusts the GL_UNPACK_ALIGNMENT to fit the stride. 187 * \brief adjusts the GL_UNPACK_ALIGNMENT to fit the stride.
164 * \param stride number of bytes per line for which alignment should fit. 188 * \param stride number of bytes per line for which alignment should fit.
165 * \ingroup glgeneral 189 * \ingroup glgeneral
499 SIMPLE_FUNC_DESC(VertexPointer), 523 SIMPLE_FUNC_DESC(VertexPointer),
500 SIMPLE_FUNC_DESC(TexCoordPointer), 524 SIMPLE_FUNC_DESC(TexCoordPointer),
501 SIMPLE_FUNC_DESC(ClientActiveTexture), 525 SIMPLE_FUNC_DESC(ClientActiveTexture),
502 SIMPLE_FUNC_DESC(EnableClientState), 526 SIMPLE_FUNC_DESC(EnableClientState),
503 SIMPLE_FUNC_DESC(DisableClientState), 527 SIMPLE_FUNC_DESC(DisableClientState),
528
529 SIMPLE_FUNC_DESC(VertexAttribPointer),
530 SIMPLE_FUNC_DESC(EnableVertexAttribArray),
504 SIMPLE_FUNC_DESC(DrawArrays), 531 SIMPLE_FUNC_DESC(DrawArrays),
532
533
534 SIMPLE_FUNC_DESC(CreateProgram),
535 SIMPLE_FUNC_DESC(CreateShader),
536 SIMPLE_FUNC_DESC(ShaderSource),
537 SIMPLE_FUNC_DESC(CompileShader),
538 SIMPLE_FUNC_DESC(GetShaderiv),
539 SIMPLE_FUNC_DESC(GetShaderInfoLog),
540 SIMPLE_FUNC_DESC(AttachShader),
541 SIMPLE_FUNC_DESC(DetachShader),
542 SIMPLE_FUNC_DESC(DeleteShader),
543 SIMPLE_FUNC_DESC(BindAttribLocation),
544 SIMPLE_FUNC_DESC(LinkProgram),
545 SIMPLE_FUNC_DESC(GetProgramiv),
546 SIMPLE_FUNC_DESC(GetProgramInfoLog),
547 SIMPLE_FUNC_DESC(UseProgram),
548 SIMPLE_FUNC_DESC(GetUniformLocation),
549 SIMPLE_FUNC_DESC(Uniform1iv),
550 SIMPLE_FUNC_DESC(UniformMatrix4fv),
505 {NULL} 551 {NULL}
506 }; 552 };
507 553
508 /** 554 /**
509 * \brief find the function pointers of some useful OpenGL extensions 555 * \brief find the function pointers of some useful OpenGL extensions
1541 mp_msg(MSGT_VO, MSGL_DBG2, "[gl] generated fragment program:\n%s\n", yuv_prog); 1587 mp_msg(MSGT_VO, MSGL_DBG2, "[gl] generated fragment program:\n%s\n", yuv_prog);
1542 loadGPUProgram(GL_FRAGMENT_PROGRAM, yuv_prog); 1588 loadGPUProgram(GL_FRAGMENT_PROGRAM, yuv_prog);
1543 free(yuv_prog); 1589 free(yuv_prog);
1544 } 1590 }
1545 1591
1592 static void print_result(int link, GLuint obj) {
1593 char msgtmp[500];
1594 GLint status;
1595 (link ? mpglGetProgramiv : mpglGetShaderiv)(obj, link ? GL_LINK_STATUS : GL_COMPILE_STATUS, &status);
1596 if (!status)
1597 mp_msg(MSGT_VO, MSGL_ERR, "[gl] Shader %s failed.\n", link ? "linking" : "compilation");
1598 msgtmp[0] = 0;
1599 (link ? mpglGetProgramInfoLog : mpglGetShaderInfoLog)(obj, sizeof(msgtmp), NULL, msgtmp);
1600 mp_msg(MSGT_VO, status ? MSGL_V : MSGL_ERR, "[gl] %s messages:\n%s\n", link ? "Linker" : "Compiler", msgtmp);
1601 }
1602
1603 static GLuint compile_shader(GLenum type, const char *source) {
1604 GLuint shader = mpglCreateShader(type);
1605 mp_msg(MSGT_VO, MSGL_DBG2, "[gl] Compiling shader:\n%s\n", source);
1606 mpglShaderSource(shader, 1, &source, NULL);
1607 mpglCompileShader(shader);
1608 print_result(0, shader);
1609 return shader;
1610 }
1611
1612 static const char vertex_shader[] =
1613 "uniform mat4 matrix;\n"
1614 "attribute vec4 vPos;\n"
1615 "attribute vec2 tca, tca2, tca3;\n"
1616 "varying vec2 tcv, tcv2, tcv3;\n"
1617 "void main() {\n"
1618 " gl_Position = matrix * vPos;\n"
1619 " tcv = tca; tcv2 = tca2; tcv3 = tca3;\n"
1620 "}\n";
1621
1622 static GLuint new_gpu_program(void) {
1623 GLuint program = mpglCreateProgram();
1624 GLuint shader = compile_shader(GL_VERTEX_SHADER, vertex_shader);
1625 mpglAttachShader(program, shader);
1626 mpglDeleteShader(shader);
1627 return program;
1628 }
1629
1630 static const char def_frag_shader[] =
1631 "precision mediump float;\n"
1632 "uniform sampler2D texs[4];\n"
1633 "varying vec2 tcv;\n"
1634 "void main() {\n"
1635 " gl_FragColor = texture2D(texs[0], tcv);\n"
1636 "}\n";
1637
1638 static const char yuv_frag_shader[] =
1639 "precision mediump float;\n"
1640 "uniform sampler2D texs[4];\n"
1641 "varying vec2 tcv, tcv2;\n"
1642 "void main() {\n"
1643 " mat4 yuv_conv = mat4(\n"
1644 " 1.164000e+00, 1.164000e+00, 1.164000e+00, 0,\n"
1645 " 0.000000e+00, -3.910000e-01, 2.018000e+00, 0,\n"
1646 " 1.596000e+00, -8.130000e-01, 0.000000e+00, 0,\n"
1647 " -8.741648e-01, 5.313256e-01, -1.085992e+00, 1\n"
1648 " );\n"
1649 " vec4 yuv = vec4(0.0, 0.5, 0.5, 1.0);\n"
1650 " yuv.r = texture2D(texs[0], tcv).r;\n"
1651 " yuv.g = texture2D(texs[1], tcv2).r;\n"
1652 " yuv.b = texture2D(texs[2], tcv2).r;\n"
1653 " gl_FragColor = yuv_conv * yuv;\n"
1654 "}\n";
1655
1656 static void set_frag_shader(GLuint prog, GLuint shader) {
1657 mpglAttachShader(prog, shader);
1658 mpglBindAttribLocation(prog, 0, "vPos");
1659 mpglBindAttribLocation(prog, 1, "tca");
1660 mpglBindAttribLocation(prog, 2, "tca2");
1661 mpglBindAttribLocation(prog, 3, "tca3");
1662 mpglLinkProgram(prog);
1663 print_result(1, prog);
1664 }
1665
1666 static void set_frag_src(GLuint prog, const char *src) {
1667 GLuint shader = compile_shader(GL_FRAGMENT_SHADER, src);
1668 set_frag_shader(prog, shader);
1669 mpglDeleteShader(shader);
1670 }
1671
1672 static void GLAPIENTRY matrix_uniform(const float *matrix)
1673 {
1674 GLint loc;
1675 if (matrix != transform_matrix)
1676 memcpy(transform_matrix, matrix, sizeof(transform_matrix));
1677 loc = mpglGetUniformLocation(gpu_cur_sl_program, "matrix");
1678 mpglUniformMatrix4fv(loc, 1, GL_FALSE, transform_matrix);
1679 }
1680
1681 static void use_program(GLuint prog) {
1682 GLint loc;
1683 static const GLint texs[] = {0, 1, 2, 3, 4};
1684 mpglUseProgram(prog);
1685 gpu_cur_sl_program = prog;
1686 loc = mpglGetUniformLocation(prog, "texs");
1687 mpglUniform1iv(loc, sizeof(texs)/sizeof(texs[0]), texs);
1688 matrix_uniform(transform_matrix);
1689 }
1690
1546 /** 1691 /**
1547 * \brief detect the best YUV->RGB conversion method available 1692 * \brief detect the best YUV->RGB conversion method available
1548 */ 1693 */
1549 int glAutodetectYUVConversion(void) { 1694 int glAutodetectYUVConversion(void) {
1550 const char *extensions = mpglGetString(GL_EXTENSIONS); 1695 const char *extensions = mpglGetString(GL_EXTENSIONS);
1551 const char *vendor = mpglGetString(GL_VENDOR); 1696 const char *vendor = mpglGetString(GL_VENDOR);
1552 // Imagination cannot parse floats in exponential representation (%e) 1697 // Imagination cannot parse floats in exponential representation (%e)
1553 int is_img = vendor && strstr(vendor, "Imagination") != NULL; 1698 int is_img = vendor && strstr(vendor, "Imagination") != NULL;
1699 if (!mpglBegin)
1700 return YUV_CONVERSION_SL_PROGRAM;
1554 if (!extensions || !mpglMultiTexCoord2f) 1701 if (!extensions || !mpglMultiTexCoord2f)
1555 return YUV_CONVERSION_NONE; 1702 return YUV_CONVERSION_NONE;
1556 if (strstr(extensions, "GL_ARB_fragment_program") && !is_img) 1703 if (strstr(extensions, "GL_ARB_fragment_program") && !is_img)
1557 return YUV_CONVERSION_FRAGMENT_LOOKUP; 1704 return YUV_CONVERSION_FRAGMENT_LOOKUP;
1558 if (strstr(extensions, "GL_ATI_text_fragment_shader") && !is_img) 1705 if (strstr(extensions, "GL_ATI_text_fragment_shader") && !is_img)
1587 case YUV_CONVERSION_FRAGMENT_LOOKUP3D: 1734 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
1588 case YUV_CONVERSION_FRAGMENT: 1735 case YUV_CONVERSION_FRAGMENT:
1589 case YUV_CONVERSION_FRAGMENT_POW: 1736 case YUV_CONVERSION_FRAGMENT_POW:
1590 glSetupYUVFragprog(params); 1737 glSetupYUVFragprog(params);
1591 break; 1738 break;
1739 case YUV_CONVERSION_SL_PROGRAM:
1740 break;
1592 case YUV_CONVERSION_NONE: 1741 case YUV_CONVERSION_NONE:
1593 break; 1742 break;
1594 default: 1743 default:
1595 mp_msg(MSGT_VO, MSGL_ERR, "[gl] unknown conversion type %i\n", YUV_CONVERSION(params->type)); 1744 mp_msg(MSGT_VO, MSGL_ERR, "[gl] unknown conversion type %i\n", YUV_CONVERSION(params->type));
1596 } 1745 }
1632 case YUV_CONVERSION_FRAGMENT_LOOKUP: 1781 case YUV_CONVERSION_FRAGMENT_LOOKUP:
1633 case YUV_CONVERSION_FRAGMENT_POW: 1782 case YUV_CONVERSION_FRAGMENT_POW:
1634 case YUV_CONVERSION_FRAGMENT: 1783 case YUV_CONVERSION_FRAGMENT:
1635 case YUV_CONVERSION_NONE: 1784 case YUV_CONVERSION_NONE:
1636 mpglEnable(GL_FRAGMENT_PROGRAM); 1785 mpglEnable(GL_FRAGMENT_PROGRAM);
1786 break;
1787 case YUV_CONVERSION_SL_PROGRAM:
1788 use_program(gpu_yuv_sl_program);
1637 break; 1789 break;
1638 } 1790 }
1639 } 1791 }
1640 1792
1641 /** 1793 /**
1678 case YUV_CONVERSION_FRAGMENT_LOOKUP: 1830 case YUV_CONVERSION_FRAGMENT_LOOKUP:
1679 case YUV_CONVERSION_FRAGMENT_POW: 1831 case YUV_CONVERSION_FRAGMENT_POW:
1680 case YUV_CONVERSION_FRAGMENT: 1832 case YUV_CONVERSION_FRAGMENT:
1681 case YUV_CONVERSION_NONE: 1833 case YUV_CONVERSION_NONE:
1682 mpglDisable(GL_FRAGMENT_PROGRAM); 1834 mpglDisable(GL_FRAGMENT_PROGRAM);
1835 break;
1836 case YUV_CONVERSION_SL_PROGRAM:
1837 use_program(gpu_def_sl_program);
1683 break; 1838 break;
1684 } 1839 }
1685 } 1840 }
1686 1841
1687 void glSetupAlphaStippleTex(unsigned pattern) { 1842 void glSetupAlphaStippleTex(unsigned pattern) {
1819 GLfloat texcoords [8] = {tx, ty, tx, ty + th, tx + tw, ty, tx + tw, ty + th}; 1974 GLfloat texcoords [8] = {tx, ty, tx, ty + th, tx + tw, ty, tx + tw, ty + th};
1820 GLfloat texcoords2[8] = {tx2, ty2, tx2, ty2 + th2, tx2 + tw2, ty2, tx2 + tw2, ty2 + th2}; 1975 GLfloat texcoords2[8] = {tx2, ty2, tx2, ty2 + th2, tx2 + tw2, ty2, tx2 + tw2, ty2 + th2};
1821 GLfloat texcoords3[8] = {vo_dx / 4.0, vo_dy / 4.0, vo_dx / 4.0, (vo_dy + vo_dheight) / 4.0, (vo_dx + vo_dwidth) / 4.0, vo_dy / 4.0, (vo_dx + vo_dwidth) / 4.0, (vo_dy + vo_dheight) / 4.0}; 1976 GLfloat texcoords3[8] = {vo_dx / 4.0, vo_dy / 4.0, vo_dx / 4.0, (vo_dy + vo_dheight) / 4.0, (vo_dx + vo_dwidth) / 4.0, vo_dy / 4.0, (vo_dx + vo_dwidth) / 4.0, (vo_dy + vo_dheight) / 4.0};
1822 1977
1823 if (!mpglBegin) { 1978 if (!mpglBegin) {
1824 mpglEnableClientState(GL_VERTEX_ARRAY); 1979 mpglVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vertices);
1825 mpglVertexPointer(2, GL_FLOAT, 0, vertices); 1980 mpglEnableVertexAttribArray(0);
1826 mpglEnableClientState(GL_TEXTURE_COORD_ARRAY); 1981 mpglVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, texcoords);
1827 mpglTexCoordPointer(2, GL_FLOAT, 0, texcoords); 1982 mpglEnableVertexAttribArray(1);
1828 if (use_stipple) { 1983 mpglVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, texcoords2);
1829 mpglClientActiveTexture(GL_TEXTURE3); 1984 mpglEnableVertexAttribArray(2);
1830 mpglEnableClientState(GL_TEXTURE_COORD_ARRAY); 1985 mpglVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 0, texcoords3);
1831 mpglTexCoordPointer(2, GL_FLOAT, 0, texcoords3); 1986 mpglEnableVertexAttribArray(3);
1832 }
1833 if (is_yv12) {
1834 mpglClientActiveTexture(GL_TEXTURE1);
1835 mpglEnableClientState(GL_TEXTURE_COORD_ARRAY);
1836 mpglTexCoordPointer(2, GL_FLOAT, 0, texcoords2);
1837 mpglClientActiveTexture(GL_TEXTURE2);
1838 mpglEnableClientState(GL_TEXTURE_COORD_ARRAY);
1839 mpglTexCoordPointer(2, GL_FLOAT, 0, texcoords2);
1840 mpglClientActiveTexture(GL_TEXTURE0);
1841 }
1842 mpglDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 1987 mpglDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
1843 if (use_stipple) {
1844 mpglClientActiveTexture(GL_TEXTURE3);
1845 mpglDisableClientState(GL_TEXTURE_COORD_ARRAY);
1846 }
1847 if (is_yv12) {
1848 mpglClientActiveTexture(GL_TEXTURE1);
1849 mpglDisableClientState(GL_TEXTURE_COORD_ARRAY);
1850 mpglClientActiveTexture(GL_TEXTURE2);
1851 mpglDisableClientState(GL_TEXTURE_COORD_ARRAY);
1852 mpglClientActiveTexture(GL_TEXTURE0);
1853 }
1854 mpglDisableClientState(GL_VERTEX_ARRAY);
1855 return; 1988 return;
1856 } 1989 }
1857 1990
1858 mpglBegin(GL_TRIANGLE_STRIP); 1991 mpglBegin(GL_TRIANGLE_STRIP);
1859 for (i = 0; i < 4; i++) { 1992 for (i = 0; i < 4; i++) {
2216 #endif 2349 #endif
2217 static void *eglgpa(const GLubyte *name) { 2350 static void *eglgpa(const GLubyte *name) {
2218 void *res = eglGetProcAddress(name); 2351 void *res = eglGetProcAddress(name);
2219 if (!res) { 2352 if (!res) {
2220 static const char * const paths[] = { 2353 static const char * const paths[] = {
2221 "/usr/lib/libGLESv1_CM.so", 2354 "/usr/lib/libGLESv2.so",
2222 "/usr/lib/x86_64-linux-gnu/libGLESv1_CM.so", 2355 "/usr/lib/x86_64-linux-gnu/libGLESv2.so",
2223 "/usr/lib/i386-linux-gnu/libGLESv1_CM.so", 2356 "/usr/lib/i386-linux-gnu/libGLESv2.so",
2224 NULL}; 2357 NULL};
2225 int i; 2358 int i;
2226 void *h = NULL; 2359 void *h = NULL;
2227 for (i = 0; !h && paths[i]; i++) 2360 for (i = 0; !h && paths[i]; i++)
2228 h = dlopen(paths[i], RTLD_LAZY); 2361 h = dlopen(paths[i], RTLD_LAZY);
2233 return res; 2366 return res;
2234 } 2367 }
2235 2368
2236 static int setGlWindow_egl(MPGLContext *ctx) 2369 static int setGlWindow_egl(MPGLContext *ctx)
2237 { 2370 {
2238 static const EGLint cfg_attribs[] = { EGL_NONE }; 2371 static const EGLint cfg_attribs[] = { EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NONE };
2239 static const EGLint ctx_attribs[] = { EGL_NONE }; 2372 static const EGLint ctx_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
2240 EGLContext *context = &ctx->context.egl; 2373 EGLContext *context = &ctx->context.egl;
2241 EGLContext new_context = NULL; 2374 EGLContext new_context = NULL;
2242 EGLConfig eglConfig; 2375 EGLConfig eglConfig;
2243 int num_configs; 2376 int num_configs;
2244 #ifdef CONFIG_GL_EGL_ANDROID 2377 #ifdef CONFIG_GL_EGL_ANDROID
2296 *context = new_context; 2429 *context = new_context;
2297 2430
2298 getFunctions(eglgpa, eglQueryString(eglDisplay, EGL_EXTENSIONS)); 2431 getFunctions(eglgpa, eglQueryString(eglDisplay, EGL_EXTENSIONS));
2299 mpglBegin = NULL; 2432 mpglBegin = NULL;
2300 mpglDrawBuffer = NULL; 2433 mpglDrawBuffer = NULL;
2434
2435 gpu_def_sl_program = new_gpu_program();
2436 gpu_yuv_sl_program = new_gpu_program();
2437 set_frag_src(gpu_def_sl_program, def_frag_shader);
2438 set_frag_src(gpu_yuv_sl_program, yuv_frag_shader);
2439 mpglLoadMatrixf = matrix_uniform;
2440 use_program(gpu_def_sl_program);
2301 2441
2302 // and inform that reinit is necessary 2442 // and inform that reinit is necessary
2303 return SET_WINDOW_REINIT; 2443 return SET_WINDOW_REINIT;
2304 } 2444 }
2305 2445