diff options
author | Dominique Martinet <asmadeus@codewreck.org> | 2017-08-12 00:02:33 +0200 |
---|---|---|
committer | Dominique Martinet <asmadeus@codewreck.org> | 2017-08-12 00:24:30 +0200 |
commit | c323bfc6a0016076e3a27a639da23f6c176c68fa (patch) | |
tree | 8648e8be04ad0a75b7dfd241bb4d9e93659a8e72 | |
parent | de86965174a5ccb6c204c52d6e57812c1fa64a24 (diff) |
GLES2: detach and delete shaders after LinkProgram
Also make sure program linked correctly!
-rw-r--r-- | render/gles2/renderer.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c index 237dc67b..c1bf4815 100644 --- a/render/gles2/renderer.c +++ b/render/gles2/renderer.c @@ -30,7 +30,7 @@ static bool compile_shader(GLuint type, const GLchar *src, GLuint *shader) { GL_CALL(glGetShaderInfoLog(*shader, loglen, &loglen, msg)); wlr_log(L_ERROR, "Shader compilation failed"); wlr_log(L_ERROR, "%s", msg); - exit(1); + glDeleteShader(*shader); return false; } return true; @@ -43,13 +43,32 @@ static bool compile_program(const GLchar *vert_src, return false; } if (!compile_shader(GL_FRAGMENT_SHADER, frag_src, &fragment)) { - glDeleteProgram(vertex); + glDeleteShader(vertex); return false; } *program = GL_CALL(glCreateProgram()); GL_CALL(glAttachShader(*program, vertex)); GL_CALL(glAttachShader(*program, fragment)); GL_CALL(glLinkProgram(*program)); + GLint success; + GL_CALL(glGetProgramiv(*program, GL_LINK_STATUS, &success)); + if (success == GL_FALSE) { + GLint loglen; + GL_CALL(glGetProgramiv(*program, GL_INFO_LOG_LENGTH, &loglen)); + GLchar msg[loglen]; + GL_CALL(glGetProgramInfoLog(*program, loglen, &loglen, msg)); + wlr_log(L_ERROR, "Program link failed"); + wlr_log(L_ERROR, "%s", msg); + glDeleteProgram(*program); + glDeleteShader(vertex); + glDeleteShader(fragment); + return false; + } + glDetachShader(*program, vertex); + glDetachShader(*program, fragment); + glDeleteShader(vertex); + glDeleteShader(fragment); + return true; } |