X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=blobdiff_plain;f=progs%2Ftests%2Fzreaddraw.c;h=0910eaaa799a77e5552d9a5ebdc15543d4c317ad;hp=8839e108360dc280c0579a63347e566d916949f0;hb=ccd13da0fc1f1813b55fc0d2181a6cb0d3b42b0d;hpb=f02f63997ce65530788a6dfcb28f11790a14d938 diff --git a/progs/tests/zreaddraw.c b/progs/tests/zreaddraw.c index 8839e108360..0910eaaa799 100644 --- a/progs/tests/zreaddraw.c +++ b/progs/tests/zreaddraw.c @@ -11,15 +11,27 @@ #include #include -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; static void Display(void) { - GLfloat depth[100 * 100]; - GLfloat depth2[400 * 400]; - GLfloat min, max; - int i; + GLfloat depth[ZWIDTH * ZHEIGHT * 2]; + GLfloat depth2[ZWIDTH2 * ZHEIGHT2]; /* *2 to test pixelstore stuff */ + GLuint list; + GLenum depthType = GL_FLOAT; glClearColor(0.5, 0.5, 0.5, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -27,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 */ @@ -35,30 +47,101 @@ static void Display(void) glLoadIdentity(); glutSolidSphere(1.0, 20, 10); + if (TestPacking) { + glPixelStorei(GL_PACK_ROW_LENGTH, 120); + glPixelStorei(GL_PACK_SKIP_PIXELS, 5); + } + /* read the depth image */ - glReadPixels(0, 0, 100, 100, GL_DEPTH_COMPONENT, GL_FLOAT, depth); - min = max = depth[0]; - for (i = 1; i < 100 * 100; i++) { - if (depth[i] < min) - min = depth[i]; - if (depth[i] > max) - max = depth[i]; + 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 < ZWIDTH * ZHEIGHT; i++) { + if (depth[i] < min) + min = depth[i]; + if (depth[i] > max) + max = depth[i]; + } + 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, ZHEIGHT); + glDrawPixels(ZWIDTH, ZHEIGHT, GL_LUMINANCE, depthType, depth); + + 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); } - printf("Depth value range: [%f, %f]\n", min, max); /* draw depth image with scaling (into z buffer) */ - glPixelZoom(4.0, 4.0); + glPixelZoom(ZOOM, ZOOM); glColor4f(1, 0, 0, 0); - glWindowPos2i(100, 0); - glDrawPixels(100, 100, GL_DEPTH_COMPONENT, GL_FLOAT, depth); + glWindowPos2i(ZWIDTH, 0); + if (Invert) { + glPixelTransferf(GL_DEPTH_SCALE, -1.0); + glPixelTransferf(GL_DEPTH_BIAS, 1.0); + } + if (TestList) { + list = glGenLists(1); + glNewList(list, GL_COMPILE); + glDrawPixels(ZWIDTH, ZHEIGHT, GL_DEPTH_COMPONENT, depthType, depth); + glEndList(); + glCallList(list); + glDeleteLists(list, 1); + } + else { + glDrawPixels(ZWIDTH, ZHEIGHT, GL_DEPTH_COMPONENT, depthType, depth); + } + if (Invert) { + glPixelTransferf(GL_DEPTH_SCALE, 1.0); + glPixelTransferf(GL_DEPTH_BIAS, 0.0); + } + + if (TestPacking) { + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + } 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 + ZWIDTH2 * 200; + printf("z at y=200:\n"); + 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); - glDrawPixels(400, 400, GL_LUMINANCE, GL_FLOAT, depth2); + glWindowPos2i(ZWIDTH, 0); + glDrawPixels(ZWIDTH2, ZHEIGHT2, GL_LUMINANCE, GL_FLOAT, depth2); glutSwapBuffers(); } @@ -77,6 +160,17 @@ static void Key(unsigned char key, int x, int y) (void) x; (void) y; switch (key) { + case 'i': + Invert = !Invert; + break; + 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; @@ -91,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);