From 6fe621bbef43e6b73a53ca25a9df3d349cd84929 Mon Sep 17 00:00:00 2001 From: Mike Morris Date: Wed, 24 Aug 2016 15:47:21 -0400 Subject: [PATCH] [core] check GL errors in loop As recommended in https://www.opengl.org/wiki/GLAPI/glGetError char* -> std::string --- include/mbgl/gl/gl.hpp | 5 ++- src/mbgl/gl/gl.cpp | 80 ++++++++++++++++++++++++++++++------------ 2 files changed, 60 insertions(+), 25 deletions(-) diff --git a/include/mbgl/gl/gl.hpp b/include/mbgl/gl/gl.hpp index 285f1ff3b..092166ef9 100644 --- a/include/mbgl/gl/gl.hpp +++ b/include/mbgl/gl/gl.hpp @@ -59,9 +59,8 @@ namespace gl { void mbx_trapExtension(const char *name, GLuint array); #endif -struct Error : ::std::runtime_error { - Error(GLenum err, const std::string &msg) : ::std::runtime_error(msg), code(err) {}; - const GLenum code; +struct Error : std::runtime_error { + using std::runtime_error::runtime_error; }; void checkError(const char *cmd, const char *file, int line); diff --git a/src/mbgl/gl/gl.cpp b/src/mbgl/gl/gl.cpp index 463d2e565..54e9df53e 100644 --- a/src/mbgl/gl/gl.cpp +++ b/src/mbgl/gl/gl.cpp @@ -61,31 +61,67 @@ void InitializeExtensions(glProc (*getProcAddress)(const char *)) { }); } -void checkError(const char *cmd, const char *file, int line) { - const GLenum err = glGetError(); - if (err != GL_NO_ERROR) { - const char *error = nullptr; - switch (err) { - case GL_INVALID_ENUM: error = "INVALID_ENUM"; break; - case GL_INVALID_VALUE: error = "INVALID_VALUE"; break; - case GL_INVALID_OPERATION: error = "INVALID_OPERATION"; break; -#ifdef GL_STACK_OVERFLOW - case GL_STACK_OVERFLOW: error = "STACK_OVERFLOW"; break; -#endif -#ifdef GL_STACK_UNDERFLOW - case GL_STACK_UNDERFLOW: error = "STACK_UNDERFLOW"; break; -#endif - case GL_OUT_OF_MEMORY: error = "OUT_OF_MEMORY"; break; - case GL_INVALID_FRAMEBUFFER_OPERATION: error = "INVALID_FRAMEBUFFER_OPERATION"; break; -#ifdef GL_CONTEXT_LOST - case GL_CONTEXT_LOST: error = "CONTEXT_LOST"; break; -#endif - default: error = "(unknown)"; break; - } +namespace { - throw ::mbgl::gl::Error(err, std::string(cmd) + ": Error GL_" + error + " - " + file + ":" + util::toString(line)); +constexpr const char* stringFromError(GLenum err) { + switch (err) { + case GL_INVALID_ENUM: + return "GL_INVALID_ENUM"; + + case GL_INVALID_VALUE: + return "GL_INVALID_VALUE"; + + case GL_INVALID_OPERATION: + return "GL_INVALID_OPERATION"; + + case GL_INVALID_FRAMEBUFFER_OPERATION: + return "GL_INVALID_FRAMEBUFFER_OPERATION"; + + case GL_OUT_OF_MEMORY: + return "GL_OUT_OF_MEMORY"; + +#ifdef GL_TABLE_TOO_LARGE + case GL_TABLE_TOO_LARGE: + return "GL_TABLE_TOO_LARGE"; +#endif + +#ifdef GL_STACK_OVERFLOW + case GL_STACK_OVERFLOW: + return "GL_STACK_OVERFLOW"; +#endif + +#ifdef GL_STACK_UNDERFLOW + case GL_STACK_UNDERFLOW: + return "GL_STACK_UNDERFLOW"; +#endif + +#ifdef GL_CONTEXT_LOST + case GL_CONTEXT_LOST: + return "GL_CONTEXT_LOST"; +#endif + + default: + return "GL_UNKNOWN"; } } + +} // namespace + +void checkError(const char* cmd, const char* file, int line) { + GLenum err = GL_NO_ERROR; + if ((err = glGetError()) != GL_NO_ERROR) { + std::string message = std::string(cmd) + ": Error " + stringFromError(err); + + // Check for further errors + while ((err = glGetError()) != GL_NO_ERROR) { + message += ", "; + message += stringFromError(err); + } + + throw Error(message + " at " + file + ":" + util::toString(line)); + } +} + } // namespace gl } // namespace mbgl