#include <GL/glut.h>
#include <GL/glext.h> #include <cstdio> #include <sstream> #include <iostream> #define WIDTH 640 #define HEIGHT 480 std::string enum_name(GLenum value); int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(WIDTH, HEIGHT);
int window = glutCreateWindow(argv[0]); std::cout << "GL_VENDOR=" << glGetString(GL_VENDOR) << std::endl; std::cout << "GL_RENDERER=" << glGetString(GL_RENDERER) << std::endl; std::cout << "GL_VERSION=" << glGetString(GL_VERSION) << std::endl; #define TEST_ERROR(msg) \ std::cout << msg << enum_name(glGetError()) << std::endl #define TEST(x) \ { \ TEST_ERROR("Error status before testing " #x "="); \ GLint value; \ glGetIntegerv(x, &value); \ std::cout << #x "=" << value << std::endl; \ TEST_ERROR("Error status after testing " #x "="); \ } TEST(GL_MAX_GEOMETRY_INPUT_COMPONENTS); TEST(GL_MAX_GEOMETRY_OUTPUT_COMPONENTS); TEST(GL_MAX_FRAGMENT_INPUT_COMPONENTS); TEST(GL_FRAGMENT_SHADER_DERIVATIVE_HINT); glutDestroyWindow(window); return getchar(); } std::string enum_name(GLenum value) { switch (value) { #define ENUM_NAME(x) case x: return #x; ENUM_NAME(GL_NO_ERROR); ENUM_NAME(GL_INVALID_ENUM); ENUM_NAME(GL_INVALID_VALUE); ENUM_NAME(GL_INVALID_OPERATION); ENUM_NAME(GL_STACK_OVERFLOW); ENUM_NAME(GL_STACK_UNDERFLOW); ENUM_NAME(GL_OUT_OF_MEMORY); ENUM_NAME(GL_TABLE_TOO_LARGE); ENUM_NAME(GL_INVALID_FRAMEBUFFER_OPERATION); #undef ENUM_NAME default:; } std::stringstream unknown; unknown << "unknown enum (0x" << std::hex << value << ')'; return unknown.str(); } |