[core] check GL errors in loop
As recommended in https://www.opengl.org/wiki/GLAPI/glGetError char* -> std::string
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user