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

This commit is contained in:
Tim Felgentreff 2016-03-15 00:09:42 +01:00
parent 8c314be70d
commit 15b6eaa48f
3 changed files with 36 additions and 4 deletions

View file

@ -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();

View file

@ -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."));

View file

@ -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;
}