diff options
Diffstat (limited to 'progs/tests/stencilwrap.c')
-rw-r--r-- | progs/tests/stencilwrap.c | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/progs/tests/stencilwrap.c b/progs/tests/stencilwrap.c new file mode 100644 index 00000000000..e65258b583a --- /dev/null +++ b/progs/tests/stencilwrap.c @@ -0,0 +1,147 @@ +/* Test GL_EXT_stencil_wrap extension. + * This is by no means complete, just a quick check. + * + * Brian Paul 30 October 2002 + */ + +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <GL/glut.h> + + +static void RunTest(void) +{ + const GLenum prim = GL_LINES; + GLubyte val; + int bits, max, i; + + glGetIntegerv(GL_STENCIL_BITS, &bits); + max = (1 << bits) - 1; + + glClearStencil(0); + glEnable(GL_STENCIL_TEST); + glStencilFunc(GL_ALWAYS, 0, ~0); + + /* test GL_INCR (saturation) */ + glClear(GL_STENCIL_BUFFER_BIT); + glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); + printf("Testing GL_INCR...\n"); + for (i = 1; i < max+10; i++) { + int expected = (i > max) ? max : i; + glBegin(prim); + glVertex2f(0.5, 0.5); glVertex2f(9.5, 0.5); + glEnd(); + glReadPixels(0, 0, 1, 1, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, &val); + assert(val == expected); + } + printf("OK!\n"); + + /* test GL_INCR_WRAP_EXT (wrap around) */ + glClear(GL_STENCIL_BUFFER_BIT); + glStencilOp(GL_KEEP, GL_KEEP, GL_INCR_WRAP_EXT); + printf("Testing GL_INCR_WRAP_EXT...\n"); + for (i = 1; i < max+10; i++) { + int expected = i % (max + 1); + glBegin(prim); + glVertex2f(0.5, 0.5); glVertex2f(9.5, 0.5); + glEnd(); + glReadPixels(0, 0, 1, 1, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, &val); + assert(val == expected); + } + printf("OK!\n"); + + glClearStencil(max); + + /* test GL_INCR (saturation) */ + glClear(GL_STENCIL_BUFFER_BIT); + glStencilOp(GL_KEEP, GL_KEEP, GL_DECR); + printf("Testing GL_DECR...\n"); + for (i = max-1; i > -10; i--) { + int expected = (i < 0) ? 0 : i; + glBegin(prim); + glVertex2f(0.5, 0.5); glVertex2f(9.5, 0.5); + glEnd(); + glReadPixels(0, 0, 1, 1, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, &val); + assert(val == expected); + } + printf("OK!\n"); + + /* test GL_INCR_WRAP_EXT (wrap-around) */ + glClear(GL_STENCIL_BUFFER_BIT); + glStencilOp(GL_KEEP, GL_KEEP, GL_DECR_WRAP_EXT); + printf("Testing GL_DECR_WRAP_EXT...\n"); + for (i = max-1; i > -10; i--) { + int expected = (i < 0) ? max + i + 1: i; + glBegin(prim); + glVertex2f(0.5, 0.5); glVertex2f(9.5, 0.5); + glEnd(); + glReadPixels(0, 0, 1, 1, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, &val); + assert(val == expected); + } + printf("OK!\n"); + + glDisable(GL_STENCIL_TEST); +} + + +static void Display( void ) +{ + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + + RunTest(); + + glutSwapBuffers(); +} + + +static void Reshape( int width, int height ) +{ + glViewport( 0, 0, width, height ); + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glOrtho(0, width, 0, height, -1, 1); + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); +} + + +static void Key( unsigned char key, int x, int y ) +{ + (void) x; + (void) y; + switch (key) { + case 27: + exit(0); + break; + } + glutPostRedisplay(); +} + + +static void Init( void ) +{ + printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); + printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); + if (!glutExtensionSupported("GL_EXT_stencil_wrap")) { + printf("Sorry, GL_EXT_stencil_wrap not supported.\n"); + exit(1); + } +} + + +int main( int argc, char *argv[] ) +{ + glutInit( &argc, argv ); + glutInitWindowPosition( 0, 0 ); + glutInitWindowSize( 400, 400 ); + glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_STENCIL ); + glutCreateWindow(argv[0]); + glutReshapeFunc( Reshape ); + glutKeyboardFunc( Key ); + glutDisplayFunc( Display ); + Init(); + glutMainLoop(); + return 0; +} |