summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Morris <mikemorris@users.noreply.github.com>2016-08-24 15:47:21 -0400
committerMike Morris <mikemorris@users.noreply.github.com>2016-08-26 10:56:19 -0400
commit51e6e2684496f9d858ce77e86fbd964b8b3abb9b (patch)
tree0e397962d5c05b836ae709d9bd793c2bdb3c1dc0
parent6703249b3e6084eb5b93ee4626c4327791853a8e (diff)
downloadqtlocation-mapboxgl-51e6e2684496f9d858ce77e86fbd964b8b3abb9b.tar.gz
[core] check GL errors in loop
As recommended in https://www.opengl.org/wiki/GLAPI/glGetError
-rw-r--r--src/mbgl/gl/gl.cpp40
1 files changed, 26 insertions, 14 deletions
diff --git a/src/mbgl/gl/gl.cpp b/src/mbgl/gl/gl.cpp
index 59aaaa3255..b74d52bbbd 100644
--- a/src/mbgl/gl/gl.cpp
+++ b/src/mbgl/gl/gl.cpp
@@ -2,6 +2,7 @@
#include <mbgl/util/string.hpp>
#include <mbgl/platform/log.hpp>
+#include <cstring>
#include <cassert>
#include <iostream>
#include <map>
@@ -61,30 +62,41 @@ 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;
+char* parseErrors(std::vector<GLenum> errors) {
+ char* error = nullptr;
+
+ for (auto &err : errors) {
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;
+ case GL_INVALID_ENUM: strcat(error, "INVALID_ENUM"); break;
+ case GL_INVALID_VALUE: strcat(error, "INVALID_VALUE"); break;
+ case GL_INVALID_OPERATION: strcat(error, "INVALID_OPERATION"); break;
#ifdef GL_STACK_OVERFLOW
- case GL_STACK_OVERFLOW: error = "STACK_OVERFLOW"; break;
+ case GL_STACK_OVERFLOW: strcat(error, "STACK_OVERFLOW"); break;
#endif
#ifdef GL_STACK_UNDERFLOW
- case GL_STACK_UNDERFLOW: error = "STACK_UNDERFLOW"; break;
+ case GL_STACK_UNDERFLOW: strcat(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;
+ case GL_OUT_OF_MEMORY: strcat(error, "OUT_OF_MEMORY"); break;
+ case GL_INVALID_FRAMEBUFFER_OPERATION: strcat(error, "INVALID_FRAMEBUFFER_OPERATION"); break;
#ifdef GL_CONTEXT_LOST
- case GL_CONTEXT_LOST: error = "CONTEXT_LOST"; break;
+ case GL_CONTEXT_LOST: strcat(error, "CONTEXT_LOST"); break;
#endif
- default: error = "(unknown)"; break;
+ default: strcat(error, "(unknown)"); break;
}
+ }
+
+ return error;
+}
+
+void checkError(const char *cmd, const char *file, int line) {
+ std::vector<GLenum> errors;
+ GLenum err = GL_NO_ERROR;
- throw ::mbgl::gl::Error(err, std::string(cmd) + ": Error GL_" + error + " - " + file + ":" + util::toString(line));
+ while((err = glGetError()) != GL_NO_ERROR) {
+ errors.push_back(err);
}
+
+ if (!errors.empty()) throw ::mbgl::gl::Error(err, std::string(cmd) + ": Error GL_" + parseErrors(errors) + " - " + file + ":" + util::toString(line));
}
} // namespace gl
} // namespace mbgl