diff options
Diffstat (limited to 'progs/tests')
| -rw-r--r-- | progs/tests/Makefile | 2 | ||||
| -rw-r--r-- | progs/tests/fbotest1.c | 169 | ||||
| -rw-r--r-- | progs/tests/fbotexture.c | 276 | ||||
| -rw-r--r-- | progs/tests/getprocaddress.c | 1 | 
4 files changed, 448 insertions, 0 deletions
| diff --git a/progs/tests/Makefile b/progs/tests/Makefile index c1218b1ca9..4d3d2696b8 100644 --- a/progs/tests/Makefile +++ b/progs/tests/Makefile @@ -26,6 +26,8 @@ SOURCES = antialias.c \  	cva.c \  	dinoshade.c \  	floattex.c \ +	fbotest1.c \ +	fbotexture.c \  	fogcoord.c \  	fptest1.c \  	fptexture.c \ diff --git a/progs/tests/fbotest1.c b/progs/tests/fbotest1.c new file mode 100644 index 0000000000..1b71004178 --- /dev/null +++ b/progs/tests/fbotest1.c @@ -0,0 +1,169 @@ +/* + * Test GL_EXT_framebuffer_object + * + * Brian Paul + * 7 Feb 2005 + */ + + +#define GL_GLEXT_PROTOTYPES +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <GL/glut.h> + +static int Width = 400, Height = 400; +static GLuint MyFB; + + +static void +CheckError(int line) +{ +   GLenum err = glGetError(); +   if (err) { +      printf("GL Error 0x%x at line %d\n", (int) err, line); +   } +} + + +static void +Display( void ) +{ +   GLubyte *buffer = malloc(Width * Height * 4); +   GLenum status; + +   /* draw to user framebuffer */ +   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB); +   glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT); +   glReadBuffer(GL_COLOR_ATTACHMENT1_EXT); + +   status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); +   if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { +      printf("Framebuffer incomplete!!!\n"); +   } + +   glClearColor(0.5, 0.5, 1.0, 0.0); +   glClear( GL_COLOR_BUFFER_BIT ); + +   glBegin(GL_POLYGON); +   glColor3f(1, 0, 0); +   glVertex2f(-1, -1); +   glColor3f(0, 1, 0); +   glVertex2f(1, -1); +   glColor3f(0, 0, 1); +   glVertex2f(0, 1); +   glEnd(); + +   /* read from user framebuffer */ +   glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); + +   /* draw to window */ +   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); +   glWindowPos2iARB(0, 0); +   glDrawPixels(Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); + +   free(buffer); +   glutSwapBuffers(); +} + + +static void +Reshape( int width, int height ) +{ +   float ar = (float) width / (float) height; +   glViewport( 0, 0, width, height ); +   glMatrixMode( GL_PROJECTION ); +   glLoadIdentity(); +#if 0 +   glFrustum( -ar, ar, -1.0, 1.0, 5.0, 25.0 ); +#else +   glOrtho(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0 ); +#endif +   glMatrixMode( GL_MODELVIEW ); +   glLoadIdentity(); +   glTranslatef( 0.0, 0.0, -15.0 ); +   Width = width; +   Height = height; +   glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, Width, Height); +} + + +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 ) +{ +   GLuint rb; +   GLint i; + +   if (!glutExtensionSupported("GL_EXT_framebuffer_object")) { +      printf("GL_EXT_framebuffer_object not found!\n"); +      /*exit(0);*/ +   } +   printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); + +   glGenFramebuffersEXT(1, &MyFB); +   assert(MyFB); +   assert(glIsFramebufferEXT(MyFB)); +   glDeleteFramebuffersEXT(1, &MyFB); +   assert(!glIsFramebufferEXT(MyFB)); +   /* Note, continue to use MyFB below */ + +   glGenRenderbuffersEXT(1, &rb); +   assert(rb); +   assert(glIsRenderbufferEXT(rb)); +   glDeleteRenderbuffersEXT(1, &rb); +   assert(!glIsRenderbufferEXT(rb)); +   rb = 42; /* an arbitrary ID */ + +   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB); +   assert(glIsFramebufferEXT(MyFB)); +   glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rb); +   assert(glIsRenderbufferEXT(rb)); + +   glGetIntegerv(GL_RENDERBUFFER_BINDING_EXT, &i); +   assert(i == rb); + +   glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &i); +   assert(i == MyFB); + +   glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, +                                GL_RENDERBUFFER_EXT, rb); + +   glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, Width, Height); + +   CheckError(__LINE__); + +   /* restore to default */ +   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); +} + + +int +main( int argc, char *argv[] ) +{ +   glutInit( &argc, argv ); +   glutInitWindowPosition( 0, 0 ); +   glutInitWindowSize(Width, Height); +   glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE ); +   glutCreateWindow(argv[0]); +   glutReshapeFunc( Reshape ); +   glutKeyboardFunc( Key ); +   glutDisplayFunc( Display ); +   Init(); +   glutMainLoop(); +   return 0; +} diff --git a/progs/tests/fbotexture.c b/progs/tests/fbotexture.c new file mode 100644 index 0000000000..dc347423aa --- /dev/null +++ b/progs/tests/fbotexture.c @@ -0,0 +1,276 @@ +/* + * Test GL_EXT_framebuffer_object render-to-texture + * + * Draw a teapot into a texture image with stenciling. + * Then draw a textured quad using that texture. + * + * Brian Paul + * 18 Apr 2005 + */ + + +#define GL_GLEXT_PROTOTYPES +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <GL/glut.h> + +static int Width = 400, Height = 400; +static int TexWidth = 512, TexHeight = 512; +static GLuint MyFB; +static GLuint TexObj; +static GLuint DepthRB, StencilRB; +static GLboolean Anim = GL_FALSE; +static GLfloat Rot = 0.0; + + +static void +CheckError(int line) +{ +   GLenum err = glGetError(); +   if (err) { +      printf("GL Error 0x%x at line %d\n", (int) err, line); +   } +} + + +static void +Idle(void) +{ +   Rot = glutGet(GLUT_ELAPSED_TIME) * 0.05; +   glutPostRedisplay(); +} + + +static void +RenderTexture(void) +{ +   GLint level = 0; +   GLenum status; + +   glMatrixMode(GL_PROJECTION); +   glLoadIdentity(); +   glOrtho(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); +   glMatrixMode(GL_MODELVIEW); +   glLoadIdentity(); +   glTranslatef(0.0, 0.0, -15.0); + +   /* draw to texture */ +   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB); +   glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, +                             GL_TEXTURE_2D, TexObj, level); + +   status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); +   if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { +      printf("Framebuffer incomplete!!!\n"); +   } + +   glViewport(0, 0, TexWidth, TexHeight); + +   glClearColor(0.5, 0.5, 1.0, 0.0); +   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + +   glEnable(GL_DEPTH_TEST); +   glEnable(GL_STENCIL_TEST); +   glStencilFunc(GL_NEVER, 1, ~0); +   glStencilOp(GL_REPLACE, GL_KEEP, GL_REPLACE); + +   /* draw diamond-shaped stencil pattern */ +   glColor3f(0, 1, 0); +   glBegin(GL_POLYGON); +   glVertex2f(-0.2,  0.0); +   glVertex2f( 0.0, -0.2); +   glVertex2f( 0.2,  0.0); +   glVertex2f( 0.0,  0.2); +   glEnd(); + +   /* draw teapot where stencil != 1 */ +   glStencilFunc(GL_NOTEQUAL, 1, ~0); +   glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + +#if 0 +   glBegin(GL_POLYGON); +   glColor3f(1, 0, 0); +   glVertex2f(-1, -1); +   glColor3f(0, 1, 0); +   glVertex2f(1, -1); +   glColor3f(0, 0, 1); +   glVertex2f(0, 1); +   glEnd(); +#else +   glEnable(GL_LIGHTING); +   glEnable(GL_LIGHT0); +   glPushMatrix(); +   glRotatef(0.5 * Rot, 1.0, 0.0, 0.0); +   glutSolidTeapot(0.5); +   glPopMatrix(); +   glDisable(GL_LIGHTING); +#endif +   glDisable(GL_DEPTH_TEST); +   glDisable(GL_STENCIL_TEST); + +   /* Bind normal framebuffer */ +   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + +   CheckError(__LINE__); +} + + + +static void +Display(void) +{ +   float ar = (float) Width / (float) Height; + +   RenderTexture(); + +   /* draw textured quad in the window */ + +   glMatrixMode(GL_PROJECTION); +   glLoadIdentity(); +   glFrustum(-ar, ar, -1.0, 1.0, 5.0, 25.0); +   glMatrixMode(GL_MODELVIEW); +   glLoadIdentity(); +   glTranslatef(0.0, 0.0, -7.0); + +   glViewport(0, 0, Width, Height); + +   glClearColor(0.25, 0.25, 0.25, 0); +   glClear(GL_COLOR_BUFFER_BIT); + +   glPushMatrix(); +   glRotatef(Rot, 0, 1, 0); +   glEnable(GL_TEXTURE_2D); +   glBegin(GL_POLYGON); +   glColor3f(0.25, 0.25, 0.25); +   glTexCoord2f(0, 0); +   glVertex2f(-1, -1); +   glTexCoord2f(1, 0); +   glVertex2f(1, -1); +   glColor3f(1.0, 1.0, 1.0); +   glTexCoord2f(1, 1); +   glVertex2f(1, 1); +   glTexCoord2f(0, 1); +   glVertex2f(-1, 1); +   glEnd(); +   glPopMatrix(); +   glDisable(GL_TEXTURE_2D); +    +   glutSwapBuffers(); +   CheckError(__LINE__); +} + + +static void +Reshape(int width, int height) +{ +   glViewport(0, 0, width, height); +   Width = width; +   Height = height; +} + + +static void +Key(unsigned char key, int x, int y) +{ +   (void) x; +   (void) y; +   switch (key) { +      case 'a': +         Anim = !Anim; +         if (Anim) +            glutIdleFunc(Idle); +         else +            glutIdleFunc(NULL); +         break; +      case 27: +         exit(0); +         break; +   } +   glutPostRedisplay(); +} + + +static void +Init(void) +{ +   GLint i; + +   if (!glutExtensionSupported("GL_EXT_framebuffer_object")) { +      printf("GL_EXT_framebuffer_object not found!\n"); +      exit(0); +   } +   printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); + +   /* make framebuffer */ +   glGenFramebuffersEXT(1, &MyFB); +   assert(MyFB); +   assert(glIsFramebufferEXT(MyFB)); +   glDeleteFramebuffersEXT(1, &MyFB); +   assert(!glIsFramebufferEXT(MyFB)); +   /* Note, continue to use MyFB below */ + +   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB); +   assert(glIsFramebufferEXT(MyFB)); +   glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &i); +   assert(i == MyFB); + +   /* make depth renderbuffer */ +   glGenRenderbuffersEXT(1, &DepthRB); +   assert(DepthRB); +   assert(glIsRenderbufferEXT(DepthRB)); +   glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, DepthRB); +   glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, +                            TexWidth, TexHeight); + +   /* make stencil renderbuffer */ +   glGenRenderbuffersEXT(1, &StencilRB); +   assert(StencilRB); +   assert(glIsRenderbufferEXT(StencilRB)); +   glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, StencilRB); +   glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_STENCIL_INDEX, +                            TexWidth, TexHeight); + +   /* attach DepthRB to MyFB */ +   glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, +                                GL_RENDERBUFFER_EXT, DepthRB); + +   /* attach StencilRB to MyFB */ +   glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, +                                GL_RENDERBUFFER_EXT, StencilRB); + + +   /* bind regular framebuffer */ +   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + +   /* Make texture object/image */ +   glGenTextures(1, &TexObj); +   glBindTexture(GL_TEXTURE_2D, TexObj); +   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TexWidth, TexHeight, 0, +                GL_RGBA, GL_UNSIGNED_BYTE, NULL); +   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); +   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); +   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + +   CheckError(__LINE__); +} + + +int +main(int argc, char *argv[]) +{ +   glutInit(&argc, argv); +   glutInitWindowPosition(0, 0); +   glutInitWindowSize(Width, Height); +   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); +   glutCreateWindow(argv[0]); +   glutReshapeFunc(Reshape); +   glutKeyboardFunc(Key); +   glutDisplayFunc(Display); +   if (Anim) +      glutIdleFunc(Idle); +   Init(); +   glutMainLoop(); +   return 0; +} diff --git a/progs/tests/getprocaddress.c b/progs/tests/getprocaddress.c index 702255285d..2480ed44cc 100644 --- a/progs/tests/getprocaddress.c +++ b/progs/tests/getprocaddress.c @@ -288,6 +288,7 @@ check_functions( const char *extensions )     for (entry = functions; entry->name; entry++) {        if (entry->name[0] == '-') { +         /* XXX update for OpenGL 2.0 */           if (entry->name[1] == '1') {              /* check GL version X.Y */              const char *version = (const char *) glGetString(GL_VERSION); | 
