void yagl_host_glCompileShader(GLuint shader)
{
+#ifndef CONFIG_DARWIN
gles_api_ts->driver->CompileShader(yagl_gles_object_get(shader));
+#else
+ GLint tmp = 0;
+
+ YAGL_LOG_FUNC_SET(glCompileShader);
+
+ gles_api_ts->driver->CompileShader(yagl_gles_object_get(shader));
+
+ gles_api_ts->driver->GetShaderiv(yagl_gles_object_get(shader), GL_COMPILE_STATUS, &tmp);
+ if (tmp == GL_FALSE) {
+ char *buff;
+ char *substring;
+ const char textue2d_err[] = "undeclared identifier 'texture2D'";
+ const char texture_lookup_define[] = "#define TextureLookup texture2D";
+
+ tmp = 0;
+ gles_api_ts->driver->GetShaderiv(yagl_gles_object_get(shader), GL_INFO_LOG_LENGTH, &tmp);
+ buff = g_malloc0(tmp);
+ gles_api_ts->driver->GetShaderInfoLog(yagl_gles_object_get(shader), tmp, NULL, buff);
+ if (gles_api_ts->driver->gl_version < yagl_gl_3_2 ||
+ strstr(buff, textue2d_err) == NULL) {
+ YAGL_LOG_ERROR("Unable to compile shader %s", buff);
+ g_free(buff);
+ return;
+ }
+ YAGL_LOG_DEBUG("Unable to compile shader %s", buff);
+ g_free(buff);
+
+ tmp = 0;
+ gles_api_ts->driver->GetShaderiv(yagl_gles_object_get(shader), GL_SHADER_SOURCE_LENGTH, &tmp);
+ buff = g_malloc0(tmp);
+ gles_api_ts->driver->GetShaderSource(yagl_gles_object_get(shader), tmp, NULL, buff);
+ YAGL_LOG_DEBUG("Shader Source: \n%s", buff);
+
+ substring = strstr(buff, texture_lookup_define);
+ if (substring) {
+ const GLchar *strings[1];
+ GLint lenghts[1];
+
+ /* texture2D -> texture\n\n */
+ substring[strlen(texture_lookup_define) - 1] = '\n';
+ substring[strlen(texture_lookup_define) - 2] = '\n';
+
+ strings[0] = buff;
+ lenghts[0] = tmp - 1;
+
+ gles_api_ts->driver->ShaderSource(yagl_gles_object_get(shader),
+ 1,
+ strings,
+ lenghts);
+ gles_api_ts->driver->CompileShader(yagl_gles_object_get(shader));
+ gles_api_ts->driver->GetShaderiv(yagl_gles_object_get(shader), GL_COMPILE_STATUS, &tmp);
+ if (!tmp) {
+ YAGL_LOG_ERROR("Unable to compile the patched shader source: \n%s", buff);
+ g_free(buff);
+
+ tmp = 0;
+ gles_api_ts->driver->GetShaderiv(yagl_gles_object_get(shader), GL_INFO_LOG_LENGTH, &tmp);
+ buff = g_malloc0(tmp);
+ gles_api_ts->driver->GetShaderInfoLog(yagl_gles_object_get(shader), tmp, NULL, buff);
+ YAGL_LOG_ERROR("Cause of compilation failure: %s", buff);
+ }
+ }
+ g_free(buff);
+ }
+#endif
}
void yagl_host_glBindAttribLocation(GLuint program,
YAGL_GLES_OGL_GET_PROC(driver, GetProgramInfoLog, glGetProgramInfoLog);
YAGL_GLES_OGL_GET_PROC(driver, GetShaderiv, glGetShaderiv);
YAGL_GLES_OGL_GET_PROC(driver, GetShaderInfoLog, glGetShaderInfoLog);
+ YAGL_GLES_OGL_GET_PROC(driver, GetShaderSource, glGetShaderSource);
YAGL_GLES_OGL_GET_PROC(driver, GetUniformfv, glGetUniformfv);
YAGL_GLES_OGL_GET_PROC(driver, GetUniformiv, glGetUniformiv);
YAGL_GLES_OGL_GET_PROC(driver, GetUniformLocation, glGetUniformLocation);
YAGL_GLES_DRIVER_FUNC4(GetProgramInfoLog, GLuint, GLsizei, GLsizei*, GLchar*, program, bufsize, length, infolog)
YAGL_GLES_DRIVER_FUNC3(GetShaderiv, GLuint, GLenum, GLint*, shader, pname, params)
YAGL_GLES_DRIVER_FUNC4(GetShaderInfoLog, GLuint, GLsizei, GLsizei*, GLchar*, shader, bufsize, length, infolog)
+ YAGL_GLES_DRIVER_FUNC4(GetShaderSource, GLuint, GLsizei, GLsizei*, GLchar*, shader, bufsize, length, source)
YAGL_GLES_DRIVER_FUNC3(GetUniformfv, GLuint, GLint, GLfloat*, program, location, params)
YAGL_GLES_DRIVER_FUNC3(GetUniformiv, GLuint, GLint, GLint*, program, location, params)
YAGL_GLES_DRIVER_FUNC_RET2(int, GetUniformLocation, GLuint, const GLchar*, program, name)