From 126a355e4757d7bd8c5e176ab33106f4004d4e74 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 15 Apr 2011 09:35:39 -0400 Subject: [PATCH] check OpenGL errors with checkGLError()/GL_CHECK() --- sdl-opengl-vbo/checkGLError.cc | 32 +++++++++++++++++++++ sdl-opengl-vbo/checkGLError.h | 11 +++++++ sdl-opengl-vbo/sdl-opengl-vbo.cc | 49 +++++++++++++++++--------------- 3 files changed, 69 insertions(+), 23 deletions(-) create mode 100644 sdl-opengl-vbo/checkGLError.cc create mode 100644 sdl-opengl-vbo/checkGLError.h diff --git a/sdl-opengl-vbo/checkGLError.cc b/sdl-opengl-vbo/checkGLError.cc new file mode 100644 index 0000000..fb59f90 --- /dev/null +++ b/sdl-opengl-vbo/checkGLError.cc @@ -0,0 +1,32 @@ + +#include + +#include "checkGLError.h" + +#define checkGLErrorCase(e) \ + case (e): sprintf(msg, #e); break + +GLenum _checkGLError(const char *fname, int lineno) +{ + char msg[40]; + GLenum e; + + sprintf(msg, "Unknown"); + e = glGetError(); + switch (e) + { + checkGLErrorCase(GL_NO_ERROR); + checkGLErrorCase(GL_INVALID_ENUM); + checkGLErrorCase(GL_INVALID_VALUE); + checkGLErrorCase(GL_INVALID_OPERATION); + checkGLErrorCase(GL_STACK_OVERFLOW); + checkGLErrorCase(GL_STACK_UNDERFLOW); + checkGLErrorCase(GL_OUT_OF_MEMORY); + checkGLErrorCase(GL_TABLE_TOO_LARGE); + } + + if (e != GL_NO_ERROR) + fprintf(stderr, "GL error %s at %s:%d\n", msg, fname, lineno); + + return e; +} diff --git a/sdl-opengl-vbo/checkGLError.h b/sdl-opengl-vbo/checkGLError.h new file mode 100644 index 0000000..b853813 --- /dev/null +++ b/sdl-opengl-vbo/checkGLError.h @@ -0,0 +1,11 @@ + +#ifndef CHECKGLERROR_H +#define CHECKGLERROR_H + +#include + +#define checkGLError() _checkGLError(__FILE__, __LINE__) + +GLenum _checkGLError(const char *fname, int lineno); + +#endif diff --git a/sdl-opengl-vbo/sdl-opengl-vbo.cc b/sdl-opengl-vbo/sdl-opengl-vbo.cc index 14447e9..ff59ea7 100644 --- a/sdl-opengl-vbo/sdl-opengl-vbo.cc +++ b/sdl-opengl-vbo/sdl-opengl-vbo.cc @@ -4,28 +4,31 @@ #include #include +#include "checkGLError.h" + #define WIDTH 500 #define HEIGHT 500 #define ADDR_DIFF(x, y) ((unsigned long) (y) - (unsigned long) (x)) +#define GL_CHECK(x) ({x; checkGLError();}) void init(void) { - glClearColor (0.0, 0.0, 0.0, 0.0); - glEnable(GL_DEPTH_TEST); - glShadeModel(GL_SMOOTH); - glViewport(0, 0, WIDTH, HEIGHT); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); + GL_CHECK(glClearColor (0.0, 0.0, 0.0, 0.0)); + GL_CHECK(glEnable(GL_DEPTH_TEST)); + GL_CHECK(glShadeModel(GL_SMOOTH)); + GL_CHECK(glViewport(0, 0, WIDTH, HEIGHT)); + GL_CHECK(glMatrixMode(GL_PROJECTION)); + GL_CHECK(glLoadIdentity()); gluPerspective(60.0, (GLfloat)WIDTH/(GLfloat)WIDTH, 1.0, 30.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0, 0.0, -3.6); + GL_CHECK(glMatrixMode(GL_MODELVIEW)); + GL_CHECK(glLoadIdentity()); + GL_CHECK(glTranslatef(0.0, 0.0, -3.6)); } void display(void) { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GL_CHECK(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); static const GLfloat data[][2][4] = { {{-0.8, -0.8, 0.0, 1.0}, {1.0, 0.0, 0.0, 1.0}}, {{0.8, -0.8, 0.0, 1.0}, {0.0, 1.0, 0.0, 1.0}}, @@ -34,20 +37,20 @@ void display(void) }; static const GLbyte indexes[] = {1, 0, 2, 3}; GLuint buffers[2]; - glGenBuffers(sizeof(buffers)/sizeof(buffers[0]), buffers); - glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); - glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexes), indexes, - GL_STATIC_DRAW); + GL_CHECK(glGenBuffers(sizeof(buffers)/sizeof(buffers[0]), buffers)); + GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, buffers[0])); + GL_CHECK(glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW)); + GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1])); + GL_CHECK(glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexes), indexes, + GL_STATIC_DRAW)); - glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]); - glVertexPointer(3, GL_FLOAT, ADDR_DIFF(&data[0], &data[1]), - (void *) ADDR_DIFF(&data, &data[0][0][0])); - glColorPointer(4, GL_FLOAT, ADDR_DIFF(&data[0], &data[1]), - (void *) ADDR_DIFF(&data, &data[0][1][0])); - glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, NULL); + GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, buffers[0])); + GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1])); + GL_CHECK(glVertexPointer(3, GL_FLOAT, ADDR_DIFF(&data[0], &data[1]), + (void *) ADDR_DIFF(&data, &data[0][0][0]))); + GL_CHECK(glColorPointer(4, GL_FLOAT, ADDR_DIFF(&data[0], &data[1]), + (void *) ADDR_DIFF(&data, &data[0][1][0]))); + GL_CHECK(glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, NULL)); SDL_GL_SwapBuffers(); }