forked from enlightenment/efl
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 <cedric@osg.samsung.com>
This commit is contained in:
parent
32fd16dfc0
commit
6c580faad9
|
@ -216,59 +216,6 @@ _shader_compile(GLuint shader, const char *src)
|
||||||
return EINA_TRUE;
|
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
|
static inline void
|
||||||
_program_vertex_attrib_bind(E3D_Program *program)
|
_program_vertex_attrib_bind(E3D_Program *program)
|
||||||
{
|
{
|
||||||
|
@ -305,6 +252,60 @@ _program_vertex_attrib_bind(E3D_Program *program)
|
||||||
glBindAttribLocation(program->prog, index++, "aTexCoord1");
|
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[] =
|
static const char *uniform_names[] =
|
||||||
{
|
{
|
||||||
"uMatrixMvp",
|
"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))
|
if (! _program_build(program, vert.str, frag.str))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
_program_vertex_attrib_bind(program);
|
|
||||||
_program_uniform_init(program);
|
_program_uniform_init(program);
|
||||||
|
|
||||||
_shader_string_fini(&vert);
|
_shader_string_fini(&vert);
|
||||||
|
|
Loading…
Reference in New Issue