From 15b6eaa48facb77f5c86bca8057c6b0de6f5165f Mon Sep 17 00:00:00 2001
From: Tim Felgentreff <timfelgentreff@gmail.com>
Date: Tue, 15 Mar 2016 00:09:42 +0100
Subject: [PATCH] do proper error checking when testing if shaders are
 supported, so when the hardware won't accept the shader or the program (even
 though the opengl lib supports it), we don't get an upside down image any
 longer

---
 src/include/shaders.h |  2 +-
 src/ui/interface.cpp  |  1 +
 src/video/shaders.cpp | 37 ++++++++++++++++++++++++++++++++++---
 3 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/src/include/shaders.h b/src/include/shaders.h
index 5c6ec27c1..6cc07a479 100644
--- a/src/include/shaders.h
+++ b/src/include/shaders.h
@@ -9,7 +9,7 @@ extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebuffer;
 #endif
 extern GLuint fullscreenFramebuffer;
 extern unsigned ShaderIndex;
-extern void LoadShaders();
+extern bool LoadShaders();
 extern bool LoadShaderExtensions();
 extern void SetupFramebuffer();
 extern void RenderFramebufferToScreen();
diff --git a/src/ui/interface.cpp b/src/ui/interface.cpp
index 7dcb49414..9e5639967 100644
--- a/src/ui/interface.cpp
+++ b/src/ui/interface.cpp
@@ -993,6 +993,7 @@ int HandleKeyModifiersDown(unsigned key, unsigned)
 			return 1;
 		case SDLK_SYSREQ:
 		case SDLK_PRINT:
+		case SDLK_F11:
 			Screenshot();
 			if (GameRunning) {
 				SetMessage("%s", _("Screenshot made."));
diff --git a/src/video/shaders.cpp b/src/video/shaders.cpp
index 8ccd02324..08f502e79 100644
--- a/src/video/shaders.cpp
+++ b/src/video/shaders.cpp
@@ -394,27 +394,59 @@ void printProgramInfoLog(GLuint obj, const char* prefix)
 
 unsigned ShaderIndex = 0;
 
-extern void LoadShaders() {
+extern bool LoadShaders() {
 	GLuint vs, fs;
+	GLint params;
 	fs = glCreateShader(GL_FRAGMENT_SHADER);
+	if (fs == 0) {
+	    return false;
+	}
 	glShaderSource(fs, 1, (const char**)&(fragment_shaders[ShaderIndex]), NULL);
 	glCompileShader(fs);
+	glGetShaderiv(fs, GL_COMPILE_STATUS, &params);
+	if (params == GL_FALSE) {
+		glDeleteShader(fs);
+		return false;
+	}
 	//printShaderInfoLog(fs, "Fragment Shader");
 	ShaderIndex = (ShaderIndex + 1) % MAX_SHADERS;
 	vs = glCreateShader(GL_VERTEX_SHADER);
+	if (fs == 0) {
+	    glDeleteShader(fs);
+	    return false;
+	}
 	glShaderSource(vs, 1, (const char**)&vertex_shader, NULL);
 	glCompileShader(vs);
+	glGetShaderiv(fs, GL_COMPILE_STATUS, &params);
+	if (params == GL_FALSE) {
+		glDeleteShader(fs);
+		glDeleteShader(vs);
+		return false;
+	}
 	//printShaderInfoLog(vs, "Vertex Shader");
 	if (glIsProgram(fullscreenShader)) {
 		glDeleteProgram(fullscreenShader);
 	}
 	fullscreenShader = glCreateProgram();
+	if (fullscreenShader == 0) {
+		glDeleteShader(fs);
+		glDeleteShader(vs);
+		return false;
+	}
 	glAttachShader(fullscreenShader, vs);
 	glAttachShader(fullscreenShader, fs);
 	glLinkProgram(fullscreenShader);
+	glGetProgramiv(fullscreenShader, GL_LINK_STATUS, &params);
+	if (params == GL_FALSE) {
+		glDeleteShader(fs);
+		glDeleteShader(vs);
+		glDeleteProgram(fullscreenShader);
+		return false;
+	}
 	glDeleteShader(fs);
 	glDeleteShader(vs);
 	//printProgramInfoLog(fullscreenShader, "Shader Program");
+	return true;
 }
 
 extern bool LoadShaderExtensions() {
@@ -449,8 +481,7 @@ extern bool LoadShaderExtensions() {
 	glDrawBuffers = (PFNGLDRAWBUFFERSPROC)(uintptr_t)SDL_GL_GetProcAddress("glDrawBuffers");
 	glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)(uintptr_t)SDL_GL_GetProcAddress("glCheckFramebufferStatus");
 	if (glCreateShader && glGenFramebuffers && glGetUniformLocation && glActiveTextureProc) {
-		LoadShaders();
-		return true;
+		return LoadShaders();
 	} else {
 		return false;
 	}