diff options
| author | degasus <wickmarkus@web.de> | 2013-02-07 12:47:41 +0100 |
|---|---|---|
| committer | degasus <wickmarkus@web.de> | 2013-02-07 12:47:41 +0100 |
| commit | f079b04a5daafc1def25bb26c1111c4b02039666 (patch) | |
| tree | 54e57f134498bbb592c4f69a42fb20dc6a5dcbe1 /Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | |
| parent | 9987765b1f6b44881a7e42cb11f70ff3053682a2 (diff) | |
also check for glsl errors on linking, activation GLSL_DEBUG again (slowdown on shader compilation)
Diffstat (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp')
| -rw-r--r-- | Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index b56bb8919d..5481f26541 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -184,6 +184,48 @@ void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) SetProgramBindings(entry); glLinkProgram(entry.prog_id); + +#if defined(_DEBUG) || defined(DEBUGFAST) || defined(DEBUG_GLSL) + GLsizei length = 0; + glGetProgramiv(entry.prog_id, GL_INFO_LOG_LENGTH, &length); + if (length > 1) + { + GLsizei charsWritten; + GLchar* infoLog = new GLchar[length]; + glGetProgramInfoLog(entry.prog_id, length, &charsWritten, infoLog); + ERROR_LOG(VIDEO, "Program info log:\n%s", infoLog); + char szTemp[MAX_PATH]; + sprintf(szTemp, "p_%d.txt", entry.prog_id); + FILE *fp = fopen(szTemp, "wb"); + fwrite(infoLog, length, 1, fp); + delete[] infoLog; + + glGetShaderiv(VS, GL_SHADER_SOURCE_LENGTH, &length); + GLchar* src = new GLchar[length]; + glGetShaderSource(VS, length, &charsWritten, src); + fwrite(src, strlen(src), 1, fp); + delete [] src; + + glGetShaderiv(PS, GL_SHADER_SOURCE_LENGTH, &length); + src = new GLchar[length]; + glGetShaderSource(PS, length, &charsWritten, src); + fwrite(src, strlen(src), 1, fp); + delete [] src; + fclose(fp); + } + + GLint linkStatus; + glGetProgramiv(entry.prog_id, GL_LINK_STATUS, &linkStatus); + if (linkStatus != GL_TRUE) + { + // Compile failed + ERROR_LOG(VIDEO, "Program linking failed; see info log"); + + // Don't try to use this shader + glDeleteProgram(entry.prog_id); + return; + } +#endif glUseProgram(entry.prog_id); |
