[core] check GL errors in loop

As recommended in https://www.opengl.org/wiki/GLAPI/glGetError

char* -> std::string
This commit is contained in:
Mike Morris
2016-08-24 15:47:21 -04:00
parent 658354ced1
commit 6fe621bbef
2 changed files with 60 additions and 25 deletions

View File

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

View File

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