#ifdef __GNUC__
#define MUST_CHECK_RESULT __attribute__((warn_unused_result))
+#define DOES_NOT_RETURN __attribute__((noreturn))
#else
#define MUST_CHECK_RESULT
+#define DOES_NOT_RETURN
#endif
#endif // !defined(_MOVIT_DEFS_H)
#endif
}
+void abort_gl_error(GLenum err, const char *filename, int line)
+{
+ const char *err_text = "unknown";
+
+ // All errors listed in the glGetError(3G) man page.
+ switch (err) {
+ case GL_NO_ERROR:
+ err_text = "GL_NO_ERROR"; // Should not happen.
+ break;
+ case GL_INVALID_ENUM:
+ err_text = "GL_INVALID_ENUM";
+ break;
+ case GL_INVALID_VALUE:
+ err_text = "GL_INVALID_VALUE";
+ break;
+ case GL_INVALID_OPERATION:
+ err_text = "GL_INVALID_OPERATION";
+ break;
+ case GL_INVALID_FRAMEBUFFER_OPERATION:
+ err_text = "GL_INVALID_FRAMEBUFFER_OPERATION";
+ break;
+ case GL_OUT_OF_MEMORY:
+ err_text = "GL_OUT_OF_MEMORY";
+ break;
+ case GL_STACK_UNDERFLOW:
+ err_text = "GL_STACK_UNDERFLOW";
+ break;
+ case GL_STACK_OVERFLOW:
+ err_text = "GL_STACK_OVERFLOW";
+ break;
+ }
+ fprintf(stderr, "GL error 0x%x (%s) at %s:%d\n", err, err_text, filename, line);
+ abort();
+}
+
} // namespace movit
#include <stdlib.h>
#include <Eigen/Core>
#include <string>
+#include "defs.h"
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
// back into anything you intend to pass into OpenGL.
void *get_gl_context_identifier();
+// Used in the check_error() macro, below.
+void abort_gl_error(GLenum err, const char *filename, int line) DOES_NOT_RETURN;
+
} // namespace movit
#ifdef NDEBUG
#define check_error()
#else
-#define check_error() { int err = glGetError(); if (err != GL_NO_ERROR) { printf("GL error 0x%x at %s:%d\n", err, __FILE__, __LINE__); abort(); } }
+#define check_error() { GLenum err = glGetError(); if (err != GL_NO_ERROR) { movit::abort_gl_error(err, __FILE__, __LINE__); } }
#endif
// CHECK() is like assert(), but retains any side effects no matter the compilation mode.