summaryrefslogtreecommitdiff
path: root/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp
diff options
context:
space:
mode:
authordegasus <wickmarkus@web.de>2013-02-07 12:47:41 +0100
committerdegasus <wickmarkus@web.de>2013-02-07 12:47:41 +0100
commitf079b04a5daafc1def25bb26c1111c4b02039666 (patch)
tree54e57f134498bbb592c4f69a42fb20dc6a5dcbe1 /Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp
parent9987765b1f6b44881a7e42cb11f70ff3053682a2 (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.cpp42
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);