Guess so. I hadn't noticed that test before. -Brian
On Thu, Oct 14, 2010 at 9:05 AM, Keith Whitwell <[email protected]> wrote: > Isn't this a quite similar concept to tests/texfilt? > > Keith > > > On Thu, Oct 14, 2010 at 3:55 PM, Brian Paul > <[email protected]> wrote: >> Module: Demos >> Branch: master >> Commit: 4d981d192bcff29fd85c794415148988518c6eae >> URL: >> http://cgit.freedesktop.org/mesa/demos/commit/?id=4d981d192bcff29fd85c794415148988518c6eae >> >> Author: Brian Paul <[email protected]> >> Date: Thu Oct 14 08:49:01 2010 -0600 >> >> mipmap_tunnel: new test to examine mipmap filtering >> >> --- >> >> src/tests/Makefile.am | 1 + >> src/tests/mipmap_tunnel.c | 250 >> +++++++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 251 insertions(+), 0 deletions(-) >> >> diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am >> index 03e3c97..cd7424b 100644 >> --- a/src/tests/Makefile.am >> +++ b/src/tests/Makefile.am >> @@ -107,6 +107,7 @@ noinst_PROGRAMS = \ >> mipmap_comp_tests \ >> mipmap_limits \ >> mipmap_view \ >> + mipmap_tunnel \ >> multipal \ >> multitexarray \ >> multiwindow \ >> diff --git a/src/tests/mipmap_tunnel.c b/src/tests/mipmap_tunnel.c >> new file mode 100644 >> index 0000000..05c4e9e >> --- /dev/null >> +++ b/src/tests/mipmap_tunnel.c >> @@ -0,0 +1,250 @@ >> +/** >> + * Display trilinear mipmap filtering quality. >> + * We look down a long tunnel shape which has a mipmapped texture >> + * applied to it. Ideally, the transition from one mipmap level to >> + * another should be nice and regular/circular. >> + * This sort of test is frequently seen in online articles about GPU >> + * texture filtering. >> + * >> + * Brian Paul >> + * 13 Oct 2010 >> + */ >> + >> + >> +#include <stdlib.h> >> +#include <stdio.h> >> +#include <GL/glew.h> >> +#include <GL/glut.h> >> +#include <GL/glu.h> >> + >> + >> +static GLfloat LodBias = 0.0; >> +static GLboolean NearestFilter = GL_FALSE; >> +static GLfloat Zpos = -10.0, Zrot = 0.0; >> +static GLuint TexObj; >> + >> +#define TEX_SIZE 1024 >> + >> + >> +/** Make a solid-colored texture image */ >> +static void >> +MakeImage(int level, int width, int height, const GLubyte color[4]) >> +{ >> + const int makeStripes = 0; >> + GLubyte img[TEX_SIZE * TEX_SIZE * 3]; >> + int i, j; >> + for (i = 0; i < height; i++) { >> + for (j = 0; j < width; j++) { >> + int k = (i * width + j) * 3; >> + int p = (i / 8) & makeStripes; >> + if (p == 0) { >> + img[k + 0] = color[0]; >> + img[k + 1] = color[1]; >> + img[k + 2] = color[2]; >> + } >> + else { >> + img[k + 0] = 0; >> + img[k + 1] = 0; >> + img[k + 2] = 0; >> + } >> + } >> + } >> + >> + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); >> + glTexImage2D(GL_TEXTURE_2D, level, GL_RGB, width, height, 0, >> + GL_RGB, GL_UNSIGNED_BYTE, img); >> +} >> + >> + >> +/** Make a mipmap in which each level is a different, solid color */ >> +static void >> +MakeMipmap(void) >> +{ >> + static const GLubyte colors[12][3] = { >> + {255, 0, 0}, >> + {0, 255, 0}, >> + {0, 0, 255}, >> + {0, 255, 255}, >> + {255, 0, 255}, >> + {255, 255, 0}, >> + {255, 0, 0}, >> + {0, 255, 0}, >> + {0, 0, 255}, >> + {0, 255, 255}, >> + {255, 0, 255}, >> + {255, 255, 0}, >> + }; >> + int i, sz = TEX_SIZE; >> + >> + for (i = 0; sz > 0; i++) { >> + MakeImage(i, sz, sz, colors[i]); >> + printf("Level %d size: %d x %d\n", i, sz, sz); >> + sz /= 2; >> + } >> +} >> + >> + >> +static void >> +Init(void) >> +{ >> + glClearColor(.5, .5, .5, .5); >> + >> + glGenTextures(1, &TexObj); >> + glBindTexture(GL_TEXTURE_2D, TexObj); >> + MakeMipmap(); >> + >> + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); >> + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); >> + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); >> + >> + printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); >> + printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); >> +} >> + >> + >> +static void >> +DrawTunnel(void) >> +{ >> + const float radius = 10.0, height = 500.0; >> + const int slices = 24, stacks = 52; >> + const float bias = 0.995; >> + GLUquadric *q = gluNewQuadric(); >> + >> + glPushMatrix(); >> + glRotatef(180, 1, 0, 0); >> + glEnable(GL_TEXTURE_2D); >> + gluQuadricTexture(q, GL_TRUE); >> + gluCylinder(q, radius, radius, height, slices, stacks); >> + >> + glDisable(GL_TEXTURE_2D); >> + glColor3f(0, 0, 0); >> + gluQuadricDrawStyle(q, GLU_LINE); >> + gluCylinder(q, bias*radius, bias*radius, height/4, slices, stacks/4); >> + glPopMatrix(); >> + >> + gluDeleteQuadric(q); >> +} >> + >> + >> +static void >> +PrintString(const char *s) >> +{ >> + while (*s) { >> + glutBitmapCharacter(GLUT_BITMAP_8_BY_13, (int) *s); >> + s++; >> + } >> +} >> + >> + >> +static void >> +Display(void) >> +{ >> + char str[100]; >> + >> + glBindTexture(GL_TEXTURE_2D, TexObj); >> + >> + if (NearestFilter) { >> + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); >> + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, >> + GL_NEAREST_MIPMAP_NEAREST); >> + } >> + else { >> + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); >> + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, >> + GL_LINEAR_MIPMAP_LINEAR); >> + } >> + >> + glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, >> LodBias); >> + >> + glClear(GL_COLOR_BUFFER_BIT); >> + >> + glPushMatrix(); >> + glTranslatef(0.0, 0.0, Zpos); >> + glRotatef(Zrot, 0, 0, 1); >> + DrawTunnel(); >> + glPopMatrix(); >> + >> + glColor3f(1, 1, 1); >> + glWindowPos2i(10, 10); >> + sprintf(str, "LOD bias (b/B): %.3f", LodBias); >> + PrintString(str); >> + >> + glutSwapBuffers(); >> +} >> + >> + >> +static void >> +Reshape(int w, int h) >> +{ >> + glViewport(0, 0, w, h); >> + glMatrixMode(GL_PROJECTION); >> + glLoadIdentity(); >> + gluPerspective(80.0, 1.0 * (GLfloat) w / (GLfloat) h, 1.0, 3000.0); >> + glMatrixMode(GL_MODELVIEW); >> + glLoadIdentity(); >> +} >> + >> + >> +static void >> +Key(unsigned char k, int x, int y) >> +{ >> + (void) x; >> + (void) y; >> + switch (k) { >> + case 'b': >> + LodBias -= 0.125; >> + break; >> + case 'B': >> + LodBias += 0.125; >> + break; >> + case 'f': >> + NearestFilter = !NearestFilter; >> + break; >> + case 'r': >> + Zrot--; >> + break; >> + case 'R': >> + Zrot++; >> + break; >> + case 'z': >> + Zpos--; >> + break; >> + case 'Z': >> + Zpos++; >> + break; >> + case 27: >> + exit(0); >> + break; >> + default: >> + return; >> + } >> + glutPostRedisplay(); >> +} >> + >> + >> +static void >> +Usage(void) >> +{ >> + printf("Keys:\n"); >> + printf(" b/B decrease/increase GL_TEXTURE_LOD_BIAS\n"); >> + printf(" f toggle nearest/linear filtering\n"); >> + printf(" r/R rotate tunnel\n"); >> +} >> + >> + >> +int >> +main(int argc, char **argv) >> +{ >> + glutInitWindowSize(600, 600); >> + glutInit(&argc, argv); >> + glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); >> + glutCreateWindow(argv[0]); >> + glewInit(); >> + glutReshapeFunc(Reshape); >> + glutDisplayFunc(Display); >> + glutKeyboardFunc(Key); >> + Init(); >> + Usage(); >> + glutMainLoop(); >> + return 0; >> +} >> >> _______________________________________________ >> mesa-commit mailing list >> [email protected] >> http://lists.freedesktop.org/mailman/listinfo/mesa-commit >> > _______________________________________________ > mesa-dev mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/mesa-dev > _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
