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, ¶ms); + 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, ¶ms); + 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, ¶ms); + 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; }