// Wrapper macros for OpenGL #define GL_STRERROR(gl_error) ((gl_error) == GL_NO_ERROR ? "" : ": "), ((gl_error) == GL_NO_ERROR ? "" : (char *)gluErrorString(gl_error)) #define GL_ERROR(gl_error, M, ...) EPRINT(DEBUG_LEVEL("[ERROR] ") DEBUG_LOC_FMT M "%s%s\n" DEBUG_LOC_VALS, ##__VA_ARGS__, GL_STRERROR(gl_error)) #define GL_WARN(gl_error, M, ...) EPRINT(DEBUG_LEVEL("[WARN] ") DEBUG_LOC_FMT M "%s%s\n" DEBUG_LOC_VALS, ##__VA_ARGS__, GL_STRERROR(gl_error)) #define GL_CHECK(M, ...) BEGIN GLenum gl_error = glGetError(); if (gl_error != GL_NO_ERROR) { GL_ERROR(gl_error, M, ##__VA_ARGS__); goto error; } END // Wrapper macros for GLEW #define GLEW_STRERROR(glew_error) ((glew_error) == GLEW_OK ? "" : ": "), ((glew_error) == GLEW_OK ? "" : (char *)glewGetErrorString(glew_error)) #define GLEW_ERROR(glew_error, M, ...) EPRINT(DEBUG_LEVEL("[ERROR] ") DEBUG_LOC_FMT M "%s%s\n" DEBUG_LOC_VALS, ##__VA_ARGS__, GLEW_STRERROR(glew_error)) #define GLEW_WARN(glew_error, M, ...) EPRINT(DEBUG_LEVEL("[WARN] ") DEBUG_LOC_FMT M "%s%s\n" DEBUG_LOC_VALS, ##__VA_ARGS__, GLEW_STRERROR(glew_error)) #define GLEW_CHECK(glew_error, M, ...) BEGIN if (glew_error != GLEW_OK) { GLEW_ERROR(glew_error, M, ##__VA_ARGS__); goto error; } END #define GLEW_CHK(func, ...) ({ typeof(func(__VA_ARGS__))rv = func(__VA_ARGS__); GLEW_CHECK(rv, #func " failed"); rv; }) #define GLEWINIT(...) GLEW_CHK(glewInit, __VA_ARGS__)