diff options
author | Laura Ekstrand <laura@jlekstrand.net> | 2014-10-17 14:11:48 -0700 |
---|---|---|
committer | Laura Ekstrand <laura@jlekstrand.net> | 2014-10-28 15:12:19 -0700 |
commit | 1e111c749e49a014eda8b4ddf5bef0e294197219 (patch) | |
tree | 5e85051bff99694f1c610b25bdea8c20a3ac0405 | |
parent | 0d0492b7cbbe38b2a9197f26d7a7cf230a144b1a (diff) |
Removed Glean read pixels sanity test.
-rw-r--r-- | tests/all.py | 1 | ||||
-rw-r--r-- | tests/glean/CMakeLists.gl.txt | 1 | ||||
-rw-r--r-- | tests/glean/treadpix.cpp | 706 | ||||
-rw-r--r-- | tests/glean/treadpix.h | 291 |
4 files changed, 0 insertions, 999 deletions
diff --git a/tests/all.py b/tests/all.py index 4b56e4b03..52eb03287 100644 --- a/tests/all.py +++ b/tests/all.py @@ -117,7 +117,6 @@ glean['pointAtten'] = GleanTest('pointAtten') glean['pointSprite'] = GleanTest('pointSprite') # exactRGBA is not included intentionally, because it's too strict and # the equivalent functionality is covered by other tests -glean['readPixSanity'] = GleanTest('readPixSanity') glean['shaderAPI'] = GleanTest('shaderAPI') glean['stencil2'] = GleanTest('stencil2') glean['texCombine'] = GleanTest('texCombine') diff --git a/tests/glean/CMakeLists.gl.txt b/tests/glean/CMakeLists.gl.txt index 558d88793..5b63d6454 100644 --- a/tests/glean/CMakeLists.gl.txt +++ b/tests/glean/CMakeLists.gl.txt @@ -42,7 +42,6 @@ piglit_add_executable (glean tpixelformats.cpp tpointatten.cpp tpointsprite.cpp - treadpix.cpp tshaderapi.cpp tstencil2.cpp ttexcombine.cpp diff --git a/tests/glean/treadpix.cpp b/tests/glean/treadpix.cpp deleted file mode 100644 index 490f2f5d7..000000000 --- a/tests/glean/treadpix.cpp +++ /dev/null @@ -1,706 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 2001 Allen Akin All Rights Reserved. -// -// 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 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 ALLEN AKIN 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. -// -// END_COPYRIGHT - -// treadpix.cpp: implementation of ReadPixels tests - -#include <cmath> -#ifdef __CYGWIN__ -#undef log2 -#endif -#include <iomanip> -#include <cstdlib> -#include <algorithm> -#include "misc.h" -#include "rand.h" -#include "treadpix.h" - - -namespace GLEAN { - -void -ReadPixSanityTest::checkRGBA(ReadPixSanityResult& r, Window& w) { - DrawingSurfaceConfig& config = *r.config; - RandomBitsDouble rRand(config.r, 1066); - RandomBitsDouble gRand(config.g, 1492); - RandomBitsDouble bRand(config.b, 1776); - RandomBitsDouble aRand((config.a? config.a: 1), 1789); - int thresh = 1; - - r.passRGBA = true; - r.errRGBA = 0.0; - for (int i = 0; i < 100 && r.passRGBA; ++i) { - // Generate a random color and use it to clear the color buffer: - float expected[4]; - expected[0] = rRand.next(); - expected[1] = gRand.next(); - expected[2] = bRand.next(); - expected[3] = aRand.next(); - glClearColor(expected[0],expected[1],expected[2],expected[3]); - glClear(GL_COLOR_BUFFER_BIT); - - // If the color buffer doesn't have an alpha channel, then - // the spec requires the readback value to be 1.0: - if (!config.a) - expected[3] = 1.0; - - // Read the buffer: - GLfloat buf[READPIX_SANITY_WIN_SIZE][READPIX_SANITY_WIN_SIZE][4]; - glReadPixels(0, 0, READPIX_SANITY_WIN_SIZE, - READPIX_SANITY_WIN_SIZE, GL_RGBA, GL_FLOAT, buf); - - // Now compute the error for each pixel, and record the - // worst one we find: - for (int y = 0; y < READPIX_SANITY_WIN_SIZE; ++y) - for (int x = 0; x < READPIX_SANITY_WIN_SIZE; ++x) { - GLfloat dr = abs(buf[y][x][0] - expected[0]); - GLfloat dg = abs(buf[y][x][1] - expected[1]); - GLfloat db = abs(buf[y][x][2] - expected[2]); - GLfloat da = abs(buf[y][x][3] - expected[3]); - double err = - max(ErrorBits(dr, config.r), - max(ErrorBits(dg, config.g), - max(ErrorBits(db, config.b), - ErrorBits(da, - config.a? config.a: thresh+1)))); - // The "thresh+1" fudge above is - // needed to force the error to - // be greater than the threshold - // in the case where there is no - // alpha channel. Without it the - // error would be just equal to - // the threshold, and the test - // would spuriously pass. - if (err > r.errRGBA) { - r.xRGBA = x; - r.yRGBA = y; - r.errRGBA = err; - for (int j = 0; j < 4; ++j) { - r.expectedRGBA[j] = expected[j]; - r.actualRGBA[j] = buf[y][x][j]; - } - } - } - - if (r.errRGBA > thresh) - r.passRGBA = false; - w.swap(); - } -} // ReadPixSanityTest::checkRGBA - -void -ReadPixSanityTest::checkDepth(ReadPixSanityResult& r, Window& w) { - DrawingSurfaceConfig& config = *r.config; - RandomDouble dRand(35798); - int thresh = 1; - - r.passDepth = true; - r.errDepth = 0.0; - for (int i = 0; i < 100 && r.passDepth; ++i) { - // Generate a random depth and use it to clear the depth buffer: - GLdouble expected = dRand.next(); - glClearDepth(expected); - glClear(GL_DEPTH_BUFFER_BIT); - - // Because glReadPixels won't return data of type GLdouble, - // there's no straightforward portable way to deal with - // integer depth buffers that are deeper than 32 bits or - // floating-point depth buffers that have higher precision - // than a GLfloat. Since this is just a sanity check, we'll - // use integer readback and settle for 32 bits at best. - GLuint buf[READPIX_SANITY_WIN_SIZE][READPIX_SANITY_WIN_SIZE]; - glReadPixels(0, 0, READPIX_SANITY_WIN_SIZE, - READPIX_SANITY_WIN_SIZE, GL_DEPTH_COMPONENT, - GL_UNSIGNED_INT, buf); - - // Now compute the error for each pixel, and record the - // worst one we find: - for (int y = 0; y < READPIX_SANITY_WIN_SIZE; ++y) - for (int x = 0; x < READPIX_SANITY_WIN_SIZE; ++x) { - GLfloat dd = abs(buf[y][x]/4294967295.0 - - expected); - double err = ErrorBits(dd, config.z); - if (err > r.errDepth) { - r.xDepth = x; - r.yDepth = y; - r.errDepth = err; - r.expectedDepth = expected; - r.actualDepth = buf[y][x]/4294967295.0; - } - } - - if (r.errDepth > thresh) - r.passDepth = false; - w.swap(); - } -} // ReadPixSanityTest::checkDepth - -void -ReadPixSanityTest::checkStencil(ReadPixSanityResult& r, Window& w) { - DrawingSurfaceConfig& config = *r.config; - RandomBits sRand(config.s, 10101); - - r.passStencil = true; - for (int i = 0; i < 100 && r.passStencil; ++i) { - GLuint expected = sRand.next(); - glClearStencil(expected); - glClear(GL_STENCIL_BUFFER_BIT); - - GLuint buf[READPIX_SANITY_WIN_SIZE][READPIX_SANITY_WIN_SIZE]; - glReadPixels(0, 0, READPIX_SANITY_WIN_SIZE, - READPIX_SANITY_WIN_SIZE, GL_STENCIL_INDEX, - GL_UNSIGNED_INT, buf); - - for (int y = 0; y < READPIX_SANITY_WIN_SIZE && r.passStencil; - ++y) - for (int x = 0; x < READPIX_SANITY_WIN_SIZE; ++x) - if (buf[y][x] != expected) { - r.passStencil = false; - r.xStencil = x; - r.yStencil = y; - r.expectedStencil = expected; - r.actualStencil = buf[y][x]; - break; - } - - w.swap(); - } -} // ReadPixSanityTest::checkStencil - -void -ReadPixSanityTest::checkIndex(ReadPixSanityResult& r, Window& w) { - DrawingSurfaceConfig& config = *r.config; - RandomBits iRand(config.bufSize, 2); - - r.passIndex = true; - for (int i = 0; i < 100 && r.passIndex; ++i) { - GLuint expected = iRand.next(); - glClearIndex(expected); - glClear(GL_COLOR_BUFFER_BIT); - - GLuint buf[READPIX_SANITY_WIN_SIZE][READPIX_SANITY_WIN_SIZE]; - glReadPixels(0, 0, READPIX_SANITY_WIN_SIZE, - READPIX_SANITY_WIN_SIZE, GL_COLOR_INDEX, - GL_UNSIGNED_INT, buf); - - for (int y = 0; y < READPIX_SANITY_WIN_SIZE && r.passIndex; ++y) - for (int x = 0; x < READPIX_SANITY_WIN_SIZE; ++x) - if (buf[y][x] != expected) { - r.passIndex = false; - r.xIndex = x; - r.yIndex = y; - r.expectedIndex = expected; - r.actualIndex = buf[y][x]; - break; - } - - w.swap(); - } -} // ReadPixSanityTest::checkIndex - -/////////////////////////////////////////////////////////////////////////////// -// runOne: Run a single test case -/////////////////////////////////////////////////////////////////////////////// -void -ReadPixSanityTest::runOne(ReadPixSanityResult& r, GLEAN::Window& w) { - - // Many (if not most) other tests need to read the contents of - // the framebuffer to determine if the correct image has been - // drawn. Obviously this is a waste of time if the basic - // functionality of glReadPixels isn't working. - // - // This test does a "sanity" check of glReadPixels. Using as - // little of the GL as practicable, it writes a random value - // in the framebuffer, reads it, and compares the value read - // with the value written. - - glPixelStorei(GL_PACK_SWAP_BYTES, GL_FALSE); - glPixelStorei(GL_PACK_LSB_FIRST, GL_FALSE); - glPixelStorei(GL_PACK_ROW_LENGTH, 0); - glPixelStorei(GL_PACK_SKIP_ROWS, 0); - glPixelStorei(GL_PACK_SKIP_PIXELS, 0); - glPixelStorei(GL_PACK_ALIGNMENT, 1); - - glPixelTransferi(GL_MAP_COLOR, GL_FALSE); - glPixelTransferi(GL_MAP_STENCIL, GL_FALSE); - glPixelTransferi(GL_INDEX_SHIFT, 0); - glPixelTransferi(GL_INDEX_OFFSET, 0); - glPixelTransferf(GL_RED_SCALE, 1.0); - glPixelTransferf(GL_GREEN_SCALE, 1.0); - glPixelTransferf(GL_BLUE_SCALE, 1.0); - glPixelTransferf(GL_ALPHA_SCALE, 1.0); - glPixelTransferf(GL_DEPTH_SCALE, 1.0); - glPixelTransferf(GL_RED_BIAS, 0.0); - glPixelTransferf(GL_GREEN_BIAS, 0.0); - glPixelTransferf(GL_BLUE_BIAS, 0.0); - glPixelTransferf(GL_ALPHA_BIAS, 0.0); - glPixelTransferf(GL_DEPTH_BIAS, 0.0); - - glDisable(GL_SCISSOR_TEST); - glDisable(GL_DITHER); - - glIndexMask(~0); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - glDepthMask(GL_TRUE); - glStencilMask(~0); - - if (r.config->canRGBA) - checkRGBA(r, w); - if (r.config->z) - checkDepth(r, w); - if (r.config->s) - checkStencil(r, w); - - r.pass = r.passRGBA & r.passDepth & r.passStencil & r.passIndex; -} // ReadPixSanityTest::runOne - -void -ReadPixSanityTest::logOne(ReadPixSanityResult& r) { - logPassFail(r); - logConcise(r); - - if (!r.passRGBA) { - env->log << "\tRGB(A) worst-case error was " - << r.errRGBA << " bits at (" - << r.xRGBA << ", " << r.yRGBA << ")\n"; - env->log << "\t\texpected (" - << r.expectedRGBA[0] << ", " - << r.expectedRGBA[1] << ", " - << r.expectedRGBA[2] << ", " - << r.expectedRGBA[3] << ")\n\t\tgot (" - << r.actualRGBA[0] << ", " - << r.actualRGBA[1] << ", " - << r.actualRGBA[2] << ", " - << r.actualRGBA[3] << ")\n" - ; - } - if (!r.passDepth) { - env->log << "\tDepth worst-case error was " - << r.errDepth << " bits at (" - << r.xDepth << ", " << r.yDepth << ")\n"; - env->log << "\t\texpected " - << r.expectedDepth - << "; got " - << r.actualDepth - << ".\n" - ; - } - if (!r.passStencil) { - env->log << "\tStencil expected " - << r.expectedStencil - << "; got " - << r.actualStencil - << ".\n" - ; - } - if (!r.passIndex) { - env->log << "\tIndex expected " - << r.expectedIndex - << "; got " - << r.actualIndex - << ".\n" - ; - } - if (env->options.verbosity) { - if (r.config->canRGBA) - env->log << "\tRGBA largest readback error was " - << r.errRGBA - << " bits\n"; - if (r.config->z) - env->log << "\tDepth largest readback error was " - << r.errDepth - << " bits\n"; - } -} // ReadPixSanityTest::logOne - -/////////////////////////////////////////////////////////////////////////////// -// The test object itself: -/////////////////////////////////////////////////////////////////////////////// -ReadPixSanityTest -readPixSanityTest("readPixSanity", "1", - - "This test performs a sanity check of glReadPixels, using as\n" - "few other portions of the GL as possible. If this test fails,\n" - "it may be pointless to run other tests, since so many of them\n" - "depend on reading the contents of the framebuffer to determine\n" - "if they pass.\n" - "\n" - "The test works by using glClear to fill the framebuffer with a\n" - "randomly-chosen value, reading the contents of the\n" - "framebuffer, and comparing the actual contents with the\n" - "expected contents. RGB, RGBA, color index, stencil, and depth\n" - "buffers (whichever are applicable to the current rendering\n" - "context) are checked. The test passes if the actual contents\n" - "are within 1 LSB of the expected contents.\n" - - ); -}; // namespace GLEAN - - - -//////////////////////////////////////////////////////////////////////////////// -// ExactRGBATest -// Verifies that unsigned RGBA values written to a framebuffer with -// sufficient depth are not altered by the OpenGL implementation. -//////////////////////////////////////////////////////////////////////////////// - -namespace { - -// Mac OS header file AssertMacros.h defines check as a macro. -#ifdef check -#undef check -#endif - -template<class T> -void -check(GLEAN::ExactRGBAResult::Flavor& r, GLEAN::DrawingSurfaceConfig& config, - GLenum type, int roundingMode) { - unsigned size = EXACT_RGBA_WIN_SIZE - 2; - unsigned nPixels = size * size; - unsigned nComponents = 4 * nPixels; - T* expected = new T[nComponents]; - T* actual = new T[nComponents]; - GLEAN::RandomBits rand(32, 1929); - unsigned x; - unsigned y; - T* p; - T* q; - - // Draw random colors into the window, recording the raw - // color data in the array "expected": - p = expected; - for (y = 0; y < size; ++y) - for (x = 0; x < size; ++x) { - p[0] = rand.next(); // r - p[1] = rand.next(); // g - p[2] = rand.next(); // b - p[3] = rand.next(); // a - switch (type) { - case GL_UNSIGNED_BYTE: - glColor4ubv(reinterpret_cast<GLubyte*> - (p)); - break; - case GL_UNSIGNED_SHORT: - glColor4usv(reinterpret_cast<GLushort*> - (p)); - break; - case GL_UNSIGNED_INT: - glColor4uiv(reinterpret_cast<GLuint*> - (p)); - break; - } - glBegin(GL_QUADS); - glVertex2i(x + 1, y + 1); - glVertex2i(x + 2, y + 1); - glVertex2i(x + 2, y + 2); - glVertex2i(x + 1, y + 2); - glEnd(); - p += 4; - } - - // Read the relevant contents of the window into the array - // "actual": - glReadPixels(1, 1, size, size, GL_RGBA, type, actual); - - // Find masks that select only the high-order bits that should - // be common to both the host representation and the framebuffer - // representation: - int hostBits; - switch (type) { - case GL_UNSIGNED_BYTE: - hostBits = 8; - break; - case GL_UNSIGNED_SHORT: - hostBits = 16; - break; - case GL_UNSIGNED_INT: - hostBits = 32; - break; - } - T Mask[4]; - Mask[0] = static_cast<T>(-1) << (hostBits - min(hostBits, config.r)); - Mask[1] = static_cast<T>(-1) << (hostBits - min(hostBits, config.g)); - Mask[2] = static_cast<T>(-1) << (hostBits - min(hostBits, config.b)); - Mask[3] = static_cast<T>(-1) << (hostBits - min(hostBits, config.a)); - // Patch up arithmetic for RGB drawing surfaces. All other nasty cases - // are eliminated by the drawing surface filter, which requires - // nonzero R, G, and B. - if (Mask[0] == static_cast<T>(-1)) - Mask[0] = 0; - - // Compare masked actual and expected values, and record the - // worst-case error location and magnitude. - r.err = 0; - p = expected; - q = actual; - for (y = 0; y < size; ++y) - for (x = 0; x < size; ++x) { - T e[4] = { p[0], p[1], p[2], p[3] }; - T a[4] = { q[0], q[1], q[2], q[3] }; - for (unsigned i = 0; i < 4; ++i) { - if (roundingMode == 0) { - // Follow the OpenGL spec to the letter - e[i] = e[i] & Mask[i]; - a[i] = a[i] & Mask[i]; - } - GLuint err = - max(e[i], a[i]) - min(e[i], a[i]); - if (roundingMode == 1) { - // Do the sane thing - if (err < ~Mask[i] / 2) - err = 0; - } - if (err > r.err) { - r.x = x; - r.y = y; - r.err = err; - for (unsigned j = 0; j < 4; ++j) { - r.expected[j] = e[j]; - r.actual[j] = a[j]; - } - } - } - p += 4; - q += 4; - } - - // We only pass if the maximum error was zero. - r.pass = (r.err == 0); - - delete[] expected; - delete[] actual; -} - -}; - - -namespace GLEAN { - - -/////////////////////////////////////////////////////////////////////////////// -// runOne: Run a single test case -/////////////////////////////////////////////////////////////////////////////// -void -ExactRGBATest::runOne(ExactRGBAResult& r, GLEAN::Window& w) { - - // Many other tests depend on the ability of the OpenGL - // implementation to store fixed-point RGBA values in the - // framebuffer, and to read back exactly the value that - // was stored. The OpenGL spec guarantees that this will work - // under certain conditions, which are spelled out in section - // 2.13.9 in the 1.2.1 version of the spec: - // - // Suppose that lighting is disabled, the color associated - // with a vertex has not been clipped, and one of - // [gl]Colorub, [gl]Colorus, or [gl]Colorui was used to - // specify that color. When these conditions are - // satisfied, an RGBA component must convert to a value - // that matches the component as specified in the Color - // command: if m [the number of bits in the framebuffer - // color channel] is less than the number of bits b with - // which the component was specified, then the converted - // value must equal the most significant m bits of the - // specified value; otherwise, the most significant b bits - // of the converted value must equal the specified value. - // - // This test attempts to verify that behavior. - - - // Don't bother running if the ReadPixels sanity test for this - // display surface configuration failed: - vector<ReadPixSanityResult*>::const_iterator rpsRes; - for (rpsRes = readPixSanityTest.results.begin(); - rpsRes != readPixSanityTest.results.end(); - ++rpsRes) - if ((*rpsRes)->config == r.config) - break; - if (rpsRes == readPixSanityTest.results.end() || !(*rpsRes)->pass) { - r.skipped = true; - r.pass = false; - return; - } - - // Hack: Make hardware driver tests feasible - // (One can debate the sanity of the spec requirement cited above, - // anyway. On the one hand, we don't want to remember which API call - // was used to set the color. This means that glColoru[b|s|i] must - // perform some conversion. The default language of the spec mandates - // that the maximum integer value always correspond to 1.0, which - // mandates rounding up of discarded bits. However, the language - // above mandates simply discarding those bits.) - int roundingMode = 0; - const char* s = getenv("GLEAN_EXACTRGBA_ROUNDING"); - if (s) { - roundingMode = atoi(s); - env->log << "Note: Rounding mode changed to " << roundingMode << "\n"; - } - - // Much of this state should already be set, if the defaults are - // implemented correctly. We repeat the setting here in order - // to insure reasonable results when there are bugs. - - GLUtils::useScreenCoords(EXACT_RGBA_WIN_SIZE, EXACT_RGBA_WIN_SIZE); - - glDisable(GL_LIGHTING); - - glFrontFace(GL_CCW); - - glDisable(GL_COLOR_MATERIAL); - - glDisable(GL_TEXTURE_1D); - glDisable(GL_TEXTURE_2D); - glDisable(GL_TEXTURE_3D); - - glDisable(GL_CLIP_PLANE0); - glDisable(GL_CLIP_PLANE1); - glDisable(GL_CLIP_PLANE2); - glDisable(GL_CLIP_PLANE3); - glDisable(GL_CLIP_PLANE4); - glDisable(GL_CLIP_PLANE5); - - glDisable(GL_FOG); - - glDisable(GL_SCISSOR_TEST); - glDisable(GL_ALPHA_TEST); - glDisable(GL_STENCIL_TEST); - glDisable(GL_DEPTH_TEST); - glDisable(GL_BLEND); - glDisable(GL_DITHER); - glDisable(GL_COLOR_LOGIC_OP); - - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - glDisable(GL_CULL_FACE); - glDisable(GL_POLYGON_STIPPLE); - glDisable(GL_POLYGON_OFFSET_FILL); - - glShadeModel(GL_FLAT); - - glPixelStorei(GL_PACK_SWAP_BYTES, GL_FALSE); - glPixelStorei(GL_PACK_LSB_FIRST, GL_FALSE); - glPixelStorei(GL_PACK_ROW_LENGTH, 0); - glPixelStorei(GL_PACK_SKIP_ROWS, 0); - glPixelStorei(GL_PACK_SKIP_PIXELS, 0); - glPixelStorei(GL_PACK_ALIGNMENT, 1); - - glPixelTransferi(GL_MAP_COLOR, GL_FALSE); - glPixelTransferi(GL_MAP_STENCIL, GL_FALSE); - glPixelTransferi(GL_INDEX_SHIFT, 0); - glPixelTransferi(GL_INDEX_OFFSET, 0); - glPixelTransferf(GL_RED_SCALE, 1.0); - glPixelTransferf(GL_GREEN_SCALE, 1.0); - glPixelTransferf(GL_BLUE_SCALE, 1.0); - glPixelTransferf(GL_ALPHA_SCALE, 1.0); - glPixelTransferf(GL_DEPTH_SCALE, 1.0); - glPixelTransferf(GL_RED_BIAS, 0.0); - glPixelTransferf(GL_GREEN_BIAS, 0.0); - glPixelTransferf(GL_BLUE_BIAS, 0.0); - glPixelTransferf(GL_ALPHA_BIAS, 0.0); - glPixelTransferf(GL_DEPTH_BIAS, 0.0); - - check<GLubyte>(r.ub, *(r.config), GL_UNSIGNED_BYTE, roundingMode); - w.swap(); - check<GLushort>(r.us, *(r.config), GL_UNSIGNED_SHORT, roundingMode); - w.swap(); - check<GLuint>(r.ui, *(r.config), GL_UNSIGNED_INT, roundingMode); - w.swap(); - r.pass = r.ub.pass && r.us.pass && r.ui.pass; - r.skipped = false; -} // ExactRGBATest::runOne - -void -ExactRGBATest::logFlavor(const char* label, const ExactRGBAResult::Flavor& r) { - if (!r.pass) { - env->log << "\t" - << label - << " worst-case error was 0x" - << hex - << r.err << " at (" - << dec - << r.x << ", " << r.y << ")\n"; - env->log << "\t\texpected (0x" - << hex - << r.expected[0] << ", 0x" - << r.expected[1] << ", 0x" - << r.expected[2] << ", 0x" - << r.expected[3] << ")\n\t\tgot (0x" - << r.actual[0] << ", 0x" - << r.actual[1] << ", 0x" - << r.actual[2] << ", 0x" - << r.actual[3] << ")\n" - << dec - ; - } -} // ExactRGBATest::logFlavor - -void -ExactRGBATest::logOne(ExactRGBAResult& r) { - if (r.skipped) { - env->log << name << ": NOTE "; - logConcise(r); - env->log << "\tTest skipped; prerequisite test " - << readPixSanityTest.name - << " failed or was not run\n"; - return; - } - - logPassFail(r); - logConcise(r); - - logFlavor("Unsigned byte ", r.ub); - logFlavor("Unsigned short", r.us); - logFlavor("Unsigned int ", r.ui); -} // ExactRGBATest::logOne - -/////////////////////////////////////////////////////////////////////////////// -// The test object itself: -/////////////////////////////////////////////////////////////////////////////// -Test* exactRGBATestPrereqs[] = {&readPixSanityTest, 0}; -ExactRGBATest -exactRGBATest("exactRGBA", "rgb", exactRGBATestPrereqs, - - "The OpenGL specification requires that under certain conditions\n" - "(e.g. lighting disabled, no clipping, no dithering, etc.) colors\n" - "specified as unsigned integers are represented *exactly* in the\n" - "framebuffer (up to the number of bits common to both the\n" - "original color and the framebuffer color channel). Several glean\n" - "tests depend on this behavior, so this test is a prerequisite for\n" - "them.\n" - "\n" - "This test works by drawing many small quadrilaterals whose\n" - "colors are specified by glColorub, glColorus, and glColorui;\n" - "reading back the resulting image; and comparing the colors read\n" - "back to the colors written. The high-order bits shared by the\n" - "source representation of the colors and the framebuffer\n" - "representation of the colors must agree exactly for the test to\n" - "pass.\n" - - ); - - -} // namespace GLEAN diff --git a/tests/glean/treadpix.h b/tests/glean/treadpix.h deleted file mode 100644 index 53de5ccbc..000000000 --- a/tests/glean/treadpix.h +++ /dev/null @@ -1,291 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 2001 Allen Akin All Rights Reserved. -// -// 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 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 ALLEN AKIN 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. -// -// END_COPYRIGHT - - -// treadpix.h: ReadPixels tests. - -#ifndef __treadpix_h__ -#define __treadpix_h__ - -#include <iomanip> -#include "tbase.h" - -namespace GLEAN { - -class ReadPixSanityResult: public BaseResult { -public: - bool pass; - - bool passRGBA; - int xRGBA; - int yRGBA; - float errRGBA; - GLfloat expectedRGBA[4]; - GLfloat actualRGBA[4]; - - bool passDepth; - int xDepth; - int yDepth; - float errDepth; - GLdouble expectedDepth; - GLdouble actualDepth; - - bool passStencil; - int xStencil; - int yStencil; - GLuint expectedStencil; - GLuint actualStencil; - - bool passIndex; - int xIndex; - int yIndex; - GLuint expectedIndex; - GLuint actualIndex; - - ReadPixSanityResult() { - pass = true; - - passRGBA = true; - xRGBA = yRGBA = 0; - errRGBA = 0.0; - expectedRGBA[0] = expectedRGBA[1] = expectedRGBA[2] - = expectedRGBA[3] = 0.0; - actualRGBA[0] = actualRGBA[1] = actualRGBA[2] - = actualRGBA[3] = 0.0; - - passDepth = true; - xDepth = yDepth = 0; - errDepth = 0.0; - expectedDepth = 0.0; - actualDepth = 0.0; - - passStencil = true; - xStencil = yStencil = 0; - expectedStencil = 0; - actualStencil = 0; - - passIndex = true; - xIndex = yIndex = 0; - expectedIndex = 0; - actualIndex = 0; - } - - void putresults(ostream& s) const { - s - << pass << '\n' - - << passRGBA << '\n' - << xRGBA << ' ' << yRGBA << '\n' - << errRGBA << '\n' - << expectedRGBA[0] << ' ' << expectedRGBA[1] << ' ' - << expectedRGBA[2] << ' ' << expectedRGBA[3] << '\n' - << actualRGBA[0] << ' ' << actualRGBA[1] << ' ' - << actualRGBA[2] << ' ' << actualRGBA[3] << '\n' - - << passDepth << '\n' - << xDepth << ' ' << yDepth << '\n' - << errDepth << '\n' - << setprecision(16) - << expectedDepth << '\n' - << actualDepth << '\n' - - << passStencil << '\n' - << xStencil << ' ' << yStencil << '\n' - << expectedStencil << '\n' - << actualStencil << '\n' - - << passIndex << '\n' - << xIndex << ' ' << yIndex << '\n' - << expectedIndex << '\n' - << actualIndex << '\n' - ; - } - - bool getresults(istream& s) { - s >> pass - - >> passRGBA - >> xRGBA >> yRGBA - >> errRGBA - >> expectedRGBA[0] >> expectedRGBA[1] >> expectedRGBA[2] - >> expectedRGBA[3] - >> actualRGBA[0] >> actualRGBA[1] >> actualRGBA[2] - >> actualRGBA[3] - - >> passDepth - >> xDepth >> yDepth - >> errDepth - >> expectedDepth - >> actualDepth - - >> passStencil - >> xStencil >> yStencil - >> expectedStencil - >> actualStencil - - >> passIndex - >> xIndex >> yIndex - >> expectedIndex - >> actualIndex - ; - return s.good(); - } -}; - -#define READPIX_SANITY_WIN_SIZE 32 - -class ReadPixSanityTest: public BaseTest<ReadPixSanityResult> { -public: - GLEAN_CLASS_WH(ReadPixSanityTest, ReadPixSanityResult, - READPIX_SANITY_WIN_SIZE, READPIX_SANITY_WIN_SIZE); - - void checkRGBA(ReadPixSanityResult& r, Window& w); - void checkDepth(ReadPixSanityResult& r, Window& w); - void checkStencil(ReadPixSanityResult& r, Window& w); - void checkIndex(ReadPixSanityResult& r, Window& w); -}; // class ReadPixSanityTest -extern ReadPixSanityTest readPixSanityTest; - - - - -class ExactRGBAResult: public BaseResult { -public: - struct Flavor { - bool pass; - int x; - int y; - GLuint err; - GLuint expected[4]; - GLuint actual[4]; - - bool operator== (const Flavor& f) const { - return pass == f.pass - && x == f.x - && y == f.y - && err == f.err - && expected[0] == f.expected[0] - && expected[1] == f.expected[1] - && expected[2] == f.expected[2] - && expected[3] == f.expected[3] - && actual[0] == f.actual[0] - && actual[1] == f.actual[1] - && actual[2] == f.actual[2] - && actual[3] == f.actual[3] - ; - } - - Flavor() { - pass = true; - x = y = 0; - err = 0; - expected[0] = expected[1] = expected[2] - = expected[3] = 0; - actual[0] = actual[1] = actual[2] = actual[3] = 0; - } - - void put(ostream& s) const { - s - << pass << '\n' - << x << ' ' << y << '\n' - << err << '\n' - << expected[0] << ' ' - << expected[1] << ' ' - << expected[2] << ' ' - << expected[3] << '\n' - << actual[0] << ' ' - << actual[1] << ' ' - << actual[2] << ' ' - << actual[3] << '\n' - ; - } - void get(istream& s) { - s - >> pass - >> x >> y - >> err - >> expected[0] - >> expected[1] - >> expected[2] - >> expected[3] - >> actual[0] - >> actual[1] - >> actual[2] - >> actual[3] - ; - } - }; - - bool skipped; - bool pass; - - Flavor ub; - Flavor us; - Flavor ui; - - ExactRGBAResult(): ub(), us(), ui() { - skipped = false; - pass = true; - } - - void putresults(ostream& s) const { - s - << skipped << '\n' - << pass << '\n' - ; - ub.put(s); - us.put(s); - ui.put(s); - } - - bool getresults(istream& s) { - s - >> skipped - >> pass - ; - ub.get(s); - us.get(s); - ui.get(s); - return s.good(); - } -}; - -#define EXACT_RGBA_WIN_SIZE (512+2) - -class ExactRGBATest: public BaseTest<ExactRGBAResult> { -public: - GLEAN_CLASS_WH(ExactRGBATest, ExactRGBAResult, - EXACT_RGBA_WIN_SIZE, EXACT_RGBA_WIN_SIZE); - - void logFlavor(const char* label, const ExactRGBAResult::Flavor& r); -}; // class ExactRGBATest -extern ExactRGBATest exactRGBATest; - -} // namespace GLEAN - -#endif // __treadpix_h__ |