diff options
author | Eric Anholt <eric@anholt.net> | 2010-03-17 10:53:05 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2010-03-17 10:53:05 -0700 |
commit | 74f7a3b3d23bfc24a81ecf66f801347759f93d57 (patch) | |
tree | 38849ade1ce8697e1cb3d14bd0694842395f6582 | |
parent | a226c6ce9e8a3bed5414eb144700833cb7786a83 (diff) |
depth-level-clamp: Test for a miptree relayout failure in the 965 driver.
This test may be obsoleted later if we stop relayouting due to
baselevel, but for now this shows off a failure in the relayout code
when doing a fallback blit.
-rw-r--r-- | tests/all.tests | 1 | ||||
-rw-r--r-- | tests/texturing/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/texturing/depth-level-clamp.c | 164 |
3 files changed, 166 insertions, 0 deletions
diff --git a/tests/all.tests b/tests/all.tests index 6112d415f..f485085ea 100644 --- a/tests/all.tests +++ b/tests/all.tests @@ -258,6 +258,7 @@ texturing = Group() add_plain_test(texturing, 'array-texture') add_plain_test(texturing, 'copytexsubimage') add_plain_test(texturing, 'cubemap') +add_plain_test(texturing, 'depth-level-clamp') add_plain_test(texturing, 'gen-teximage') add_plain_test(texturing, 'gen-compressed-teximage') add_plain_test(texturing, 'gen-nonzero-unit') diff --git a/tests/texturing/CMakeLists.txt b/tests/texturing/CMakeLists.txt index f6919a6af..86d4e5149 100644 --- a/tests/texturing/CMakeLists.txt +++ b/tests/texturing/CMakeLists.txt @@ -22,6 +22,7 @@ link_libraries ( add_executable (array-texture array-texture.c) add_executable (copytexsubimage copytexsubimage.c) add_executable (cubemap cubemap.c) +add_executable (depth-level-clamp depth-level-clamp.c) add_executable (gen-compressed-teximage gen-compressed-teximage.c) add_executable (gen-nonzero-unit gen-nonzero-unit.c) add_executable (gen-teximage gen-teximage.c) diff --git a/tests/texturing/depth-level-clamp.c b/tests/texturing/depth-level-clamp.c new file mode 100644 index 000000000..a7c1009f3 --- /dev/null +++ b/tests/texturing/depth-level-clamp.c @@ -0,0 +1,164 @@ +/* + * Copyright © 2010 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: + * Eric Anholt <eric@anholt.net> + * + */ + +/** + * @file depth-level-clamp.c + * + * Tests that glTexImage2D()ing in the mipmap levels of a depth texture and then + * rendering with them with various clamping works correctly. + * + * This test is designed to catch a failure in the 965 driver's depth + * miptree copying for relayout that occurs due to the clamping. + */ + +#include "piglit-util.h" + +#define MAX_SIZE 64 +#define MAX_LOD 6 +#define PAD 5 + +int piglit_window_mode = GLUT_DOUBLE | GLUT_RGB; +int piglit_width = (MAX_SIZE * 2 + PAD * 3); +int piglit_height = (MAX_SIZE * MAX_LOD + PAD * (MAX_LOD + 1)); + +static void +set_level_value(int level, int size, float val) +{ + GLfloat *tex; + int x, y; + + tex = malloc(size * size * sizeof(GLfloat)); + + for (y = 0; y < size; y++) { + for (x = 0; x < size; x++) { + tex[(y * size + x)] = val; + } + } + + glTexImage2D(GL_TEXTURE_2D, level, GL_DEPTH_COMPONENT, + size, size, 0, + GL_DEPTH_COMPONENT, GL_FLOAT, tex); + + free(tex); +} + +enum piglit_result +piglit_display(void) +{ + int dim; + GLboolean pass = GL_TRUE; + int level, x, y; + GLuint tex; + float val; + + piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE); + + /* Clear background to gray */ + glClearColor(0.0, 0.7, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + + /* Create the texture. */ + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + /* Fill in each level */ + val = 1.0; + for (level = 0, dim = MAX_SIZE; dim > 0; level++, dim /= 2) { + set_level_value(level, dim, val); + val -= 1.0 / MAX_LOD; + } + + glEnable(GL_TEXTURE_2D); + + /* Draw areas of the base level size with clamping to the + * minimum mip lod of each texture level. + */ + x = PAD; + y = PAD; + for (level = 0, dim = MAX_SIZE; dim > 1; level++, dim /= 2) { + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, level); + piglit_draw_rect_tex(x, y, MAX_SIZE, MAX_SIZE, + 0.0, 0.0, 1.0, 1.0); + y += MAX_SIZE + PAD; + } + + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, 0.0); + + /* Draw areas of the base level size with level clamping to + * each texture level. + */ + x = PAD + MAX_SIZE + PAD; + y = PAD; + for (level = 0, dim = MAX_SIZE; dim > 1; level++, dim /= 2) { + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, level); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, level); + piglit_draw_rect_tex(x, y, MAX_SIZE, MAX_SIZE, + 0.0, 0.0, 1.0, 1.0); + y += MAX_SIZE + PAD; + } + + /* Verify that the resulting images are blended between the levels. */ + x = PAD; + y = PAD; + val = 1.0; + for (level = 0, dim = MAX_SIZE; dim > 1; level++, dim /= 2) { + float expected[3]; + int i; + + for (i = 0; i < 3; i++) + expected[i] = val; + + pass = piglit_probe_pixel_rgb(x + MAX_SIZE / 2, + y + MAX_SIZE / 2, + expected) && pass; + + pass = piglit_probe_pixel_rgb(x + MAX_SIZE + PAD + MAX_SIZE / 2, + y + MAX_SIZE / 2, + expected) && pass; + + y += MAX_SIZE + PAD; + val -= 1.0 / MAX_LOD; + } + + glDeleteTextures(1, &tex); + + glutSwapBuffers(); + + return pass ? PIGLIT_SUCCESS : PIGLIT_FAILURE; +} + +void +piglit_init(int argc, char **argv) +{ + piglit_require_extension("GL_ARB_depth_texture"); +} |