diff options
author | Eric Anholt <eric@anholt.net> | 2008-08-21 11:16:53 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2008-08-21 11:18:51 -0700 |
commit | 4bcd9a8a95efb2796ab46dd9616aaa2331df9e8d (patch) | |
tree | 7983715cd9615f9d1a949f4744de026bf6ce532d /tests | |
parent | 6e01207dd195744ee97b2d33cfc634258572a13d (diff) |
New test: texturing/gen-teximage.
Tests SGIS_generate_mipmap versus glTexImage2D. Catches a mesa bug with
updating GL_GENERATE_MIPMAP state without flushing.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/all.tests | 1 | ||||
-rw-r--r-- | tests/texturing/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/texturing/gen-teximage.c | 209 |
3 files changed, 211 insertions, 0 deletions
diff --git a/tests/all.tests b/tests/all.tests index e33dd4216..5d72c62aa 100644 --- a/tests/all.tests +++ b/tests/all.tests @@ -86,6 +86,7 @@ bugs['tex1d-2dborder'] = PlainExecTest([testBinDir + 'tex1d-2dborder', '-auto']) texturing = Group() texturing['copytexsubimage'] = PlainExecTest([testBinDir + 'copytexsubimage', '-auto']) texturing['cubemap'] = PlainExecTest([testBinDir + 'cubemap', '-auto']) +texturing['gen-teximage'] = PlainExecTest([testBinDir + 'gen-teximage', '-auto']) texturing['gen-texsubimage'] = PlainExecTest([testBinDir + 'gen-texsubimage', '-auto']) texturing['lodbias'] = PlainExecTest([testBinDir + 'lodbias', '-auto']) texturing['tex3d'] = PlainExecTest([testBinDir + 'tex3d']) diff --git a/tests/texturing/CMakeLists.txt b/tests/texturing/CMakeLists.txt index cfaadd284..721788911 100644 --- a/tests/texturing/CMakeLists.txt +++ b/tests/texturing/CMakeLists.txt @@ -20,6 +20,7 @@ link_libraries ( add_executable (copytexsubimage copytexsubimage.c) add_executable (cubemap cubemap.c) +add_executable (gen-teximage gen-teximage.c) add_executable (gen-texsubimage gen-texsubimage.c) add_executable (lodbias lodbias.c) add_executable (tex3d tex3d.c) diff --git a/tests/texturing/gen-teximage.c b/tests/texturing/gen-teximage.c new file mode 100644 index 000000000..32f330a34 --- /dev/null +++ b/tests/texturing/gen-teximage.c @@ -0,0 +1,209 @@ +/* + * Copyright © 2008 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Chris Lord <chris@openedhand.com> + * Eric Anholt <eric@anholt.net> + * + */ + +/** @file gen-teximage.c + * + * Tests that: + * - The full mipmap tree is generated when level 0 is set in a new + * texture object. + * - Changing GL_GENERATE_MIPMAP state flushes previous vertices. + * - The full mipmap tree is regenerated when level 0 is updated in an + * existing texture. + */ + +#include "GL/glut.h" +#include <string.h> +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <math.h> +#include "piglit-util.h" + +#define WIN_WIDTH 512 +#define WIN_HEIGHT 512 +#define SIZE 128 + +static GLboolean Automatic = GL_FALSE; + +static void display_mipmaps(int start_x, int start_y) +{ + int i; + + /* Disply all the mipmap levels */ + for (i = SIZE; i > 0; i /= 2) { + glBegin(GL_QUADS); + glTexCoord2f(0.0, 0.0); glVertex2f(start_x + 0, start_y + 0); + glTexCoord2f(1.0, 0.0); glVertex2f(start_x + i, start_y + 0); + glTexCoord2f(1.0, 1.0); glVertex2f(start_x + i, start_y + i); + glTexCoord2f(0.0, 1.0); glVertex2f(start_x + 0, start_y + i); + glEnd(); + + start_x += i; + } +} + +static void fill_level(int level, const GLfloat *color) +{ + GLfloat *data; + int size = SIZE / (1 << level); + int i; + + /* Update a square inside the texture to red */ + data = malloc(size * size * 4 * sizeof(GLfloat)); + for (i = 0; i < 4 * size * size; i += 4) { + data[i + 0] = color[0]; + data[i + 1] = color[1]; + data[i + 2] = color[2]; + data[i + 3] = color[3]; + } + glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, size, size, 0, + GL_RGBA, GL_FLOAT, data); + free(data); +} + +static GLboolean check_resulting_mipmaps(int x, int y, const GLfloat *color) +{ + GLboolean pass = GL_TRUE; + int i; + + for (i = SIZE; i > 4; i /= 2) { + pass = pass && piglit_probe_pixel_rgb(x + i / 2, y + i / 2, + color); + x += i; + } + + return pass; +} + +static void display() +{ + const GLfloat red[4] = {1.0, 0.0, 0.0, 0.0}; + const GLfloat blue[4] = {0.0, 0.0, 1.0, 0.0}; + GLint texture; + int i; + + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); + + /* Set up a texture object with mipmap generation */ + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + GL_LINEAR_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); + + /* Set the first level of the new texture to red and display. */ + fill_level(0, red); + display_mipmaps(0, 0); + + glDeleteTextures(1, &texture); + + /* Set up texture object without mipmap generation */ + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + GL_LINEAR_MIPMAP_NEAREST); + + /* Paint normal blue mipmap set */ + for (i = 0; SIZE / (1 << i) > 0; i++) + fill_level(i, blue); + + display_mipmaps(0, SIZE); + + /* Enable GENERATE_MIPMAP and set the first (and thus all) levels to + * blue. + */ + glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); + fill_level(0, red); + display_mipmaps(0, SIZE * 2); + + glDeleteTextures(1, &texture); + + glutSwapBuffers(); + glFlush(); + + if (Automatic) { + int dim; + GLboolean pass = GL_TRUE; + + pass = pass && check_resulting_mipmaps(0, 0, red); + pass = pass && check_resulting_mipmaps(0, SIZE, blue); + pass = pass && check_resulting_mipmaps(0, SIZE * 2, red); + + if (Automatic) + printf("PIGLIT: {'result': '%s' }\n", + pass ? "pass" : "fail"); + exit(pass ? 0 : 1); + } +} + +static void init() +{ + piglit_require_extension("GL_SGIS_generate_mipmap"); + + /* Set up projection matrix so we can just draw using window + * coordinates. + */ + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, WIN_WIDTH, 0, WIN_HEIGHT, -1, 1); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + glEnable(GL_TEXTURE_2D); +} + +int main(int argc, char**argv) +{ + int i; + glutInit(&argc, argv); + for(i = 1; i < argc; ++i) { + if (!strcmp(argv[i], "-auto")) + Automatic = 1; + else + printf("Unknown option: %s\n", argv[i]); + } + glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); + glutInitWindowSize(WIN_WIDTH, WIN_HEIGHT); + glutInitWindowPosition(100, 100); + glutCreateWindow("gen-teximage"); + init(); + glutDisplayFunc(display); + glutMainLoop(); +} |