From 6c580faad9712c15344c7531c11b6e0c4b5c822b Mon Sep 17 00:00:00 2001 From: Oleksandr Shcherbina Date: Mon, 6 Jun 2016 16:39:38 -0700 Subject: [PATCH] evas: fix order binding attributes to gl. Summary: In same cases(devices) can lead to mix up attributes in shaders. @fix Reviewers: cedric, Hermet, raster Subscribers: jpeg Differential Revision: https://phab.enlightenment.org/D4012 Signed-off-by: Cedric BAIL --- .../engines/gl_common/evas_gl_3d_shader.c | 108 +++++++++--------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/src/modules/evas/engines/gl_common/evas_gl_3d_shader.c b/src/modules/evas/engines/gl_common/evas_gl_3d_shader.c index 7fef49092b..0ead38a961 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_3d_shader.c +++ b/src/modules/evas/engines/gl_common/evas_gl_3d_shader.c @@ -216,59 +216,6 @@ _shader_compile(GLuint shader, const char *src) return EINA_TRUE; } -static inline Eina_Bool -_program_build(E3D_Program *program, const char *vert_src, const char *frag_src) -{ - GLint ok = 0; - - /* Create OpenGL vertex & fragment shader object. */ - program->vert = glCreateShader(GL_VERTEX_SHADER); - program->frag = glCreateShader(GL_FRAGMENT_SHADER); - - /* Commpile vertex shader. */ - if (!_shader_compile(program->vert, vert_src)) - { - ERR("Faield to compile vertex shader."); - return EINA_FALSE; - } - - /* Compile fragment shader. */ - if (!_shader_compile(program->frag, frag_src)) - { - ERR("Failed to compile fragment shader."); - return EINA_FALSE; - } - - /* Create OpenGL program object. */ - program->prog = glCreateProgram(); - - /* Attach shaders. */ - glAttachShader(program->prog, program->vert); - glAttachShader(program->prog, program->frag); - - /* Link program. */ - glLinkProgram(program->prog); - - /* Check link status. */ - glGetProgramiv(program->prog, GL_LINK_STATUS, &ok); - - if (!ok) - { - GLchar *log_str; - GLint len = 0; - GLsizei info_len; - - glGetProgramiv(program->prog, GL_INFO_LOG_LENGTH, &len); - log_str = (GLchar *)malloc(len); - glGetProgramInfoLog(program->prog, len, &info_len, log_str); - ERR("Shader link failed.\n%s", log_str); - free(log_str); - return EINA_FALSE; - } - - return EINA_TRUE; -} - static inline void _program_vertex_attrib_bind(E3D_Program *program) { @@ -305,6 +252,60 @@ _program_vertex_attrib_bind(E3D_Program *program) glBindAttribLocation(program->prog, index++, "aTexCoord1"); } +static inline Eina_Bool +_program_build(E3D_Program *program, const char *vert_src, const char *frag_src) +{ + GLint ok = 0; + + /* Create OpenGL vertex & fragment shader object. */ + program->vert = glCreateShader(GL_VERTEX_SHADER); + program->frag = glCreateShader(GL_FRAGMENT_SHADER); + + /* Commpile vertex shader. */ + if (!_shader_compile(program->vert, vert_src)) + { + ERR("Faield to compile vertex shader."); + return EINA_FALSE; + } + + /* Compile fragment shader. */ + if (!_shader_compile(program->frag, frag_src)) + { + ERR("Failed to compile fragment shader."); + return EINA_FALSE; + } + + /* Create OpenGL program object. */ + program->prog = glCreateProgram(); + + /* Attach shaders. */ + glAttachShader(program->prog, program->vert); + glAttachShader(program->prog, program->frag); + + _program_vertex_attrib_bind(program); + /* Link program. */ + glLinkProgram(program->prog); + + /* Check link status. */ + glGetProgramiv(program->prog, GL_LINK_STATUS, &ok); + + if (!ok) + { + GLchar *log_str; + GLint len = 0; + GLsizei info_len; + + glGetProgramiv(program->prog, GL_INFO_LOG_LENGTH, &len); + log_str = (GLchar *)malloc(len); + glGetProgramInfoLog(program->prog, len, &info_len, log_str); + ERR("Shader link failed.\n%s", log_str); + free(log_str); + return EINA_FALSE; + } + + return EINA_TRUE; +} + static const char *uniform_names[] = { "uMatrixMvp", @@ -696,7 +697,6 @@ e3d_program_new(Evas_Canvas3D_Shader_Mode mode, E3D_Shader_Flag flags) if (! _program_build(program, vert.str, frag.str)) goto error; - _program_vertex_attrib_bind(program); _program_uniform_init(program); _shader_string_fini(&vert);