check OpenGL errors with checkGLError()/GL_CHECK()

This commit is contained in:
Josh Holtrop 2011-04-15 09:35:39 -04:00
parent d8dc7f1ee5
commit 126a355e47
3 changed files with 69 additions and 23 deletions

View File

@ -0,0 +1,32 @@
#include <stdio.h>
#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;
}

View File

@ -0,0 +1,11 @@
#ifndef CHECKGLERROR_H
#define CHECKGLERROR_H
#include <GL/gl.h>
#define checkGLError() _checkGLError(__FILE__, __LINE__)
GLenum _checkGLError(const char *fname, int lineno);
#endif

View File

@ -4,28 +4,31 @@
#include <GL/gl.h>
#include <GL/glu.h>
#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();
}