diff options
Diffstat (limited to 'progs/tests')
| -rw-r--r-- | progs/tests/.gitignore | 17 | ||||
| -rw-r--r-- | progs/tests/Makefile | 1 | ||||
| -rw-r--r-- | progs/tests/SConscript | 1 | ||||
| -rw-r--r-- | progs/tests/antialias.c | 71 | ||||
| -rw-r--r-- | progs/tests/fbotest1.c | 6 | ||||
| -rw-r--r-- | progs/tests/fbotest2.c | 52 | ||||
| -rw-r--r-- | progs/tests/fbotest3.c | 6 | ||||
| -rw-r--r-- | progs/tests/stencil_twoside.c | 85 | ||||
| -rw-r--r-- | progs/tests/stencilreaddraw.c | 187 | ||||
| -rw-r--r-- | progs/tests/zreaddraw.c | 61 | 
10 files changed, 393 insertions, 94 deletions
diff --git a/progs/tests/.gitignore b/progs/tests/.gitignore index d905fab611..37be27fff2 100644 --- a/progs/tests/.gitignore +++ b/progs/tests/.gitignore @@ -1,4 +1,3 @@ -.cvsignore  afsmultiarb  antialias  arbfpspec @@ -17,6 +16,7 @@ auxbuffer  blendminmax  blendsquare  blendxor +blitfb  bufferobj  bug_3050  bug_3101 @@ -28,12 +28,16 @@ condrender  copypixrate  crossbar  cva +cva_huge +cylwrap  drawbuffers  drawbuffers2 -extfuncs.h  exactrast +ext422square +extfuncs.h  fbotest1  fbotest2 +fbotest3  fillrate  floattex  fog @@ -58,10 +62,12 @@ mipmap_comp_tests  mipmap_limits  mipmap_view  multipal +multitexarray +multiwindow  no_s3tc  packedpixels -persp_hint  pbo +persp_hint  prim  prog_parameter  quads @@ -77,6 +83,7 @@ shader_api  shaderutil.c  shaderutil.h  sharedtex +stencilreaddraw  stencil_twoside  stencilwrap  stencil_wrap @@ -84,10 +91,13 @@ streaming_rect  subtex  subtexrate  tex1d +texcmp  texcompress2  texcompsub  texdown  texfilt +texgenmix +texleak  texline  texobj  texobjshare @@ -97,6 +107,7 @@ unfilledclip  vao-01  vao-02  vparray +vpeval  vptest1  vptest2  vptest3 diff --git a/progs/tests/Makefile b/progs/tests/Makefile index 6bb0249e17..0f938f9b0c 100644 --- a/progs/tests/Makefile +++ b/progs/tests/Makefile @@ -90,6 +90,7 @@ SOURCES = \  	seccolor.c \  	shader_api.c \  	sharedtex.c \ +	stencilreaddraw.c \  	stencil_twoside.c \  	stencilwrap.c \  	stencil_wrap.c \ diff --git a/progs/tests/SConscript b/progs/tests/SConscript index 037a0c35da..429d3bb957 100644 --- a/progs/tests/SConscript +++ b/progs/tests/SConscript @@ -89,6 +89,7 @@ progs = [      'scissor-viewport',      'seccolor',      'shader_api', +    'stencilreaddraw',      'stencil_twoside',      'stencil_wrap',      'stencilwrap', diff --git a/progs/tests/antialias.c b/progs/tests/antialias.c index 656bf2471f..a6456a5218 100644 --- a/progs/tests/antialias.c +++ b/progs/tests/antialias.c @@ -30,15 +30,17 @@ PrintString(const char *s)  static void -doPolygon( GLint verts, GLfloat radius, GLfloat z ) +doPolygon( GLenum mode, GLint verts, GLfloat radius, GLfloat z )  {     int i; +   glBegin(mode);     for (i = 0; i < verts; i++) {        float a = (i * 2.0 * 3.14159) / verts;        float x = radius * cos(a);        float y = radius * sin(a);        glVertex3f(x, y, z);     } +   glEnd();  } @@ -47,35 +49,23 @@ DrawObject( void )  {     glLineWidth(3.0);     glColor3f(1, 1, 1); -   glBegin(GL_LINE_LOOP); -   doPolygon(12, 1.2, 0); -   glEnd(); +   doPolygon(GL_LINE_LOOP, 12, 1.2, 0);     glLineWidth(1.0);     glColor3f(1, 1, 1); -   glBegin(GL_LINE_LOOP); -   doPolygon(12, 1.1, 0); -   glEnd(); +   doPolygon(GL_LINE_LOOP, 12, 1.1, 0);     glColor3f(1, 0, 0); -   glBegin(GL_POLYGON); -   doPolygon(12, 0.4, 0.3); -   glEnd(); +   doPolygon(GL_POLYGON, 12, 0.4, 0.3);     glColor3f(0, 1, 0); -   glBegin(GL_POLYGON); -   doPolygon(12, 0.6, 0.2); -   glEnd(); +   doPolygon(GL_POLYGON, 12, 0.6, 0.2);     glColor3f(0, 0, 1); -   glBegin(GL_POLYGON); -   doPolygon(12, 0.8, 0.1); -   glEnd(); +   doPolygon(GL_POLYGON, 12, 0.8, 0.1);     glColor3f(1, 1, 1); -   glBegin(GL_POLYGON); -   doPolygon(12, 1.0, 0); -   glEnd(); +   doPolygon(GL_POLYGON, 12, 1.0, 0);  } @@ -85,43 +75,46 @@ Display( void )     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );     glColor3f(1, 1, 1); + +   glRasterPos2f(-3.1, -1.6); +   PrintString("No antialiasing"); + +   glRasterPos2f(-0.8, -1.6);     if (HaveMultisample) { -      glRasterPos2f(-3.1, -1.6);        if (DoMultisample) -         PrintString("MULTISAMPLE"); +         PrintString("  MULTISAMPLE");        else           PrintString("MULTISAMPLE (off)");     } -   glRasterPos2f(-0.8, -1.6); -   PrintString("No antialiasing"); +   else +      PrintString("MULTISAMPLE (N/A)"); +     glRasterPos2f(1.6, -1.6);     PrintString("GL_POLYGON_SMOOTH"); -   /* multisample */ -   if (HaveMultisample) { -      glEnable(GL_DEPTH_TEST); -      if (DoMultisample) -         glEnable(GL_MULTISAMPLE_ARB); -      glPushMatrix(); -      glTranslatef(-2.5, 0, 0); -      glPushMatrix(); -      glRotatef(Zrot, 0, 0, 1); -      DrawObject(); -      glPopMatrix(); -      glPopMatrix(); -      glDisable(GL_MULTISAMPLE_ARB); -      glDisable(GL_DEPTH_TEST); -   } -     /* non-aa */     glEnable(GL_DEPTH_TEST);     glPushMatrix(); +   glTranslatef(-2.5, 0, 0); +   glPushMatrix(); +   glRotatef(Zrot, 0, 0, 1); +   DrawObject(); +   glPopMatrix(); +   glPopMatrix(); +   glDisable(GL_DEPTH_TEST); + +   /* multisample */ +   glEnable(GL_DEPTH_TEST); +   if (HaveMultisample && DoMultisample) +      glEnable(GL_MULTISAMPLE_ARB); +   glPushMatrix();     glTranslatef(0, 0, 0);     glPushMatrix();     glRotatef(Zrot, 0, 0, 1);     DrawObject();     glPopMatrix();     glPopMatrix(); +   glDisable(GL_MULTISAMPLE_ARB);     glDisable(GL_DEPTH_TEST);     /* polygon smooth */ diff --git a/progs/tests/fbotest1.c b/progs/tests/fbotest1.c index 0cd7f95c35..a95fdff74c 100644 --- a/progs/tests/fbotest1.c +++ b/progs/tests/fbotest1.c @@ -36,8 +36,8 @@ Display( void )     /* draw to user framebuffer */     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB); -   glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT); -   glReadBuffer(GL_COLOR_ATTACHMENT1_EXT); +   glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); +   glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);     status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);     if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { @@ -161,7 +161,7 @@ Init( void )     assert(i == MyFB);     CheckError(__LINE__); -   glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, +   glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,                                  GL_RENDERBUFFER_EXT, MyRB);     glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, Width, Height); diff --git a/progs/tests/fbotest2.c b/progs/tests/fbotest2.c index f9c506193f..faf0dd8748 100644 --- a/progs/tests/fbotest2.c +++ b/progs/tests/fbotest2.c @@ -33,15 +33,16 @@ CheckError(int line)  static void  Display( void )  { -   GLubyte *buffer = malloc(Width * Height * 4); +   GLboolean copyPix = GL_FALSE; +   GLboolean blitPix = GL_FALSE;     GLenum status;     CheckError(__LINE__);     /* draw to user framebuffer */     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB); -   glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT); -   glReadBuffer(GL_COLOR_ATTACHMENT1_EXT); +   glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); +   glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);     status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);     if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { @@ -63,16 +64,43 @@ Display( void )     glutSolidTeapot(2.0);     glPopMatrix(); -   /* read from user framebuffer */ -   glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); +   if (copyPix) { +      glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, MyFB); +      glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); +      glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0); +      glDrawBuffer(GL_BACK); -   /* draw to window */ -   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); -   glDisable(GL_DEPTH_TEST);  /* in case window has depth buffer */ -   glWindowPos2iARB(0, 0); -   glDrawPixels(Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); +      glDisable(GL_DEPTH_TEST);  /* in case window has depth buffer */ + +      glWindowPos2iARB(0, 0); +      glCopyPixels(0, 0, Width, Height, GL_COLOR); +   } +   else if (blitPix) { +      glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, MyFB); +      glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); +      glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0); +      glDrawBuffer(GL_BACK); + +      glDisable(GL_DEPTH_TEST);  /* in case window has depth buffer */ + +      glBlitFramebufferEXT(0, 0, Width, Height, +                           0, 0, Width, Height, +                           GL_COLOR_BUFFER_BIT, GL_NEAREST); +   } +   else { +      GLubyte *buffer = malloc(Width * Height * 4); +      /* read from user framebuffer */ +      glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); + +      /* draw to window */ +      glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); +      glDisable(GL_DEPTH_TEST);  /* in case window has depth buffer */ +      glWindowPos2iARB(0, 0); +      glDrawPixels(Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); + +      free(buffer); +   } -   free(buffer);     glutSwapBuffers();     CheckError(__LINE__);  } @@ -163,7 +191,7 @@ Init( void )     glGenRenderbuffersEXT(1, &ColorRb);     glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, ColorRb);     assert(glIsRenderbufferEXT(ColorRb)); -   glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, +   glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,                                  GL_RENDERBUFFER_EXT, ColorRb);     glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, Width, Height); diff --git a/progs/tests/fbotest3.c b/progs/tests/fbotest3.c index 8e288b38b8..c176f82d2b 100644 --- a/progs/tests/fbotest3.c +++ b/progs/tests/fbotest3.c @@ -50,8 +50,8 @@ Display( void )     /* draw to user framebuffer */     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB); -   glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT); -   glReadBuffer(GL_COLOR_ATTACHMENT1_EXT); +   glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); +   glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);     status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);     if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { @@ -189,7 +189,7 @@ Init( void )     glGenRenderbuffersEXT(1, &ColorRb);     glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, ColorRb);     assert(glIsRenderbufferEXT(ColorRb)); -   glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, +   glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,                                  GL_RENDERBUFFER_EXT, ColorRb);     glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, Width, Height); diff --git a/progs/tests/stencil_twoside.c b/progs/tests/stencil_twoside.c index 7d871e5877..1010139a20 100644 --- a/progs/tests/stencil_twoside.c +++ b/progs/tests/stencil_twoside.c @@ -26,7 +26,7 @@   * \file stencil_twoside.c   *    * Simple test of GL_ATI_separate_stencil (or the OGL 2.0 equivalent) functionality. - * Four squares are drawn + * Five squares (or six if stencil wrap is available) are drawn   * with different stencil modes, but all should be rendered with the same   * final color.   */ @@ -37,7 +37,7 @@  #include <GL/glut.h>  static int use20syntax = 1; -static int Width = 550; +static int Width = 650;  static int Height = 200;  static const GLfloat Near = 5.0, Far = 25.0; @@ -70,7 +70,7 @@ static void Display( void )      */     glDisable(GL_STENCIL_TEST); -   glTranslatef(-6.0, 0, 0); +   glTranslatef(-7.0, 0, 0);     glBegin(GL_QUADS);     glColor3f( 0.5, 0.5, 0.5 );     glVertex2f(-1, -1); @@ -85,6 +85,9 @@ static void Display( void )     /* Draw the first two squares using incr for the affected face      */ +   /************************************************************************* +    * 2nd square +    */     if (use20syntax) {        stencil_func_separate(GL_FRONT, GL_ALWAYS, 0, ~0);        stencil_func_separate(GL_BACK, GL_ALWAYS, 0, ~0); @@ -98,8 +101,8 @@ static void Display( void )     glTranslatef(3.0, 0, 0);     glBegin(GL_QUADS);     glColor3f( 0.9, 0.9, 0.9 ); -   /* this should be front facing */     for ( i = 0 ; i < (max_stencil + 5) ; i++ ) { +      /* this should be front facing */        glVertex2f(-1, -1);        glVertex2f( 1, -1);        glVertex2f( 1,  1); @@ -107,6 +110,7 @@ static void Display( void )     }     glEnd(); +   /* stencil vals should be equal to max_stencil */     glStencilFunc(GL_EQUAL, max_stencil, ~0);     glBegin(GL_QUADS);     glColor3f( 0.5, 0.5, 0.5 ); @@ -116,6 +120,9 @@ static void Display( void )     glVertex2f(-1,  1);     glEnd(); +   /************************************************************************* +    * 3rd square +    */     if (use20syntax) {        stencil_func_separate(GL_FRONT, GL_ALWAYS, 0, ~0);        stencil_func_separate(GL_BACK, GL_ALWAYS, 0, ~0); @@ -129,9 +136,8 @@ static void Display( void )     glTranslatef(3.0, 0, 0);     glBegin(GL_QUADS);     glColor3f( 0.9, 0.9, 0.9 ); - -   /* this should be back facing */     for ( i = 0 ; i < (max_stencil + 5) ; i++ ) { +      /* this should be back facing */        glVertex2f(-1, -1);        glVertex2f(-1,  1);        glVertex2f( 1,  1); @@ -139,6 +145,7 @@ static void Display( void )     }     glEnd(); +   /* stencil vals should be equal to max_stencil */     glStencilFunc(GL_EQUAL, max_stencil, ~0);     glBegin(GL_QUADS);     glColor3f( 0.5, 0.5, 0.5 ); @@ -148,6 +155,9 @@ static void Display( void )     glVertex2f(-1,  1);     glEnd(); +   /************************************************************************* +    * 4th square +    */     if (use20syntax) {        stencil_func_separate(GL_FRONT, GL_NEVER, 0, ~0);        stencil_func_separate(GL_BACK, GL_ALWAYS, 0, ~0); @@ -161,15 +171,13 @@ static void Display( void )     glTranslatef(3.0, 0, 0);     glBegin(GL_QUADS);     glColor3f( 0.9, 0.9, 0.9 ); - -   /* this should be back facing */     for ( i = 0 ; i < (max_stencil + 5) ; i++ ) { -   /* this should be back facing */ +      /* this should be back facing */        glVertex2f(-1, -1);        glVertex2f(-1,  1);        glVertex2f( 1,  1);        glVertex2f( 1, -1); -   /* this should be front facing */ +      /* this should be front facing */        glVertex2f(-1, -1);        glVertex2f( 1, -1);        glVertex2f( 1,  1); @@ -177,6 +185,7 @@ static void Display( void )     }     glEnd(); +   /* stencil vals should be equal to max_stencil */     glStencilFunc(GL_EQUAL, max_stencil, ~0);     glBegin(GL_QUADS);     glColor3f( 0.5, 0.5, 0.5 ); @@ -186,6 +195,9 @@ static void Display( void )     glVertex2f(-1,  1);     glEnd(); +   /************************************************************************* +    * 5th square +    */     if (use20syntax) {        stencil_func_separate(GL_FRONT, GL_ALWAYS, 0, ~0);        stencil_func_separate(GL_BACK, GL_ALWAYS, 0, ~0); @@ -193,21 +205,19 @@ static void Display( void )     else {        stencil_func_separate_ati(GL_ALWAYS, GL_ALWAYS, 0, ~0);     } -   stencil_op_separate(GL_FRONT, GL_KEEP, GL_KEEP, GL_DECR); -   stencil_op_separate(GL_BACK, GL_KEEP, GL_KEEP, GL_INCR); +   stencil_op_separate(GL_FRONT, GL_KEEP, GL_KEEP, GL_INCR); +   stencil_op_separate(GL_BACK, GL_KEEP, GL_KEEP, GL_DECR);     glTranslatef(3.0, 0, 0);     glBegin(GL_QUADS);     glColor3f( 0.9, 0.9, 0.9 ); - -   /* this should be back facing */     for ( i = 0 ; i < (max_stencil + 5) ; i++ ) { -   /* this should be back facing */ +      /* this should be back facing */        glVertex2f(-1, -1);        glVertex2f(-1,  1);        glVertex2f( 1,  1);        glVertex2f( 1, -1); -   /* this should be front facing */ +      /* this should be front facing */        glVertex2f(-1, -1);        glVertex2f( 1, -1);        glVertex2f( 1,  1); @@ -224,6 +234,47 @@ static void Display( void )     glVertex2f(-1,  1);     glEnd(); +   /************************************************************************* +    * 6th square +    */ +   if (glutExtensionSupported("GL_EXT_stencil_wrap")) { +      if (use20syntax) { +         stencil_func_separate(GL_FRONT, GL_ALWAYS, 0, ~0); +         stencil_func_separate(GL_BACK, GL_ALWAYS, 0, ~0); +      } +      else { +         stencil_func_separate_ati(GL_ALWAYS, GL_ALWAYS, 0, ~0); +      } +      stencil_op_separate(GL_FRONT, GL_KEEP, GL_KEEP, GL_KEEP); +      stencil_op_separate(GL_BACK, GL_KEEP, GL_KEEP, GL_INCR_WRAP); + +      glTranslatef(3.0, 0, 0); +      glBegin(GL_QUADS); +      glColor3f( 0.9, 0.9, 0.9 ); +      for ( i = 0 ; i < (max_stencil + 5) ; i++ ) { +         /* this should be back facing */ +         glVertex2f(-1, -1); +         glVertex2f(-1,  1); +         glVertex2f( 1,  1); +         glVertex2f( 1, -1); +         /* this should be front facing */ +         glVertex2f(-1, -1); +         glVertex2f( 1, -1); +         glVertex2f( 1,  1); +         glVertex2f(-1,  1); +      } +      glEnd(); + +      glStencilFunc(GL_EQUAL, 260 - 255, ~0); +      glBegin(GL_QUADS); +      glColor3f( 0.5, 0.5, 0.5 ); +      glVertex2f(-1, -1); +      glVertex2f( 1, -1); +      glVertex2f( 1,  1); +      glVertex2f(-1,  1); +      glEnd(); +   } +     glPopMatrix();     glutSwapBuffers(); @@ -278,7 +329,7 @@ static void Init( void )     stencil_func_separate_ati = (PFNGLSTENCILFUNCSEPARATEATIPROC) glutGetProcAddress( "glStencilFuncSeparateATI" );     stencil_op_separate = (PFNGLSTENCILOPSEPARATEPROC) glutGetProcAddress( "glStencilOpSeparate" ); -   printf("\nAll 5 squares should be the same color.\n"); +   printf("\nAll 5 (or 6) squares should be the same color.\n");  } diff --git a/progs/tests/stencilreaddraw.c b/progs/tests/stencilreaddraw.c new file mode 100644 index 0000000000..84a5a922a0 --- /dev/null +++ b/progs/tests/stencilreaddraw.c @@ -0,0 +1,187 @@ +/* + * Test glRead/DrawPixels for GL_STENCIL_INDEX, with pixelzoom. + *  + * Brian Paul + * 8 April 2010 + */ + +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <GL/glew.h> +#include <GL/glut.h> + +static GLint WinWidth = 500, WinHeight = 500; +static GLboolean TestPacking = GL_FALSE; +static GLboolean TestList = GL_FALSE; + + +static GLuint StencilValue = 192; + +static void Display(void) +{ +   GLubyte stencil[100 * 100 * 2]; +   GLubyte stencil2[400 * 400]; /* *2 to test pixelstore stuff */ +   GLuint list; + +   glClearColor(0.5, 0.5, 0.5, 1.0); +   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + +   glEnable(GL_DEPTH_TEST); + +   glStencilOp(GL_INVERT, GL_KEEP, GL_REPLACE); +   glStencilFunc(GL_ALWAYS, StencilValue, ~0); +   glEnable(GL_STENCIL_TEST); + +   /* draw a sphere */ +   glViewport(0, 0, 100, 100); +   glMatrixMode(GL_PROJECTION); +   glLoadIdentity(); +   glOrtho(-1, 1, -1, 1, -1, 0);  /* clip away back half of sphere */ +   glMatrixMode(GL_MODELVIEW); +   glLoadIdentity(); +   glutSolidSphere(1.0, 20, 10); + +   glDisable(GL_STENCIL_TEST); + +   if (TestPacking) { +      glPixelStorei(GL_PACK_ROW_LENGTH, 120); +      glPixelStorei(GL_PACK_SKIP_PIXELS, 5); +   } + +   /* read the stencil image */ +   glReadPixels(0, 0, 100, 100, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, stencil); +   { +      GLubyte min, max; +      int i; +      min = max = stencil[0]; +      for (i = 1; i < 100 * 100; i++) { +         if (stencil[i] < min) +            min = stencil[i]; +         if (stencil[i] > max) +            max = stencil[i]; +      } +      printf("Stencil value range: [%u, %u]\n", min, max); +      if (max != StencilValue) { +         printf("Error: expected max stencil val of %u, found %u\n", +                StencilValue, max); +      } +   } + +   /* Draw the Z image as luminance above original rendering */ +   glWindowPos2i(0, 100); +   glDrawPixels(100, 100, GL_LUMINANCE, GL_UNSIGNED_BYTE, stencil); + +   if (1) { +      if (TestPacking) { +         glPixelStorei(GL_PACK_ROW_LENGTH, 0); +         glPixelStorei(GL_PACK_SKIP_PIXELS, 0); +         glPixelStorei(GL_UNPACK_ROW_LENGTH, 120); +         glPixelStorei(GL_UNPACK_SKIP_PIXELS, 5); +      } + +      /* draw stencil image with scaling (into stencil buffer) */ +      glPixelZoom(4.0, 4.0); +      glColor4f(1, 0, 0, 0); +      glWindowPos2i(100, 0); + +      if (TestList) { +         list = glGenLists(1); +         glNewList(list, GL_COMPILE); +         glDrawPixels(100, 100, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, stencil); +         glEndList(); +         glCallList(list); +         glDeleteLists(list, 1); +      } +      else { +         glDrawPixels(100, 100, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, stencil); +      } + +      if (TestPacking) { +         glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); +         glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); +      } + +      /* read back scaled stencil image */ +      glReadPixels(100, 0, 400, 400, GL_STENCIL_INDEX, +                   GL_UNSIGNED_BYTE, stencil2); +      /* draw as luminance */ +      glPixelZoom(1.0, 1.0); +      glWindowPos2i(100, 0); +      glDrawPixels(400, 400, GL_LUMINANCE, GL_UNSIGNED_BYTE, stencil2); +   } + +   glutSwapBuffers(); +} + + +static void Reshape(int width, int height) +{ +   WinWidth = width; +   WinHeight = height; +   glViewport(0, 0, width, height); +} + + +static void Key(unsigned char key, int x, int y) +{ +   (void) x; +   (void) y; +   switch (key) { +      case 'p': +         TestPacking = !TestPacking; +         printf("Test pixel pack/unpack: %d\n", TestPacking); +         break; +      case 'l': +         TestList = !TestList; +         printf("Test dlist: %d\n", TestList); +         break; +      case 27: +         exit(0); +         break; +   } +   glutPostRedisplay(); +} + + +static void Init(void) +{ +   const GLfloat blue[4] = {.1, .1, 1.0, 1.0}; +   const GLfloat gray[4] = {0.2, 0.2, 0.2, 1.0}; +   const GLfloat white[4] = {1.0, 1.0, 1.0, 1.0}; +   const GLfloat pos[4] = {0, 0, 10, 0}; +   GLint bits; + +   printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); +   printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); + +   glGetIntegerv(GL_STENCIL_BITS, &bits); +   printf("Stencil bits: %d\n", bits); + +   assert(bits >= 8); + +   glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, blue); +   glLightfv(GL_LIGHT0, GL_AMBIENT, gray); +   glLightfv(GL_LIGHT0, GL_DIFFUSE, white); +   glLightfv(GL_LIGHT0, GL_POSITION, pos); +   glEnable(GL_LIGHTING); +   glEnable(GL_LIGHT0); +} + + +int main(int argc, char *argv[]) +{ +   glutInit(&argc, argv); +   glutInitWindowPosition(0, 0); +   glutInitWindowSize(WinWidth, WinHeight); +   glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_STENCIL | GLUT_DOUBLE); +   glutCreateWindow(argv[0]); +   glewInit(); +   glutReshapeFunc(Reshape); +   glutKeyboardFunc(Key); +   glutDisplayFunc(Display); +   Init(); +   glutMainLoop(); +   return 0; +} diff --git a/progs/tests/zreaddraw.c b/progs/tests/zreaddraw.c index 4d27b3a505..0910eaaa79 100644 --- a/progs/tests/zreaddraw.c +++ b/progs/tests/zreaddraw.c @@ -11,7 +11,16 @@  #include <GL/glew.h>  #include <GL/glut.h> -static GLint WinWidth = 500, WinHeight = 500; + +#define ZWIDTH 100 +#define ZHEIGHT 100 + +#define ZOOM 4 + +#define ZWIDTH2 (ZOOM * ZWIDTH) +#define ZHEIGHT2 (ZOOM * ZHEIGHT) + +static GLint WinWidth = ZWIDTH + ZWIDTH2, WinHeight = ZHEIGHT + ZHEIGHT2;  static GLboolean Invert = GL_FALSE;  static GLboolean TestPacking = GL_FALSE;  static GLboolean TestList = GL_FALSE; @@ -19,8 +28,8 @@ static GLboolean TestList = GL_FALSE;  static void Display(void)  { -   GLfloat depth[100 * 100 * 2]; -   GLfloat depth2[400 * 400]; /* *2 to test pixelstore stuff */ +   GLfloat depth[ZWIDTH * ZHEIGHT * 2]; +   GLfloat depth2[ZWIDTH2 * ZHEIGHT2]; /* *2 to test pixelstore stuff */     GLuint list;     GLenum depthType = GL_FLOAT; @@ -30,7 +39,7 @@ static void Display(void)     glEnable(GL_DEPTH_TEST);     /* draw a sphere */ -   glViewport(0, 0, 100, 100); +   glViewport(0, 0, ZWIDTH, ZHEIGHT);     glMatrixMode(GL_PROJECTION);     glLoadIdentity();     glOrtho(-1, 1, -1, 1, -1, 0);  /* clip away back half of sphere */ @@ -44,12 +53,12 @@ static void Display(void)     }     /* read the depth image */ -   glReadPixels(0, 0, 100, 100, GL_DEPTH_COMPONENT, depthType, depth); +   glReadPixels(0, 0, ZWIDTH, ZHEIGHT, GL_DEPTH_COMPONENT, depthType, depth);     if (depthType == GL_FLOAT) {        GLfloat min, max;        int i;        min = max = depth[0]; -      for (i = 1; i < 100 * 100; i++) { +      for (i = 1; i < ZWIDTH * ZHEIGHT; i++) {           if (depth[i] < min)              min = depth[i];           if (depth[i] > max) @@ -58,9 +67,22 @@ static void Display(void)        printf("Depth value range: [%f, %f]\n", min, max);     } +   /* debug */ +   if (0) { +      int i; +      float *z = depth + ZWIDTH * 50; +      printf("z at y=50:\n"); +      for (i = 0; i < ZWIDTH; i++) { +         printf("%5.3f ", z[i]); +         if ((i + 1) % 12 == 0) +            printf("\n"); +      } +      printf("\n"); +   } +     /* Draw the Z image as luminance above original rendering */ -   glWindowPos2i(0, 100); -   glDrawPixels(100, 100, GL_LUMINANCE, depthType, depth); +   glWindowPos2i(0, ZHEIGHT); +   glDrawPixels(ZWIDTH, ZHEIGHT, GL_LUMINANCE, depthType, depth);     if (TestPacking) {        glPixelStorei(GL_PACK_ROW_LENGTH, 0); @@ -70,9 +92,9 @@ static void Display(void)     }     /* draw depth image with scaling (into z buffer) */ -   glPixelZoom(4.0, 4.0); +   glPixelZoom(ZOOM, ZOOM);     glColor4f(1, 0, 0, 0); -   glWindowPos2i(100, 0); +   glWindowPos2i(ZWIDTH, 0);     if (Invert) {        glPixelTransferf(GL_DEPTH_SCALE, -1.0);        glPixelTransferf(GL_DEPTH_BIAS, 1.0); @@ -80,13 +102,13 @@ static void Display(void)     if (TestList) {        list = glGenLists(1);        glNewList(list, GL_COMPILE); -      glDrawPixels(100, 100, GL_DEPTH_COMPONENT, depthType, depth); +      glDrawPixels(ZWIDTH, ZHEIGHT, GL_DEPTH_COMPONENT, depthType, depth);        glEndList();        glCallList(list);        glDeleteLists(list, 1);     }     else { -      glDrawPixels(100, 100, GL_DEPTH_COMPONENT, depthType, depth); +      glDrawPixels(ZWIDTH, ZHEIGHT, GL_DEPTH_COMPONENT, depthType, depth);     }     if (Invert) {        glPixelTransferf(GL_DEPTH_SCALE, 1.0); @@ -101,24 +123,25 @@ static void Display(void)     glDisable(GL_DEPTH_TEST);     /* read back scaled depth image */ -   glReadPixels(100, 0, 400, 400, GL_DEPTH_COMPONENT, GL_FLOAT, depth2); +   glReadPixels(ZWIDTH, 0, ZWIDTH2, ZHEIGHT2, GL_DEPTH_COMPONENT, GL_FLOAT, depth2);     /* debug */     if (0) {        int i; -      float *z = depth2 + 400 * 200; +      float *z = depth2 + ZWIDTH2 * 200;        printf("z at y=200:\n"); -      for (i = 0; i < 400; i++) { +      for (i = 0; i < ZWIDTH2; i++) {           printf("%5.3f ", z[i]);           if ((i + 1) % 12 == 0)              printf("\n");        } +      printf("\n");     }     /* draw as luminance */     glPixelZoom(1.0, 1.0); -   glWindowPos2i(100, 0); -   glDrawPixels(400, 400, GL_LUMINANCE, GL_FLOAT, depth2); +   glWindowPos2i(ZWIDTH, 0); +   glDrawPixels(ZWIDTH2, ZHEIGHT2, GL_LUMINANCE, GL_FLOAT, depth2);     glutSwapBuffers();  } @@ -162,9 +185,13 @@ static void Init(void)     const GLfloat gray[4] = {0.2, 0.2, 0.2, 1.0};     const GLfloat white[4] = {1.0, 1.0, 1.0, 1.0};     const GLfloat pos[4] = {0, 0, 10, 0}; +   GLint z; + +   glGetIntegerv(GL_DEPTH_BITS, &z);     printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));     printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); +   printf("GL_DEPTH_BITS = %d\n", z);     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, blue);     glLightfv(GL_LIGHT0, GL_AMBIENT, gray);  | 
