From 8f7ec2fa091fe66d2ff20464cdc4d9499692d2e5 Mon Sep 17 00:00:00 2001 From: Allanis <allanis@saracraft.net> Date: Wed, 15 May 2013 23:22:39 +0100 Subject: [PATCH] [Add] Finally added opengl error checking in DEBUG builds. --- src/font.c | 15 ++++++++++++-- src/lephisto.c | 2 ++ src/opengl.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/opengl.h | 1 + 4 files changed, 71 insertions(+), 2 deletions(-) diff --git a/src/font.c b/src/font.c index 2506149..d87523a 100644 --- a/src/font.c +++ b/src/font.c @@ -72,6 +72,8 @@ void gl_print(const glFont* ft_font, const double x, const double y, glPopMatrix(); // Translation matrix. glDisable(GL_TEXTURE_2D); + + gl_checkErr(); } // Acts just like gl_print, but prints to a max length of max. @@ -120,6 +122,8 @@ int gl_printMax(const glFont* ft_font, const int max, glPopMatrix(); // Translation matrix. glDisable(GL_TEXTURE_2D); + gl_checkErr(); + return ret; } @@ -173,6 +177,8 @@ int gl_printMid(const glFont* ft_font, const int width, double x, const double y glPopMatrix(); // Translation matrix. glDisable(GL_TEXTURE_2D); + gl_checkErr(); + return ret; } @@ -256,6 +262,8 @@ int gl_printText(const glFont* ft_font, const int width, const int height, } glDisable(GL_TEXTURE_2D); + gl_checkErr(); + return ret; } @@ -407,12 +415,16 @@ static void glFontMakeDList(FT_Face face, char ch, GLuint list_base, glEndList(); FT_Done_Glyph(glyph); + + gl_checkErr(); } void gl_fontInit(glFont* font, const char* fname, const unsigned int h) { + uint32_t bufsize; + int i; + if(font == NULL) font = &gl_defFont; - uint32_t bufsize; FT_Byte* buf = pack_readfile(DATA, (fname) ? fname : FONT_DEF, &bufsize); // Allocatagery. @@ -443,7 +455,6 @@ void gl_fontInit(glFont* font, const char* fname, const unsigned int h) { glGenTextures(128, font->textures); // Create each of the font display lists. - unsigned char i; for(i = 0; i < 128; i++) glFontMakeDList(face, i, font->list_base, font->textures, font->w); diff --git a/src/lephisto.c b/src/lephisto.c index 3ff4f00..03cbd80 100644 --- a/src/lephisto.c +++ b/src/lephisto.c @@ -246,6 +246,8 @@ void main_loop(void) { } if(toolkit) toolkit_render(); + gl_checkErr(); // Check error every loop. + SDL_GL_SwapBuffers(); } diff --git a/src/opengl.c b/src/opengl.c index fa10a69..357f547 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -141,6 +141,8 @@ void gl_screenshot(const char* filename) { for(i = 0; i < screen->h; i++) rows[i] = screenbuf[screen->h - i - 1]; write_png(filename, rows, screen->w, screen->h, PNG_COLOR_TYPE_RGB, 8); + + gl_checkErr(); } // ================ @@ -235,6 +237,8 @@ static GLuint gl_loadSurface(SDL_Surface* surface, int* rw, int* rh) { SDL_UnlockSurface(surface); SDL_FreeSurface(surface); + gl_checkErr(); + return texture; } @@ -387,6 +391,8 @@ void gl_blitSprite(const glTexture* sprite, const double bx, const double by, glEnd(); glDisable(GL_TEXTURE_2D); + + gl_checkErr(); } // Just straight out blit the thing at position. @@ -419,6 +425,8 @@ void gl_blitStatic(const glTexture* texture, const double bx, const double by, glEnd(); glDisable(GL_TEXTURE_2D); + + gl_checkErr(); } // Bind our precious camera to a vector. @@ -469,6 +477,8 @@ void gl_drawCircle(const double cx, const double cy, const double r) { } } glEnd(); + + gl_checkErr(); } // Draw a cirlce in a rect. @@ -532,7 +542,10 @@ void gl_drawCircleInRect(const double cx, const double cy, const double r, } } glEnd(); + + gl_checkErr(); } +#undef PIXEL // ================ // GLOBAL. @@ -564,6 +577,46 @@ static GLboolean gl_hasExt(char* name) { return GL_FALSE; } +// Check and report if there's been an error. +void gl_checkErr(void) { +#ifdef DEBUG + GLenum err; + char* errstr; + + err = glGetError(); + + if(err == GL_NO_ERROR) return; // No error. + + switch(err) { + case GL_INVALID_ENUM: + errstr = "GL invalid enum"; + break; + case GL_INVALID_VALUE: + errstr = "GL invalid operation"; + break; + case GL_INVALID_OPERATION: + errstr = "GL invalid operation"; + break; + case GL_STACK_OVERFLOW: + errstr = "GL stack overflow"; + break; + case GL_STACK_UNDERFLOW: + errstr = "GL stack underflow"; + break; + case GL_OUT_OF_MEMORY: + errstr = "GL out of memory"; + break; + case GL_TABLE_TOO_LARGE: + errstr = "GL table too large"; + break; + default: + errstr = "GL unkown error"; + break; + } + WARN("OpenGL error: %s", errstr); +#endif +} + // Initialize SDL/OpenGL etc. int gl_init(void) { int doublebuf, depth, i, j, off, toff, supported; @@ -683,6 +736,8 @@ int gl_init(void) { glClear(GL_COLOR_BUFFER_BIT); + gl_checkErr(); + return 0; } diff --git a/src/opengl.h b/src/opengl.h index 720df0f..e20aef5 100644 --- a/src/opengl.h +++ b/src/opengl.h @@ -79,4 +79,5 @@ void gl_exit(void); int gl_isTrans(const glTexture* t, const int x, const int y); void gl_getSpriteFromDir(int* x, int* y, const glTexture* t, const double dir); void gl_screenshot(const char* filename); +void gl_checkErr(void);