diff options
-rw-r--r-- | tests/all.py | 78 | ||||
-rw-r--r-- | tests/glean/CMakeLists.gl.txt | 11 | ||||
-rw-r--r-- | tests/glean/tapi2.cpp | 890 | ||||
-rw-r--r-- | tests/glean/tapi2.h | 87 | ||||
-rw-r--r-- | tests/glean/tbasic.cpp | 60 | ||||
-rw-r--r-- | tests/glean/tbasic.h | 69 | ||||
-rw-r--r-- | tests/glean/tbinding.cpp | 206 | ||||
-rw-r--r-- | tests/glean/tbinding.h | 73 | ||||
-rw-r--r-- | tests/glean/tfbo.cpp | 1367 | ||||
-rw-r--r-- | tests/glean/tfbo.h | 83 | ||||
-rw-r--r-- | tests/glean/tfragprog1.cpp | 1125 | ||||
-rw-r--r-- | tests/glean/tfragprog1.h | 92 | ||||
-rw-r--r-- | tests/glean/tpixelformats.cpp | 1675 | ||||
-rw-r--r-- | tests/glean/tpixelformats.h | 98 | ||||
-rw-r--r-- | tests/glean/tshaderapi.cpp | 470 | ||||
-rw-r--r-- | tests/glean/tshaderapi.h | 98 | ||||
-rw-r--r-- | tests/glean/ttexcube.cpp | 426 | ||||
-rw-r--r-- | tests/glean/ttexcube.h | 66 | ||||
-rw-r--r-- | tests/glean/ttexture_srgb.cpp | 356 | ||||
-rw-r--r-- | tests/glean/ttexture_srgb.h | 71 | ||||
-rw-r--r-- | tests/glean/tvertarraybgra.cpp | 186 | ||||
-rw-r--r-- | tests/glean/tvertarraybgra.h | 74 | ||||
-rw-r--r-- | tests/glean/tvertattrib.cpp | 1398 | ||||
-rw-r--r-- | tests/glean/tvertattrib.h | 95 | ||||
-rw-r--r-- | tests/no_error.py | 3 | ||||
-rw-r--r-- | tests/quick.py | 4 |
26 files changed, 3 insertions, 9158 deletions
diff --git a/tests/all.py b/tests/all.py index c586adc21..67e78c58c 100644 --- a/tests/all.py +++ b/tests/all.py @@ -18,7 +18,7 @@ from framework import options from framework import wflinfo from framework.profile import TestProfile from framework.driver_classifier import DriverClassifier -from framework.test import (PiglitGLTest, GleanTest, PiglitBaseTest, +from framework.test import (PiglitGLTest, PiglitBaseTest, GLSLParserTest, GLSLParserNoConfigError) from framework.test.shader_test import ShaderTest, MultiShaderTest from .py_modules.constants import TESTS_DIR, GENERATED_TESTS_DIR @@ -370,82 +370,6 @@ for basedir in [os.path.join(TESTS_DIR, 'apitrace', 'traces')]: # List of all of the MSAA sample counts we wish to test MSAA_SAMPLE_COUNTS = ['2', '4', '6', '8', '16', '32'] -with profile.test_list.group_manager(GleanTest, 'glean') as g: - g('basic') - g('api2') - g('makeCurrent') - g('bufferObject') - g('depthStencil') - g('fbo') - g('getString') - g('pixelFormats') - # exactRGBA is not included intentionally, because it's too strict and - # the equivalent functionality is covered by other tests - g('shaderAPI') - g('texCube') - g('texture_srgb') - g('vertArrayBGRA') - g('vertattrib') - -glean_fp_tests = ['ABS test', - 'ADD test', - 'ADD with saturation', - 'ADD an immediate', - 'ADD negative immediate', - 'ADD negative immediate (2)', - 'CMP test', - 'COS test', - 'COS test 2', - 'DP3 test', - 'DP3 test (2)', - 'DP4 test', - 'DPH test', - 'DST test', - 'EX2 test', - 'FLR test', - 'FRC test', - 'LG2 test', - 'LIT test 1', - 'LIT test 2 (degenerate case: 0 ^ 0 -> 1)', - 'LIT test 3 (case x < 0)', - 'MAD test', - 'MAX test', - 'MIN test', - 'MOV test', - 'MUL test', - 'masked MUL test', - 'POW test (exponentiation)', - 'RCP test (reciprocal)', - 'RCP test 2 (reciprocal)', - 'RSQ test 1 (reciprocal square root)', - 'RSQ test 2 (reciprocal square root of negative value)', - 'SCS test', - 'SGE test', - 'SIN test', - 'SIN test 2', - 'SLT test', - 'SUB test (with swizzle)', - 'SUB with saturation', - 'SWZ test', - 'swizzled move test', - 'swizzled add test', - 'XPD test 1', - 'Z-write test', - 'Divide by zero test', - 'Infinity and nan test', - 'ARB_fog_linear test', - 'Computed fog linear test', - 'ARB_fog_exp test', - 'Computed fog exp test', - 'ARB_fog_exp2 test', - 'Computed fog exp2 test'] - -for pairs in [(['fragProg1'], glean_fp_tests)]: - for prefix, name in itertools.product(*pairs): - groupname = grouptools.join('glean', '{0}-{1}'.format(prefix, name)) - profile.test_list[groupname] = GleanTest(prefix) - profile.test_list[groupname].env['PIGLIT_TEST'] = name - with profile.test_list.group_manager(PiglitGLTest, 'security') as g: g(['initialized-texmemory'], run_concurrent=False) g(['initialized-fbo'], run_concurrent=False) diff --git a/tests/glean/CMakeLists.gl.txt b/tests/glean/CMakeLists.gl.txt index 9250dfe26..bd7e441e4 100644 --- a/tests/glean/CMakeLists.gl.txt +++ b/tests/glean/CMakeLists.gl.txt @@ -26,19 +26,8 @@ piglit_add_executable (glean misc.cpp options.cpp rc.cpp - tapi2.cpp - tbasic.cpp - tbinding.cpp test.cpp - tfbo.cpp - tfragprog1.cpp tmultitest.cpp - tpixelformats.cpp - tshaderapi.cpp - ttexcube.cpp - ttexture_srgb.cpp - tvertarraybgra.cpp - tvertattrib.cpp winsys.cpp gl.cpp image_misc.cpp diff --git a/tests/glean/tapi2.cpp b/tests/glean/tapi2.cpp deleted file mode 100644 index ab8727931..000000000 --- a/tests/glean/tapi2.cpp +++ /dev/null @@ -1,890 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 1999 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 - -// tapi2.h: Test OpenGL 2.x API functions/features -// Brian Paul 9 March 2007 - -#define GL_GLEXT_PROTOTYPES - -#include <stdlib.h> -#include <cstring> -#include <cassert> -#include <math.h> -#include "tapi2.h" - - -namespace GLEAN { - -bool -API2Test::setup(void) -{ - // check that we have OpenGL 2.0 - if (GLUtils::getVersion() < 2.0) { - //env->log << "OpenGL 2.0 not supported\n"; - return false; - } - - GLenum err = glGetError(); - assert(!err); // should be OK - - // setup vertex transform (we'll draw a quad in middle of window) - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-4.0, 4.0, -4.0, 4.0, 0.0, 1.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glDrawBuffer(GL_FRONT); - glReadBuffer(GL_FRONT); - - // compute error tolerances (may need fine-tuning) - int bufferBits[5]; - glGetIntegerv(GL_RED_BITS, &bufferBits[0]); - glGetIntegerv(GL_GREEN_BITS, &bufferBits[1]); - glGetIntegerv(GL_BLUE_BITS, &bufferBits[2]); - glGetIntegerv(GL_ALPHA_BITS, &bufferBits[3]); - glGetIntegerv(GL_DEPTH_BITS, &bufferBits[4]); - - tolerance[0] = 2.0 / (1 << bufferBits[0]); - tolerance[1] = 2.0 / (1 << bufferBits[1]); - tolerance[2] = 2.0 / (1 << bufferBits[2]); - if (bufferBits[3]) - tolerance[3] = 2.0 / (1 << bufferBits[3]); - else - tolerance[3] = 1.0; - if (bufferBits[4]) - tolerance[4] = 16.0 / (1 << bufferBits[4]); - else - tolerance[4] = 1.0; - - return true; -} - - -void -API2Test::reportFailure(const char *msg, int line) const -{ - env->log << "FAILURE: " << msg << " (at tapi2.cpp:" << line << ")\n"; -} - - -void -API2Test::reportFailure(const char *msg, GLenum target, int line) const -{ - env->log << "FAILURE: " << msg; - if (target == GL_FRAGMENT_SHADER) - env->log << " (fragment)"; - else - env->log << " (vertex)"; - env->log << " (at tapi2.cpp:" << line << ")\n"; -} - - - -#define REPORT_FAILURE(MSG) reportFailure(MSG, __LINE__) -#define REPORT_FAILURE_T(MSG, TARGET) reportFailure(MSG, TARGET, __LINE__) - - -// Compare actual and expected colors -bool -API2Test::equalColors(const GLfloat act[4], const GLfloat exp[4]) const -{ - if ((fabsf(act[0] - exp[0]) > tolerance[0]) || - (fabsf(act[1] - exp[1]) > tolerance[1]) || - (fabsf(act[2] - exp[2]) > tolerance[2]) || - (fabsf(act[3] - exp[3]) > tolerance[3])) - return false; - else - return true; -} - - -// Render test quad w/ current shader program, return RGBA color of quad -void -API2Test::renderQuad(GLfloat *pixel) const -{ - const GLfloat r = 0.62; // XXX draw 16x16 pixel quad - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glBegin(GL_POLYGON); - glTexCoord2f(0, 0); glVertex2f(-r, -r); - glTexCoord2f(1, 0); glVertex2f( r, -r); - glTexCoord2f(1, 1); glVertex2f( r, r); - glTexCoord2f(0, 1); glVertex2f(-r, r); - glEnd(); - - // read a pixel from lower-left corner of rendered quad - glReadPixels(windowSize / 2 - 2, windowSize / 2 - 2, 1, 1, - GL_RGBA, GL_FLOAT, pixel); -} - - -// As above, but use vertex arrays -// \param attr which vertex attribute array to put colors into -// \param value 4-component valut to put into the attribute array -// \param pixel returns the rendered color obtained with glReadPixels -void -API2Test::renderQuadWithArrays(GLint attr, const GLfloat value[4], - GLfloat *pixel) const -{ - const GLfloat r = 0.62; // XXX draw 16x16 pixel quad - static const GLfloat vertcoords[4][3] = { - { -r, -r, 0 }, { r, -r, 0 }, { r, r, 0 }, { -r, r, 0 } - }; - GLfloat values[4][4]; - GLint i; - for (i = 0; i < 4; i++) { - values[i][0] = value[0]; - values[i][1] = value[1]; - values[i][2] = value[2]; - values[i][3] = value[3]; - }; - - glVertexPointer(3, GL_FLOAT, 0, vertcoords); - glEnableClientState(GL_VERTEX_ARRAY); - glVertexAttribPointer(attr, 4, GL_FLOAT, GL_FALSE, 0, values); - glEnableVertexAttribArray(attr); - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glDrawArrays(GL_POLYGON, 0, 4); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableVertexAttribArray(attr); - - // read a pixel from lower-left corner of rendered quad - glReadPixels(windowSize / 2 - 2, windowSize / 2 - 2, 1, 1, - GL_RGBA, GL_FLOAT, pixel); -} - - -GLuint -API2Test::loadAndCompileShader(GLenum target, const char *text) -{ - GLint stat, val; - GLuint shader = glCreateShader(target); - if (!shader) { - REPORT_FAILURE("glCreateShader failed (fragment)"); - return 0; - } - glShaderSource(shader, 1, - (const GLchar **) &text, NULL); - glCompileShader(shader); - glGetShaderiv(shader, GL_COMPILE_STATUS, &stat); - if (!stat) { - REPORT_FAILURE_T("glShaderSource or glCompileShader failed", target); - return 0; - } - if (!glIsShader(shader)) { - REPORT_FAILURE("glIsShader failed (fragment)"); - return false; - } - glGetShaderiv(shader, GL_SHADER_TYPE, &val); - if (val != (GLint) target) { - REPORT_FAILURE_T("glGetShaderiv(GL_SHADER_TYPE) failed", target); - return 0; - } - glGetShaderiv(shader, GL_COMPILE_STATUS, &val); - if (val != GL_TRUE) { - REPORT_FAILURE_T("glGetShaderiv(GL_COMPILE_STATUS) failed", target); - return 0; - } - glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &val); - // Note: some OpenGLs return a 1-char shorter length than strlen(text) - if (abs(val - (int) strlen(text)) > 1) { - REPORT_FAILURE_T("glGetShaderiv(GL_SHADER_SOURCE_LENGTH) failed", target); - return 0; - } - return shader; -} - - -GLuint -API2Test::createProgram(GLuint vertShader, GLuint fragShader) -{ - GLuint program = glCreateProgram(); - if (vertShader) - glAttachShader(program, vertShader); - if (fragShader) - glAttachShader(program, fragShader); - glLinkProgram(program); - return program; -} - - -bool -API2Test::testShaderObjectFuncs(void) -{ - static const char *vertShaderText = - "void main() { \n" - " gl_Position = ftransform(); \n" - "} \n"; - static const char *fragShaderText = - "void main() { \n" - " gl_FragColor = vec4(1.0, 0.5, 0.25, 0.0); \n" - "} \n"; - GLuint vertShader, fragShader, program; - GLint stat, val, err; - - vertShader = loadAndCompileShader(GL_VERTEX_SHADER, vertShaderText); - if (!vertShader) - return false; - fragShader = loadAndCompileShader(GL_FRAGMENT_SHADER, fragShaderText); - if (!fragShader) - return false; - - - program = createProgram(vertShader, fragShader); - if (!program) { - REPORT_FAILURE("glCreateProgram failed"); - return false; - } - glGetProgramiv(program, GL_LINK_STATUS, &stat); - if (!stat) { - REPORT_FAILURE("glLinkProgram failed"); - return false; - } - glUseProgram(program); - - glGetIntegerv(GL_CURRENT_PROGRAM, &val); - if (val != (GLint) program) { - REPORT_FAILURE("glGetInteger(GL_CURRENT_PROGRAM) failed"); - return false; - } - - err = glGetError(); - if (err) { - REPORT_FAILURE("OpenGL error detected in testShaderFuncs"); - return false; - } - - if (!glIsProgram(program)) { - REPORT_FAILURE("glIsProgram failed"); - return false; - } - - GLuint objects[2]; - GLsizei count; - glGetProgramiv(program, GL_ATTACHED_SHADERS, &val); - if (val != 2) { - REPORT_FAILURE("glGetProgramiv(GL_ATTACHED_SHADERS) failed"); - return false; - } - glGetAttachedShaders(program, 2, &count, objects); - if (count != 2) { - REPORT_FAILURE("glGetAttachedShaders failed (wrong count)"); - return false; - } - if (objects[0] != vertShader && objects[1] != vertShader) { - REPORT_FAILURE("glGetAttachedShaders failed (vertex shader missing)"); - return false; - } - if (objects[0] != fragShader && objects[1] != fragShader) { - REPORT_FAILURE("glGetAttachedShaders failed (fragment shader missing)"); - return false; - } - - glValidateProgram(program); - glGetProgramiv(program, GL_VALIDATE_STATUS, &stat); - if (!stat) { - REPORT_FAILURE("glValidateProgram failed"); - return false; - } - - // Delete vertex shader - glDeleteShader(vertShader); - if (!glIsShader(vertShader)) { - // the shader is still attached so the handle should be valid - REPORT_FAILURE("glIsShader(deleted shader) failed"); - return false; - } - glGetShaderiv(vertShader, GL_DELETE_STATUS, &stat); - if (stat != GL_TRUE) { - REPORT_FAILURE("Incorrect shader delete status"); - return false; - } - - // Delete fragment shader - glDeleteShader(fragShader); - - // Delete program object - glDeleteProgram(program); - if (!glIsProgram(program)) { - // the program is still in use so the handle should be valid - REPORT_FAILURE("glIsProgram(deleted program) failed"); - return false; - } - glGetProgramiv(program, GL_DELETE_STATUS, &stat); - if (stat != GL_TRUE) { - REPORT_FAILURE("Incorrect program delete status"); - return false; - } - - // now unbind the program - glUseProgram(0); - stat = glIsProgram(program); - if (stat) { - // the program and handle should have really been deleted now - REPORT_FAILURE("glIsProgram(deleted program) failed"); - return false; - } - - glGetProgramiv(program, GL_DELETE_STATUS, &stat); - err = glGetError(); - if (!err) { - // the program and handle should have been deleted now - // so glGetProgramiv() should have generated an error - REPORT_FAILURE("glGetProgramiv(deleted program) failed"); - return false; - } - - return true; -} - - -bool -API2Test::testUniformfFuncs(void) -{ - static const char *fragShaderText = - "uniform float uf1; \n" - "uniform vec2 uf2; \n" - "uniform vec3 uf3; \n" - "uniform vec4 uf4; \n" - "void main() { \n" - " gl_FragColor = vec4(uf1, uf2.y, uf3.z, uf4.w); \n" - "} \n"; - GLuint fragShader, program; - GLint uf1, uf2, uf3, uf4; - GLfloat value[4]; - - fragShader = loadAndCompileShader(GL_FRAGMENT_SHADER, fragShaderText); - if (!fragShader) { - return false; - } - program = createProgram(0, fragShader); - if (!program) { - REPORT_FAILURE("glCreateProgram (uniform test) failed"); - return false; - } - glUseProgram(program); - - uf1 = glGetUniformLocation(program, "uf1"); - if (uf1 < 0) { - REPORT_FAILURE("glGetUniform \"uf1\" failed"); - return false; - } - uf2 = glGetUniformLocation(program, "uf2"); - if (uf2 < 0) { - REPORT_FAILURE("glGetUniform \"uf2\" failed"); - return false; - } - uf3 = glGetUniformLocation(program, "uf3"); - if (uf3 < 0) { - REPORT_FAILURE("glGetUniform \"uf3\" failed"); - return false; - } - uf4 = glGetUniformLocation(program, "uf4"); - if (uf4 < 0) { - REPORT_FAILURE("glGetUniform \"uf4\" failed"); - return false; - } - - - GLfloat pixel[4], expected[4]; - - // Test glUniform[1234]f() - expected[0] = 0.1; - expected[1] = 0.2; - expected[2] = 0.3; - expected[3] = 0.4; - glUniform1f(uf1, expected[0]); - glUniform2f(uf2, 0.0, expected[1]); - glUniform3f(uf3, 0.0, 0.0, expected[2]); - glUniform4f(uf4, 0.0, 0.0, 0.0, expected[3]); - renderQuad(pixel); - if (!equalColors(pixel, expected)) { - REPORT_FAILURE("glUniform[1234]f failed"); - //printf("found: %f %f %f %f\n", pixel[0], pixel[1], pixel[2], pixel[3]); - //printf("expected: %f %f %f %f\n", expected[0], expected[1], expected[2], expected[3]); - - return false; - } - - // Test glUniform[1234]fv() - GLfloat u[4]; - expected[0] = 0.9; - expected[1] = 0.8; - expected[2] = 0.7; - expected[3] = 0.6; - u[0] = expected[0]; - glUniform1fv(uf1, 1, u); - u[0] = 0.0; u[1] = expected[1]; - glUniform2fv(uf2, 1, u); - u[0] = 0.0; u[1] = 0.0; u[2] = expected[2]; - glUniform3fv(uf3, 1, u); - u[0] = 0.0; u[1] = 0.0; u[2] = 0.0; u[3] = expected[3]; - glUniform4fv(uf4, 1, u); - renderQuad(pixel); - if (!equalColors(pixel, expected)) { - REPORT_FAILURE("glUniform[1234]f failed"); - return false; - } - - // Test glGetUniformfv - glUniform4fv(uf4, 1, expected); - glGetUniformfv(program, uf4, value); - if (value[0] != expected[0] || - value[1] != expected[1] || - value[2] != expected[2] || - value[3] != expected[3]) { - REPORT_FAILURE("glGetUniformfv failed"); - return false; - } - - return true; -} - - -bool -API2Test::testUniformiFuncs(void) -{ - static const char *fragShaderText = - "uniform int ui1; \n" - "uniform ivec2 ui2; \n" - "uniform ivec3 ui3; \n" - "uniform ivec4 ui4; \n" - "void main() { \n" - " gl_FragColor = vec4(ui1, ui2.y, ui3.z, ui4.w) * 0.1; \n" - "} \n"; - GLuint fragShader, program; - GLint ui1, ui2, ui3, ui4; - - fragShader = loadAndCompileShader(GL_FRAGMENT_SHADER, fragShaderText); - if (!fragShader) { - return false; - } - program = createProgram(0, fragShader); - if (!program) { - REPORT_FAILURE("glCreateProgram (uniform test) failed"); - return false; - } - glUseProgram(program); - - ui1 = glGetUniformLocation(program, "ui1"); - if (ui1 < 0) { - REPORT_FAILURE("glGetUniform \"ui1\" failed"); - return false; - } - ui2 = glGetUniformLocation(program, "ui2"); - if (ui2 < 0) { - REPORT_FAILURE("glGetUniform \"ui2\" failed"); - return false; - } - ui3 = glGetUniformLocation(program, "ui3"); - if (ui3 < 0) { - REPORT_FAILURE("glGetUniform \"ui3\" failed"); - return false; - } - ui4 = glGetUniformLocation(program, "ui4"); - if (ui4 < 0) { - REPORT_FAILURE("glGetUniform \"ui4\" failed"); - return false; - } - - GLfloat pixel[4], expected[4]; - GLint expectedInt[4]; - - // Test glUniform[1234]i() - expectedInt[0] = 1; - expectedInt[1] = 2; - expectedInt[2] = 3; - expectedInt[3] = 4; - expected[0] = 0.1; - expected[1] = 0.2; - expected[2] = 0.3; - expected[3] = 0.4; - glUniform1i(ui1, expectedInt[0]); - glUniform2i(ui2, 0, expectedInt[1]); - glUniform3i(ui3, 0, 0, expectedInt[2]); - glUniform4i(ui4, 0, 0, 0, expectedInt[3]); - renderQuad(pixel); - if (!equalColors(pixel, expected)) { - REPORT_FAILURE("glUniform[1234]i failed"); - //printf("%f %f %f %f\n", pixel[0], pixel[1], pixel[2], pixel[3]); - return false; - } - - // Test glUniform[1234]iv() - GLint u[4]; - expectedInt[0] = 9; - expectedInt[1] = 8; - expectedInt[2] = 7; - expectedInt[3] = 6; - expected[0] = 0.9; - expected[1] = 0.8; - expected[2] = 0.7; - expected[3] = 0.6; - u[0] = expectedInt[0]; - glUniform1iv(ui1, 1, u); - u[0] = 0; u[1] = expectedInt[1]; - glUniform2iv(ui2, 1, u); - u[0] = 0; u[1] = 0; u[2] = expectedInt[2]; - glUniform3iv(ui3, 1, u); - u[0] = 0; u[1] = 0; u[2] = 0; u[3] = expectedInt[3]; - glUniform4iv(ui4, 1, u); - renderQuad(pixel); - if (!equalColors(pixel, expected)) { - REPORT_FAILURE("glUniform[1234]i failed"); -#if 0 - printf("Expected color %f %f %f %f\n", - expected[0], expected[1], expected[2], expected[3]); - printf("Found color %f %f %f %f\n", - pixel[0], pixel[1], pixel[2], pixel[3]); -#endif - return false; - } - - return true; -} - - -bool -API2Test::testShaderAttribs(void) -{ - static const char *vertShaderText = - "attribute vec4 generic; \n" - "void main() { \n" - " gl_Position = ftransform(); \n" - " gl_FrontColor = generic; \n" - "} \n"; - GLuint vertShader, program; - - vertShader = loadAndCompileShader(GL_VERTEX_SHADER, vertShaderText); - if (!vertShader) { - return false; - } - program = createProgram(vertShader, 0); - if (!program) { - REPORT_FAILURE("glCreateProgram (uniform test) failed"); - return false; - } - glUseProgram(program); - - static const GLfloat testColors[3][4] = { - { 1.0, 0.5, 0.25, 0.0 }, - { 0.0, 0.1, 0.2, 0.3 }, - { 0.5, 0.6, 0.7, 0.8 }, - }; - - // let compiler allocate the attribute location - const GLint attr = glGetAttribLocation(program, "generic"); - if (attr < 0) { - REPORT_FAILURE("glGetAttribLocation failed"); - return false; - } - for (int i = 0; i < 3; i++) { - GLfloat pixel[4]; - renderQuadWithArrays(attr, testColors[i], pixel); - if (!equalColors(pixel, testColors[i])) { -#if 0 - printf("Expected color %f %f %f\n", - testColors[i][0], - testColors[i][1], - testColors[i][2]); - printf("Found color %f %f %f\n", - pixel[0], pixel[1], pixel[2]); -#endif - REPORT_FAILURE("Vertex array test failed"); - return false; - } - } - - // Test explicit attribute binding. - const GLint bindAttr = 6; // XXX a non-colliding alias - glBindAttribLocation(program, bindAttr, "generic"); - glLinkProgram(program); - GLint loc = glGetAttribLocation(program, "generic"); - if (loc != bindAttr) { - REPORT_FAILURE("glBindAttribLocation failed"); - return false; - } - for (int i = 0; i < 3; i++) { - GLfloat pixel[4]; - renderQuadWithArrays(bindAttr, testColors[i], pixel); - if (!equalColors(pixel, testColors[i])) { - REPORT_FAILURE("Vertex array test failed (2)"); - return false; - } - } - - return true; -} - -#define CLAMP( X, MIN, MAX ) ( (X)<(MIN) ? (MIN) : ((X)>(MAX) ? (MAX) : (X)) ) - -bool -API2Test::testStencilFuncSeparate(void) -{ - GLint val; - GLint stencilBits, stencilMax; - - glGetIntegerv(GL_STENCIL_BITS, &stencilBits); - stencilMax = (1 << stencilBits) - 1; - - glStencilFuncSeparate(GL_FRONT, GL_LEQUAL, 12, 0xf); - glStencilFuncSeparate(GL_BACK, GL_GEQUAL, 13, 0xe); - - glGetIntegerv(GL_STENCIL_BACK_FUNC, &val); - if (val != GL_GEQUAL) { - REPORT_FAILURE("GL_STENCIL_BACK_FUNC query returned wrong value"); - return false; - } - - glGetIntegerv(GL_STENCIL_FUNC, &val); - if (val != GL_LEQUAL) { - REPORT_FAILURE("GL_STENCIL_FUNC (front) query returned wrong value"); - return false; - } - - glGetIntegerv(GL_STENCIL_BACK_REF, &val); - if (val != CLAMP(13, 0, stencilMax)) { - REPORT_FAILURE("GL_STENCIL_BACK_REF query returned wrong value"); - return false; - } - - glGetIntegerv(GL_STENCIL_REF, &val); - if (val != CLAMP(12, 0, stencilMax)) { - REPORT_FAILURE("GL_STENCIL_REF (front) query returned wrong value"); - return false; - } - - glGetIntegerv(GL_STENCIL_BACK_VALUE_MASK, &val); - if (val != 0xe) { - REPORT_FAILURE("GL_STENCIL_BACK_VALUE_MASK query returned wrong value"); - return false; - } - - glGetIntegerv(GL_STENCIL_VALUE_MASK, &val); - if (val != 0xf) { - REPORT_FAILURE("GL_STENCIL_VALUE_MASK (front) query returned wrong value"); - return false; - } - - return true; -} - - -bool -API2Test::testStencilOpSeparate(void) -{ - GLint val; - - // face, fail, zfail, zpass - glStencilOpSeparate(GL_FRONT, GL_INVERT, GL_ZERO, GL_INCR); - glStencilOpSeparate(GL_BACK, GL_INCR, GL_KEEP, GL_REPLACE); - - glGetIntegerv(GL_STENCIL_BACK_FAIL, &val); - if (val != GL_INCR) { - REPORT_FAILURE("GL_STENCIL_BACK_FAIL query returned wrong value"); - return false; - } - - glGetIntegerv(GL_STENCIL_FAIL, &val); - if (val != GL_INVERT) { - REPORT_FAILURE("GL_STENCIL_FAIL (front) query returned wrong value"); - return false; - } - - glGetIntegerv(GL_STENCIL_BACK_PASS_DEPTH_FAIL, &val); - if (val != GL_KEEP) { - REPORT_FAILURE("GL_STENCIL_BACK_PASS_DEPTH_FAIL query returned wrong value"); - return false; - } - - glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &val); - if (val != GL_ZERO) { - REPORT_FAILURE("GL_STENCIL_PASS_DEPTH_FAIL (front) query returned wrong value"); - return false; - } - - glGetIntegerv(GL_STENCIL_BACK_PASS_DEPTH_PASS, &val); - if (val != GL_REPLACE) { - REPORT_FAILURE("GL_STENCIL_BACK_PASS_DEPTH_PASS query returned wrong value"); - return false; - } - - glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &val); - if (val != GL_INCR) { - REPORT_FAILURE("GL_STENCIL_PASS_DEPTH_PASS (front) query returned wrong value"); - return false; - } - - return true; -} - - -bool -API2Test::testStencilMaskSeparate(void) -{ - GLint val; - - // face, fail, zfail, zpass - glStencilMaskSeparate(GL_BACK, 0xa); - glStencilMaskSeparate(GL_FRONT, 0xb); - - glGetIntegerv(GL_STENCIL_BACK_WRITEMASK, &val); - if (val != 0xa) { - REPORT_FAILURE("GL_STENCIL_BACK_WRITEMASK query returned wrong value"); - return false; - } - - glGetIntegerv(GL_STENCIL_WRITEMASK, &val); - if (val != 0xb) { - REPORT_FAILURE("GL_STENCIL_WRITEMASK (front) query returned wrong value"); - return false; - } - - return true; -} - - -bool -API2Test::testBlendEquationSeparate(void) -{ - GLint val; - - glBlendEquationSeparate(GL_MAX, GL_FUNC_SUBTRACT); - - glGetIntegerv(GL_BLEND_EQUATION, &val); - if (val != GL_MAX) { - REPORT_FAILURE("GL_BLEND_EQUATION (rgb) query returned wrong value"); - return false; - } - - glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &val); - if (val != GL_FUNC_SUBTRACT) { - REPORT_FAILURE("GL_BLEND_EQUATION (rgb) query returned wrong value"); - return false; - } - - return true; -} - - -bool -API2Test::testDrawBuffers(void) -{ - const int MAX = 2; - GLint maxBuf = -1, i, n, val; - GLenum buffers[MAX], err; - GLint initDrawBuffer; - - glGetIntegerv(GL_DRAW_BUFFER, &initDrawBuffer); - - glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxBuf); - if (maxBuf < 1) { - REPORT_FAILURE("GL_MAX_DRAW_BUFFERS query failed"); - return false; - } - - n = maxBuf < MAX ? maxBuf : MAX; - assert(n > 0); - for (i = 0; i < n; i++) { - buffers[i] = (i & 1) ? GL_FRONT_LEFT : GL_BACK_LEFT; - } - glDrawBuffers(n, buffers); - - for (i = 0; i < n; i++) { - glGetIntegerv(GL_DRAW_BUFFER0 + i, &val); - if (val != (GLint) buffers[i]) { - REPORT_FAILURE("glDrawBuffers failed"); - return false; - } - } - - // restore - glDrawBuffer(initDrawBuffer); - - err = glGetError(); - if (err) { - REPORT_FAILURE("glDrawBuffers generrated an OpenGL error"); - return false; - } - - return true; -} - - -// Run all the subtests, incrementing numPassed, numFailed -void -API2Test::runSubTests(MultiTestResult &r) -{ - static TestFunc funcs[] = { - &GLEAN::API2Test::testStencilFuncSeparate, - &GLEAN::API2Test::testStencilOpSeparate, - &GLEAN::API2Test::testStencilMaskSeparate, - &GLEAN::API2Test::testBlendEquationSeparate, - &GLEAN::API2Test::testDrawBuffers, - &GLEAN::API2Test::testShaderObjectFuncs, - &GLEAN::API2Test::testUniformfFuncs, - &GLEAN::API2Test::testUniformiFuncs, - &GLEAN::API2Test::testShaderAttribs, - NULL - }; - - for (int i = 0; funcs[i]; i++) - if ((this->*funcs[i])()) - r.numPassed++; - else - r.numFailed++; -} - - -void -API2Test::runOne(MultiTestResult &r, Window &w) -{ - (void) w; - - if (!setup()) { - r.pass = false; - return; - } - - runSubTests(r); - - r.pass = (r.numFailed == 0); -} - - -// The test object itself: -API2Test api2Test("api2", "window, rgb, z, db", - "", // no extension filter (we'll test for version 2.x during setup) - "API2 test: check that OpenGL 2.x API functions work.\n" - ); - - - -} // namespace GLEAN diff --git a/tests/glean/tapi2.h b/tests/glean/tapi2.h deleted file mode 100644 index 36cf58725..000000000 --- a/tests/glean/tapi2.h +++ /dev/null @@ -1,87 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 1999 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 - -// tapi2.h: Test OpenGL 2.x API functions/features -// Brian Paul 9 March 2007 - -#ifndef __tapi2_h__ -#define __tapi2_h__ - -#include "tmultitest.h" - -namespace GLEAN { - -#define windowSize 100 - - -class API2Test: public MultiTest -{ -public: - API2Test(const char* testName, const char* filter, - const char *extensions, const char* description): - MultiTest(testName, filter, extensions, description), - tolerance() - { - } - - virtual void runOne(MultiTestResult &r, Window &w); - -private: - typedef bool (API2Test::*TestFunc)(void); - - GLfloat tolerance[5]; - - GLuint loadAndCompileShader(GLenum target, const char *str); - GLuint createProgram(GLuint vertShader, GLuint fragShader); - - void renderQuad(GLfloat *pixel) const; - void renderQuadWithArrays(GLint attr, const GLfloat value[4], - GLfloat *pixel) const; - - bool testStencilFuncSeparate(void); - bool testStencilOpSeparate(void); - bool testStencilMaskSeparate(void); - bool testBlendEquationSeparate(void); - bool testDrawBuffers(void); - bool testShaderObjectFuncs(void); - bool testUniformfFuncs(void); - bool testUniformiFuncs(void); - bool testShaderAttribs(void); - - void runSubTests(MultiTestResult &r); - - bool setup(void); - bool equalColors(const GLfloat a[4], const GLfloat b[4]) const; - - void reportFailure(const char *msg, int line) const; - void reportFailure(const char *msg, GLenum target, int line) const; -}; - -} // namespace GLEAN - -#endif // __tglsl1_h__ diff --git a/tests/glean/tbasic.cpp b/tests/glean/tbasic.cpp deleted file mode 100644 index 1e5fe2e55..000000000 --- a/tests/glean/tbasic.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 1999-2000 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 - -// tbasic.cpp: implementation of example class for basic tests - -#include "tbasic.h" - -namespace GLEAN { - -/////////////////////////////////////////////////////////////////////////////// -// runOne: Run a single test case -/////////////////////////////////////////////////////////////////////////////// -void -BasicTest::runOne(BasicResult& r, Window&) { - r.pass = true; -} // BasicTest::runOne - -/////////////////////////////////////////////////////////////////////////////// -// logOne: Log a single test case -/////////////////////////////////////////////////////////////////////////////// -void -BasicTest::logOne(BasicResult& r) { - logPassFail(r); - logConcise(r); -} // BasicTest::logOne - -/////////////////////////////////////////////////////////////////////////////// -// The test object itself: -/////////////////////////////////////////////////////////////////////////////// -BasicTest basicTest("basic", "window", - "This trivial test simply verifies the internal support for basic\n" - "tests. It is run on every OpenGL-capable drawing surface\n" - "configuration that supports creation of a window.\n"); - -} // namespace GLEAN diff --git a/tests/glean/tbasic.h b/tests/glean/tbasic.h deleted file mode 100644 index 2d3af683a..000000000 --- a/tests/glean/tbasic.h +++ /dev/null @@ -1,69 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 1999-2000 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 - - - -// tbasic.h: Example class for basic tests - -// This class illustrates the use of the BaseResult class and BaseTest -// template class for constructing straightforward portable tests. -// See the file tbase.h for a discussion of this process. - -// BasicTest simply runs on all drawing surface configurations that -// permit the creation of a window, and always passes. - - -#ifndef __tbasic_h__ -#define __tbasic_h__ - -#include "tbase.h" - -namespace GLEAN { - -class BasicResult: public BaseResult { -public: - bool pass; - - void putresults(ostream& s) const { - s << pass << '\n'; - } - - bool getresults(istream& s) { - s >> pass; - return s.good(); - } -}; - -class BasicTest: public BaseTest<BasicResult> { -public: - GLEAN_CLASS(BasicTest, BasicResult); -}; - -} // namespace GLEAN - -#endif // __tbasic_h__ diff --git a/tests/glean/tbinding.cpp b/tests/glean/tbinding.cpp deleted file mode 100644 index 48c766894..000000000 --- a/tests/glean/tbinding.cpp +++ /dev/null @@ -1,206 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 2000 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 - -// tbinding.cpp: Test functions in the window-system binding - -#include "tbinding.h" -#include "image.h" -#include "rand.h" -#include <cmath> -#include <algorithm> // max - -#if 0 -#ifdef __UNIX__ -#include <unistd.h> -#endif - -#include <iostream> -#include <fstream> -#include <cmath> -#include "dsconfig.h" -#include "dsfilt.h" -#include "dsurf.h" -#include "winsys.h" -#include "environ.h" -#include "rc.h" -#include "glutils.h" -#include "stats.h" -#include "tbinding.h" -#include "misc.h" -#endif - -namespace { - -bool -makeCurrentOK(GLEAN::DrawingSurfaceConfig& config) { - using namespace GLEAN; - float expected[4]; - glClear(GL_COLOR_BUFFER_BIT); - glGetFloatv(GL_COLOR_CLEAR_VALUE, expected); - Image probe(1, 1, GL_RGBA, GL_FLOAT); - probe.read(drawingSize/2, drawingSize/2); - const float* actual = reinterpret_cast<float*>(probe.pixels()); - double maxError = ErrorBits(fabs(expected[0] - actual[0]), config.r); - maxError = max(maxError, - ErrorBits(fabs(expected[1] - actual[1]), config.g)); - maxError = max(maxError, - ErrorBits(fabs(expected[2] - actual[2]), config.b)); - return maxError <= 1.0; -} // makeCurrentOK - -} // anonymous namespace - -namespace GLEAN { - -/////////////////////////////////////////////////////////////////////////////// -// runOne: Run a single test case -/////////////////////////////////////////////////////////////////////////////// -void -MakeCurrentTest::runOne(MakeCurrentResult& r, Window& w) { - - DrawingSurfaceConfig& config = *(r.config); - WindowSystem& ws = env->winSys; - - // The rendering contexts to be used: - vector<RenderingContext*> rcs; - - RandomBitsDouble rRand(config.r, 712105); - RandomBitsDouble gRand(config.g, 63230); - RandomBitsDouble bRand(config.b, 912167); - - // Create rendering contexts to be used with the test window. - // Note that the first context (at index 0) is always the - // null context. - - rcs.push_back(0); - r.descriptions.push_back("Null context"); - ws.makeCurrent(); - r.testSequence.push_back(static_cast<int>(rcs.size()) - 1); - - rcs.push_back(new RenderingContext(env->winSys, config, 0, true)); - r.descriptions.push_back("Direct-rendering context"); - ws.makeCurrent(*rcs.back(), w); - r.testSequence.push_back(static_cast<int>(rcs.size()) - 1); - glDisable(GL_DITHER); - glClearColor(rRand.next(), gRand.next(), bRand.next(), 1.0); - if (!makeCurrentOK(config)) - goto failed; - - rcs.push_back(new RenderingContext(env->winSys, config, 0, false)); - r.descriptions.push_back("Indirect-rendering context"); - ws.makeCurrent(*rcs.back(), w); - r.testSequence.push_back(static_cast<int>(rcs.size()) - 1); - glDisable(GL_DITHER); - glClearColor(rRand.next(), gRand.next(), bRand.next(), 1.0); - if (!makeCurrentOK(config)) - goto failed; - - // Now run through all the pairs of rendering contexts, making - // them current in sequence and checking that rendering looks - // correct. Don't worry about the redundant sequences; we want - // to check those, too! - - int i; - for (i = 0; i < static_cast<int>(rcs.size()); ++i) - for (int j = 0; j < static_cast<int>(rcs.size()); ++j) { - r.testSequence.push_back(i); - if (rcs[i] == 0) - ws.makeCurrent(); - else { - ws.makeCurrent(*rcs[i], w); - if (!makeCurrentOK(config)) - goto failed; - } - r.testSequence.push_back(j); - if (rcs[j] == 0) - ws.makeCurrent(); - else { - ws.makeCurrent(*rcs[j], w); - if (!makeCurrentOK(config)) - goto failed; - } - } - r.pass = true; - goto cleanup; - -failed: - r.pass = false; -cleanup: - for (i = 0; i < static_cast<int>(rcs.size()); ++i) - if (rcs[i]) { - // We need to make sure that no GL commands are - // pending when the window is destroyed, or we - // risk a GLXBadCurrentWindow error at some - // indeterminate time in the future when - // glXMakeCurrent() is executed. - // In theory, if glReadPixels() is the last - // command executed by a test, then an implicit - // flush has occurred, and the command queue is - // empty. In practice, we have to protect - // against the possibility that the implicit - // flush is not enough to avoid the error. - ws.makeCurrent(*rcs[i], w); - glFinish(); - ws.makeCurrent(); - - delete rcs[i]; - } -} // MakeCurrentTest::runOne - -/////////////////////////////////////////////////////////////////////////////// -// logOne: Log a single test case -/////////////////////////////////////////////////////////////////////////////// -void -MakeCurrentTest::logOne(MakeCurrentResult& r) { - logPassFail(r); - logConcise(r); - if (!r.pass) { - env->log << "\tSequence of MakeCurrent operations was:\n"; - for (int k = 0; k < static_cast<int>(r.testSequence.size()); ++k) - env->log << "\t\t" - << r.descriptions[r.testSequence[k]] - << '\n'; - } -} // MakeCurrentTestTest::logOne - -/////////////////////////////////////////////////////////////////////////////// -// The test object itself: -/////////////////////////////////////////////////////////////////////////////// -MakeCurrentTest makeCurrentTest("makeCurrent", "window, rgb", - - "This test sanity-checks the ability to use multiple rendering\n" - "contexts. It creates several contexts with differing\n" - "characteristics (e.g., some are direct-rendering and some\n" - "are indirect-rendering, if the window system binding supports\n" - "that distinction). Then it runs through all pairs of contexts,\n" - "making each one \"current\" in turn and verifying that simple\n" - "rendering succeeds.\n" - - ); - -} // namespace GLEAN diff --git a/tests/glean/tbinding.h b/tests/glean/tbinding.h deleted file mode 100644 index 021b85466..000000000 --- a/tests/glean/tbinding.h +++ /dev/null @@ -1,73 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 2000 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 - - - - -// tbinding.h: Test functions in the window-system binding - -#ifndef __tbinding_h__ -#define __tbinding_h__ - -#include "tbasic.h" - -namespace GLEAN { - -class DrawingSurfaceConfig; // Forward reference. -class Window; - -#define drawingSize 64 - -class MakeCurrentResult: public BaseResult { -public: - bool pass; - // Short descriptions of the rendering contexts: - vector<const char*> descriptions; - // Complete record of rendering contexts made "current" during - // the test: - vector<int> testSequence; - - void putresults(ostream& s) const { - s << pass << '\n'; - } - - bool getresults(istream& s) { - s >> pass; - return s.good(); - } -}; - -class MakeCurrentTest: public BaseTest<MakeCurrentResult> { -public: - GLEAN_CLASS_WH(MakeCurrentTest, MakeCurrentResult, - drawingSize, drawingSize); -}; // class MakeCurrentTest - -} // namespace GLEAN - -#endif // __tbinding_h__ diff --git a/tests/glean/tfbo.cpp b/tests/glean/tfbo.cpp deleted file mode 100644 index 288fb0e91..000000000 --- a/tests/glean/tfbo.cpp +++ /dev/null @@ -1,1367 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyrigth (C) 2007 Intel Corporation -// Copyright (C) 1999 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 -// -// Authors: -// Shuang He <shuang.he@intel.com> -// -// tfbo.cpp: Test OpenGL Extension GL_EXT_framebuffer_object - - -#define GL_GLEXT_PROTOTYPES - -#include "tfbo.h" -#include <cassert> -#include <math.h> -#include <cstring> -#include "piglit-util-gl.h" - -namespace GLEAN -{ - -static int useFramebuffer; - -bool -FBOTest::setup(void) -{ - // setup vertex transform (we'll draw a quad in middle of window) - glMatrixMode(GL_PROJECTION); - - glLoadIdentity(); - glOrtho(0, 100, 0, 100, -1, 1); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glDrawBuffer(GL_FRONT); - glReadBuffer(GL_FRONT); - - glDisable(GL_DITHER); - - // compute error tolerances (may need fine-tuning) - int bufferBits[5]; - - glGetIntegerv(GL_RED_BITS, &bufferBits[0]); - glGetIntegerv(GL_GREEN_BITS, &bufferBits[1]); - glGetIntegerv(GL_BLUE_BITS, &bufferBits[2]); - glGetIntegerv(GL_ALPHA_BITS, &bufferBits[3]); - glGetIntegerv(GL_DEPTH_BITS, &bufferBits[4]); - - tolerance[0] = 3.0 / (1 << bufferBits[0]); - tolerance[1] = 3.0 / (1 << bufferBits[1]); - tolerance[2] = 3.0 / (1 << bufferBits[2]); - if (bufferBits[3]) - tolerance[3] = 3.0 / (1 << bufferBits[3]); - else - tolerance[3] = 1.0; - if (bufferBits[4]) - tolerance[4] = 16.0 / (1 << bufferBits[4]); - else - tolerance[4] = 1.0; - - // Check if GL_EXT_framebuffer_object is supported - if (GLUtils::haveExtension("GL_EXT_framebuffer_object")) { - printf("GL_EXT_framebuffer_object is supported\n"); - useFramebuffer = 1; - } - else { - printf("GL_EXT_framebuffer_object is not supported\n"); - useFramebuffer = 0; - return false; - } - - haveARBfbo = GLUtils::haveExtension("GL_ARB_framebuffer_object"); - if (haveARBfbo) - printf("GL_ARB_framebuffer_object is supported\n"); - else - printf("GL_ARB_framebuffer_object is not supported\n"); - - return true; -} - - -void -FBOTest::reportFailure(const char *msg, const int line) const -{ - env->log << "FAILURE: " << msg << " (at tfbo.cpp:" << line - << ")\n"; -} - -void -FBOTest::reportFailure(const char *msg, const GLenum target, const int line) const -{ - env->log << "FAILURE: " << msg; - if (target == GL_FRAGMENT_SHADER) - env->log << " (fragment)"; - else - env->log << " (vertex)"; - env->log << " (at tfbo.cpp:" << line << ")\n"; -} - -#define REPORT_FAILURE(MSG) reportFailure(MSG, __LINE__) -#define REPORT_FAILURE_T(MSG, TARGET) reportFailure(MSG, TARGET, __LINE__) -// Compare actual and expected colors -bool -FBOTest::equalColors(const GLfloat act[3], const GLfloat exp[3]) const -{ - if ((fabsf(act[0] - exp[0]) > tolerance[0]) - || (fabsf(act[1] - exp[1]) > tolerance[1]) - || (fabsf(act[2] - exp[2]) > tolerance[2])) { - return false; - } - else - return true; -} - - -#define TEXSIZE 64 - -/* -|--------------------| - |---depth---| - |---stencil---| -*/ -bool -FBOTest::checkResult(const GLfloat color[4], const int depth, - const int stencil) const -{ - GLfloat buf[TEXSIZE * TEXSIZE * 3]; - int i, j; - const GLfloat black[4] = { 0.0, 0.0, 0.0, 0.0 }; - const GLfloat *exp; - - glReadPixels(0, 0, TEXSIZE, TEXSIZE, GL_RGB, GL_FLOAT, buf); - - for (j = 0; j < TEXSIZE; j++) { - for (i = 0; i < TEXSIZE; i++) { - exp = color; - - if (i * 4 >= TEXSIZE && i * 8 < TEXSIZE * 5 - && depth) - exp = black; - if (i * 2 >= TEXSIZE && i * 8 < TEXSIZE * 7 - && stencil) - exp = black; - - - if (!equalColors(buf + (j * TEXSIZE + i) * 3, exp)) { - printf(" depth = %d, stencil = %d\n", - depth, stencil); - printf(" (%d, %d) = [%f, %f, %f], is expected to be[%f, %f, %f]\n", i, j, buf[(j * TEXSIZE + i) * 3], buf[(j * TEXSIZE + i) * 3 + 1], buf[(j * TEXSIZE + i) * 3 + 2], exp[0], exp[1], exp[2]); - return false; - } - } - } - return true; -} - - -// Check FB status, print unexpected results to stdout. -static GLenum -CheckFramebufferStatus(const char *func, int line) -{ - GLenum status; - status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - - switch(status) { - case GL_FRAMEBUFFER_COMPLETE_EXT: - /*printf(" (%s:%d)GL_FRAMEBUFFER_COMPLETE_EXT\n", func, line);*/ - break; - case GL_FRAMEBUFFER_UNSUPPORTED_EXT: - printf(" (%s:%d)GL_FRAMEBUFFER_UNSUPPORTED_EXT\n", func, line); - /* choose different formats */ - break; - case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT: - printf(" (%s:%d)GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT\n", func, line); - break; - case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT: - printf(" (%s:%d)GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT\n", func, line); - break; - case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT: - printf(" (%s:%d)GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT\n", func, line); - break; - case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT: - printf(" (%s:%d)GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT\n", func, line); - break; - case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT: - printf(" (%s:%d)GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT\n", func, line); - break; - case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT: - printf(" (%s:%d)GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT\n", func, line); - break; - default: - /* programming error; will fail on all hardware */ - printf(" (%s:%d)programming error\n", func, line); - break; - } - return status; -} - - -enum -{ BLACK, RED, GREEN, BLUE, WHITE }; - -GLfloat colors[][4] = { - {0.0, 0.0, 0.0, 0.0}, - {1.0, 0.0, 0.0, 1.0}, - {0.0, 1.0, 0.0, 1.0}, - {0.0, 0.0, 1.0, 1.0}, - {1.0, 1.0, 1.0, 1.0} -}; - - - -bool -FBOTest::testSanity(void) -{ - GLuint fbs[2]; - GLuint maxColorAttachment; - GLuint fb_binding; - - if (!useFramebuffer) - return true; - - glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, - (GLint *) & maxColorAttachment); - if (maxColorAttachment < 1) { - REPORT_FAILURE - ("Failed to get max color attachment points"); - return false; - } - - - glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, (GLint *) & fb_binding); - if (fb_binding != 0) { - printf(" fb_binding = %d\n", fb_binding); - REPORT_FAILURE - ("The default framebuffer binding should be 0"); - return false; - } - - glGenFramebuffersEXT(1, fbs); - - - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbs[0]); - glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, (GLint *) & fb_binding); - if (fb_binding != fbs[0]) { - printf(" fb_binding = %d\n", fb_binding); - REPORT_FAILURE("Binding framebuffer failed"); - return false; - } - if (glIsFramebufferEXT(fbs[0]) != GL_TRUE) - { - REPORT_FAILURE("Call glIsFramebufferEXT failed"); - return false; - } - - glDeleteFramebuffersEXT(1, fbs); - - GLint maxRenderbufferSize; - - glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &maxRenderbufferSize); - if (maxRenderbufferSize < 1) { - printf(" maxRenderbufferSize = %d\n", - maxRenderbufferSize); - REPORT_FAILURE("Get max Renderbuffer Size failed"); - return false; - } - - return true; -} - - -void -FBOTest::reset(void) -{ - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - glDisable(GL_DEPTH_TEST); - glDisable(GL_STENCIL_TEST); -} - -GLenum textureModes[] = { GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D, - GL_TEXTURE_CUBE_MAP}; - -bool -FBOTest::testRender2SingleTexture(void) -{ - GLint depthBuffer = 0; - GLint stencilBuffer = 0; - GLuint fbs[1]; - GLuint depth_rb[1]; - GLuint stencil_rb[1]; - GLuint textures[1]; - int mode; - int maxzoffset = -1; - GLenum status; - - glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, &maxzoffset); - if (maxzoffset > 16) - maxzoffset = 16; - - for (depthBuffer = 0; depthBuffer < 2; depthBuffer++) { - for (stencilBuffer = 0; stencilBuffer < 2; stencilBuffer++) { - for (mode = 0; mode < 4; mode++) { - - // - // Setup state to test - // - if (mode == 2 && maxzoffset <= 0) - continue; - - if (useFramebuffer) - glGenFramebuffersEXT(1, fbs); - glGenTextures(1, textures); - - glBindTexture(textureModes[mode], - textures[0]); - glTexParameteri(textureModes[mode], - GL_TEXTURE_MIN_FILTER, - GL_NEAREST); - glTexParameteri(textureModes[mode], - GL_TEXTURE_MAG_FILTER, - GL_NEAREST); - - switch (textureModes[mode]) { - case GL_TEXTURE_1D: - glTexImage1D(GL_TEXTURE_1D, - 0, GL_RGB, - TEXSIZE, 0, - GL_RGB, GL_INT, NULL); - break; - case GL_TEXTURE_2D: - glTexImage2D(GL_TEXTURE_2D, - 0, GL_RGB, - TEXSIZE, - TEXSIZE, 0, - GL_RGB, GL_INT, NULL); - break; - case GL_TEXTURE_3D: - glTexImage3D(GL_TEXTURE_3D, - 0, GL_RGB, - TEXSIZE, - TEXSIZE, - maxzoffset, 0, - GL_RGB, GL_INT, NULL); - break; - case GL_TEXTURE_CUBE_MAP: - glTexImage2D - (GL_TEXTURE_CUBE_MAP_POSITIVE_X, - 0, GL_RGB, - TEXSIZE, TEXSIZE, - 0, GL_RGB, GL_INT, NULL); - glTexImage2D - (GL_TEXTURE_CUBE_MAP_NEGATIVE_X, - 0, GL_RGB, - TEXSIZE, TEXSIZE, - 0, GL_RGB, GL_INT, NULL); - glTexImage2D - (GL_TEXTURE_CUBE_MAP_POSITIVE_Y, - 0, GL_RGB, - TEXSIZE, TEXSIZE, - 0, GL_RGB, GL_INT, NULL); - glTexImage2D - (GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, - 0, GL_RGB, - TEXSIZE, TEXSIZE, - 0, GL_RGB, GL_INT, NULL); - glTexImage2D - (GL_TEXTURE_CUBE_MAP_POSITIVE_Z, - 0, GL_RGB, - TEXSIZE, TEXSIZE, - 0, GL_RGB, GL_INT, NULL); - glTexImage2D - (GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, - 0, GL_RGB, - TEXSIZE, TEXSIZE, - 0, GL_RGB, GL_INT, NULL); - break; - } - - - if (useFramebuffer) { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbs[0]); - int height = TEXSIZE; - - if (textureModes[mode] == GL_TEXTURE_1D) - height = 1; - - if (depthBuffer) { - int params; - - glGenRenderbuffersEXT(1, depth_rb); - - - glBindRenderbufferEXT - (GL_RENDERBUFFER_EXT, - depth_rb[0]); - if (glIsRenderbufferEXT(depth_rb[0]) != GL_TRUE) - { - REPORT_FAILURE("Call glIsRenderbufferEXT failed\n"); - return false; - } - - glRenderbufferStorageEXT - (GL_RENDERBUFFER_EXT, - GL_DEPTH_COMPONENT, - TEXSIZE, height); - glFramebufferRenderbufferEXT - (GL_FRAMEBUFFER_EXT, - GL_DEPTH_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, - depth_rb[0]); - glGetRenderbufferParameterivEXT - (GL_RENDERBUFFER_EXT, - GL_RENDERBUFFER_WIDTH_EXT, - ¶ms); - if (params != TEXSIZE) { - REPORT_FAILURE("Get Renderbuffer width failed"); - printf("glGetRenderbufferParameterivEXT: %s\n", piglit_get_gl_error_name(glGetError())); - printf("width = %d\n", params); - return false; - } - glGetRenderbufferParameterivEXT - (GL_RENDERBUFFER_EXT, - GL_RENDERBUFFER_HEIGHT_EXT, - ¶ms); - if (params != height) { - REPORT_FAILURE("Get Renderbuffer height failed"); - printf("glGetRenderbufferParameterivEXT: %s\n", piglit_get_gl_error_name(glGetError())); - return false; - } - } - - if (stencilBuffer) { - int type; - - type = -1; - glGenRenderbuffersEXT(1, stencil_rb); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, stencil_rb[0]); - glRenderbufferStorageEXT - (GL_RENDERBUFFER_EXT, - GL_STENCIL_INDEX, - TEXSIZE, height); - glFramebufferRenderbufferEXT - (GL_FRAMEBUFFER_EXT, - GL_STENCIL_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, - stencil_rb[0]); - glGetFramebufferAttachmentParameterivEXT - (GL_FRAMEBUFFER_EXT, - GL_STENCIL_ATTACHMENT_EXT, - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT, - &type); - if (type != GL_RENDERBUFFER_EXT) { - REPORT_FAILURE("Get Framebuffer attached object type failed"); - printf("glGetFramebufferParameterivEXT: %s\n", piglit_get_gl_error_name(glGetError())); - printf("type = %d\n", type); - return false; - } - } - - switch (textureModes[mode]) { - case GL_TEXTURE_1D: - int name; - - name = -1; - glFramebufferTexture1DEXT - (GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT, - GL_TEXTURE_1D, - textures[0], 0); - glGetFramebufferAttachmentParameterivEXT - (GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT, - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT, - &name); - if ((GLuint)name != textures[0]) { - REPORT_FAILURE("Get Framebuffer attached texture name failed"); - printf("glGetFramebufferParameterivEXT: %s\n", piglit_get_gl_error_name(glGetError())); - printf("name = %d\n", name); - return false; - } - - break; - case GL_TEXTURE_2D: - int level; - - level = -1; - glFramebufferTexture2DEXT - (GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT, - GL_TEXTURE_2D, - textures[0], 0); - glGetFramebufferAttachmentParameterivEXT - (GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT, - GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT, - &level); - if (level != 0) { - REPORT_FAILURE("Get Framebuffer attached texture level failed"); - printf("glGetFramebufferParameterivEXT: %s\n", piglit_get_gl_error_name(glGetError())); - printf("level = %d\n", level); - return false; - } - - break; - case GL_TEXTURE_3D: - int zoffset; - - zoffset = -1; - glFramebufferTexture3DEXT - (GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT, - GL_TEXTURE_3D, - textures[0], - 0, - maxzoffset-1); - - glGetFramebufferAttachmentParameterivEXT - (GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT, - GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT, - &zoffset); - - if (zoffset != maxzoffset-1) { - REPORT_FAILURE("Get Framebuffer attached 3D texture z-offset failed"); - printf("glGetFramebufferParameterivEXT: %s\n", piglit_get_gl_error_name(glGetError())); - printf("zoffset = %d\n", zoffset); - return false; - } - break; - case GL_TEXTURE_CUBE_MAP: - int face = 0; - - glFramebufferTexture2DEXT - (GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT, - GL_TEXTURE_CUBE_MAP_POSITIVE_Z, - textures[0], 0); - glGetFramebufferAttachmentParameterivEXT - (GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT, - GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT, - &face); - if (face != - GL_TEXTURE_CUBE_MAP_POSITIVE_Z) - { - REPORT_FAILURE("Get Framebuffer attached cube map face failed"); - printf("glGetFramebufferParameterivEXT: %s\n", piglit_get_gl_error_name(glGetError())); - printf("face = %d\n", face); - return false; - } - - break; - } - - status = CheckFramebufferStatus("FBOTest::testRender2SingleTexture", __LINE__); - } - else { - status = GL_FRAMEBUFFER_COMPLETE_EXT; - } - - - if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { - glDeleteTextures(1, textures); - if (useFramebuffer) - glDeleteFramebuffersEXT(1, fbs); - if (depthBuffer) - glDeleteRenderbuffersEXT(1, depth_rb); - if (stencilBuffer) - glDeleteRenderbuffersEXT(1, stencil_rb); - continue; - } - - // - // Render, test the results - // - - if (depthBuffer) { - glClear(GL_DEPTH_BUFFER_BIT); - // Init depth buffer - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_ALWAYS); - glBegin(GL_POLYGON); - glVertex3f(TEXSIZE / 4, 0, 0.3); - glVertex3f(TEXSIZE * 5 / 8, 0, 0.3); - glVertex3f(TEXSIZE * 5 / 8, TEXSIZE, 0.3); - glVertex3f(TEXSIZE / 4, TEXSIZE, 0.3); - glEnd(); - glDepthFunc(GL_LESS); - } - - if (stencilBuffer) { - glClear(GL_STENCIL_BUFFER_BIT); - // Init stencil buffer - glEnable(GL_STENCIL_TEST); - glStencilFunc(GL_ALWAYS, 0x1, 0x1); - glStencilOp(GL_KEEP, - GL_KEEP, GL_REPLACE); - glBegin(GL_POLYGON); - glVertex3f(TEXSIZE / 2, 0, 0.3); - glVertex3f(TEXSIZE * 7 / 8, 0, 0.3); - glVertex3f(TEXSIZE * 7 / 8, TEXSIZE, 0.3); - glVertex3f(TEXSIZE / 2, TEXSIZE, 0.3); - glEnd(); - glStencilFunc(GL_NOTEQUAL, 0x1, 0x1); - } - - // Render to the texture - glBindTexture(textureModes[mode], 0); - glDisable(textureModes[mode]); - glColor4fv(colors[RED]); - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - - glBegin(GL_POLYGON); - glVertex3f(0, 0, 0.2); - glVertex3f(TEXSIZE, 0, 0.2); - glVertex3f(TEXSIZE, TEXSIZE, 0.2); - glVertex3f(0, TEXSIZE, 0.2); - glEnd(); - - // Render to the window - glEnable(textureModes[mode]); - glBindTexture(textureModes[mode], - textures[0]); - if (useFramebuffer) { - glBindFramebufferEXT - (GL_FRAMEBUFFER_EXT, 0); - glBindTexture(textureModes - [mode], textures[0]); - } - else { - switch (textureModes[mode]) { - case GL_TEXTURE_1D: - glCopyTexImage1D - (GL_TEXTURE_1D, - 0, GL_RGB, - 0, 0, TEXSIZE, 0); - break; - case GL_TEXTURE_2D: - glCopyTexImage2D - (GL_TEXTURE_2D, - 0, GL_RGB, - 0, 0, - TEXSIZE, - TEXSIZE, 0); - break; - case GL_TEXTURE_3D: - glCopyTexSubImage3D - (GL_TEXTURE_3D, - 0, 0, 0, - 0, 0, 0, - TEXSIZE, TEXSIZE); - break; - case GL_TEXTURE_CUBE_MAP: - glCopyTexImage2D - (GL_TEXTURE_CUBE_MAP_POSITIVE_Z, - 0, GL_RGB, - 0, 0, - TEXSIZE, - TEXSIZE, 0); - default: - break; - } - } - if (depthBuffer) - glDisable(GL_DEPTH_TEST); - if (stencilBuffer) - glDisable(GL_STENCIL_TEST); - - glEnable(textureModes[mode]); - glColor4fv(colors[WHITE]); - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - - glTexParameteri (textureModes[mode], GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri (textureModes[mode], GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri (textureModes[mode], GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - - if (textureModes[mode] != - GL_TEXTURE_CUBE_MAP) { - GLfloat depth = 0.99+0.01; - glBegin(GL_POLYGON); - glTexCoord3f(0.0, 0.0, depth); - glVertex2f(0, 0); - glTexCoord3f(1.0, 0.0, depth); - glVertex2f(TEXSIZE, 0); - glTexCoord3f(1.0, 1.0, depth); - glVertex2f(TEXSIZE, TEXSIZE); - glTexCoord3f(0.0, 1.0, depth); - glVertex2f(0, TEXSIZE); - glEnd(); - } - else { - glBegin(GL_POLYGON); - glTexCoord3f(-1.0, 1.0, 1.0); - glVertex2f(0, 0); - glTexCoord3f(1.0, 1.0, 1.0); - glVertex2f(TEXSIZE, 0); - glTexCoord3f(1.0, -1.0, 1.0); - glVertex2f(TEXSIZE, TEXSIZE); - glTexCoord3f(-1.0, -1.0, 1.0); - glVertex2f(0, TEXSIZE); - glEnd(); - } - - glDeleteTextures(1, textures); - if (useFramebuffer) - glDeleteFramebuffersEXT(1, fbs); - if (depthBuffer) - glDeleteRenderbuffersEXT(1, depth_rb); - if (stencilBuffer) - glDeleteRenderbuffersEXT(1, stencil_rb); - -// getchar(); - if (checkResult(colors[RED], depthBuffer, stencilBuffer) == false) { - REPORT_FAILURE("Render to single texture failed"); - printf(" mode = %d\n", mode); - return false; - } - } - } - } - - return true; -} - - -bool -FBOTest::testRender2MultiTexture(void) -{ - int i; - GLuint fbs[8]; - GLuint textures[8]; - GLint maxColorAttachment = 8; - - - enum { MULTI_FBO, SINGLE_COLOR_ATTACH, MULTI_COLOR_ATTACH }; - int numRender; - int numFBO; - int numColorAttach; - int mode; - - reset(); - for (mode = MULTI_FBO; mode < MULTI_COLOR_ATTACH + 1; mode++) { - if (useFramebuffer) { - glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, - &maxColorAttachment); - if (maxColorAttachment < 1) { - REPORT_FAILURE("Failed to get max color attachment points"); - return false; - } - } - - numRender = maxColorAttachment; - numColorAttach = maxColorAttachment; - if (mode == MULTI_FBO) - numFBO = maxColorAttachment; - else - numFBO = 1; - - if (useFramebuffer) - glGenFramebuffersEXT(numFBO, fbs); - - GLint maxTexUnits; - - glGetIntegerv(GL_MAX_TEXTURE_UNITS, &maxTexUnits); - glGenTextures(maxTexUnits, textures); - - - for (i = 0; i < numColorAttach; i++) { - int idx; - - if (i > maxTexUnits - 1) - idx = maxTexUnits - 1; - else - idx = i; - - glActiveTexture(GL_TEXTURE0 + idx); - glBindTexture(GL_TEXTURE_2D, textures[idx]); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, - TEXSIZE, TEXSIZE, 0, GL_RGB, - GL_INT, NULL); - - if (useFramebuffer) { - if (mode == MULTI_FBO) - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbs[i]); - else - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbs[0]); - - if (mode != SINGLE_COLOR_ATTACH) - glFramebufferTexture2DEXT - (GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT + i, - GL_TEXTURE_2D, - textures[idx], 0); - else - glFramebufferTexture2DEXT - (GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT, - GL_TEXTURE_2D, - textures[idx], 0); - if (mode != SINGLE_COLOR_ATTACH) { - glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT + i); - glReadBuffer(GL_COLOR_ATTACHMENT0_EXT + i); - } - else { - glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); - glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); - } - CheckFramebufferStatus("FBOTest::testRender2MultiTexture", __LINE__); - } - } - - - - for (i = 0; i < numRender; i++) { - int idx; - - if (i > maxTexUnits - 1) - idx = maxTexUnits - 1; - else - idx = i; - - - if (useFramebuffer) { - if (mode == MULTI_FBO) - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbs[i]); - else - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbs[0]); - - if (mode == MULTI_COLOR_ATTACH) { - glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT + idx); - glReadBuffer(GL_COLOR_ATTACHMENT0_EXT + idx); - } - - CheckFramebufferStatus("FBOTest::testRender2MultiTexture", __LINE__); - if (mode == SINGLE_COLOR_ATTACH) { - glFramebufferTexture2DEXT - (GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT, - GL_TEXTURE_2D, - textures[idx], 0); - } - } - - glDisable(GL_TEXTURE_2D); - - // Render to the texture - glColor4fv(colors[RED + i % (WHITE - RED)]); - - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - - glBegin(GL_POLYGON); - glVertex3f(0, 0, 1); - glVertex3f(TEXSIZE, 0, 1); - glVertex3f(TEXSIZE, TEXSIZE, 1); - glVertex3f(0, TEXSIZE, 1); - glEnd(); - - - glEnable(GL_TEXTURE_2D); - if (useFramebuffer) { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - glBindTexture(GL_TEXTURE_2D, textures[idx]); - } - else { - glBindTexture(GL_TEXTURE_2D, textures[idx]); - glCopyTexImage2D(GL_TEXTURE_2D, 0, - GL_RGB, 0, 0, - TEXSIZE, TEXSIZE, 0); - } - - } - // Clean up - if (useFramebuffer) - glDeleteFramebuffersEXT(numFBO, fbs); - - - // Render to the window - for (i = 0; i < numRender; i++) { - int idx; - - if (i > maxTexUnits - 1) - idx = maxTexUnits - 1; - else - idx = i; - - glActiveTexture(GL_TEXTURE0 + idx); - glEnable(GL_TEXTURE_2D); - glTexParameteri(GL_TEXTURE_2D, - GL_TEXTURE_MIN_FILTER, GL_NEAREST); - 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); - - glColor4fv(colors[WHITE]); - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - glBegin(GL_POLYGON); - glMultiTexCoord2f(GL_TEXTURE0 + idx, 0, 0); - glVertex3f(0, 0, 1); - glMultiTexCoord2f(GL_TEXTURE0 + idx, 1, 0); - glVertex3f(TEXSIZE, 0, 1); - glMultiTexCoord2f(GL_TEXTURE0 + idx, 1, 1); - glVertex3f(TEXSIZE, TEXSIZE, 1); - glMultiTexCoord2f(GL_TEXTURE0 + idx, 0, 1); - glVertex3f(0, TEXSIZE, 1); - glEnd(); - - //Check result - int exp = (i >= maxTexUnits - 1) ? maxColorAttachment - 1 : i; - - if (checkResult(colors[RED + (exp % (WHITE - RED))], 0, 0) == false) { - glDeleteTextures(maxTexUnits, textures); - - REPORT_FAILURE("Render to multi texture failed"); - return false; - } - - glDisable(GL_TEXTURE_2D); - glActiveTexture(GL_TEXTURE0); - } - - glDeleteTextures(maxTexUnits, textures); - } - - return true; -} - - -bool -FBOTest::testRender2depthTexture(void) -{ - GLuint fbs[2]; - GLuint textures[8]; - - reset(); - if (useFramebuffer) - glGenFramebuffersEXT(1, fbs); - - glGenTextures(1, textures); - glBindTexture(GL_TEXTURE_2D, textures[0]); - glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, TEXSIZE, - TEXSIZE, 0, GL_DEPTH_COMPONENT, GL_INT, NULL); - - if (useFramebuffer) { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbs[0]); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, - GL_DEPTH_ATTACHMENT_EXT, - GL_TEXTURE_2D, textures[0], 0); - glDrawBuffer(GL_NONE); - glReadBuffer(GL_NONE); - - CheckFramebufferStatus("FBOTest::testRender2depthTexture", __LINE__); - } - glClear(GL_DEPTH_BUFFER_BIT); - glEnable(GL_DEPTH_TEST); - - glDisable(GL_TEXTURE_2D); - - // Render to the texture - glColor4fv(colors[RED]); - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - glBegin(GL_POLYGON); - glVertex3f(TEXSIZE / 4, 0, 0.5); - glVertex3f(TEXSIZE * 5 / 8, 0, 0.5); - glVertex3f(TEXSIZE * 5 / 8, TEXSIZE, 0.5); - glVertex3f(TEXSIZE / 4, TEXSIZE, 0.5); - glEnd(); - - if (useFramebuffer) { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - glBindTexture(GL_TEXTURE_2D, textures[0]); - } - else { - glBindTexture(GL_TEXTURE_2D, textures[0]); - glCopyTexImage2D(GL_TEXTURE_2D, 0, - GL_DEPTH_COMPONENT, 0, 0, TEXSIZE, - TEXSIZE, 0); - } - - glClear(GL_DEPTH_BUFFER_BIT); - - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, - GL_COMPARE_R_TO_TEXTURE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LESS); - glTexParameterf(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, - GL_LUMINANCE); - glEnable(GL_TEXTURE_2D); - glDisable(GL_DEPTH_TEST); - - // Render to the window - glColor4fv(colors[GREEN]); - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - glBegin(GL_POLYGON); - glTexCoord3f(0, 0, 0.75); - glVertex2f(0, 0); - glTexCoord3f(1, 0, 0.75); - glVertex2f(TEXSIZE, 0); - glTexCoord3f(1, 1, 0.75); - glVertex2f(TEXSIZE, TEXSIZE); - glTexCoord3f(0, 1, 0.75); - glVertex2f(0, TEXSIZE); - glEnd(); - glFlush(); - - // Clean up - if (useFramebuffer) - glDeleteFramebuffersEXT(1, fbs); - glDeleteTextures(1, textures); - - // Check result - if (checkResult(colors[WHITE], 1, 0) == false) { - REPORT_FAILURE("Render to depth texture failed"); - return false; - } - - - - return true; -} - - -bool -FBOTest::testRender2MipmapTexture(void) -{ - int i; - GLuint fbs[1]; - GLuint textures[1]; - - reset(); - if (useFramebuffer) - glGenFramebuffersEXT(1, fbs); - - glGenTextures(1, textures); - glBindTexture(GL_TEXTURE_2D, textures[0]); - - if (useFramebuffer) - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbs[0]); - - glDisable(GL_TEXTURE_2D); - - GLint level = 0; - - for (i = TEXSIZE; i > 0; i /= 2, level++) { - if (useFramebuffer) { - glTexImage2D(GL_TEXTURE_2D, level, GL_RGB, - i, i, 0, GL_RGB, GL_INT, NULL); - glFramebufferTexture2DEXT - (GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT, - GL_TEXTURE_2D, textures[0], level); - CheckFramebufferStatus("FBOTest::testRender2MipmapTexture", __LINE__); - - glColor4fv(colors[RED + (level % (WHITE - RED))]); - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - - glBegin(GL_POLYGON); - glVertex3f(0, 0, 1); - glVertex3f(TEXSIZE, 0, 1); - glVertex3f(TEXSIZE, TEXSIZE, 1); - glVertex3f(0, TEXSIZE, 1); - glEnd(); - } - else { - glColor4fv(colors[RED + (level % (WHITE - RED))]); - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - - glBegin(GL_POLYGON); - glVertex3f(0, 0, 1); - glVertex3f(TEXSIZE, 0, 1); - glVertex3f(TEXSIZE, TEXSIZE, 1); - glVertex3f(0, TEXSIZE, 1); - glEnd(); - - - glTexImage2D(GL_TEXTURE_2D, level, GL_RGB, - i, i, 0, GL_RGB, GL_INT, NULL); - glCopyTexImage2D(GL_TEXTURE_2D, level, - GL_RGB, 0, 0, i, i, 0); - } - } - - if (useFramebuffer) { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - glBindTexture(GL_TEXTURE_2D, textures[0]); - } - glEnable(GL_TEXTURE_2D); - - // Render to the window - glColor4fv(colors[GREEN]); - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, - GL_NEAREST_MIPMAP_NEAREST); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - - for (i = TEXSIZE; i > 0; i /= 2) { - glBegin(GL_POLYGON); - glTexCoord2f(0, 0); - glVertex3f(windowSize / 2 - i / 2, - windowSize / 2 - i / 2, 1); - glTexCoord2f(1, 0); - glVertex3f(windowSize / 2 + i / 2, - windowSize / 2 - i / 2, 1); - glTexCoord2f(1, 1); - glVertex3f(windowSize / 2 + i / 2, - windowSize / 2 + i / 2, 1); - glTexCoord2f(0, 1); - glVertex3f(windowSize / 2 - i / 2, - windowSize / 2 + i / 2, 1); - glEnd(); - } - glFlush(); - - // Clean up - if (useFramebuffer) - glDeleteFramebuffersEXT(1, fbs); - glDeleteTextures(1, textures); - - // Check result - level = 0; - for (i = TEXSIZE; i > 1; i /= 2, level++) { - GLfloat pixel[3]; - - glReadPixels(windowSize / 2 - i / 2, - windowSize / 2 - i / 2, 1, 1, GL_RGB, - GL_FLOAT, pixel); - if (!equalColors - (pixel, colors[RED + (level % (WHITE - RED))])) { - REPORT_FAILURE("Render to mipmap texture failed"); - printf(" level = %d\n", level); - return false; - } - } - - - return true; -} - - -bool -FBOTest::testErrorHandling(void) -{ - GLuint fbs[1]; - GLuint textures[2]; - GLuint renderbuffer; - GLenum status; - bool have_ARB_ES2 = GLUtils::haveExtension("GL_ARB_ES2_compatibility"); - - if (useFramebuffer) { - GLuint maxColorAttachment; - - glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, (GLint *) & maxColorAttachment); - if (maxColorAttachment < 1) { - REPORT_FAILURE("Failed to get max color attachment points"); - return false; - } - - - // At least one image attached to the framebuffer - glGenFramebuffersEXT(1, fbs); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbs[0]); - glDrawBuffer(GL_NONE); - glReadBuffer(GL_NONE); - status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - glDeleteFramebuffersEXT(1, fbs); - if (status != - GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT) { - REPORT_FAILURE - ("If no image is attached to framebuffer, status should be GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT"); - return false; - } - - // All attached images have the same width and height, - // unless GL_ARB_framebuffer object is supported. - glGenFramebuffersEXT(1, fbs); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbs[0]); - glGenTextures(2, textures); - glBindTexture(GL_TEXTURE_2D, textures[0]); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TEXSIZE, - TEXSIZE, 0, GL_RGB, GL_INT, NULL); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT, - GL_TEXTURE_2D, textures[0], 0); - glBindTexture(GL_TEXTURE_2D, textures[1]); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TEXSIZE / 2, - TEXSIZE / 2, 0, GL_RGB, GL_INT, NULL); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT - + maxColorAttachment - 1, - GL_TEXTURE_2D, textures[1], 0); - status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - glDeleteFramebuffersEXT(1, fbs); - glDeleteTextures(2, textures); - if (!haveARBfbo && - status != GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT) { - REPORT_FAILURE - ("If renderbuffer sizes don't all match, status should be GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT"); - return false; - } - - // All images attached to the attachment points - // COLOR_ATTACHMENT0_EXT through COLOR_ATTACHMENTn_EXT must - // have the same internal format, unless ARB_fbo is supported. - glGenFramebuffersEXT(1, fbs); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbs[0]); - glGenTextures(2, textures); - glBindTexture(GL_TEXTURE_2D, textures[0]); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TEXSIZE, - TEXSIZE, 0, GL_RGB, GL_INT, NULL); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT, - GL_TEXTURE_2D, textures[0], 0); - glBindTexture(GL_TEXTURE_2D, textures[1]); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEXSIZE, - TEXSIZE, 0, GL_RGBA, GL_INT, NULL); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT - + maxColorAttachment - 1, - GL_TEXTURE_2D, textures[1], 0); - status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - glDeleteFramebuffersEXT(1, fbs); - glDeleteTextures(2, textures); - if (!haveARBfbo && - status != GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT) { - REPORT_FAILURE - ("All color renderbuffers must be of same format, status should be GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT"); - return false; - } - - - // The value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT must not - // be NONE for any color attachment point(s) named by - // DRAW_BUFFERi. - // [Note: to avoid being caught by the no-attachments - // case above, we attach a depth renderbuffer.] - glGenFramebuffersEXT(1, fbs); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbs[0]); - glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT + - maxColorAttachment - 1); - glGenRenderbuffers(1, &renderbuffer); - glBindRenderbuffer(GL_RENDERBUFFER_EXT, renderbuffer); - glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, - TEXSIZE, TEXSIZE); - glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, - GL_DEPTH_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, - renderbuffer); - status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - glDeleteFramebuffersEXT(1, fbs); - glDeleteTextures(1, textures); - glDeleteRenderbuffers(1, &renderbuffer); - if (status != GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT && - !have_ARB_ES2) { - REPORT_FAILURE - ("All any buffer named by glDrawBuffers is missing, status should be GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT"); - return false; - } - - // If READ_BUFFER is not NONE, then the value of - // FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT must not be NONE for - // the color attachment point named by READ_BUFFER. - // [Note: to avoid being caught by the no-attachments - // case above, we attach a depth renderbuffer.] - glGenFramebuffersEXT(1, fbs); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbs[0]); - glDrawBuffer(GL_NONE); - glReadBuffer(GL_COLOR_ATTACHMENT0_EXT + - maxColorAttachment - 1); - glGenRenderbuffers(1, &renderbuffer); - glBindRenderbuffer(GL_RENDERBUFFER_EXT, renderbuffer); - glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, - TEXSIZE, TEXSIZE); - glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, - GL_DEPTH_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, - renderbuffer); - status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - glDeleteFramebuffersEXT(1, fbs); - glDeleteRenderbuffers(1, &renderbuffer); - if (status != GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT && - !have_ARB_ES2) { - REPORT_FAILURE - ("If buffer named by glReadBuffers is missing, status should be GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT"); - return false; - } - } - return true; -} - -void -FBOTest::runOne(MultiTestResult & r, Window & w) -{ - (void) w; - - if (!setup()) { - r.pass = false; - return; - } - - static SubTestFunc funcs[] = { - &GLEAN::FBOTest::testSanity, - &GLEAN::FBOTest::testRender2SingleTexture, - &GLEAN::FBOTest::testRender2MultiTexture, - &GLEAN::FBOTest::testRender2depthTexture, - &GLEAN::FBOTest::testRender2MipmapTexture, - &GLEAN::FBOTest::testErrorHandling, - NULL - }; - - for (int i = 0; funcs[i]; i++) - if ((this->*funcs[i]) ()) - r.numPassed++; - else - r.numFailed++; - - r.pass = (r.numFailed == 0); -} - - -// The test object itself: -FBOTest fboTest("fbo", "window, rgb, z", "", // no extension filter - "fbo test: Test OpenGL Extension GL_EXT_framebuffer_object\n"); - - - -} // namespace GLEAN diff --git a/tests/glean/tfbo.h b/tests/glean/tfbo.h deleted file mode 100644 index 5f8b71965..000000000 --- a/tests/glean/tfbo.h +++ /dev/null @@ -1,83 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyrigth (C) 2007 Intel Corporation -// Copyright (C) 1999 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 -// -// Authors: -// Shuang He <shuang.he@intel.com> -// -// tfbo.h: Test OpenGL Extension GL_EXT_framebuffer_objec - -#ifndef __tfbo_h__ -#define __tfbo_h__ - -#include "tmultitest.h" - -namespace GLEAN { - -#define windowSize 100 - - -class FBOTest: public MultiTest -{ -public: - FBOTest(const char* testName, const char* filter, - const char *extensions, const char* description): - MultiTest(testName, filter, extensions, description), - haveARBfbo(false), - tolerance() - { - } - - virtual void runOne(MultiTestResult &r, Window &w); - -private: - typedef bool (FBOTest::*TestFunc)(MultiTestResult &r); - typedef bool (FBOTest::*SubTestFunc)(void); - - GLboolean haveARBfbo; // GL_ARB_framebuffer_object supported? - GLfloat tolerance[5]; - void reset(void); - bool testSanity(void); - bool testRender2SingleTexture(void); - bool testRender2MultiTexture(void); - bool testRender2depthTexture(void); - bool testRender2MipmapTexture(void); - bool testErrorHandling(void); - - - bool setup(void); - bool checkResult(const GLfloat exp[4], const int depth, const int stencil) const; - bool equalColors(const GLfloat a[4], const GLfloat b[4]) const; - - void reportFailure(const char *msg, int line) const; - void reportFailure(const char *msg, GLenum target, int line) const; -}; - -} // namespace GLEAN - -#endif // __tfbo_h__ diff --git a/tests/glean/tfragprog1.cpp b/tests/glean/tfragprog1.cpp deleted file mode 100644 index 837382c14..000000000 --- a/tests/glean/tfragprog1.cpp +++ /dev/null @@ -1,1125 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 1999 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 - -// tfragprog.cpp: Test GL_ARB_fragment_program extension. -// Brian Paul 22 October 2005 -// -// This is pretty simple. Specific fragment programs are run, we read back -// the framebuffer color and compare the color to the expected result. -// Pretty much any fragment program can be tested in the manner. -// Ideally, an additional fragment program test should be developed which -// exhaustively tests instruction combinations with all the various swizzle -// and masking options, etc. -// But this test is good for regression testing to be sure that particular or -// unique programs work correctly. - -#include <cstdlib> -#include <cstring> -#include <cassert> -#include <cmath> -#include <math.h> -#include "tfragprog1.h" - - -namespace GLEAN { - -// Clamp X to [0, 1] -#define CLAMP01( X ) ( (X)<(0.0) ? (0.0) : ((X)>(1.0) ? (1.0) : (X)) ) -// Absolute value -#define ABS(X) ( (X) < 0.0 ? -(X) : (X) ) -// Max -#define MAX( A, B ) ( (A) > (B) ? (A) : (B) ) -// Min -#define MIN( A, B ) ( (A) < (B) ? (A) : (B) ) -// Duplicate value four times -#define SMEAR(X) (X), (X), (X), (X) - -#define DONT_CARE_Z -1.0 -#define DONT_CARE_COLOR -1.0 - -#define FRAGCOLOR { 0.25, 0.75, 0.5, 0.25 } -#define PARAM0 { 0.0, 0.0, 0.0, 0.0 } -#define PARAM1 { 0.5, 0.25, 1.0, 0.5 } -#define PARAM2 { -1.0, 0.0, 0.25, -0.5 } -static const GLfloat FragColor[4] = FRAGCOLOR; -static const GLfloat Param0[4] = PARAM0; -static const GLfloat Param1[4] = PARAM1; -static const GLfloat Param2[4] = PARAM2; -static GLfloat InfNan[4]; -static GLfloat FogColor[4] = {1.0, 1.0, 0.0, 0.0}; -static GLfloat FogStart = 10.0; -static GLfloat FogEnd = 100.0; -static GLfloat FogDensity = 0.03; -static GLfloat FogCoord = 50.0; /* Between FogStart and FogEnd */ - - -// These are the specific fragment programs which we'll test -// Alphabetical order, please -static const FragmentProgram Programs[] = { - { - "ABS test", - "!!ARBfp1.0\n" - "PARAM p = program.local[2]; \n" - "ABS result.color, p; \n" - "END \n", - { ABS(Param2[0]), - ABS(Param2[1]), - ABS(Param2[2]), - ABS(Param2[3]) - }, - DONT_CARE_Z, - }, - { - "ADD test", - "!!ARBfp1.0\n" - "PARAM p = program.local[1]; \n" - "ADD result.color, fragment.color, p; \n" - "END \n", - { CLAMP01(FragColor[0] + Param1[0]), - CLAMP01(FragColor[1] + Param1[1]), - CLAMP01(FragColor[2] + Param1[2]), - CLAMP01(FragColor[3] + Param1[3]) - }, - DONT_CARE_Z - }, - { - "ADD with saturation", - "!!ARBfp1.0\n" - "PARAM p = program.local[1]; \n" - "TEMP t; \n" - "ADD t, p, p; \n" - "ADD_SAT result.color, t, p; \n" - "END \n", - { CLAMP01(Param1[0] + Param1[0] + Param1[0]), - CLAMP01(Param1[1] + Param1[1] + Param1[1]), - CLAMP01(Param1[2] + Param1[2] + Param1[2]), - CLAMP01(Param1[3] + Param1[3] + Param1[3]), - }, - DONT_CARE_Z - }, - - { - "ADD an immediate", - "!!ARBfp1.0\n" - "PARAM p = program.local[1]; \n" - "ADD result.color, p, {0.25, 0.0, 0.5, 0.25}; \n" - "END \n", - { CLAMP01(Param1[0] + 0.25), - CLAMP01(Param1[1] + 0.0), - CLAMP01(Param1[2] + 0.5), - CLAMP01(Param1[3] + 0.25), - }, - DONT_CARE_Z - }, - - { - "ADD negative immediate", - "!!ARBfp1.0\n" - "PARAM p = program.local[1]; \n" - "ADD result.color, p, {-0.25, -0.2, 0.0, -0.25}; \n" - "END \n", - { CLAMP01(Param1[0] - 0.25), - CLAMP01(Param1[1] - 0.2), - CLAMP01(Param1[2] - 0.0), - CLAMP01(Param1[3] - 0.25), - }, - DONT_CARE_Z - }, - - { - "ADD negative immediate (2)", - "!!ARBfp1.0\n" - "PARAM p = program.local[1]; \n" - "TEMP t; \n" - "MOV t, p; \n" - "MUL t.xyz, t, 2.0; \n" - "ADD t.xyz, t, -1.0; \n" - "MOV result.color, t; \n" - "END \n", - { CLAMP01(Param1[0] * 2.0 - 1.0), - CLAMP01(Param1[1] * 2.0 - 1.0), - CLAMP01(Param1[2] * 2.0 - 1.0), - CLAMP01(Param1[3] ), - }, - DONT_CARE_Z - }, - - { - "CMP test", - "!!ARBfp1.0\n" - "PARAM zero = program.local[0]; \n" - "PARAM p1 = program.local[1]; \n" - "PARAM p2 = program.local[2]; \n" - "CMP result.color, p2, zero, p1; \n" - "END \n", - { Param0[0], Param1[1], Param1[2], Param0[3] }, - DONT_CARE_Z - }, - { - "COS test", - "!!ARBfp1.0\n" - "PARAM values = { 0.0, 3.14159, 0.5, 1.0 }; \n" - "COS result.color.x, values.x; \n" - "COS result.color.y, values.y; \n" - "COS result.color.z, values.z; \n" - "COS result.color.w, values.w; \n" - "END \n", - { CLAMP01(1.0), - CLAMP01(-1.0), - CLAMP01(0.8775), - CLAMP01(0.5403) - }, - DONT_CARE_Z - }, - { - "COS test 2", - "!!ARBfp1.0\n" - "PARAM values = { 6.78318, 7.28318, 6.28318, -5.78318 }; \n" - "COS result.color.x, values.x; \n" - "COS result.color.y, values.y; \n" - "COS result.color.z, values.z; \n" - "COS result.color.w, values.w; \n" - "END \n", - { CLAMP01(0.8775), - CLAMP01(0.5403), - CLAMP01(1.0), - CLAMP01(0.8775) - }, - DONT_CARE_Z - }, - { - "DP3 test", - "!!ARBfp1.0\n" - "PARAM p1 = program.local[1]; \n" - "DP3 result.color, p1, fragment.color; \n" - "END \n", - { SMEAR(CLAMP01(Param1[0] * FragColor[0] + - Param1[1] * FragColor[1] + - Param1[2] * FragColor[2])) - }, - DONT_CARE_Z - }, - { - "DP3 test (2)", - "!!ARBfp1.0\n" - "PARAM p1 = program.local[1]; \n" - "TEMP t, r; \n" - "MOV t, p1; \n" - "DP3 r.x, t, t; \n" - "MUL result.color, r.xxxx, 0.5; \n" - "END \n", - { SMEAR(CLAMP01((Param1[0] * Param1[0] + - Param1[1] * Param1[1] + - Param1[2] * Param1[2]) * 0.5)) - }, - DONT_CARE_Z - }, - { - "DP4 test", - "!!ARBfp1.0\n" - "PARAM p1 = program.local[1]; \n" - "DP4 result.color, p1, fragment.color; \n" - "END \n", - { SMEAR(CLAMP01(Param1[0] * FragColor[0] + - Param1[1] * FragColor[1] + - Param1[2] * FragColor[2] + - Param1[3] * FragColor[3])) - }, - DONT_CARE_Z - }, - { - "DPH test", - "!!ARBfp1.0\n" - "PARAM p1 = program.local[1]; \n" - "PARAM scale = {0.1, 0.1, 0.1, 0.1}; \n" - "TEMP t; \n" - "DPH t, p1, fragment.color; \n" - "MUL result.color, t, scale; \n" - "END \n", - { SMEAR(CLAMP01((Param1[0] * FragColor[0] + - Param1[1] * FragColor[1] + - Param1[2] * FragColor[2] + - FragColor[3]) * 0.1)) - }, - DONT_CARE_Z - }, - { - "DST test", - "!!ARBfp1.0\n" - "# let d = 0.4 \n" - "PARAM v1 = {9.9, 0.16, 0.16, 9.9}; \n" - "PARAM v2 = {9.9, 2.5, 9.9, 2.5}; \n" - "DST result.color, v1, v2; \n" - "END \n", - { 1.0, - 0.4, // v1.y * v2.y - 0.16, // v1.z - CLAMP01(2.5) // v2.w - }, - DONT_CARE_Z - }, - { - "EX2 test", - "!!ARBfp1.0\n" - "PARAM scale = {0.01, 0.01, 0.01, 0.01}; \n" - "PARAM values = {0.0, 1.0, 4.0, -2.0 }; \n" - "TEMP t; \n" - "EX2 t.x, values.x; \n" - "EX2 t.y, values.y; \n" - "EX2 t.z, values.z; \n" - "EX2 t.w, values.w; \n" - "MUL result.color, t, scale; \n" - "END \n", - { 1.0 * 0.01, - 2.0 * 0.01, - 16.0 * 0.01, - 0.25 * 0.01 }, - DONT_CARE_Z - }, - { - "FLR test", - "!!ARBfp1.0\n" - "PARAM values = {4.8, 0.3, -0.2, 1.2}; \n" - "PARAM scale = {0.1, 0.1, 0.1, 0.1}; \n" - "TEMP t; \n" - "FLR t, values; \n" - "MUL result.color, t, scale; \n" - "END \n", - { 0.4, - 0.0, - CLAMP01(-0.1), - 0.1 - }, - DONT_CARE_Z - }, - { - "FRC test", - "!!ARBfp1.0\n" - "PARAM values = {-1.1, 0.1, -2.2, 2.4 }; \n" - "FRC result.color, values; \n" - "END \n", - { 0.9, 0.1, 0.8, 0.4 }, - DONT_CARE_Z - }, - { - "LG2 test", - "!!ARBfp1.0\n" - "PARAM values = {64.0, 1, 30, 4}; \n" - "PARAM scale = {0.1, 0.1, 0.1, 0.1}; \n" - "TEMP t; \n" - "LG2 t.x, values.x; \n" - "LG2 t.y, values.y; \n" - "LG2 t.z, values.z; \n" - "LG2 t.w, values.w; \n" - "MUL result.color, t, scale; \n" - "END \n", - { 0.6, - 0.0, - 0.49, - 0.2 - }, - DONT_CARE_Z - }, - { - "LIT test 1", - "!!ARBfp1.0\n" - "PARAM values = {0.65, 0.9, 0.0, 8.0}; \n" - "LIT result.color, values; \n" - "END \n", - { 1.0, - 0.65, // values.x - 0.433, // roughly Pow(values.y, values.w) - 1.0 - }, - DONT_CARE_Z - }, - { - "LIT test 2 (degenerate case: 0 ^ 0 -> 1)", - "!!ARBfp1.0\n" - "PARAM values = {0.65, 0.0, 0.0, 0.0}; \n" - "LIT result.color, values; \n" - "END \n", - { 1.0, - 0.65, // values.x - 1.0, // 0^0 - 1.0 - }, - DONT_CARE_Z - }, - { - "LIT test 3 (case x < 0)", - "!!ARBfp1.0\n" - "PARAM values = {-0.5, 0.0, 0.0, 0.0}; \n" - "LIT result.color, values; \n" - "END \n", - { 1.0, - CLAMP01(-0.5), // values.x - 0.0, - 1.0 - }, - DONT_CARE_Z - }, - { - "LRP test", - "!!ARBfp1.0\n" - "PARAM p1 = program.local[1]; \n" - "PARAM t = {0.2, 0.5, 1.0, 0.0}; \n" - "LRP result.color, t, fragment.color, p1; \n" - "END \n", - { 0.2 * FragColor[0] + (1.0 - 0.2) * Param1[0], - 0.5 * FragColor[1] + (1.0 - 0.5) * Param1[1], - 1.0 * FragColor[2] + (1.0 - 1.0) * Param1[2], - 0.0 * FragColor[3] + (1.0 - 0.0) * Param1[3] - }, - DONT_CARE_Z - }, - { - "MAD test", - "!!ARBfp1.0\n" - "PARAM p1 = program.local[1]; \n" - "PARAM p2 = program.local[2]; \n" - "MAD result.color, fragment.color, p1, p2; \n" - "END \n", - { CLAMP01(FragColor[0] * Param1[0] + Param2[0]), - CLAMP01(FragColor[1] * Param1[1] + Param2[1]), - CLAMP01(FragColor[2] * Param1[2] + Param2[2]), - CLAMP01(FragColor[3] * Param1[3] + Param2[3]) - }, - DONT_CARE_Z - }, - { - "MAX test", - "!!ARBfp1.0\n" - "PARAM p1 = program.local[1]; \n" - "PARAM p2 = program.local[2]; \n" - "MAX result.color, p1, p2; \n" - "END \n", - { MAX(Param1[0], Param2[0]), - MAX(Param1[1], Param2[1]), - MAX(Param1[2], Param2[2]), - MAX(Param1[3], Param2[3]), - }, - DONT_CARE_Z - }, - { - "MIN test", - "!!ARBfp1.0\n" - "PARAM p1 = program.local[1]; \n" - "MIN result.color, p1, fragment.color; \n" - "END \n", - { MIN(Param1[0], FragColor[0]), - MIN(Param1[1], FragColor[1]), - MIN(Param1[2], FragColor[2]), - MIN(Param1[3], FragColor[3]), - }, - DONT_CARE_Z - }, - { - "MOV test", - "!!ARBfp1.0\n" - "MOV result.color, fragment.color; \n" - "END \n", - FRAGCOLOR, - DONT_CARE_Z, - }, - { - "MUL test", - "!!ARBfp1.0\n" - "PARAM p = program.local[1]; \n" - "MUL result.color, fragment.color, p; \n" - "END \n", - { CLAMP01(FragColor[0] * Param1[0]), - CLAMP01(FragColor[1] * Param1[1]), - CLAMP01(FragColor[2] * Param1[2]), - CLAMP01(FragColor[3] * Param1[3]) - }, - DONT_CARE_Z - }, - { - "masked MUL test", - "!!ARBfp1.0\n" - "PARAM zero = program.local[0]; \n" - "PARAM p = program.local[1]; \n" - "MOV result.color, zero; \n" - "MUL result.color.xy, fragment.color, p; \n" - "END \n", - { CLAMP01(FragColor[0] * Param1[0]), - CLAMP01(FragColor[1] * Param1[1]), - 0.0, - 0.0 - }, - DONT_CARE_Z - }, - { - "POW test (exponentiation)", - "!!ARBfp1.0\n" - "PARAM values = {0.5, 2, 3, 4}; \n" - "POW result.color.x, values.x, values.y; \n" - "POW result.color.y, values.x, values.z; \n" - "POW result.color.z, values.x, values.w; \n" - "POW result.color.w, values.w, values.x; \n" - "END \n", - { 0.5 * 0.5, - 0.5 * 0.5 * 0.5, - 0.5 * 0.5 * 0.5 * 0.5, - CLAMP01(2.0) }, - DONT_CARE_Z - }, - { - "RCP test (reciprocal)", - "!!ARBfp1.0\n" - "PARAM values = {8, -10, 1, 12 }; \n" - "RCP result.color.x, values.x; \n" - "RCP result.color.y, values.y; \n" - "RCP result.color.z, values.z; \n" - "RCP result.color.w, values.w; \n" - "END \n", - { 1.0 / 8.0, CLAMP01(1.0 / -10.0), 1, 1.0 / 12.0 }, - DONT_CARE_Z - }, - { - /* check that RCP result is replicated across XYZW */ - "RCP test 2 (reciprocal)", - "!!ARBfp1.0\n" - "PARAM values = {8, -10, 1, 12 }; \n" - "MOV result.color, values; \n" - "RCP result.color, values.x; \n" - "END \n", - { 1.0 / 8.0, 1.0 / 8.0, 1.0 / 8.0, 1.0 / 8.0 }, - DONT_CARE_Z - }, - { - "RSQ test 1 (reciprocal square root)", - "!!ARBfp1.0\n" - "PARAM values = {1, 4, 9, 100 }; \n" - "RSQ result.color.x, values.x; \n" - "RSQ result.color.y, values.y; \n" - "RSQ result.color.z, values.z; \n" - "RSQ result.color.w, values.w; \n" - "END \n", - { 1.0, 0.5, 0.3333, 0.1 }, - DONT_CARE_Z - }, - { - "RSQ test 2 (reciprocal square root of negative value)", - "!!ARBfp1.0\n" - "PARAM values = {0, -100, -5, -1}; \n" - "RSQ result.color.x, values.x; \n" - "RSQ result.color.y, values.y; \n" - "RSQ result.color.z, values.z; \n" - "RSQ result.color.w, values.w; \n" - "END \n", - { DONT_CARE_COLOR, - 0.1, - 0.447, - 1.0, - }, - DONT_CARE_Z - }, - { - "SCS test", - "!!ARBfp1.0\n" - "PARAM values = { 0.5, 0.5, 0.0, 0.0 }; \n" - "SCS result.color.x, values.x; \n" - "SCS result.color.y, values.y; \n" - "END \n", - { CLAMP01(0.8775), - CLAMP01(0.4794), - DONT_CARE_COLOR, - DONT_CARE_COLOR, - }, - DONT_CARE_Z - }, - { - "SGE test", - "!!ARBfp1.0\n" - "PARAM p0 = program.local[0]; \n" - "PARAM p2 = program.local[2]; \n" - "SGE result.color, p2, p0; \n" - "END \n", - { Param2[0] >= Param0[0] ? 1.0 : 0.0, - Param2[1] >= Param0[1] ? 1.0 : 0.0, - Param2[2] >= Param0[2] ? 1.0 : 0.0, - Param2[3] >= Param0[3] ? 1.0 : 0.0, - }, - DONT_CARE_Z - }, - { - "SIN test", - "!!ARBfp1.0\n" - "PARAM values = { 1.57079, -1.57079, 0.5, 1.0 }; \n" - "SIN result.color.x, values.x; \n" - "SIN result.color.y, values.y; \n" - "SIN result.color.z, values.z; \n" - "SIN result.color.w, values.w; \n" - "END \n", - { CLAMP01(1.0), - CLAMP01(-1.0), - CLAMP01(0.4794), - CLAMP01(0.8414) - }, - DONT_CARE_Z - }, - { - "SIN test 2", - "!!ARBfp1.0\n" - "PARAM values = { 3.14159, -3.14159, 6.78319, -5.78319 }; \n" - "SIN result.color.x, values.x; \n" - "SIN result.color.y, values.y; \n" - "SIN result.color.z, values.z; \n" - "SIN result.color.w, values.w; \n" - "END \n", - { CLAMP01(0.0), - CLAMP01(0.0), - CLAMP01(0.4794), - CLAMP01(0.4794) - }, - DONT_CARE_Z - }, - { - "SLT test", - "!!ARBfp1.0\n" - "PARAM p1 = program.local[1]; \n" - "SLT result.color, fragment.color, p1; \n" - "END \n", - { FragColor[0] < Param1[0] ? 1.0 : 0.0, - FragColor[1] < Param1[1] ? 1.0 : 0.0, - FragColor[2] < Param1[2] ? 1.0 : 0.0, - FragColor[3] < Param1[3] ? 1.0 : 0.0, - }, - DONT_CARE_Z - }, - { - "SUB test (with swizzle)", - "!!ARBfp1.0\n" - "PARAM p1 = program.local[1]; \n" - "SUB result.color, p1.yxwz, fragment.color.yxwz; \n" - "END \n", - { CLAMP01(Param1[1] - FragColor[1]), - CLAMP01(Param1[0] - FragColor[0]), - CLAMP01(Param1[3] - FragColor[3]), - CLAMP01(Param1[2] - FragColor[2]) - }, - DONT_CARE_Z - }, - { - "SUB with saturation", - "!!ARBfp1.0\n" - "PARAM p1 = program.local[1]; \n" - "PARAM bias = {0.1, 0.1, 0.1, 0.1}; \n" - "TEMP t; \n" - "SUB_SAT t, fragment.color, p1; \n" - "ADD result.color, t, bias; \n" - "END \n", - { CLAMP01(FragColor[0] - Param1[1]) + 0.1, - CLAMP01(FragColor[1] - Param1[1]) + 0.1, - CLAMP01(FragColor[2] - Param1[2]) + 0.1, - CLAMP01(FragColor[3] - Param1[3]) + 0.1 - }, - DONT_CARE_Z - }, - { - "SWZ test", - "!!ARBfp1.0\n" - "PARAM p = program.local[1]; \n" - "SWZ result.color, p, -1,-y,z,0; \n" - "END \n", - { CLAMP01(-1.0), - CLAMP01(-Param1[1]), - CLAMP01(Param1[2]), - CLAMP01(0.0) - }, - DONT_CARE_Z - }, - { - // this test checks that SOA execution is handled correctly - "swizzled move test", - "!!ARBfp1.0\n" - "TEMP t; \n" - "PARAM p = program.local[1]; \n" - "MOV t, p; \n" - "MOV t, t.yxwz; \n" // "in-place" swizzle - "MOV result.color, t; \n" - "END \n", - { Param1[1], Param1[0], Param1[3], Param1[2] }, - DONT_CARE_Z - }, - { - // this test checks that SOA execution is handled correctly - "swizzled add test", - "!!ARBfp1.0\n" - "TEMP t; \n" - "PARAM p = program.local[1]; \n" - "MOV t, p; \n" - "ADD t, t, t.yxwz; \n" // "in-place" swizzled add - "MOV result.color, t; \n" - "END \n", - { CLAMP01(Param1[0] + Param1[1]), - CLAMP01(Param1[1] + Param1[0]), - CLAMP01(Param1[2] + Param1[3]), - CLAMP01(Param1[3] + Param1[2]) }, - DONT_CARE_Z - }, - { - "XPD test 1", - "!!ARBfp1.0\n" - "PARAM p1 = program.local[1]; \n" - "PARAM p2 = program.local[2]; \n" - "XPD result.color, p1, p2; \n" - "END \n", - { CLAMP01(Param1[1] * Param2[2] - Param1[2] * Param2[1]), - CLAMP01(Param1[2] * Param2[0] - Param1[0] * Param2[2]), - CLAMP01(Param1[0] * Param2[1] - Param1[1] * Param2[0]), - DONT_CARE_COLOR - }, - DONT_CARE_Z - }, - { - "Z-write test", - "!!ARBfp1.0\n" - "PARAM p = program.local[1]; \n" - "MOV result.color, p; \n" - "MOV result.depth.z, p.y; \n" - "END \n", - { Param1[0], - Param1[1], - Param1[2], - Param1[3] - }, - Param1[1] - }, - - // ============= Numeric stress tests ================================= - // Basically just check that we don't crash when we do divides by - // zero, etc. - { - "Divide by zero test", - "!!ARBfp1.0\n" - "PARAM zero = program.local[0]; \n" - "RCP result.color.x, zero.x; \n" - "RCP result.color.y, zero.y; \n" - "RCP result.color.z, zero.z; \n" - "RCP result.color.w, zero.w; \n" - "END \n", - { DONT_CARE_COLOR, - DONT_CARE_COLOR, - DONT_CARE_COLOR, - DONT_CARE_COLOR - }, - DONT_CARE_Z - }, - { - "Infinity and nan test", - "!!ARBfp1.0\n" - "PARAM zero = program.local[0]; \n" - "PARAM infNan = program.local[9]; \n" - "ADD result.color, infNan, zero; \n" - "END \n", - { DONT_CARE_COLOR, - DONT_CARE_COLOR, - DONT_CARE_COLOR, - DONT_CARE_COLOR - }, - DONT_CARE_Z - }, - - // ============= Fog tests ============================================ - // Linear fog -#define FOG_FACT ((FogEnd - FogCoord) / (FogEnd - FogStart)) - { - "ARB_fog_linear test", - "!!ARBfp1.0\n" - "OPTION ARB_fog_linear; \n" - "MOV result.color, fragment.color; \n" - "END \n", - { FragColor[0] * FOG_FACT + FogColor[0] * (1.0 - FOG_FACT), - FragColor[1] * FOG_FACT + FogColor[1] * (1.0 - FOG_FACT), - FragColor[2] * FOG_FACT + FogColor[2] * (1.0 - FOG_FACT), - FragColor[3] - }, - DONT_CARE_Z - }, - { - "Computed fog linear test", - "!!ARBfp1.0\n" - "# fogParams.x = density \n" - "# fogParams.y = start \n" - "# fogParams.z = end \n" - "# fogParams.w = 1/(end-start) \n" - "PARAM fogParams = state.fog.params; \n" - "ATTRIB fogCoord = fragment.fogcoord; \n" - "PARAM fogColor = state.fog.color; \n" - "TEMP numerator, f; \n" - "# f = (end - coord) / (end - start) \n" - "SUB numerator, fogParams.z, fogCoord.x; \n" - "MUL_SAT f, numerator, fogParams.w; \n" - "LRP result.color.rgb, f, fragment.color, fogColor; \n" - "MOV result.color.a, fragment.color.a; \n" - "END \n", - { FragColor[0] * FOG_FACT + FogColor[0] * (1.0 - FOG_FACT), - FragColor[1] * FOG_FACT + FogColor[1] * (1.0 - FOG_FACT), - FragColor[2] * FOG_FACT + FogColor[2] * (1.0 - FOG_FACT), - FragColor[3] - }, - DONT_CARE_Z - }, -#undef FOG_FACT - - // Exp fog -#define FOG_FACT 0.2231 // = exp(-Density * Coord) - { - "ARB_fog_exp test", - "!!ARBfp1.0\n" - "OPTION ARB_fog_exp; \n" - "MOV result.color, fragment.color; \n" - "END \n", - { FragColor[0] * FOG_FACT + FogColor[0] * (1.0 - FOG_FACT), - FragColor[1] * FOG_FACT + FogColor[1] * (1.0 - FOG_FACT), - FragColor[2] * FOG_FACT + FogColor[2] * (1.0 - FOG_FACT), - FragColor[3] - }, - DONT_CARE_Z - }, -#undef FOG_FACT -#define FOG_FACT 0.3535 // = ex2(-Density * Coord) - { - // NOTE: we could also do this with the POW instruction - "Computed fog exp test", - "!!ARBfp1.0\n" - "# fogParams.x = density \n" - "# fogParams.y = start \n" - "# fogParams.z = end \n" - "# fogParams.w = 1/(end-start) \n" - "PARAM fogParams = state.fog.params; \n" - "ATTRIB fogCoord = fragment.fogcoord; \n" - "PARAM fogColor = state.fog.color; \n" - "TEMP f, dc; \n" - "# f = exp(-density * coord) \n" - "MUL dc.x, fogParams.x, fogCoord.x; \n" - "EX2_SAT f, -dc.x; \n" - "LRP result.color.rgb, f, fragment.color, fogColor; \n" - "MOV result.color.a, fragment.color.a; \n" - "END \n", - { FragColor[0] * FOG_FACT + FogColor[0] * (1.0 - FOG_FACT), - FragColor[1] * FOG_FACT + FogColor[1] * (1.0 - FOG_FACT), - FragColor[2] * FOG_FACT + FogColor[2] * (1.0 - FOG_FACT), - FragColor[3] - }, - DONT_CARE_Z - }, -#undef FOG_FACT - - // Exp2 fog -#define FOG_FACT 0.1054 // = exp(-(Density * Coord)^2) - { - "ARB_fog_exp2 test", - "!!ARBfp1.0\n" - "OPTION ARB_fog_exp2; \n" - "MOV result.color, fragment.color; \n" - "END \n", - { FragColor[0] * FOG_FACT + FogColor[0] * (1.0 - FOG_FACT), - FragColor[1] * FOG_FACT + FogColor[1] * (1.0 - FOG_FACT), - FragColor[2] * FOG_FACT + FogColor[2] * (1.0 - FOG_FACT), - FragColor[3] - }, - DONT_CARE_Z - }, -#undef FOG_FACT -#define FOG_FACT 0.2102 // = ex2(-(Density * Coord)^2) - { - // NOTE: we could also do this with the POW instruction - "Computed fog exp2 test", - "!!ARBfp1.0\n" - "# fogParams.x = density \n" - "# fogParams.y = start \n" - "# fogParams.z = end \n" - "# fogParams.w = 1/(end-start) \n" - "PARAM fogParams = state.fog.params; \n" - "ATTRIB fogCoord = fragment.fogcoord; \n" - "PARAM fogColor = state.fog.color; \n" - "TEMP f, dc; \n" - "# f = exp(-(density * coord)^2) \n" - "MUL dc.x, fogParams.x, fogCoord.x; \n" - "MUL dc.x, dc.x, dc.x; \n" - "EX2_SAT f, -dc.x; \n" - "LRP result.color.rgb, f, fragment.color, fogColor; \n" - "MOV result.color.a, fragment.color.a; \n" - "END \n", - { FragColor[0] * FOG_FACT + FogColor[0] * (1.0 - FOG_FACT), - FragColor[1] * FOG_FACT + FogColor[1] * (1.0 - FOG_FACT), - FragColor[2] * FOG_FACT + FogColor[2] * (1.0 - FOG_FACT), - FragColor[3] - }, - DONT_CARE_Z - }, -#undef FOG_FACT - - // XXX add lots more tests here! - { NULL, NULL, {0,0,0,0}, 0 } // end of list sentinal -}; - - - -void -FragmentProgramTest::setup(void) -{ - // setup Infinity, Nan values - int nan; - float *nanPtr; - - nan = (0xff << 23) | (1 << 0); - nanPtr = (float *) &nan; - InfNan[0] = HUGE_VAL; - InfNan[1] = -HUGE_VAL; - InfNan[2] = (float) (*nanPtr); - InfNan[3] = 1.0 / HUGE_VAL; - - // get function pointers - - GLuint progID; - glGenProgramsARB(1, &progID); - glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, progID); - glEnable(GL_FRAGMENT_PROGRAM_ARB); - - // load program inputs - glColor4fv(FragColor); - glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, 0, Param0); - glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, 1, Param1); - glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, 2, Param2); - glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, 9, InfNan); - - GLenum err = glGetError(); - assert(!err); // should be OK - - // setup vertex transform (we'll draw a quad in middle of window) - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); -#if DEVEL_MODE - glOrtho(-1.0, 1.0, -1.0, 1.0, 0.0, 1.0); -#else - glOrtho(-4.0, 4.0, -4.0, 4.0, 0.0, 1.0); -#endif - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glDrawBuffer(GL_FRONT); - glReadBuffer(GL_FRONT); - - // other GL state - glFogf(GL_FOG_START, FogStart); - glFogf(GL_FOG_END, FogEnd); - glFogf(GL_FOG_DENSITY, FogDensity); - glFogfv(GL_FOG_COLOR, FogColor); - glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT); - glFogCoordf(FogCoord); - - // compute error tolerances (may need fine-tuning) - int bufferBits[5]; - glGetIntegerv(GL_RED_BITS, &bufferBits[0]); - glGetIntegerv(GL_GREEN_BITS, &bufferBits[1]); - glGetIntegerv(GL_BLUE_BITS, &bufferBits[2]); - glGetIntegerv(GL_ALPHA_BITS, &bufferBits[3]); - glGetIntegerv(GL_DEPTH_BITS, &bufferBits[4]); - - tolerance[0] = 2.0 / (1 << bufferBits[0]); - tolerance[1] = 2.0 / (1 << bufferBits[1]); - tolerance[2] = 2.0 / (1 << bufferBits[2]); - if (bufferBits[3]) - tolerance[3] = 2.0 / (1 << bufferBits[3]); - else - tolerance[3] = 1.0; - if (bufferBits[4]) - tolerance[4] = 16.0 / (1 << bufferBits[4]); - else - tolerance[4] = 1.0; -} - - -void -FragmentProgramTest::reportFailure(const char *programName, - const GLfloat expectedColor[4], - const GLfloat actualColor[4] ) const -{ - env->log << "FAILURE:\n"; - env->log << " Program: " << programName << "\n"; - env->log << " Expected color: "; - env->log << expectedColor[0] << ", "; - env->log << expectedColor[1] << ", "; - env->log << expectedColor[2] << ", "; - env->log << expectedColor[3] << "\n"; - env->log << " Observed color: "; - env->log << actualColor[0] << ", "; - env->log << actualColor[1] << ", "; - env->log << actualColor[2] << ", "; - env->log << actualColor[3] << "\n"; -} - - -void -FragmentProgramTest::reportZFailure(const char *programName, - GLfloat expectedZ, GLfloat actualZ) const -{ - env->log << "FAILURE:\n"; - env->log << " Program: " << programName << "\n"; - env->log << " Expected Z: " << expectedZ << "\n"; - env->log << " Observed Z: " << actualZ << "\n"; -} - - -// Compare actual and expected colors -bool -FragmentProgramTest::equalColors(const GLfloat act[4], const GLfloat exp[4]) const -{ - if (fabsf(act[0] - exp[0]) > tolerance[0] && exp[0] != DONT_CARE_COLOR) - return false; - if (fabsf(act[1] - exp[1]) > tolerance[1] && exp[1] != DONT_CARE_COLOR) - return false; - if (fabsf(act[2] - exp[2]) > tolerance[2] && exp[2] != DONT_CARE_COLOR) - return false; - if (fabsf(act[3] - exp[3]) > tolerance[3] && exp[3] != DONT_CARE_COLOR) - return false; - return true; -} - - -bool -FragmentProgramTest::equalDepth(GLfloat z0, GLfloat z1) const -{ - if (fabsf(z0 - z1) > tolerance[4]) - return false; - else - return true; -} - - -bool -FragmentProgramTest::testProgram(const FragmentProgram &p) -{ - glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, - GL_PROGRAM_FORMAT_ASCII_ARB, - strlen(p.progString), - (const GLubyte *) p.progString); - - GLenum err = glGetError(); - if (err) { - env->log << "OpenGL error " << (int) err << "\n"; - env->log << "Invalid Fragment Program:\n"; - env->log << p.progString; - env->log << glGetString(GL_PROGRAM_ERROR_STRING_ARB) << "\n"; - return false; - } - - // to avoid potential issue with undefined result.depth.z - if (p.expectedZ == DONT_CARE_Z) - glDisable(GL_DEPTH_TEST); - else - glEnable(GL_DEPTH_TEST); - -#if !DEVEL_MODE - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); -#endif - glBegin(GL_POLYGON); - glVertex2f(-1, -1); - glVertex2f( 1, -1); - glVertex2f( 1, 1); - glVertex2f(-1, 1); - glEnd(); - -#if !DEVEL_MODE - GLfloat pixel[4]; - glReadPixels(windowWidth / 2, windowHeight / 2, 1, 1, - GL_RGBA, GL_FLOAT, pixel); - - if (0) // debug - printf("%s: Expect: %.3f %.3f %.3f %.3f found: %.3f %.3f %.3f %.3f\n", - p.name, - p.expectedColor[0], p.expectedColor[1], - p.expectedColor[2], p.expectedColor[3], - pixel[0], pixel[1], pixel[2], pixel[3]); - - if (!equalColors(pixel, p.expectedColor)) { - reportFailure(p.name, p.expectedColor, pixel); - return false; - } - - if (p.expectedZ != DONT_CARE_Z) { - GLfloat z; - glReadPixels(windowWidth / 2, windowHeight / 2, 1, 1, - GL_DEPTH_COMPONENT, GL_FLOAT, &z); - if (!equalDepth(z, p.expectedZ)) { - reportZFailure(p.name, p.expectedZ, z); - return false; - } - } -#endif - return true; -} - -void -FragmentProgramTest::runOne(MultiTestResult &r, Window &w) -{ - // to test a single sub-test, set the name here: - const char *single = getenv("PIGLIT_TEST"); - - (void) w; - setup(); - -#if DEVEL_MODE - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); -#endif - for (int i = 0; Programs[i].name; i++) { - - if (!single || strcmp(single, Programs[i].name) == 0) { - -#if DEVEL_MODE - glViewport(0, i * 20, windowWidth, 20); -#endif - if (!testProgram(Programs[i])) { - r.numFailed++; - } - else { - r.numPassed++; - } - } - } - -#if DEVEL_MODE - glFinish(); - sleep(100); -#endif - r.pass = (r.numFailed == 0); -} - - -// The test object itself: -FragmentProgramTest fragmentProgramTest("fragProg1", "window, rgb, z", - "GL_ARB_fragment_program", - "Fragment Program test 1: test a specific set of fragment programs.\n"); - - - -} // namespace GLEAN diff --git a/tests/glean/tfragprog1.h b/tests/glean/tfragprog1.h deleted file mode 100644 index 2e795eb9a..000000000 --- a/tests/glean/tfragprog1.h +++ /dev/null @@ -1,92 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 1999 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 - -// tfragprog.h: Test GL_ARB_fragment_program extension. -// Brian Paul 22 October 2005 - -#ifndef __tfragprog_h__ -#define __tfragprog_h__ - -// If DEVEL_MODE==1 we generate a tall window of color swatches, one per -// fragment program, which can be eyeballed against a reference image. -// Use this if glReadPixels functionality is not working yet. -#undef windowWidth -#undef windowHeight -#define DEVEL_MODE 0 -#if DEVEL_MODE -#define windowWidth 200 -#define windowHeight 850 -#else -#define windowWidth 100 -#define windowHeight 100 -#endif - - -#include "tmultitest.h" - -namespace GLEAN { - - -class FragmentProgram -{ -public: - const char *name; - const char *progString; - GLfloat expectedColor[4]; - GLfloat expectedZ; -}; - - -class FragmentProgramTest: public MultiTest -{ -public: - FragmentProgramTest(const char* testName, const char* filter, - const char *extensions, const char* description): - MultiTest(testName, filter, extensions, description), - tolerance() - { - } - - virtual void runOne(MultiTestResult &r, Window &w); - -private: - GLfloat tolerance[5]; - void setup(void); - bool equalColors(const GLfloat a[4], const GLfloat b[4]) const; - bool equalDepth(GLfloat z0, GLfloat z1) const; - bool testProgram(const FragmentProgram &p); - void reportFailure(const char *programName, - const GLfloat expectedColor[4], - const GLfloat actualColor[4] ) const; - void reportZFailure(const char *programName, - GLfloat expectedZ, GLfloat actualZ) const; -}; - -} // namespace GLEAN - -#endif // __tfragprog_h__ diff --git a/tests/glean/tpixelformats.cpp b/tests/glean/tpixelformats.cpp deleted file mode 100644 index d9818dc46..000000000 --- a/tests/glean/tpixelformats.cpp +++ /dev/null @@ -1,1675 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 1999 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 - - -#include <stdlib.h> -#include <cassert> -#include <cmath> -#include "tpixelformats.h" -#include "../util/rgb9e5.h" -#include "piglit-util-gl.h" - - -// Set to 1 to help debug test failures: -// Also, when a test failure is found, rearrange the order of the -// formats, types, internformats below so the failure case comes first. -#define DEBUG 0 - - -// just for extra debugging -// Maybe add fragment program path as a 3rd envMode (below) someday. -#define USE_FRAG_PROG 0 - -#define abort() do { printf("%s:%i\n", __FUNCTION__, __LINE__); abort(); } while (0) - -namespace GLEAN { - - -struct NameTokenComps { - const char *Name; - GLenum Token; - GLuint Components; -}; - - -static const NameTokenComps Types[] = -{ - { "GL_UNSIGNED_BYTE", GL_UNSIGNED_BYTE, 0 }, - { "GL_BYTE", GL_BYTE, 0 }, - { "GL_UNSIGNED_INT", GL_UNSIGNED_INT, 0 }, - { "GL_SHORT", GL_SHORT, 0 }, - { "GL_UNSIGNED_SHORT", GL_UNSIGNED_SHORT, 0 }, - { "GL_INT", GL_INT, 0 }, - { "GL_FLOAT", GL_FLOAT, 0 }, - { "GL_HALF_FLOAT_ARB", GL_HALF_FLOAT_ARB, 0 }, - - { "GL_UNSIGNED_INT_8_8_8_8", GL_UNSIGNED_INT_8_8_8_8, 4 }, - { "GL_UNSIGNED_INT_8_8_8_8_REV", GL_UNSIGNED_INT_8_8_8_8_REV, 4 }, - { "GL_UNSIGNED_INT_10_10_10_2", GL_UNSIGNED_INT_10_10_10_2, 4 }, - { "GL_UNSIGNED_INT_2_10_10_10_REV", GL_UNSIGNED_INT_2_10_10_10_REV, 4 }, - { "GL_UNSIGNED_SHORT_5_5_5_1", GL_UNSIGNED_SHORT_5_5_5_1, 4 }, - { "GL_UNSIGNED_SHORT_1_5_5_5_REV", GL_UNSIGNED_SHORT_1_5_5_5_REV, 4 }, - { "GL_UNSIGNED_SHORT_4_4_4_4", GL_UNSIGNED_SHORT_4_4_4_4, 4 }, - { "GL_UNSIGNED_SHORT_4_4_4_4_REV", GL_UNSIGNED_SHORT_4_4_4_4_REV, 4 }, - { "GL_UNSIGNED_SHORT_5_6_5", GL_UNSIGNED_SHORT_5_6_5, 3 }, - { "GL_UNSIGNED_SHORT_5_6_5_REV", GL_UNSIGNED_SHORT_5_6_5_REV, 3 }, - { "GL_UNSIGNED_BYTE_3_3_2", GL_UNSIGNED_BYTE_3_3_2, 3 }, - { "GL_UNSIGNED_BYTE_2_3_3_REV", GL_UNSIGNED_BYTE_2_3_3_REV, 3 }, - - { "GL_UNSIGNED_INT_5_9_9_9_REV", GL_UNSIGNED_INT_5_9_9_9_REV, 3 } -}; - -#define NUM_TYPES (sizeof(Types) / sizeof(Types[0])) - - -static const NameTokenComps Formats[] = -{ - { "GL_RGBA", GL_RGBA, 4 }, - { "GL_BGRA", GL_BGRA, 4 }, - { "GL_RGB", GL_RGB, 3 }, - { "GL_BGR", GL_BGR, 3 }, - { "GL_RED", GL_RED, 1 }, - { "GL_GREEN", GL_GREEN, 1 }, - { "GL_BLUE", GL_BLUE, 1 }, - { "GL_ALPHA", GL_ALPHA, 1 }, - { "GL_LUMINANCE", GL_LUMINANCE, 1 }, - { "GL_LUMINANCE_ALPHA", GL_LUMINANCE_ALPHA, 2 }, - { "GL_ABGR_EXT", GL_ABGR_EXT, 4 }, - { "GL_RG", GL_RG, 2 } -}; - -#define NUM_FORMATS (sizeof(Formats) / sizeof(Formats[0])) - - -static const NameTokenComps InternalFormats[] = -{ - { "glDrawPixels", 0, 4 }, // special case for glDrawPixels - - { "4", 4, 4 }, - { "GL_RGBA", GL_RGBA, 4 }, - { "GL_RGBA2", GL_RGBA2, 4 }, - { "GL_RGBA4", GL_RGBA4, 4 }, - { "GL_RGB5_A1", GL_RGB5_A1, 4 }, - { "GL_RGBA8", GL_RGBA8, 4 }, - { "GL_RGB10_A2", GL_RGB10_A2, 4 }, - { "GL_RGBA12", GL_RGBA12, 4 }, - { "GL_RGBA16", GL_RGBA16, 4 }, - { "GL_SRGB_ALPHA_EXT", GL_SRGB_ALPHA_EXT, 4 }, - { "GL_SRGB8_ALPHA8_EXT", GL_SRGB8_ALPHA8_EXT, 4 }, - - { "3", 3, 3 }, - { "GL_RGB", GL_RGB, 3 }, - { "GL_R3_G3_B2", GL_R3_G3_B2, 3 }, - { "GL_RGB4", GL_RGB4, 3 }, - { "GL_RGB5", GL_RGB5, 3 }, - { "GL_RGB8", GL_RGB8, 3 }, - { "GL_RGB10", GL_RGB10, 3 }, - { "GL_RGB12", GL_RGB12, 3 }, - { "GL_RGB16", GL_RGB16, 3 }, - { "GL_SRGB_EXT", GL_SRGB_EXT, 3 }, - { "GL_SRGB8_EXT", GL_SRGB8_EXT, 3 }, - - { "2", 2, 2 }, - { "GL_LUMINANCE_ALPHA", GL_LUMINANCE_ALPHA, 2 }, - { "GL_LUMINANCE4_ALPHA4", GL_LUMINANCE4_ALPHA4, 1 }, - { "GL_LUMINANCE6_ALPHA2", GL_LUMINANCE6_ALPHA2, 1 }, - { "GL_LUMINANCE8_ALPHA8", GL_LUMINANCE8_ALPHA8, 1 }, - { "GL_LUMINANCE12_ALPHA4", GL_LUMINANCE12_ALPHA4, 1 }, - { "GL_LUMINANCE12_ALPHA12", GL_LUMINANCE12_ALPHA12, 1 }, - { "GL_LUMINANCE16_ALPHA16", GL_LUMINANCE16_ALPHA16, 1 }, - { "GL_SLUMINANCE_ALPHA_EXT", GL_SLUMINANCE_ALPHA_EXT, 3 }, - { "GL_SLUMINANCE8_ALPHA8_EXT", GL_SLUMINANCE8_ALPHA8_EXT, 3 }, - - { "1", 1, 1 }, - { "GL_LUMINANCE", GL_LUMINANCE, 1 }, - { "GL_LUMINANCE4", GL_LUMINANCE4, 1 }, - { "GL_LUMINANCE8", GL_LUMINANCE8, 1 }, - { "GL_LUMINANCE12", GL_LUMINANCE12, 1 }, - { "GL_LUMINANCE16", GL_LUMINANCE16, 1 }, - { "GL_SLUMINANCE_EXT", GL_SLUMINANCE_EXT, 3 }, - { "GL_SLUMINANCE8_EXT", GL_SLUMINANCE8_EXT, 3 }, - - { "GL_ALPHA", GL_ALPHA, 1 }, - { "GL_ALPHA4", GL_ALPHA4, 1 }, - { "GL_ALPHA8", GL_ALPHA8, 1 }, - { "GL_ALPHA12", GL_ALPHA12, 1 }, - { "GL_ALPHA16", GL_ALPHA16, 1 }, - - { "GL_INTENSITY", GL_INTENSITY, 1 }, - { "GL_INTENSITY4", GL_INTENSITY4, 1 }, - { "GL_INTENSITY8", GL_INTENSITY8, 1 }, - { "GL_INTENSITY12", GL_INTENSITY12, 1 }, - { "GL_INTENSITY16", GL_INTENSITY16, 1 }, - - { "GL_RED", GL_RED, 1 }, - { "GL_RG", GL_RG, 2 }, - { "GL_R8", GL_R8, 1 }, - { "GL_RG8", GL_RG8, 2 }, - { "GL_R16", GL_R16, 1}, - { "GL_RG16", GL_RG16, 2 }, - { "GL_R16F", GL_R16F, 1 }, - { "GL_RG16F", GL_RG16F, 2 }, - { "GL_R32F", GL_R32F, 1}, - { "GL_RG32F", GL_RG32F, 2 }, - - { "GL_RED_SNORM", GL_RED_SNORM, 1 }, - { "GL_RG_SNORM", GL_RG_SNORM, 2 }, - { "GL_RGB_SNORM", GL_RGB_SNORM, 3 }, - { "GL_RGBA_SNORM", GL_RGBA_SNORM, 4 }, - { "GL_ALPHA_SNORM", GL_ALPHA_SNORM, 1 }, - { "GL_LUMINANCE_SNORM", GL_LUMINANCE_SNORM, 1 }, - { "GL_LUMINANCE_ALPHA_SNORM", GL_LUMINANCE_ALPHA_SNORM, 2 }, - { "GL_INTENSITY_SNORM", GL_INTENSITY_SNORM, 1 }, - - { "GL_R8_SNORM", GL_R8_SNORM, 1 }, - { "GL_RG8_SNORM", GL_RG8_SNORM, 2 }, - { "GL_RGB8_SNORM", GL_RGB8_SNORM, 3 }, - { "GL_RGBA8_SNORM", GL_RGBA8_SNORM, 4 }, - { "GL_ALPHA8_SNORM", GL_ALPHA8_SNORM, 1 }, - { "GL_LUMINANCE8_SNORM", GL_LUMINANCE8_SNORM, 1 }, - { "GL_LUMINANCE8_ALPHA8_SNORM", GL_LUMINANCE8_ALPHA8_SNORM, 2 }, - { "GL_INTENSITY8_SNORM", GL_INTENSITY8_SNORM, 1 }, - - { "GL_R16_SNORM", GL_R16_SNORM, 1 }, - { "GL_RG16_SNORM", GL_RG16_SNORM, 2 }, - { "GL_RGB16_SNORM", GL_RGB16_SNORM, 3 }, - { "GL_RGBA16_SNORM", GL_RGBA16_SNORM, 4 }, - { "GL_ALPHA16_SNORM", GL_ALPHA16_SNORM, 1 }, - { "GL_LUMINANCE16_SNORM", GL_LUMINANCE16_SNORM, 1 }, - { "GL_LUMINANCE16_ALPHA16_SNORM", GL_LUMINANCE16_ALPHA16_SNORM, 2 }, - { "GL_INTENSITY16_SNORM", GL_INTENSITY16_SNORM, 1 }, - - { "GL_RGB9_E5", GL_RGB9_E5, 3 } - - // XXX maybe add compressed formats too... -}; - -#define NUM_INT_FORMATS (sizeof(InternalFormats) / sizeof(InternalFormats[0])) - - -static const char *EnvModes[] = { - "GL_REPLACE", - "GL_COMBINE_ARB" -}; - - -// Return four bitmasks indicating which bits correspond to the -// 1st, 2nd, 3rd and 4th components in a packed datatype. -// Set all masks to zero for non-packed types. -static void -ComponentMasks(GLenum datatype, GLuint masks[4]) -{ - switch (datatype) { - case GL_UNSIGNED_BYTE: - case GL_BYTE: - case GL_UNSIGNED_SHORT: - case GL_SHORT: - case GL_UNSIGNED_INT: - case GL_INT: - case GL_FLOAT: - case GL_HALF_FLOAT_ARB: - case GL_UNSIGNED_INT_5_9_9_9_REV: /* special case, handled separately */ - masks[0] = - masks[1] = - masks[2] = - masks[3] = 0x0; - break; - case GL_UNSIGNED_INT_8_8_8_8: - masks[0] = 0xff000000; - masks[1] = 0x00ff0000; - masks[2] = 0x0000ff00; - masks[3] = 0x000000ff; - break; - case GL_UNSIGNED_INT_8_8_8_8_REV: - masks[0] = 0x000000ff; - masks[1] = 0x0000ff00; - masks[2] = 0x00ff0000; - masks[3] = 0xff000000; - break; - case GL_UNSIGNED_INT_10_10_10_2: - masks[0] = 0xffc00000; - masks[1] = 0x003ff000; - masks[2] = 0x00000ffc; - masks[3] = 0x00000003; - break; - case GL_UNSIGNED_INT_2_10_10_10_REV: - masks[0] = 0x000003ff; - masks[1] = 0x000ffc00; - masks[2] = 0x3ff00000; - masks[3] = 0xc0000000; - break; - case GL_UNSIGNED_SHORT_5_5_5_1: - masks[0] = 0xf800; - masks[1] = 0x07c0; - masks[2] = 0x003e; - masks[3] = 0x0001; - break; - case GL_UNSIGNED_SHORT_1_5_5_5_REV: - masks[0] = 0x001f; - masks[1] = 0x03e0; - masks[2] = 0x7c00; - masks[3] = 0x8000; - break; - case GL_UNSIGNED_SHORT_4_4_4_4: - masks[0] = 0xf000; - masks[1] = 0x0f00; - masks[2] = 0x00f0; - masks[3] = 0x000f; - break; - case GL_UNSIGNED_SHORT_4_4_4_4_REV: - masks[0] = 0x000f; - masks[1] = 0x00f0; - masks[2] = 0x0f00; - masks[3] = 0xf000; - break; - case GL_UNSIGNED_SHORT_5_6_5: - masks[0] = 0xf800; - masks[1] = 0x07e0; - masks[2] = 0x001f; - masks[3] = 0; - break; - case GL_UNSIGNED_SHORT_5_6_5_REV: - masks[0] = 0x001f; - masks[1] = 0x07e0; - masks[2] = 0xf800; - masks[3] = 0; - break; - case GL_UNSIGNED_BYTE_3_3_2: - masks[0] = 0xe0; - masks[1] = 0x1c; - masks[2] = 0x03; - masks[3] = 0; - break; - case GL_UNSIGNED_BYTE_2_3_3_REV: - masks[0] = 0x07; - masks[1] = 0x38; - masks[2] = 0xc0; - masks[3] = 0; - break; - default: - abort(); - } -} - - -// Return four values indicating the ordering of the Red, Green, Blue and -// Alpha components for the given image format. -// For example: GL_BGRA = {2, 1, 0, 3}. -static void -ComponentPositions(GLenum format, GLint pos[4]) -{ - switch (format) { - case GL_RGBA: - pos[0] = 0; - pos[1] = 1; - pos[2] = 2; - pos[3] = 3; - break; - case GL_BGRA: - pos[0] = 2; - pos[1] = 1; - pos[2] = 0; - pos[3] = 3; - break; - case GL_RGB: - pos[0] = 0; - pos[1] = 1; - pos[2] = 2; - pos[3] = -1; - break; - case GL_BGR: - pos[0] = 2; - pos[1] = 1; - pos[2] = 0; - pos[3] = -1; - break; - case GL_LUMINANCE: - pos[0] = 0; - pos[1] = -1; - pos[2] = -1; - pos[3] = -1; - break; - case GL_LUMINANCE_ALPHA: - pos[0] = 0; - pos[1] = -1; - pos[2] = -1; - pos[3] = 1; - break; - case GL_RED: - pos[0] = 0; - pos[1] = -1; - pos[2] = -1; - pos[3] = -1; - break; - case GL_GREEN: - pos[0] = -1; - pos[1] = 0; - pos[2] = -1; - pos[3] = -1; - break; - case GL_BLUE: - pos[0] = -1; - pos[1] = -1; - pos[2] = 0; - pos[3] = -1; - break; - case GL_ALPHA: - pos[0] = -1; - pos[1] = -1; - pos[2] = -1; - pos[3] = 0; - break; - case GL_ABGR_EXT: - pos[0] = 3; - pos[1] = 2; - pos[2] = 1; - pos[3] = 0; - break; - case GL_RG: - pos[0] = 0; - pos[1] = 1; - pos[2] = -1; - pos[3] = -1; - break; - default: - abort(); - } -} - - -// Given a texture internal format, return the corresponding base format. -static GLenum -BaseTextureFormat(GLint intFormat) -{ - switch (intFormat) { - case 0: - return 0; // for glDrawPixels - case GL_ALPHA: - case GL_ALPHA4: - case GL_ALPHA8: - case GL_ALPHA12: - case GL_ALPHA16: - case GL_ALPHA_SNORM: - case GL_ALPHA8_SNORM: - case GL_ALPHA16_SNORM: - return GL_ALPHA; - case 1: - case GL_LUMINANCE: - case GL_LUMINANCE4: - case GL_LUMINANCE8: - case GL_LUMINANCE12: - case GL_LUMINANCE16: - case GL_LUMINANCE_SNORM: - case GL_LUMINANCE8_SNORM: - case GL_LUMINANCE16_SNORM: - return GL_LUMINANCE; - case 2: - case GL_LUMINANCE_ALPHA: - case GL_LUMINANCE4_ALPHA4: - case GL_LUMINANCE6_ALPHA2: - case GL_LUMINANCE8_ALPHA8: - case GL_LUMINANCE12_ALPHA4: - case GL_LUMINANCE12_ALPHA12: - case GL_LUMINANCE16_ALPHA16: - case GL_LUMINANCE_ALPHA_SNORM: - case GL_LUMINANCE8_ALPHA8_SNORM: - case GL_LUMINANCE16_ALPHA16_SNORM: - return GL_LUMINANCE_ALPHA; - case GL_INTENSITY: - case GL_INTENSITY4: - case GL_INTENSITY8: - case GL_INTENSITY12: - case GL_INTENSITY16: - case GL_INTENSITY_SNORM: - case GL_INTENSITY8_SNORM: - case GL_INTENSITY16_SNORM: - return GL_INTENSITY; - - case GL_RED: - case GL_R8: - case GL_R16: - case GL_R16F: - case GL_R32F: - case GL_RED_SNORM: - case GL_R8_SNORM: - case GL_R16_SNORM: - return GL_RED; - - case GL_RG: - case GL_RG8: - case GL_RG16: - case GL_RG16F: - case GL_RG32F: - case GL_RG_SNORM: - case GL_RG8_SNORM: - case GL_RG16_SNORM: - return GL_RG; - - case 3: - case GL_RGB: - case GL_R3_G3_B2: - case GL_RGB4: - case GL_RGB5: - case GL_RGB8: - case GL_RGB10: - case GL_RGB12: - case GL_RGB16: - case GL_RGB_SNORM: - case GL_RGB8_SNORM: - case GL_RGB16_SNORM: - case GL_RGB9_E5: - return GL_RGB; - case 4: - case GL_RGBA: - case GL_RGBA2: - case GL_RGBA4: - case GL_RGB5_A1: - case GL_RGBA8: - case GL_RGB10_A2: - case GL_RGBA12: - case GL_RGBA16: - case GL_RGBA_SNORM: - case GL_RGBA8_SNORM: - case GL_RGBA16_SNORM: - return GL_RGBA; - - case GL_SRGB_EXT: - case GL_SRGB8_EXT: - case GL_COMPRESSED_SRGB_EXT: - case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: - return GL_RGB; - case GL_SRGB_ALPHA_EXT: - case GL_SRGB8_ALPHA8_EXT: - case GL_COMPRESSED_SRGB_ALPHA_EXT: - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: - case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: - return GL_RGBA; - case GL_SLUMINANCE_ALPHA_EXT: - case GL_SLUMINANCE8_ALPHA8_EXT: - case GL_COMPRESSED_SLUMINANCE_EXT: - case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: - return GL_LUMINANCE_ALPHA; - case GL_SLUMINANCE_EXT: - case GL_SLUMINANCE8_EXT: - return GL_LUMINANCE; - default: - abort(); - } -} - - - - -// Return number components in the given datatype. This is 3 or 4 for -// packed types and zero for non-packed types -// Ex: GL_UNSIGNED_SHORT_5_5_5_1 = 4 -// Ex: GL_INT = 0 -static int -NumberOfComponentsInPackedType(GLenum datatype) -{ - for (unsigned i = 0; i < NUM_TYPES; i++) { - if (Types[i].Token == datatype) - return Types[i].Components; - } - abort(); -} - - -static int -IsPackedType(GLenum datatype) -{ - return NumberOfComponentsInPackedType(datatype) > 0; -} - - -// Return number components in the given image format. -// Ex: GL_BGR = 3 -static int -NumberOfComponentsInFormat(GLenum format) -{ - for (unsigned i = 0; i < NUM_FORMATS; i++) { - if (Formats[i].Token == format) - return Formats[i].Components; - } - abort(); -} - - -// Return size, in bytes, of given datatype. -static int -SizeofType(GLenum datatype) -{ - switch (datatype) { - case GL_UNSIGNED_INT_10_10_10_2: - case GL_UNSIGNED_INT_2_10_10_10_REV: - case GL_UNSIGNED_INT_8_8_8_8: - case GL_UNSIGNED_INT_8_8_8_8_REV: - case GL_UNSIGNED_INT_5_9_9_9_REV: - case GL_UNSIGNED_INT: - case GL_INT: - case GL_FLOAT: - return 4; - case GL_UNSIGNED_SHORT_5_5_5_1: - case GL_UNSIGNED_SHORT_1_5_5_5_REV: - case GL_UNSIGNED_SHORT_4_4_4_4: - case GL_UNSIGNED_SHORT_4_4_4_4_REV: - case GL_UNSIGNED_SHORT_5_6_5: - case GL_UNSIGNED_SHORT_5_6_5_REV: - case GL_UNSIGNED_SHORT: - case GL_SHORT: - case GL_HALF_FLOAT_ARB: - return 2; - case GL_UNSIGNED_BYTE_3_3_2: - case GL_UNSIGNED_BYTE_2_3_3_REV: - case GL_UNSIGNED_BYTE: - case GL_BYTE: - return 1; - default: - abort(); - } -} - - -// Check if the given image format and datatype are compatible. -// Also check for types/formats defined by GL extensions here. -bool -PixelFormatsTest::CompatibleFormatAndType(GLenum format, GLenum datatype) const -{ - // Special case: GL_BGR can't be used with packed types! - // This has to do with putting the most color bits in red and green, - // not blue. - if (format == GL_BGR && IsPackedType(datatype)) - return false; - - if (datatype == GL_HALF_FLOAT_ARB && !haveHalfFloat) - return false; - - if (format == GL_ABGR_EXT && !haveABGR) - return false; - - // Special case: GL_ABGR_EXT can't be used with packed types - // because the packed formats specs (which were all written after the - // GL_EXT_abgr) explicitly say that the packed formats can only be used - // with GL_RGB, GL_BGR, GL_RGBA, or GL_BGRA and do not mention - // GL_ABGR_EXT. - if (format == GL_ABGR_EXT && IsPackedType(datatype)) - return false; - - if (format == GL_RG && !haveRG) - return false; - - if (datatype == GL_UNSIGNED_INT_5_9_9_9_REV && !haveTexSharedExp) - return false; - - const int formatComps = NumberOfComponentsInFormat(format); - const int typeComps = NumberOfComponentsInPackedType(datatype); - return formatComps == typeComps || typeComps == 0; -} - - -bool -PixelFormatsTest::SupportedIntFormat(GLint intFormat) const -{ - switch (intFormat) { - case GL_SRGB_ALPHA_EXT: - case GL_SRGB8_ALPHA8_EXT: - case GL_SRGB_EXT: - case GL_SRGB8_EXT: - case GL_SLUMINANCE_ALPHA_EXT: - case GL_SLUMINANCE8_ALPHA8_EXT: - case GL_SLUMINANCE_EXT: - case GL_SLUMINANCE8_EXT: - return haveSRGB; - case GL_RED: - case GL_RG: - case GL_R8: - case GL_RG8: - case GL_R16: - case GL_RG16: - return haveRG; - case GL_R16F: - case GL_RG16F: - case GL_R32F: - case GL_RG32F: - return haveRG && haveFloat; - case GL_RED_SNORM: - case GL_R8_SNORM: - case GL_R16_SNORM: - case GL_RG_SNORM: - case GL_RG8_SNORM: - case GL_RG16_SNORM: - case GL_RGB_SNORM: - case GL_RGB8_SNORM: - case GL_RGB16_SNORM: - case GL_RGBA_SNORM: - case GL_RGBA8_SNORM: - case GL_RGBA16_SNORM: - case GL_ALPHA_SNORM: - case GL_ALPHA8_SNORM: - case GL_ALPHA16_SNORM: - case GL_LUMINANCE_SNORM: - case GL_LUMINANCE8_SNORM: - case GL_LUMINANCE16_SNORM: - case GL_LUMINANCE_ALPHA_SNORM: - case GL_LUMINANCE8_ALPHA8_SNORM: - case GL_LUMINANCE16_ALPHA16_SNORM: - case GL_INTENSITY_SNORM: - case GL_INTENSITY8_SNORM: - case GL_INTENSITY16_SNORM: - return haveSnorm; - case GL_RGB9_E5: - return haveTexSharedExp; - default: - - return true; - } -} - - -// Determine if the ith pixel is in the upper-right quadrant of the -// rectangle of size 'width' x 'height'. -static bool -IsUpperRight(int i, int width, int height) -{ - const int y = i / width, x = i % width; - return (x >= width / 2 && y >= height / 2); -} - - - -// Create an image buffer and fill it so that a single image channel is -// the max value (1.0) while the other channels are zero. For example, -// if fillComponent==2 and we're filling a four-component image, the -// pixels will be (0, 0, max, 0). -// -// We always leave the upper-right quadrant black/zero. This is to help -// detect any image conversion issues related to stride, packing, etc. -static GLubyte * -MakeImage(int width, int height, GLenum format, GLenum type, - int fillComponent) -{ - assert(fillComponent < 4); - - if (type == GL_UNSIGNED_INT_5_9_9_9_REV) { - GLubyte *image = new GLubyte [width * height * 4]; - int i; - - assert(format == GL_RGB); - - GLuint *ui = (GLuint *) image; - for (i = 0; i < width * height; i++) { - float p[3] = {0, 0, 0}; - - if (!IsUpperRight(i, width, height)) - p[fillComponent] = 1; - - ui[i] = float3_to_rgb9e5(p); - } - - return image; - } - else if (IsPackedType(type)) { - const int bpp = SizeofType(type); - GLubyte *image = new GLubyte [width * height * bpp]; - GLuint masks[4]; - int pos[4]; - int i; - - ComponentMasks(type, masks); - ComponentPositions(format, pos); - - const GLuint value = masks[fillComponent]; - - switch (bpp) { - case 1: - for (i = 0; i < width * height; i++) { - if (IsUpperRight(i, width, height)) - image[i] = 0; - else - image[i] = (GLubyte) value; - } - break; - case 2: - { - GLushort *image16 = (GLushort *) image; - for (i = 0; i < width * height; i++) { - if (IsUpperRight(i, width, height)) - image16[i] = 0; - else - image16[i] = (GLushort) value; - } - } - break; - case 4: - { - GLuint *image32 = (GLuint *) image; - for (i = 0; i < width * height; i++) { - if (IsUpperRight(i, width, height)) - image32[i] = 0; - else - image32[i] = (GLuint) value; - } - } - break; - default: - abort(); - } - - return image; - } - else { - const int comps = NumberOfComponentsInFormat(format); - const int bpp = comps * SizeofType(type); - assert(bpp > 0); - GLubyte *image = new GLubyte [width * height * bpp]; - int i; - - switch (type) { - case GL_UNSIGNED_BYTE: - for (i = 0; i < width * height * comps; i++) { - if (i % comps == fillComponent && !IsUpperRight(i/comps, width, height)) - image[i] = 0xff; - else - image[i] = 0x0; - } - break; - case GL_BYTE: - { - GLbyte *b = (GLbyte *) image; - for (i = 0; i < width * height * comps; i++) { - if (i % comps == fillComponent && !IsUpperRight(i/comps, width, height)) - b[i] = 0x7f; - else - b[i] = 0x0; - } - } - break; - case GL_UNSIGNED_SHORT: - { - GLushort *us = (GLushort *) image; - for (i = 0; i < width * height * comps; i++) { - if (i % comps == fillComponent && !IsUpperRight(i/comps, width, height)) - us[i] = 0xffff; - else - us[i] = 0x0; - } - } - break; - case GL_SHORT: - { - GLshort *s = (GLshort *) image; - for (i = 0; i < width * height * comps; i++) { - if (i % comps == fillComponent && !IsUpperRight(i/comps, width, height)) - s[i] = 0x7fff; - else - s[i] = 0x0; - } - } - break; - case GL_UNSIGNED_INT: - { - GLuint *ui = (GLuint *) image; - for (i = 0; i < width * height * comps; i++) { - if (i % comps == fillComponent && !IsUpperRight(i/comps, width, height)) - ui[i] = 0xffffffff; - else - ui[i] = 0x0; - } - } - break; - case GL_INT: - { - GLint *in = (GLint *) image; - for (i = 0; i < width * height * comps; i++) { - if (i % comps == fillComponent && !IsUpperRight(i/comps, width, height)) - in[i] = 0x7fffffff; - else - in[i] = 0x0; - } - } - break; - case GL_FLOAT: - { - GLfloat *f = (GLfloat *) image; - for (i = 0; i < width * height * comps; i++) { - if (i % comps == fillComponent && !IsUpperRight(i/comps, width, height)) - f[i] = 1.0; - else - f[i] = 0.0; - } - } - break; - case GL_HALF_FLOAT_ARB: - { - GLhalfARB *f = (GLhalfARB *) image; - for (i = 0; i < width * height * comps; i++) { - if (i % comps == fillComponent && !IsUpperRight(i/comps, width, height)) - f[i] = 0x3c00; /* == 1.0 */ - else - f[i] = 0; - } - } - break; - default: - abort(); - } - return image; - } -} - - -bool -PixelFormatsTest::CheckError(const char *where) const -{ - GLint err = glGetError(); - if (err) { - char msg[1000]; - sprintf(msg, "GL Error: %s (0x%x) in %s\n", - piglit_get_gl_error_name(err), err, where); - env->log << msg; - return true; - } - return false; -} - - -// Draw the given image, either as a texture quad or glDrawPixels. -// Return true for success, false if GL error detected. -bool -PixelFormatsTest::DrawImage(int width, int height, - GLenum format, GLenum type, GLint intFormat, - const GLubyte *image) const -{ - if (intFormat) { - glEnable(GL_TEXTURE_2D); - glViewport(0, 0, width, height); - glTexImage2D(GL_TEXTURE_2D, 0, intFormat, width, height, 0, - format, type, image); - if (CheckError("glTexImage2D")) - return false; -#if USE_FRAG_PROG - glEnable(GL_FRAGMENT_PROGRAM_ARB); -#endif - glBegin(GL_POLYGON); - glTexCoord2f(0, 0); glVertex2f(-1, -1); - glTexCoord2f(1, 0); glVertex2f(1, -1); - glTexCoord2f(1, 1); glVertex2f(1, 1); - glTexCoord2f(0, 1); glVertex2f(-1, 1); - glEnd(); - glDisable(GL_TEXTURE_2D); -#if USE_FRAG_PROG - glDisable(GL_FRAGMENT_PROGRAM_ARB); -#endif - } - else { - // glDrawPixels - glDrawPixels(width, height, format, type, image); - if (CheckError("glDrawPixels")) - return false; - } - return true; -} - - -static bool -ColorsEqual(const GLubyte img[4], const GLubyte expected[4]) -{ - const int tolerance = 1; - if ((abs(img[0] - expected[0]) > tolerance) || - (abs(img[1] - expected[1]) > tolerance) || - (abs(img[2] - expected[2]) > tolerance) || - (abs(img[3] - expected[3]) > tolerance)) { - return false; - } - else { - return true; - } -} - - -// Compute the expected RGBA color we're expecting to find with glReadPixels -// if the texture was defined with the given image format and texture -// internal format. 'testChan' indicates which of the srcFormat's image -// channels was set (to 1.0) when the image was filled. -void -PixelFormatsTest::ComputeExpected(GLenum srcFormat, int testChan, - GLint intFormat, GLubyte exp[4]) const -{ - const GLenum baseIntFormat = BaseTextureFormat(intFormat); - - switch (srcFormat) { - - case GL_RGBA: - case GL_BGRA: - case GL_ABGR_EXT: - assert(testChan < 4); - switch (baseIntFormat) { - case 0: // == glReadPixels - // fallthrough - case GL_RGBA: - exp[0] = 0; - exp[1] = 0; - exp[2] = 0; - exp[3] = 0; - exp[testChan] = 255; - break; - case GL_RGB: - exp[0] = 0; - exp[1] = 0; - exp[2] = 0; - exp[testChan] = 255; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_RG: - exp[0] = 0; - exp[1] = 0; - exp[testChan] = 255; - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_RED: - exp[0] = testChan == 0 ? 255 : 0; - exp[1] = 0; - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_ALPHA: - exp[0] = 0; - exp[1] = 0; - exp[2] = 0; - exp[3] = testChan == 3 ? 255 : 0; - break; - case GL_LUMINANCE: - exp[0] = - exp[1] = - exp[2] = testChan == 0 ? 255 : 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_LUMINANCE_ALPHA: - exp[0] = - exp[1] = - exp[2] = testChan == 0 ? 255 : 0; - exp[3] = testChan == 3 ? 255 : 0; - break; - case GL_INTENSITY: - exp[0] = - exp[1] = - exp[2] = - exp[3] = testChan == 0 ? 255 : 0; - break; - default: - abort(); - } - break; - - case GL_RGB: - case GL_BGR: - assert(testChan < 3); - switch (baseIntFormat) { - case 0: - case GL_RGBA: - exp[0] = 0; - exp[1] = 0; - exp[2] = 0; - exp[testChan] = 255; - exp[3] = 255; // texture's alpha - break; - case GL_RGB: - exp[0] = 0; - exp[1] = 0; - exp[2] = 0; - exp[testChan] = 255; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_RG: - exp[0] = 0; - exp[1] = 0; - exp[testChan] = 255; - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_RED: - exp[0] = testChan == 0 ? 255 : 0; - exp[1] = 0; - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_ALPHA: - exp[0] = 0; - exp[1] = 0; - exp[2] = 0; - exp[3] = 255; // texture's alpha - break; - case GL_LUMINANCE: - exp[0] = - exp[1] = - exp[2] = testChan == 0 ? 255 : 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_LUMINANCE_ALPHA: - exp[0] = - exp[1] = - exp[2] = testChan == 0 ? 255 : 0; - exp[3] = 255; // texture's alpha - break; - case GL_INTENSITY: - exp[0] = - exp[1] = - exp[2] = - exp[3] = testChan == 0 ? 255 : 0; - break; - default: - abort(); - } - break; - - case GL_RG: - assert(testChan < 2); - switch (baseIntFormat) { - case 0: - case GL_RGBA: - exp[0] = 0; - exp[1] = 0; - exp[testChan] = 255; - exp[2] = 0; - exp[3] = 255; // texture's alpha - break; - case GL_RGB: - exp[0] = 0; - exp[1] = 0; - exp[testChan] = 255; - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_RG: - exp[0] = 0; - exp[1] = 0; - exp[testChan] = 255; - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_RED: - exp[0] = testChan == 0 ? 255 : 0; - exp[1] = 0; - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_ALPHA: - exp[0] = 0; - exp[1] = 0; - exp[2] = 0; - exp[3] = 255; // texture's alpha - break; - case GL_LUMINANCE: - exp[0] = - exp[1] = - exp[2] = testChan == 0 ? 255 : 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_LUMINANCE_ALPHA: - exp[0] = - exp[1] = - exp[2] = testChan == 0 ? 255 : 0; - exp[3] = 255; // texture's alpha - break; - case GL_INTENSITY: - exp[0] = - exp[1] = - exp[2] = - exp[3] = testChan == 0 ? 255 : 0; - break; - default: - abort(); - } - break; - - case GL_RED: - assert(testChan == 0); - switch (baseIntFormat) { - case 0: - case GL_RGBA: - exp[0] = 255; - exp[1] = 0; - exp[2] = 0; - exp[3] = 255; // texture's alpha - break; - case GL_RGB: - exp[0] = 255; - exp[1] = 0; - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_RG: - exp[0] = 255; - exp[1] = 0; - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_RED: - exp[0] = 255; - exp[1] = 0; - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_ALPHA: - exp[0] = 0; - exp[1] = 0; - exp[2] = 0; - exp[3] = 255; // texture's alpha - break; - case GL_LUMINANCE: - exp[0] = - exp[1] = - exp[2] = 255; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_LUMINANCE_ALPHA: - exp[0] = - exp[1] = - exp[2] = 255; - exp[3] = 255; // texture's alpha - break; - case GL_INTENSITY: - exp[0] = - exp[1] = - exp[2] = 255; - exp[3] = 255; // texture's alpha - break; - default: - abort(); - } - break; - - case GL_GREEN: - case GL_BLUE: - assert(testChan == 0); - switch (baseIntFormat) { - case 0: - case GL_RGBA: - exp[0] = 0; - exp[1] = 255; - exp[2] = 0; - exp[3] = 255; // texture's alpha - break; - case GL_RGB: - exp[0] = 0; - exp[1] = 255; - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_ALPHA: - exp[0] = 0; - exp[1] = 0; - exp[2] = 0; - exp[3] = 255; // texture's alpha - break; - case GL_LUMINANCE: - exp[0] = - exp[1] = - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_LUMINANCE_ALPHA: - exp[0] = - exp[1] = - exp[2] = 0; - exp[3] = 255; // texture's alpha - break; - case GL_INTENSITY: - exp[0] = - exp[1] = - exp[2] = 0; - exp[3] = 0; // texture's alpha - break; - default: - abort(); - } - break; - - case GL_ALPHA: - assert(testChan == 0); - switch (baseIntFormat) { - case 0: - case GL_RGBA: - exp[0] = 0; - exp[1] = 0; - exp[2] = 0; - exp[3] = 255; // texture's alpha - break; - case GL_RGB: - exp[0] = 0; - exp[1] = 0; - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_ALPHA: - exp[0] = 0; - exp[1] = 0; - exp[2] = 0; - exp[3] = 255; // texture's alpha - break; - case GL_LUMINANCE: - exp[0] = - exp[1] = - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_LUMINANCE_ALPHA: - exp[0] = - exp[1] = - exp[2] = 0; - exp[3] = 255; // texture's alpha - break; - case GL_INTENSITY: - exp[0] = - exp[1] = - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - default: - abort(); - } - break; - - case GL_LUMINANCE: - assert(testChan == 0); - switch (baseIntFormat) { - case 0: - case GL_RGBA: - exp[0] = 255; - exp[1] = 255; - exp[2] = 255; - exp[3] = 255; // texture's alpha - break; - case GL_RGB: - exp[0] = 255; - exp[1] = 255; - exp[2] = 255; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_RG: - exp[0] = 255; - exp[1] = 255; - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_RED: - exp[0] = 255; - exp[1] = 0; - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_ALPHA: - exp[0] = 0; - exp[1] = 0; - exp[2] = 0; - exp[3] = 255; // texture's alpha - break; - case GL_LUMINANCE: - exp[0] = 255; - exp[1] = 255; - exp[2] = 255; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_LUMINANCE_ALPHA: - exp[0] = 255; - exp[1] = 255; - exp[2] = 255; - exp[3] = 255; // texture's alpha - break; - case GL_INTENSITY: - exp[0] = 255; - exp[1] = 255; - exp[2] = 255; - exp[3] = 255; // texture's alpha - break; - default: - abort(); - } - break; - - case GL_LUMINANCE_ALPHA: - assert(testChan < 2); - switch (baseIntFormat) { - case 0: - case GL_RGBA: - exp[0] = - exp[1] = - exp[2] = testChan == 0 ? 255 : 0; - exp[3] = testChan == 1 ? 255 : 0; - break; - case GL_RGB: - exp[0] = - exp[1] = - exp[2] = testChan == 0 ? 255 : 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_RG: - exp[0] = - exp[1] = testChan == 0 ? 255 : 0; - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_RED: - exp[0] = testChan == 0 ? 255 : 0; - exp[1] = 0; - exp[2] = 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_ALPHA: - exp[0] = - exp[1] = - exp[2] = 0; // fragment color - exp[3] = testChan == 1 ? 255 : 0; - break; - case GL_LUMINANCE: - exp[0] = - exp[1] = - exp[2] = testChan == 0 ? 255 : 0; - exp[3] = defaultAlpha; // fragment alpha or texture alpha - break; - case GL_LUMINANCE_ALPHA: - exp[0] = testChan == 0 ? 255 : 0; - exp[1] = testChan == 0 ? 255 : 0; - exp[2] = testChan == 0 ? 255 : 0; - exp[3] = testChan == 1 ? 255 : 0; - break; - case GL_INTENSITY: - exp[0] = - exp[1] = - exp[2] = - exp[3] = testChan == 0 ? 255 : 0; - break; - default: - abort(); - } - break; - - default: - abort(); - } -} - - -// Read framebuffer and check that region [width x height] is the expected -// solid color, except the upper-right quadrant will always be black/zero. -// comp: which color channel in src image was set (0 = red, 1 = green, -// 2 = blue, 3 = alpha), other channels are zero. -// format is the color format we're testing. -bool -PixelFormatsTest::CheckRendering(int width, int height, int comp, - GLenum format, GLint intFormat) const -{ - const int checkAlpha = alphaBits > 0; - GLubyte *image = new GLubyte [width * height * 4]; - GLboolean ok = 1; - GLubyte expected[4]; - int i; - - assert(comp >= 0 && comp < 4); - - glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, image); - for (i = 0; i < width * height; i += 4) { - - ComputeExpected(format, comp, intFormat, expected); - if (IsUpperRight(i/4, width, height)) { - expected[0] = - expected[1] = - expected[2] = - expected[3] = 0; - } - - if (!checkAlpha) { - expected[3] = 0xff; - } - - // do the color check - if (!ColorsEqual(image+i, expected)) { - // report failure info - char msg[1000]; - env->log << name; - sprintf(msg, " failed at pixel (%d,%d), color channel %d:\n", - i/width, i%width, comp); - env->log << msg; - sprintf(msg, " Expected: 0x%02x 0x%02x 0x%02x 0x%02x\n", - expected[0], expected[1], expected[2], expected[3]); - env->log << msg; - sprintf(msg, " Found: 0x%02x 0x%02x 0x%02x 0x%02x\n", - image[i + 0], image[i + 1], image[i + 2], image[i + 3]); - env->log << msg; - ok = false; - break; - } - } - delete [] image; - return ok; -} - - - -// Exercise a particular combination of image format, type and internal -// texture format. -// Return true for success, false for failure. -bool -PixelFormatsTest::TestCombination(GLenum format, GLenum type, GLint intFormat) -{ - const int numComps = NumberOfComponentsInFormat(format); - const int width = 16; - const int height = 16; - int colorPos[4]; - ComponentPositions(format, colorPos); - - for (int comp = 0; comp < numComps; comp++) { - if (colorPos[comp] >= 0) { - // make original/incoming image - const int comp2 = colorPos[comp]; - GLubyte *image = MakeImage(width, height, format, type, comp2); - - // render with image (texture / glDrawPixels) - bool ok = DrawImage(width, height, format, type, intFormat, image); - - if (ok) { - // check rendering - ok = CheckRendering(width, height, comp, format, intFormat); - } - - delete [] image; - - if (!ok) { - return false; - } - } - } - - return true; -} - - -// Per visual setup. -void -PixelFormatsTest::setup(void) -{ - haveHalfFloat = GLUtils::haveExtensions("GL_ARB_half_float_pixel"); - haveABGR = GLUtils::haveExtensions("GL_EXT_abgr"); - haveSRGB = GLUtils::haveExtensions("GL_EXT_texture_sRGB"); - haveCombine = GLUtils::haveExtensions("GL_ARB_texture_env_combine"); - haveRG = GLUtils::haveExtensions("GL_ARB_texture_rg"); - haveFloat = GLUtils::haveExtensions("GL_ARB_texture_float"); - haveSnorm = GLUtils::haveExtensions("GL_EXT_texture_snorm"); - haveTexSharedExp = GLUtils::haveExtensions("GL_EXT_texture_shared_exponent"); - - glGetIntegerv(GL_ALPHA_BITS, &alphaBits); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - - glDrawBuffer(GL_FRONT); - glReadBuffer(GL_FRONT); - - glColor4f(0, 0, 0, 0); - -#if USE_FRAG_PROG - { - PFNGLPROGRAMSTRINGARBPROC glProgramStringARB_func; - PFNGLBINDPROGRAMARBPROC glBindProgramARB_func; - static const char *progText = - "!!ARBfp1.0\n" - "TEX result.color, fragment.texcoord[0], texture[0], 2D; \n" - "END \n" - ; - glProgramStringARB_func = (PFNGLPROGRAMSTRINGARBPROC) - GLUtils::getProcAddress("glProgramStringARB"); - assert(glProgramStringARB_func); - glBindProgramARB_func = (PFNGLBINDPROGRAMARBPROC) - GLUtils::getProcAddress("glBindProgramARB"); - assert(glBindProgramARB_func); - glBindProgramARB_func(GL_FRAGMENT_PROGRAM_ARB, 1); - glProgramStringARB_func(GL_FRAGMENT_PROGRAM_ARB, - GL_PROGRAM_FORMAT_ASCII_ARB, - strlen(progText), (const GLubyte *) progText); - if (glGetError()) { - fprintf(stderr, "Bad fragment program, error: %s\n", - (const char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB)); - exit(0); - } - } -#endif -} - - - -// Test all possible image formats, types and internal texture formats. -// Result will indicate number of passes and failures. -void -PixelFormatsTest::runOne(MultiTestResult &r, Window &w) -{ - int testNum = 0, testStride; - (void) w; // silence warning - - setup(); - - if (env->options.quick) - testStride = 13; // a prime number - else - testStride = 1; - - const unsigned numEnvModes = haveCombine ? 2 : 1; - - for (unsigned envMode = 0; envMode < numEnvModes; envMode++) { - if (envMode == 0) { - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - // When the texture internal format is GL_LUMINANCE or GL_RGB, - // GL_REPLACE takes alpha from the fragment, which we set to zero - // with glColor4f(0,0,0,0). -#if USE_FRAG_PROG - defaultAlpha = 255; -#else - defaultAlpha = 0; -#endif - } - else { - assert(haveCombine); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); - // For this GL_COMBINE mode, when sampling a texture that does - // not have an alpha channel, alpha is effectively 1.0. - defaultAlpha = 255; - } - - for (unsigned formatIndex = 0; formatIndex < NUM_FORMATS; formatIndex++) { - for (unsigned typeIndex = 0; typeIndex < NUM_TYPES; typeIndex++) { - - if (CompatibleFormatAndType(Formats[formatIndex].Token, - Types[typeIndex].Token)) { - - for (unsigned intFormat = 0; intFormat < NUM_INT_FORMATS; intFormat++) { - - if (!SupportedIntFormat(InternalFormats[intFormat].Token)) - continue; - -#if DEBUG - env->log << "testing " - << testNum - << ":\n"; - env->log << " Format: " << Formats[formatIndex].Name << "\n"; - env->log << " Type: " << Types[typeIndex].Name << "\n"; - env->log << " IntFormat: " << InternalFormats[intFormat].Name << "\n"; - -#endif - bool ok; - - if (testNum % testStride == 0) { - ok = TestCombination(Formats[formatIndex].Token, - Types[typeIndex].Token, - InternalFormats[intFormat].Token); - } - else { - // skip - ok = true; - } - - if (!ok) { - // error was reported to log, add format info here: - env->log << " Format: " << Formats[formatIndex].Name << "\n"; - env->log << " Type: " << Types[typeIndex].Name << "\n"; - env->log << " Internal Format: " << InternalFormats[intFormat].Name << "\n"; - env->log << " EnvMode: " << EnvModes[envMode] << "\n"; - r.numFailed++; - } - else { - r.numPassed++; - } - testNum++; - } - } - } - } - } - - r.pass = (r.numFailed == 0); -} - - -// The test object itself: -PixelFormatsTest pixelFormatsTest("pixelFormats", "window, rgb", - "", - "Test that all the various pixel formats/types (like\n" - "GL_BGRA/GL_UNSIGNED_SHORT_4_4_4_4_REV) operate correctly.\n" - "Test both glTexImage and glDrawPixels.\n" - "For textures, also test all the various internal texture formats.\n" - "Thousands of combinations are possible!\n" - ); - - -} // namespace GLEAN diff --git a/tests/glean/tpixelformats.h b/tests/glean/tpixelformats.h deleted file mode 100644 index d0edb94c4..000000000 --- a/tests/glean/tpixelformats.h +++ /dev/null @@ -1,98 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 1999 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 - -// Brian Paul September 2006 - -#ifndef __tpixelformats_h__ -#define __tpixelformats_h__ - -#include "tmultitest.h" - -namespace GLEAN { - -#define windowSize 100 - - -class PixelFormatsTest: public MultiTest -{ -public: - PixelFormatsTest(const char* testName, const char* filter, - const char *extensions, const char* description): - MultiTest(testName, filter, extensions, description), - alphaBits(0), - defaultAlpha(0), - haveHalfFloat(false), - haveABGR(false), - haveSRGB(false), - haveCombine(false), - haveRG(false), - haveSnorm(false), - haveTexSharedExp(false) - { - } - - virtual void runOne(MultiTestResult &r, Window &w); - -private: - int alphaBits; - int defaultAlpha; // depends on texture env mode - // extensions - bool haveHalfFloat; - bool haveABGR; - bool haveSRGB; - bool haveCombine; - bool haveRG; - bool haveFloat; - bool haveSnorm; - bool haveTexSharedExp; - - bool CheckError(const char *where) const; - - bool CompatibleFormatAndType(GLenum format, GLenum datatype) const; - - bool SupportedIntFormat(GLint intFormat) const; - - bool DrawImage(int width, int height, - GLenum format, GLenum type, GLint intFormat, - const GLubyte *image) const; - - void ComputeExpected(GLenum srcFormat, int testChan, - GLint intFormat, GLubyte exp[4]) const; - - bool CheckRendering(int width, int height, int color, - GLenum format, GLint intFormat) const; - - bool TestCombination(GLenum format, GLenum type, GLint intFormat); - - void setup(void); -}; - -} // namespace GLEAN - -#endif // __tpixelformats_h__ - diff --git a/tests/glean/tshaderapi.cpp b/tests/glean/tshaderapi.cpp deleted file mode 100644 index cad46af95..000000000 --- a/tests/glean/tshaderapi.cpp +++ /dev/null @@ -1,470 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 2009 VMware, Inc. 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 VMWARE 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 - - -// Test GLSL-related API functions for correct behaviour -// Based on the "shader_api.c" test from Mesa, written by Bruce Merry. - - -#include <cstring> -#include "tshaderapi.h" -#include "rand.h" -#include "image.h" -#include "piglit-util-gl.h" - - -namespace GLEAN { - -ShaderAPIResult::ShaderAPIResult() -{ - pass = false; -} - -void -ShaderAPITest::assert_test(const char *file, int line, int cond, const char *msg) -{ - if (!cond) { - error = true; - fprintf(stderr, "%s:%d assertion \"%s\" failed\n", file, line, msg); - } -} - -#undef assert -#define assert(x) assert_test(__FILE__, __LINE__, (x), #x) - - -void -ShaderAPITest::assert_no_error_test(const char *file, int line) -{ - GLenum err; - - err = glGetError(); - if (err != GL_NO_ERROR) { - error = true; - fprintf(stderr, "%s:%d received error %s\n", - file, line, piglit_get_gl_error_name(err)); - } -} - -#define assert_no_error() assert_no_error_test(__FILE__, __LINE__) - - -void -ShaderAPITest::assert_error_test(const char *file, int line, GLenum expect) -{ - GLenum err; - - err = glGetError(); - if (err != expect) { - fprintf(stderr, "%s:%d expected %s but received %s\n", - file, line, piglit_get_gl_error_name(expect), piglit_get_gl_error_name(err)); - error = true; - } - - while (glGetError()) - ; /* consume any following errors */ -} - -#define assert_error(err) assert_error_test(__FILE__, __LINE__, (err)) - - -void -ShaderAPITest::check_status(GLuint id, GLenum pname, - void (APIENTRY *query)(GLuint, GLenum, GLint *), - void (APIENTRY *get_log)(GLuint, GLsizei, GLsizei *, GLchar *)) -{ - GLint status; - - query(id, pname, &status); - if (!status) { - char info[65536]; - - fprintf(stderr, "Compilation/link failure:\n"); - get_log(id, sizeof(info), NULL, info); - fprintf(stderr, "%s\n", info); - - error = true; - } -} - - -void -ShaderAPITest::check_compile_status(GLuint id) -{ - check_status(id, GL_COMPILE_STATUS, glGetShaderiv, - glGetShaderInfoLog); -} - - -void -ShaderAPITest::check_link_status(GLuint id) -{ - check_status(id, GL_LINK_STATUS, glGetProgramiv, - glGetProgramInfoLog); -} - - -GLuint -ShaderAPITest::make_shader(GLenum type, const char *src) -{ - GLuint id; - - assert_no_error(); - id = glCreateShader(type); - glShaderSource(id, 1, &src, NULL); - glCompileShader(id); - check_compile_status(id); - assert_no_error(); - return id; -} - - -GLuint -ShaderAPITest::make_program(const char *vs_src, const char *fs_src) -{ - GLuint id, vs, fs; - - assert_no_error(); - id = glCreateProgram(); - if (vs_src) { - vs = make_shader(GL_VERTEX_SHADER, vs_src); - glAttachShader(id, vs); - glDeleteShader(vs); - } - if (fs_src) { - fs = make_shader(GL_FRAGMENT_SHADER, fs_src); - glAttachShader(id, fs); - glDeleteShader(fs); - } - glLinkProgram(id); - check_link_status(id); - glUseProgram(id); - glDeleteProgram(id); - assert_no_error(); - return id; -} - - -void -ShaderAPITest::test_uniform_size_type1(const char *glslType, GLenum glType, const char *el) -{ - char buffer[1024]; - GLuint program; - GLint active, i; - - //printf(" Running subtest %s\n", glslType); - //fflush(stdout); - sprintf(buffer, "#version 120\nuniform %s m[60];\nvoid main() { gl_Position[0] = m[59]%s; }\n", - glslType, el); - - program = make_program(buffer, NULL); - glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &active); - assert_no_error(); - for (i = 0; i < active; i++) { - GLint size = -1; - GLenum type = 0; - glGetActiveUniform(program, i, sizeof(buffer), NULL, - &size, &type, buffer); - assert_no_error(); - assert(type == glType); - assert(size == 60); - if (strncmp(buffer, "m", 1) == 0) - break; - } -} - - -void -ShaderAPITest::test_uniform_size_type(void) -{ - test_uniform_size_type1("float", GL_FLOAT, ""); - test_uniform_size_type1("vec2", GL_FLOAT_VEC2, "[0]"); - test_uniform_size_type1("vec3", GL_FLOAT_VEC3, "[0]"); - test_uniform_size_type1("vec4", GL_FLOAT_VEC4, "[0]"); - - test_uniform_size_type1("bool", GL_BOOL, " ? 1.0 : 0.0"); - test_uniform_size_type1("bvec2", GL_BOOL_VEC2, "[0] ? 1.0 : 0.0"); - test_uniform_size_type1("bvec3", GL_BOOL_VEC3, "[0] ? 1.0 : 0.0"); - test_uniform_size_type1("bvec4", GL_BOOL_VEC4, "[0] ? 1.0 : 0.0"); - - test_uniform_size_type1("int", GL_INT, ""); - test_uniform_size_type1("ivec2", GL_INT_VEC2, "[0]"); - test_uniform_size_type1("ivec3", GL_INT_VEC3, "[0]"); - test_uniform_size_type1("ivec4", GL_INT_VEC4, "[0]"); - - test_uniform_size_type1("mat2", GL_FLOAT_MAT2, "[0][0]"); - test_uniform_size_type1("mat3", GL_FLOAT_MAT3, "[0][0]"); - test_uniform_size_type1("mat4", GL_FLOAT_MAT4, "[0][0]"); - test_uniform_size_type1("mat2x3", GL_FLOAT_MAT2x3, "[0][0]"); - test_uniform_size_type1("mat2x4", GL_FLOAT_MAT2x4, "[0][0]"); - test_uniform_size_type1("mat3x2", GL_FLOAT_MAT3x2, "[0][0]"); - test_uniform_size_type1("mat3x4", GL_FLOAT_MAT3x4, "[0][0]"); - test_uniform_size_type1("mat4x2", GL_FLOAT_MAT4x2, "[0][0]"); - test_uniform_size_type1("mat4x3", GL_FLOAT_MAT4x3, "[0][0]"); -} - - -void -ShaderAPITest::test_attrib_size_type1(const char *glslType, GLenum glType, const char *el) -{ - char buffer[1024]; - GLuint program; - GLint active, i; - - //printf(" Running subtest %s\n", glslType); - //fflush(stdout); - sprintf(buffer, "#version 120\nattribute %s m;\nvoid main() { gl_Position[0] = m%s; }\n", - glslType, el); - - program = make_program(buffer, NULL); - glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &active); - assert_no_error(); - for (i = 0; i < active; i++) { - GLint size = -1; - GLenum type = 0; - glGetActiveAttrib(program, i, sizeof(buffer), NULL, - &size, &type, buffer); - assert_no_error(); - assert(type == glType); - assert(size == 1); - if (strncmp(buffer, "m", 1) == 0) - break; - } - assert(i < active); /* Otherwise the compiler optimised it out */ -} - - -void -ShaderAPITest::test_attrib_size_type(void) -{ - test_attrib_size_type1("float", GL_FLOAT, ""); - test_attrib_size_type1("vec2", GL_FLOAT_VEC2, "[0]"); - test_attrib_size_type1("vec3", GL_FLOAT_VEC3, "[0]"); - test_attrib_size_type1("vec4", GL_FLOAT_VEC4, "[0]"); - test_attrib_size_type1("mat2", GL_FLOAT_MAT2, "[0][0]"); - test_attrib_size_type1("mat3", GL_FLOAT_MAT3, "[0][0]"); - test_attrib_size_type1("mat4", GL_FLOAT_MAT4, "[0][0]"); - test_attrib_size_type1("mat2x3", GL_FLOAT_MAT2x3, "[0][0]"); - test_attrib_size_type1("mat2x4", GL_FLOAT_MAT2x4, "[0][0]"); - test_attrib_size_type1("mat3x2", GL_FLOAT_MAT3x2, "[0][0]"); - test_attrib_size_type1("mat3x4", GL_FLOAT_MAT3x4, "[0][0]"); - test_attrib_size_type1("mat4x2", GL_FLOAT_MAT4x2, "[0][0]"); - test_attrib_size_type1("mat4x3", GL_FLOAT_MAT4x3, "[0][0]"); -} - - -void -ShaderAPITest::test_uniform_array_overflow(void) -{ - GLuint program; - GLint location; - GLfloat data[128]; - - program = make_program("#version 120\nuniform vec2 x[10];\nvoid main() { gl_Position.xy = x[9]; }\n", NULL); - location = glGetUniformLocation(program, "x"); - assert_no_error(); - glUniform2fv(location, 64, data); - assert_no_error(); -} - - -void -ShaderAPITest::test_uniform_scalar_count(void) -{ - GLuint program; - GLint location; - GLfloat data[128]; - - program = make_program("#version 110\nuniform vec2 x;\nvoid main() { gl_Position.xy = x; }\n", NULL); - location = glGetUniformLocation(program, "x"); - assert_no_error(); - glUniform2fv(location, 64, data); - assert_error(GL_INVALID_OPERATION); -} - - -void -ShaderAPITest::test_uniform_query_matrix(void) -{ - GLuint program; - GLfloat data[18]; - GLint i, r, c; - GLint location; - - program = make_program("#version 110\nuniform mat3 m[2];\nvoid main() { gl_Position.xyz = m[1][2]; }\n", NULL); - location = glGetUniformLocation(program, "m"); - for (i = 0; i < 9; i++) - data[i] = i; - for (i = 9; i < 18; i++) - data[i] = 321.0; - glUniformMatrix3fv(location, 1, GL_TRUE, data); - - for (i = 0; i < 18; i++) - data[i] = 123.0; - glGetUniformfv(program, location, data); - for (c = 0; c < 3; c++) - for (r = 0; r < 3; r++) - assert(data[c * 3 + r] == r * 3 + c); - for (i = 9; i < 18; i++) - assert(data[i] == 123.0); -} - - -void -ShaderAPITest::test_uniform_neg_location(void) -{ - GLuint program; - GLfloat data[4]; - - program = make_program("#version 110\nvoid main() { gl_Position = vec4(1.0, 1.0, 1.0, 1.0); }\n", NULL); - (void) program; - assert_no_error(); - glUniform1i(-1, 1); - assert_no_error(); - glUniform1i(-200, 1); - assert_error(GL_INVALID_OPERATION); - glUniformMatrix2fv(-1, 1, GL_FALSE, data); - assert_no_error(); - glUniformMatrix2fv(-200, 1, GL_FALSE, data); - assert_error(GL_INVALID_OPERATION); -} - - -void -ShaderAPITest::test_uniform_bool_conversion(void) -{ - GLuint program; - GLint location; - GLint value[16]; /* in case glGetUniformiv goes nuts on the stack */ - - assert_no_error(); - program = make_program("uniform bool b;\nvoid main() { gl_Position.x = b ? 1.5 : 0.5; }\n", NULL); - location = glGetUniformLocation(program, "b"); - assert(location != -1); - assert_no_error(); - glUniform1i(location, 5); - assert_no_error(); - glGetUniformiv(program, location, &value[0]); - assert_no_error(); - assert(value[0] == 1); -} - - -void -ShaderAPITest::run_tests(void) -{ - test_uniform_size_type(); - test_attrib_size_type(); - test_uniform_array_overflow(); - test_uniform_scalar_count(); - test_uniform_query_matrix(); - test_uniform_neg_location(); - test_uniform_bool_conversion(); -} - - -void -ShaderAPITest::runOne(ShaderAPIResult &r, Window &w) -{ - (void) w; // silence warning - - // error will be set to true if any of the assert functions below fail. - error = false; - - run_tests(); - - r.pass = !error; -} - - -void -ShaderAPITest::logOne(ShaderAPIResult &r) -{ - if (r.pass) { - logPassFail(r); - logConcise(r); - } - else { - env->log << name << "FAIL\n"; - } -} - - -void -ShaderAPIResult::putresults(ostream &s) const -{ - if (pass) { - s << "PASS\n"; - } - else { - s << "FAIL\n"; - } -} - - -bool -ShaderAPIResult::getresults(istream &s) -{ - char result[1000]; - s >> result; - - if (strcmp(result, "FAIL") == 0) { - pass = false; - } - else { - pass = true; - } - return s.good(); -} - - -// We need OpenGL 2.0, 2.1 or 3.0 -bool -ShaderAPITest::isApplicable() const -{ - if (GLUtils::getVersion() >= 2.0) { - return true; - } - else { - env->log << name - << ": skipped. Requires GL >= 2.0.\n"; - return false; - } -} - - -// The test object itself: -ShaderAPITest shaderAPITest("shaderAPI", "window, rgb", - "", // no extensions, but see isApplicable() - "Test GLSL shader-related API features.\n"); - - - -} // namespace GLEAN - - diff --git a/tests/glean/tshaderapi.h b/tests/glean/tshaderapi.h deleted file mode 100644 index 876876a45..000000000 --- a/tests/glean/tshaderapi.h +++ /dev/null @@ -1,98 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 2009 VMware, Inc. 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 VMWARE 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 - - -#ifndef __tshaderapi_h__ -#define __tshaderapi_h__ - -#include "tbase.h" - -#ifndef APIENTRY -#define APIENTRY -#endif - -namespace GLEAN { - -#define windowSize 100 - - -class ShaderAPIResult: public BaseResult -{ -public: - bool pass; - - ShaderAPIResult(); - - virtual void putresults(ostream& s) const; - virtual bool getresults(istream& s); -}; - - -class ShaderAPITest: public BaseTest<ShaderAPIResult> -{ -public: - // "WHO" = width, height and one config flag - GLEAN_CLASS_WHO(ShaderAPITest, ShaderAPIResult, - windowSize, windowSize, true); - - virtual bool isApplicable() const; - -private: - bool error; - - void assert_test(const char *file, int line, int cond, const char *msg); - void assert_no_error_test(const char *file, int line); - void assert_error_test(const char *file, int line, GLenum expect); - - void check_status(GLuint id, GLenum pname, - void (APIENTRY *query)(GLuint, GLenum, GLint *), - void (APIENTRY *get_log)(GLuint, GLsizei, GLsizei *, GLchar *)); - void check_compile_status(GLuint id); - void check_link_status(GLuint id); - - GLuint make_shader(GLenum type, const char *src); - GLuint make_program(const char *vs_src, const char *fs_src); - - void test_uniform_size_type1(const char *glslType, GLenum glType, const char *el); - void test_attrib_size_type1(const char *glslType, GLenum glType, const char *el); - - void test_uniform_size_type(void); - void test_attrib_size_type(void); - void test_uniform_array_overflow(void); - void test_uniform_scalar_count(void); - void test_uniform_query_matrix(void); - void test_uniform_neg_location(void); - void test_uniform_bool_conversion(void); - void test_uniform_multiple_samplers(void); - void run_tests(void); -}; - -} // namespace GLEAN - -#endif // __tshaderapi_h__ - diff --git a/tests/glean/ttexcube.cpp b/tests/glean/ttexcube.cpp deleted file mode 100644 index 1d8ac29f2..000000000 --- a/tests/glean/ttexcube.cpp +++ /dev/null @@ -1,426 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 1999 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 - - -// ttexcube.cpp: Test the GL_ARB_texture_cube_map extension -// Author: Brian Paul (brianp@valinux.com) March 2001 -// -// Test procedure: -// We build a 6-sided texture cube map in which each side is a simple 2x2 -// checkboard pattern with known colors. Then we do three sets of tests. -// Each test draws a single quadrilateral. The tests are: -// -// 1. Directly specify texture coordinates. By changing the texture coords -// we can sample specific regions of the cube map. Check the rendered -// quad colors for correctness. -// 2. Use GL_NORMAL_MAP_ARB texgen mode with specific normal vectors to -// sample specific regions of the cube map. Check for correctness. -// 3. Test GL_REFLECTION_MAP_ARB texgen mode by specifying a quad with -// fixed vertices and normals but rotating the texture coordinate -// matrix to select each side of the cube map. Check that the rendered -// quad's four colors match the cube face. -// - -#include "ttexcube.h" -#include <stdio.h> -#include <cmath> - -namespace GLEAN { - - -#define VP_SIZE 20 - -static const char *faceName[6] = { - "POSITIVE_X", - "NEGATIVE_X", - "POSITIVE_Y", - "NEGATIVE_Y", - "POSITIVE_Z", - "NEGATIVE_Z" -}; - - -// -// Test if two colors are close enough to be considered the same -// -bool -TexCubeTest::TestColor(const GLfloat c1[3], const GLfloat c2[3]) { - if (fabs(c1[0] - c2[0]) <= mTolerance[0] && - fabs(c1[1] - c2[1]) <= mTolerance[1] && - fabs(c1[2] - c2[2]) <= mTolerance[2]) - return true; - else - return false; -} - - -// -// Define a 2x2 checkerboard texture image using the given four colors. -// -void -TexCubeTest::BuildTexImage(GLenum target, const GLfloat color[4][3]) { - const GLint w = 8, h = 8; - GLfloat texImage[8][8][4]; - for (int i = 0; i < h; i++) { - const int ibit = (i >= (h / 2)); - for (int j = 0; j < w; j++) { - const int jbit = (j >= (w / 2)); - const int c = ibit * 2 + jbit; - texImage[i][j][0] = color[c][0]; - texImage[i][j][1] = color[c][1]; - texImage[i][j][2] = color[c][2]; - texImage[i][j][3] = 1.0; - } - } - glTexImage2D(target, 0, GL_RGB, w, h, 0, GL_RGBA, GL_FLOAT, texImage); -} - - -// -// Draw a polygon either with texcoords or normal vectors and check that -// we hit the correct quadrant of each of the six cube faces. -// Return: true = pass, false = fail -// -bool -TexCubeTest::TestNormalMap(bool texCoordMode, const char *modeName) { - - // We use the coordinates both directly as texture coordinates - // and as normal vectors for testing NORMAL_MAP_ARB texgen mode). - static const GLfloat coords[6][4][3] = { - // +X - { - { 1.0, 0.5, 0.5 }, - { 1.0, 0.5, -0.5 }, - { 1.0, -0.5, 0.5 }, - { 1.0, -0.5, -0.5 }, - }, - // -X - { - { -1.0, 0.5, -0.5 }, - { -1.0, 0.5, 0.5 }, - { -1.0, -0.5, -0.5 }, - { -1.0, -0.5, 0.5 }, - }, - // +Y - { - { -0.5, 1.0, -0.5 }, - { 0.5, 1.0, -0.5 }, - { -0.5, 1.0, 0.5 }, - { 0.5, 1.0, 0.5 }, - }, - // -Y - { - { -0.5, -1.0, 0.5 }, - { 0.5, -1.0, 0.5 }, - { -0.5, -1.0, -0.5 }, - { 0.5, -1.0, -0.5 }, - }, - // +Z - { - { -0.5, 0.5, 1.0 }, - { 0.5, 0.5, 1.0 }, - { -0.5, -0.5, 1.0 }, - { 0.5, -0.5, 1.0 }, - }, - // -Z - { - { 0.5, 0.5, -1.0 }, - { -0.5, 0.5, -1.0 }, - { 0.5, -0.5, -1.0 }, - { -0.5, -0.5, -1.0 }, - } - }; - - // normal vectors to hit the four colors of each cube face when - - for (int face = 0; face < 6; face++) { - for (int quadrant = 0; quadrant < 4; quadrant++) { - - // draw the test quad - if (texCoordMode) - glTexCoord3fv(coords[face][quadrant]); - else - glNormal3fv(coords[face][quadrant]); - glColor3f(0, 1, 0); - glBegin(GL_POLYGON); - glVertex2f(-1, -1); - glVertex2f( 1, -1); - glVertex2f( 1, 1); - glVertex2f(-1, 1); - glEnd(); - - // check the color - GLfloat result[3]; - glReadPixels(1, 1, 1, 1, GL_RGB, GL_FLOAT, result); - - if (!TestColor(mColors[face][quadrant], result)) { - env->log << name - << ": FAIL: mode='" - << modeName - << "' face=" - << faceName[face] - << " quadrant=" - << quadrant - << " expected=(" - << mColors[face][quadrant][0] << ", " - << mColors[face][quadrant][1] << ", " - << mColors[face][quadrant][2] - << ") measured=(" - << result[0] << ", " - << result[1] << ", " - << result[2] - << ")\n"; - return false; - } - } - } - return true; -} - - -// -// Test GL_REFLECTION_MAP_ARB texgen mode. -// Return: true = pass, false = fail -// -bool -TexCubeTest::TestReflectionMap(const char *modeName) { - -// These are the glReadPixels coords we'll use for pixel testing -#define X0 ((int) (VP_SIZE * 0.25)) -#define X1 ((int) (VP_SIZE * 0.75)) -#define Y0 ((int) (VP_SIZE * 0.25)) -#define Y1 ((int) (VP_SIZE * 0.75)) - - // We'll rotate the texture coordinates to map each cube face - // onto a screen-aligned quad. - static const GLfloat rotation[6][4] = { - { -90, 0, 1, 0 }, // +X - { 90, 0, 1, 0 }, // -X - { 90, 1, 0, 0 }, // +Y - { -90, 1, 0, 0 }, // -Y - { 180, 1, 0, 0 }, // -Z - { 0, 1, 0, 0 } // +Z - }; - - // For each face we'll test the four quadrants to be sure test - // if the expected color is where it should be. - // These are the glReadPixels coordinates at which we should - // find the colors in the mColors[6][4] array. - static const GLint readPos[6][4][2] = { - // +X - { - { X1, Y1 }, { X0, Y1 }, { X1, Y0 }, { X0, Y0 } - }, - // -X - { - { X1, Y1 }, { X0, Y1 }, { X1, Y0 }, { X0, Y0 } - }, - // +Y - { - { X0, Y0 }, { X1, Y0 }, { X0, Y1 }, { X1, Y1 } - }, - // -Y - { - { X0, Y0 }, { X1, Y0 }, { X0, Y1 }, { X1, Y1 } - }, - // +Z - { - { X0, Y0 }, { X1, Y0 }, { X0, Y1 }, { X1, Y1 } - }, - // -Z - { - { X1, Y1 }, { X0, Y1 }, { X1, Y0 }, { X0, Y0 } - } - }; - - for (int face = 0; face < 6; face++) { - - // Draw the test quad. - // It'll be textured with one face of the cube map texture. - glMatrixMode(GL_TEXTURE); - glPushMatrix(); - glRotatef(rotation[face][0], rotation[face][1], - rotation[face][2], rotation[face][3]); - glNormal3f(0, 0, 1); - glColor3f(0, 1, 0); - glBegin(GL_POLYGON); - glVertex3f(-1, -1, 1); - glVertex3f( 1, -1, 1); - glVertex3f( 1, 1, 1); - glVertex3f(-1, 1, 1); - glEnd(); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - - // Verify the colors - for (int quadrant = 0; quadrant < 4; quadrant++) { - - GLfloat result[3]; - glReadPixels(readPos[face][quadrant][0], - readPos[face][quadrant][1], - 1, 1, GL_RGB, GL_FLOAT, result); - - if (!TestColor(mColors[face][quadrant], result)) { - env->log << name - << ": FAIL: mode='" - << modeName - << "' face=" - << faceName[face] - << " quadrant=" - << quadrant - << " expected=(" - << mColors[face][quadrant][0] << ", " - << mColors[face][quadrant][1] << ", " - << mColors[face][quadrant][2] - << ") measured=(" - << result[0] << ", " - << result[1] << ", " - << result[2] - << ")\n"; - return false; - } - } - } - return true; -} - - -void -TexCubeTest::runOne(BasicResult& r, Window& w) { - - (void) w; - - // each of six faces needs four test colors - for (int i = 0; i < 6 * 4; i++) { - GLint r = i % 3; - GLint g = (i / 3) % 3; - GLint b = (i / 9) % 3; - mColors[i / 4][i % 4][0] = r * 0.5; - mColors[i / 4][i % 4][1] = g * 0.5; - mColors[i / 4][i % 4][2] = b * 0.5; - //printf("mColors[%d][%d] = %g %g %g\n", i/4, i%4, - // mColors[i/4][i%4][0], - // mColors[i/4][i%4][1], - // mColors[i/4][i%4][2]); - } - - glDrawBuffer(GL_FRONT); - glReadBuffer(GL_FRONT); - - BuildTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, mColors[0]); - BuildTexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB, mColors[1]); - BuildTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, mColors[2]); - BuildTexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB, mColors[3]); - BuildTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB, mColors[4]); - BuildTexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB, mColors[5]); - - glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, - GL_NEAREST); - glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, - GL_NEAREST); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - glEnable(GL_TEXTURE_CUBE_MAP_ARB); - - // compute RGB error tolerance - { - GLint rBits, gBits, bBits; - GLint rTexBits, gTexBits, bTexBits; - glGetIntegerv(GL_RED_BITS, &rBits); - glGetIntegerv(GL_GREEN_BITS, &gBits); - glGetIntegerv(GL_BLUE_BITS, &bBits); - glGetTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, - 0, GL_TEXTURE_RED_SIZE, &rTexBits); - glGetTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, - 0, GL_TEXTURE_GREEN_SIZE, &gTexBits); - glGetTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, - 0, GL_TEXTURE_BLUE_SIZE, &bTexBits); - // find smaller of frame buffer and texture bits - rBits = (rBits < rTexBits) ? rBits : rTexBits; - gBits = (gBits < gTexBits) ? gBits : gTexBits; - bBits = (bBits < bTexBits) ? bBits : bTexBits; - mTolerance[0] = 2.0 / (1 << rBits); - mTolerance[1] = 2.0 / (1 << gBits); - mTolerance[2] = 2.0 / (1 << bBits); - } - - glViewport(0, 0, VP_SIZE, VP_SIZE); - - bool passed = true; - - if (passed) { - // Test directly specifying texture coords - glDisable(GL_TEXTURE_GEN_S); - glDisable(GL_TEXTURE_GEN_T); - glDisable(GL_TEXTURE_GEN_R); - passed = TestNormalMap(true, - "Direct specification of texture coordinates"); - } - - if (passed) { - // Test GL_NORMAL_MAP_ARB mode - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_ARB); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_ARB); - glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_ARB); - glEnable(GL_TEXTURE_GEN_S); - glEnable(GL_TEXTURE_GEN_T); - glEnable(GL_TEXTURE_GEN_R); - passed = TestNormalMap(false, "GL_NORMAL_MAP_ARB texgen"); - } - - if (passed) { - // Test GL_REFLECTION_MAP_ARB mode - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB); - glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB); - glEnable(GL_TEXTURE_GEN_S); - glEnable(GL_TEXTURE_GEN_T); - glEnable(GL_TEXTURE_GEN_R); - glEnable(GL_NORMALIZE); - passed = TestReflectionMap("GL_REFLECTION_MAP_ARB texgen"); - } - - r.pass = passed; -} // TexCubeTest::runOne - - -void -TexCubeTest::logOne(BasicResult& r) { - logPassFail(r); - logConcise(r); -} // TexCubeTest::logOne - - -/////////////////////////////////////////////////////////////////////////////// -// The test object itself: -/////////////////////////////////////////////////////////////////////////////// -TexCubeTest texCubeTest("texCube", "window, rgb", - - "GL_ARB_texture_cube_map verification test.\n"); - - -} // namespace GLEAN diff --git a/tests/glean/ttexcube.h b/tests/glean/ttexcube.h deleted file mode 100644 index 74940226c..000000000 --- a/tests/glean/ttexcube.h +++ /dev/null @@ -1,66 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 1999 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 - - -// ttexcube.h: Test the GL_ARB_texture_cube_map extension -// Author: Brian Paul (brianp@valinux.com) March 2001 - - -#ifndef __ttexcube_h__ -#define __ttexcube_h__ - -#include "tbasic.h" - -namespace GLEAN { - -class TexCubeTest: public BasicTest { - public: - TexCubeTest(const char* testName, const char* filter, - const char* description): - BasicTest(testName, filter, "GL_ARB_texture_cube_map", - description), - mTolerance() { - } - - virtual void runOne(BasicResult& r, Window& w); - virtual void logOne(BasicResult& r); - - private: - bool TestColor(const GLfloat c1[3], const GLfloat c2[3]); - void BuildTexImage(GLenum target, const GLfloat color[4][3]); - bool TestNormalMap(bool testTexCoords, const char *modeName); - bool TestReflectionMap(const char *modeName); - - GLfloat mColors[6][4][3]; - GLfloat mTolerance[3]; - -}; // class TexCubeTest - -} // namespace GLEAN - -#endif // __ttexcube_h__ diff --git a/tests/glean/ttexture_srgb.cpp b/tests/glean/ttexture_srgb.cpp deleted file mode 100644 index 524685f32..000000000 --- a/tests/glean/ttexture_srgb.cpp +++ /dev/null @@ -1,356 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 1999 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 - -// ttexture_srgb.h: Test GL_EXT_texture_sRGB extension. -// Brian Paul August 2006 - - -#include <cassert> -#include <cstring> -#include <cmath> -#include "ttexture_srgb.h" -#include "rand.h" -#include "piglit-util-gl.h" - - -namespace GLEAN { - - -static const struct { - GLenum sFormat; - GLenum baseFormat; - GLint components; -} Formats[] = { - { GL_SRGB_EXT, GL_RGB, 3 }, - { GL_SRGB8_EXT, GL_RGB, 3 }, - { GL_SRGB_ALPHA_EXT, GL_RGBA, 4 }, - { GL_SRGB8_ALPHA8_EXT, GL_RGBA, 4 }, - { GL_SLUMINANCE_ALPHA_EXT, GL_LUMINANCE_ALPHA, 2 }, - { GL_SLUMINANCE8_ALPHA8_EXT, GL_LUMINANCE_ALPHA, 2 }, - { GL_SLUMINANCE_EXT, GL_LUMINANCE, 1 }, - { GL_SLUMINANCE8_EXT, GL_LUMINANCE, 1 }, - { 0, 0, 0 } -}; - - - - -// Convert an 8-bit sRGB value from non-linear space to a -// linear RGB value in [0, 1]. -// Implemented with a 256-entry lookup table. -static float -nonlinear_to_linear(GLubyte cs8) -{ - static GLfloat table[256]; - static GLboolean tableReady = GL_FALSE; - if (!tableReady) { - // compute lookup table now - GLuint i; - for (i = 0; i < 256; i++) { - const GLfloat cs = i / 255.0; - if (cs <= 0.04045) { - table[i] = cs / 12.92; - } - else { - table[i] = pow((cs + 0.055) / 1.055, 2.4); - } - } - tableReady = GL_TRUE; - } - return table[cs8]; -} - - -// allocate and fill an array with random values -static GLubyte * -randomArray(int bytes, int seed) -{ - GLEAN::RandomBits r(8, seed); - GLubyte *img = new GLubyte [bytes]; - - for (int i = 0; i < bytes; i++) - img[i] = r.next(); - - return img; -} - - -// Test glTexImage and glGetTexImage functionality -bool -TextureSRGBTest::testImageTransfer(void) -{ - const GLubyte *image = randomArray(128 * 128 * 4, 0); - GLubyte image2[128 * 128 * 4]; - int i, j; - - for (i = 0; Formats[i].sFormat; i++) { - // upload tex image - glTexImage2D(GL_TEXTURE_2D, 0, Formats[i].sFormat, 128, 128, 0, - Formats[i].baseFormat, GL_UNSIGNED_BYTE, image); - - // retrieve tex image - glGetTexImage(GL_TEXTURE_2D, 0, - Formats[i].baseFormat, GL_UNSIGNED_BYTE, image2); - - // compare original and returned images - const int comps = Formats[i].components; - for (j = 0; j < 128 * 128 * comps; j++) { - if (image[j] != image2[j]) { - env->log << '\n' - << name - << " glGetTexImage failed for internalFormat " - << Formats[i].sFormat - << "\n"; - env->log << "Expected value at [" - << j - << "] should be " - << (int) image[j] - << " found " - << (int) image2[j] - << "\n"; - delete [] image; - return false; - } - image2[j] = 0; // reset for next GetTexImage - } - } - - delete [] image; - return true; -} - - -bool -TextureSRGBTest::testTextureFormat(GLenum intFormat, GLint components, - GLEAN::Environment &env) -{ - const GLubyte *image = randomArray(128 * 128 * 4, intFormat); - GLfloat readback[128 * 128 * 4]; - int i; - GLint redBits, alphaBits; - - glGetIntegerv(GL_RED_BITS, &redBits); - glGetIntegerv(GL_ALPHA_BITS, &alphaBits); - const float tolerance = 1.0 / ((1 << (redBits - 1)) - 1); - - // setup matrices - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glViewport(0, 0, windowSize, windowSize); - - // setup texture - glTexImage2D(GL_TEXTURE_2D, 0, intFormat, 128, 128, 0, - GL_RGBA, GL_UNSIGNED_BYTE, image); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - glEnable(GL_TEXTURE_2D); - - glDisable(GL_DITHER); - - glDrawBuffer(GL_FRONT); - glReadBuffer(GL_FRONT); - - // draw test polygon - glBegin(GL_POLYGON); - glTexCoord2f(0, 0); glVertex2f(-1, -1); - glTexCoord2f(1, 0); glVertex2f( 1, -1); - glTexCoord2f(1, 1); glVertex2f( 1, 1); - glTexCoord2f(0, 1); glVertex2f(-1, 1); - glEnd(); - - glReadPixels(0, 0, windowSize, windowSize, - GL_RGBA, GL_FLOAT, readback); - - // compare rendered results to expected values - for (i = 0; i < 128 * 128; i++) { - const GLfloat *actual = readback + i * 4; - GLfloat expected[4]; - - expected[0] = nonlinear_to_linear(image[i * 4 + 0]); - expected[1] = nonlinear_to_linear(image[i * 4 + 1]); - expected[2] = nonlinear_to_linear(image[i * 4 + 2]); - expected[3] = image[i * 4 + 3] / 255.0; - - if (components <= 2) { - if (fabs(actual[0] - expected[0]) > tolerance) { - env.log << '\n' - << name - << " failed for internalFormat " - << intFormat - << "\n"; - env.log << "Expected luminance " - << expected[0] - << " found " - << actual[0] - << "\n"; - delete [] image; - return GL_FALSE; - } - - } - else { - assert(components == 3 || components == 4); - if (fabs(actual[0] - expected[0]) > tolerance || - fabs(actual[1] - expected[1]) > tolerance || - fabs(actual[2] - expected[2]) > tolerance) { - env.log << '\n' - << name - << " failed for internalFormat " - << intFormat - << "\n"; - env.log << "Expected color " - << expected[0] - << ", " - << expected[1] - << ", " - << expected[2] - << " found " - << actual[0] - << ", " - << actual[1] - << ", " - << actual[2] - << "\n"; - delete [] image; - return GL_FALSE; - } - } - - if (alphaBits >= redBits - && components == 4 - && fabs(actual[3] - expected[3]) > tolerance) { - env.log << '\n' - << name - << " failed for internalFormat " - << intFormat - << "\n"; - env.log << "Expected alpha " - << expected[3] - << " found " - << actual[3] - << "\n"; - delete [] image; - return GL_FALSE; - } - } - - delete [] image; - return GL_TRUE; -} - - -// Test actual texture mapping using each of the sRGB formats -// Return GL_TRUE if all format tests pass, GL_FALSE if any fail. -bool -TextureSRGBTest::testTexturing(void) -{ - for (int i = 0; Formats[i].sFormat; i++) { - if (!testTextureFormat(Formats[i].sFormat, - Formats[i].components, *env)) - return GL_FALSE; - } - - return GL_TRUE; -} - - -void -TextureSRGBTest::runOne(TextureSRGBResult &r, Window &w) -{ - (void) w; // silence warning - r.pass = true; - errorCode = 0; - errorPos = NULL; - errorMsg[0] = 0; - - if (r.pass) - r.pass = testImageTransfer(); - if (r.pass) - r.pass = testTexturing(); -} - - -void -TextureSRGBTest::logOne(TextureSRGBResult &r) -{ - if (r.pass) { - logPassFail(r); - logConcise(r); - } - else { - env->log << name << " FAIL\n"; - if (errorCode) { - env->log << "\tOpenGL Error " << piglit_get_gl_error_name(errorCode) - << " at " << errorPos << "\n"; - } - else if (errorMsg[0]) { - env->log << "\t" << errorMsg << "\n"; - } - } -} - - -void -TextureSRGBResult::putresults(ostream &s) const -{ - if (pass) { - s << "PASS\n"; - } - else { - s << "FAIL\n"; - } -} - - -bool -TextureSRGBResult::getresults(istream &s) -{ - char result[1000]; - s >> result; - - if (strcmp(result, "FAIL") == 0) { - pass = false; - } - else { - pass = true; - } - return s.good(); -} - - -// The test object itself: -TextureSRGBTest srgbTest("texture_srgb", "window, rgb", - "GL_EXT_texture_sRGB", - "Test the GL_EXT_texture_sRGB extension.\n"); - - - -} // namespace GLEAN diff --git a/tests/glean/ttexture_srgb.h b/tests/glean/ttexture_srgb.h deleted file mode 100644 index 8875b2df4..000000000 --- a/tests/glean/ttexture_srgb.h +++ /dev/null @@ -1,71 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 1999 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 - -// ttexture_srgb.h: Test GL_EXT_texture_sRGB extension. -// Brian Paul August 2006 - -#ifndef __ttexture_srgb_h__ -#define __ttexture_srgb_h__ - -#include "tbase.h" - -namespace GLEAN { - -#define windowSize 128 - -class TextureSRGBResult: public BaseResult -{ -public: - bool pass; - - virtual void putresults(ostream& s) const; - virtual bool getresults(istream& s); -}; - - -class TextureSRGBTest: public BaseTest<TextureSRGBResult> -{ -public: - GLEAN_CLASS_WH(TextureSRGBTest, TextureSRGBResult, - windowSize, windowSize); - -private: - GLenum errorCode; - const char *errorPos; - char errorMsg[1000]; - - bool testImageTransfer(void); - bool testTextureFormat(GLenum intFormat, GLint components, - GLEAN::Environment &env); - bool testTexturing(void); -}; - -} // namespace GLEAN - -#endif // __ttexture_srgb_h__ - diff --git a/tests/glean/tvertarraybgra.cpp b/tests/glean/tvertarraybgra.cpp deleted file mode 100644 index ff8ac31ae..000000000 --- a/tests/glean/tvertarraybgra.cpp +++ /dev/null @@ -1,186 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 2009 VMware, Inc. 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 VMWARE 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 - - -// Render some geometry with random GLubyte/RGBA vertex colors. -// Then re-render same thing with GLubyte/BGRA vertex colors. -// Brian Paul -// 23 Jan 2009 - - -#define GL_GLEXT_PROTOTYPES - -#include <cassert> -#include <cmath> -#include <cstring> -#include "tvertarraybgra.h" -#include "rand.h" -#include "image.h" - - -namespace GLEAN { - - -VertArrayBGRAResult::VertArrayBGRAResult() -{ - pass = true; -} - - -void -VertArrayBGRATest::reportError(const char *msg) -{ - env->log << name << ": Error: " << msg << "\n"; -} - - -void -VertArrayBGRATest::setupPoints() -{ - RandomDouble r(10); - int i; - for (i = 0; i < NUM_POINTS; i++) { - mPos[i][0] = r.next() * WINDOW_SIZE; - mPos[i][1] = r.next() * WINDOW_SIZE; - mRGBA[i][0] = int(r.next() * 255); - mRGBA[i][1] = int(r.next() * 255); - mRGBA[i][2] = int(r.next() * 255); - mRGBA[i][3] = int(r.next() * 255); - mBGRA[i][0] = mRGBA[i][2]; // blue - mBGRA[i][1] = mRGBA[i][1]; // green - mBGRA[i][2] = mRGBA[i][0]; // red - mBGRA[i][3] = mRGBA[i][3]; // alpha - } -} - - -void -VertArrayBGRATest::renderPoints(bool useBGRA) -{ - glVertexPointer(2, GL_FLOAT, 0, mPos); - glEnableClientState(GL_VERTEX_ARRAY); - - if (useBGRA) - glColorPointer(GL_BGRA, GL_UNSIGNED_BYTE, 0, mBGRA); - else - glColorPointer(4, GL_UNSIGNED_BYTE, 0, mRGBA); - glEnableClientState(GL_COLOR_ARRAY); - - glDrawArrays(GL_POINTS, 0, NUM_POINTS); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); -} - - -void -VertArrayBGRATest::runOne(VertArrayBGRAResult &r, Window &w) -{ - (void) w; // silence warning - Image rgbaImage(WINDOW_SIZE, WINDOW_SIZE, GL_RGBA, GL_UNSIGNED_BYTE); - Image bgraImage(WINDOW_SIZE, WINDOW_SIZE, GL_RGBA, GL_UNSIGNED_BYTE); - - setupPoints(); -#if 0 // test lighting path too (debug only) - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glEnable(GL_COLOR_MATERIAL); -#endif - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(0, WINDOW_SIZE, 0, WINDOW_SIZE, -1.0, 1.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - // render with RGBA colors and save image - glClear(GL_COLOR_BUFFER_BIT); - renderPoints(false); - rgbaImage.read(0, 0); // pos=(0,0) - w.swap(); - - // render with BGRA colors and save image - glClear(GL_COLOR_BUFFER_BIT); - renderPoints(true); - bgraImage.read(0, 0); // pos=(0,0) - w.swap(); - - // images should be identical - r.pass = (rgbaImage == bgraImage); - if (!r.pass) { - reportError("BGRA colors did not match RGBA colors."); - } -} - - -void -VertArrayBGRATest::logOne(VertArrayBGRAResult &r) -{ - logPassFail(r); - logConcise(r); -} - - -void -VertArrayBGRAResult::putresults(ostream &s) const -{ - if (pass) { - s << "PASS\n"; - } - else { - s << "FAIL\n"; - } -} - - -bool -VertArrayBGRAResult::getresults(istream &s) -{ - char result[1000]; - s >> result; - - if (strcmp(result, "FAIL") == 0) { - pass = false; - } - else { - pass = true; - } - return s.good(); -} - - -// The test object itself: -VertArrayBGRATest vertArrayBGRATest("vertArrayBGRA", "window, rgb", - "GL_EXT_vertex_array_bgra", - "Test the GL_EXT_vertex_array_bgra extension.\n"); - - - -} // namespace GLEAN - - diff --git a/tests/glean/tvertarraybgra.h b/tests/glean/tvertarraybgra.h deleted file mode 100644 index 2b3a11845..000000000 --- a/tests/glean/tvertarraybgra.h +++ /dev/null @@ -1,74 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 2009 VMware, Inc. 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 VMWARE 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 - -// tvertarraybgra.h: Test GL_EXT_vertex_array bgra - -#ifndef __tvertarraybgra_h__ -#define __tvertarraybgra_h__ - -#include "tbase.h" - - -namespace GLEAN { - -#define NUM_POINTS 1000 -#define WINDOW_SIZE 100 - -class VertArrayBGRAResult: public BaseResult -{ -public: - VertArrayBGRAResult(); - - virtual void putresults(ostream& s) const; - virtual bool getresults(istream& s); - - bool pass; -}; - - -class VertArrayBGRATest: public BaseTest<VertArrayBGRAResult> -{ -public: - GLEAN_CLASS_WH(VertArrayBGRATest, VertArrayBGRAResult, - WINDOW_SIZE, WINDOW_SIZE); - -private: - float mPos[NUM_POINTS][2]; - GLubyte mRGBA[NUM_POINTS][4]; - GLubyte mBGRA[NUM_POINTS][4]; - - void reportError(const char *msg); - bool testAPI(void); - void setupPoints(void); - void renderPoints(bool useBGRA); -}; - -} // namespace GLEAN - -#endif // __tvertarraybgra_h__ - diff --git a/tests/glean/tvertattrib.cpp b/tests/glean/tvertattrib.cpp deleted file mode 100644 index e18077aa6..000000000 --- a/tests/glean/tvertattrib.cpp +++ /dev/null @@ -1,1398 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 1999 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 - - -// tvertattrib.cpp: Test vertex attribute functions. -// -// Indexed vertex attributes may either alias with conventional attributes -// or name a separate set of generic attributes. The following extensions/ -// versions are tested (and whether aliasing is allowed): -// GL_NV_vertex_program (aliasing required) -// GL_ARB_vertex_program (aliasing optional) -// GL_ARB_vertex_shader (aliasing disallowed) -// OpenGL 2.0 (aliasing disallowed) -// -// If either GL_ARB_vertex_shader or OpenGL 2.0 is supported, that means -// aliasing is required for GL_ARB_vertex_program too. -// -// We test both immediate mode and display list mode. -// -// Author: Brian Paul (brian.paul a t tungstengraphics.com) October 2004 - - -#include <stdlib.h> -#include <cassert> -#include <math.h> -#include "tvertattrib.h" -#include "glutils.h" - -namespace GLEAN { - -#define COPY1(DST, SRC) DST[0] = SRC[0]; DST[1] = 0.0F; DST[2] = 0.0F; DST[3] = 1.0F - -#define COPY2(DST, SRC) DST[0] = SRC[0]; DST[1] = SRC[1]; DST[2] = 0.0F; DST[3] = 1.0F - -#define COPY3(DST, SRC) DST[0] = SRC[0]; DST[1] = SRC[1]; DST[2] = SRC[2]; DST[3] = 1.0F - -#define COPY4(DST, SRC) DST[0] = SRC[0]; DST[1] = SRC[1]; DST[2] = SRC[2]; DST[3] = SRC[3] - -#define FLOAT_TO_BYTE(X) ( (((GLint) (255.0F * (X))) - 1) / 2 ) - -#define FLOAT_TO_UBYTE(X) ((GLubyte) (GLint) ((X) * 255.0F)) - -#define FLOAT_TO_SHORT(X) ( (((GLint) (65535.0F * (X))) - 1) / 2 ) - -#define FLOAT_TO_USHORT(X) ((GLushort) (GLint) ((X) * 65535.0F)) - -#define FLOAT_TO_INT(X) ( (GLint) (2147483647.0 * (X)) ) - -#define FLOAT_TO_UINT(X) ((GLuint) ((X) * 4294967295.0)) - - -#define NUM_NV_ATTRIB_FUNCS 26 -#define NUM_ARB_ATTRIB_FUNCS 36 -#define NUM_2_0_ATTRIB_FUNCS 36 - -static const char * -AttribFuncNames[] = { - "glVertexAttrib1fNV", - "glVertexAttrib2fNV", - "glVertexAttrib3fNV", - "glVertexAttrib4fNV", - "glVertexAttrib1fvNV", - "glVertexAttrib2fvNV", - "glVertexAttrib3fvNV", - "glVertexAttrib4fvNV", - "glVertexAttrib1dNV", - "glVertexAttrib2dNV", - "glVertexAttrib3dNV", - "glVertexAttrib4dNV", - "glVertexAttrib1dvNV", - "glVertexAttrib2dvNV", - "glVertexAttrib3dvNV", - "glVertexAttrib4dvNV", - "glVertexAttrib1sNV", - "glVertexAttrib2sNV", - "glVertexAttrib3sNV", - "glVertexAttrib4sNV", - "glVertexAttrib1svNV", - "glVertexAttrib2svNV", - "glVertexAttrib3svNV", - "glVertexAttrib4svNV", - "glVertexAttrib4ubNV", - "glVertexAttrib4ubvNV", - - "glVertexAttrib1fARB", - "glVertexAttrib2fARB", - "glVertexAttrib3fARB", - "glVertexAttrib4fARB", - "glVertexAttrib1fvARB", - "glVertexAttrib2fvARB", - "glVertexAttrib3fvARB", - "glVertexAttrib4fvARB", - "glVertexAttrib1dARB", - "glVertexAttrib2dARB", - "glVertexAttrib3dARB", - "glVertexAttrib4dARB", - "glVertexAttrib1dvARB", - "glVertexAttrib2dvARB", - "glVertexAttrib3dvARB", - "glVertexAttrib4dvARB", - "glVertexAttrib1sARB", - "glVertexAttrib2sARB", - "glVertexAttrib3sARB", - "glVertexAttrib4sARB", - "glVertexAttrib1svARB", - "glVertexAttrib2svARB", - "glVertexAttrib3svARB", - "glVertexAttrib4svARB", - "glVertexAttrib4NsvARB", - "glVertexAttrib4NubARB", - "glVertexAttrib4NubvARB", - "glVertexAttrib4ubvARB", - "glVertexAttrib4NbvARB", - "glVertexAttrib4bvARB", - "glVertexAttrib4NivARB", - "glVertexAttrib4ivARB", - "glVertexAttrib4NuivARB", - "glVertexAttrib4uivARB", - "glVertexAttrib4NusvARB", - "glVertexAttrib4usvARB", - - "glVertexAttrib1f", - "glVertexAttrib2f", - "glVertexAttrib3f", - "glVertexAttrib4f", - "glVertexAttrib1fv", - "glVertexAttrib2fv", - "glVertexAttrib3fv", - "glVertexAttrib4fv", - "glVertexAttrib1d", - "glVertexAttrib2d", - "glVertexAttrib3d", - "glVertexAttrib4d", - "glVertexAttrib1dv", - "glVertexAttrib2dv", - "glVertexAttrib3dv", - "glVertexAttrib4dv", - "glVertexAttrib1s", - "glVertexAttrib2s", - "glVertexAttrib3s", - "glVertexAttrib4s", - "glVertexAttrib1sv", - "glVertexAttrib2sv", - "glVertexAttrib3sv", - "glVertexAttrib4sv", - "glVertexAttrib4Nsv", - "glVertexAttrib4Nub", - "glVertexAttrib4Nubv", - "glVertexAttrib4ubv", - "glVertexAttrib4Nbv", - "glVertexAttrib4bv", - "glVertexAttrib4Niv", - "glVertexAttrib4iv", - "glVertexAttrib4Nuiv", - "glVertexAttrib4uiv", - "glVertexAttrib4Nusv", - "glVertexAttrib4usv" -}; - - -// Set a vertex attribute with one of the many glVertexAttrib* functions. -// index = the vertex attribute -// v = the 4-element attribute value -// funcIndex = indicates which glVertexAttrib* function to use -// refOut = returns the value which should now be in the attribute register -// -static void -SetAttrib(GLuint index, const GLfloat v[4], GLuint funcIndex, GLfloat refOut[4]) -{ - switch (funcIndex) { - // ** GLfloat-valued functions -#if defined(GL_NV_vertex_program) - case 0: - { - glVertexAttrib1fNV(index, v[0]); - COPY1(refOut, v); - } - break; - case 1: - { - glVertexAttrib2fNV(index, v[0], v[1]); - COPY2(refOut, v); - } - break; - case 2: - { - glVertexAttrib3fNV(index, v[0], v[1], v[2]); - COPY3(refOut, v); - } - break; - case 3: - { - glVertexAttrib4fNV(index, v[0], v[1], v[2], v[3]); - COPY4(refOut, v); - } - break; - case 4: - { - glVertexAttrib1fvNV(index, v); - COPY1(refOut, v); - } - break; - case 5: - { - glVertexAttrib2fvNV(index, v); - COPY2(refOut, v); - } - break; - case 6: - { - glVertexAttrib3fvNV(index, v); - COPY3(refOut, v); - } - break; - case 7: - { - glVertexAttrib4fvNV(index, v); - COPY4(refOut, v); - } - break; - // ** GLdouble-valued functions - case 8: - { - glVertexAttrib1dNV(index, v[0]); - COPY1(refOut, v); - } - break; - case 9: - { - glVertexAttrib2dNV(index, v[0], v[1]); - COPY2(refOut, v); - } - break; - case 10: - { - glVertexAttrib3dNV(index, v[0], v[1], v[2]); - COPY3(refOut, v); - } - break; - case 11: - { - glVertexAttrib4dNV(index, v[0], v[1], v[2], v[3]); - COPY4(refOut, v); - } - break; - case 12: - { - GLdouble d[1]; - d[0] = v[0]; - glVertexAttrib1dvNV(index, d); - COPY1(refOut, v); - } - break; - case 13: - { - GLdouble d[2]; - d[0] = v[0]; - d[1] = v[1]; - glVertexAttrib2dvNV(index, d); - COPY2(refOut, v); - } - break; - case 14: - { - GLdouble d[3]; - d[0] = v[0]; - d[1] = v[1]; - d[2] = v[2]; - glVertexAttrib3dvNV(index, d); - COPY3(refOut, v); - } - break; - case 15: - { - GLdouble d[4]; - d[0] = v[0]; - d[1] = v[1]; - d[2] = v[2]; - d[3] = v[3]; - glVertexAttrib4dvNV(index, d); - COPY4(refOut, v); - } - break; - // ** GLshort-valued functions - case 16: - { - glVertexAttrib1sNV(index, (GLshort) v[0]); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = 0.0F; - refOut[2] = 0.0F; - refOut[3] = 1.0F; - } - break; - case 17: - { - glVertexAttrib2sNV(index, (GLshort) v[0], (GLshort) v[1]); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = 0.0F; - refOut[3] = 1.0F; - } - break; - case 18: - { - glVertexAttrib3sNV(index, (GLshort) v[0], (GLshort) v[1], (GLshort) v[2]); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = (GLfloat) (GLshort) v[2]; - refOut[3] = 1.0F; - } - break; - case 19: - { - glVertexAttrib4sNV(index, (GLshort) v[0], (GLshort) v[1], (GLshort) v[2], (GLshort) v[3]); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = (GLfloat) (GLshort) v[2]; - refOut[3] = (GLfloat) (GLshort) v[3]; - } - break; - case 20: - { - GLshort s[1]; - s[0] = (GLshort) v[0]; - glVertexAttrib1svNV(index, s); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = 0.0F; - refOut[2] = 0.0F; - refOut[3] = 1.0F; - } - break; - case 21: - { - GLshort s[2]; - s[0] = (GLshort) v[0]; - s[1] = (GLshort) v[1]; - glVertexAttrib2svNV(index, s); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = 0.0F; - refOut[3] = 1.0F; - } - break; - case 22: - { - GLshort s[3]; - s[0] = (GLshort) v[0]; - s[1] = (GLshort) v[1]; - s[2] = (GLshort) v[2]; - glVertexAttrib3svNV(index, s); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = (GLfloat) (GLshort) v[2]; - refOut[3] = 1.0F; - } - break; - case 23: - { - GLshort s[4]; - s[0] = (GLshort) v[0]; - s[1] = (GLshort) v[1]; - s[2] = (GLshort) v[2]; - s[3] = (GLshort) v[3]; - glVertexAttrib4svNV(index, s); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = (GLfloat) (GLshort) v[2]; - refOut[3] = (GLfloat) (GLshort) v[3]; - } - break; - // ** GLubyte-valued functions - case 24: - { - glVertexAttrib4ubNV(index, FLOAT_TO_UBYTE(v[0]), FLOAT_TO_UBYTE(v[1]), FLOAT_TO_UBYTE(v[2]), FLOAT_TO_UBYTE(v[3])); - refOut[0] = v[0]; - refOut[1] = v[1]; - refOut[2] = v[2]; - refOut[3] = v[3]; - } - break; - case 25: - { - GLubyte ub[4]; - for (int i = 0; i < 4; i++ ) - ub[i] = FLOAT_TO_UBYTE(v[i]); - glVertexAttrib4ubvNV(index, ub); - refOut[0] = v[0]; - refOut[1] = v[1]; - refOut[2] = v[2]; - refOut[3] = v[3]; - } - break; - /* XXX Also test glVertexAttribs* functions? */ -#endif - -#if defined(GL_ARB_vertex_program) || defined (GL_ARB_vertex_shader) - // ** GLfloat-valued functions - case 26: - { - glVertexAttrib1fARB(index, v[0]); - COPY1(refOut, v); - } - break; - case 27: - { - glVertexAttrib2fARB(index, v[0], v[1]); - COPY2(refOut, v); - } - break; - case 28: - { - glVertexAttrib3fARB(index, v[0], v[1], v[2]); - COPY3(refOut, v); - } - break; - case 29: - { - glVertexAttrib4fARB(index, v[0], v[1], v[2], v[3]); - COPY4(refOut, v); - } - break; - case 30: - { - glVertexAttrib1fvARB(index, v); - COPY1(refOut, v); - } - break; - case 31: - { - glVertexAttrib2fvARB(index, v); - COPY2(refOut, v); - } - break; - case 32: - { - glVertexAttrib3fvARB(index, v); - COPY3(refOut, v); - } - break; - case 33: - { - glVertexAttrib4fvARB(index, v); - COPY4(refOut, v); - } - break; - // ** GLdouble-valued functions - case 34: - { - glVertexAttrib1dARB(index, v[0]); - COPY1(refOut, v); - } - break; - case 35: - { - glVertexAttrib2dARB(index, v[0], v[1]); - COPY2(refOut, v); - } - break; - case 36: - { - glVertexAttrib3dARB(index, v[0], v[1], v[2]); - COPY3(refOut, v); - } - break; - case 37: - { - glVertexAttrib4dARB(index, v[0], v[1], v[2], v[3]); - COPY4(refOut, v); - } - break; - case 38: - { - GLdouble d[1]; - d[0] = v[0]; - glVertexAttrib1dvARB(index, d); - COPY1(refOut, v); - } - break; - case 39: - { - GLdouble d[2]; - d[0] = v[0]; - d[1] = v[1]; - glVertexAttrib2dvARB(index, d); - COPY2(refOut, v); - } - break; - case 40: - { - GLdouble d[3]; - d[0] = v[0]; - d[1] = v[1]; - d[2] = v[2]; - glVertexAttrib3dvARB(index, d); - COPY3(refOut, v); - } - break; - case 41: - { - GLdouble d[4]; - d[0] = v[0]; - d[1] = v[1]; - d[2] = v[2]; - d[3] = v[3]; - glVertexAttrib4dvARB(index, d); - COPY4(refOut, v); - } - break; - // ** GLshort-valued functions - case 42: - { - glVertexAttrib1sARB(index, (GLshort) v[0]); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = 0.0F; - refOut[2] = 0.0F; - refOut[3] = 1.0F; - } - break; - case 43: - { - glVertexAttrib2sARB(index, (GLshort) v[0], (GLshort) v[1]); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = 0.0F; - refOut[3] = 1.0F; - } - break; - case 44: - { - glVertexAttrib3sARB(index, (GLshort) v[0], (GLshort) v[1], (GLshort) v[2]); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = (GLfloat) (GLshort) v[2]; - refOut[3] = 1.0F; - } - break; - case 45: - { - glVertexAttrib4sARB(index, (GLshort) v[0], (GLshort) v[1], (GLshort) v[2], (GLshort) v[3]); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = (GLfloat) (GLshort) v[2]; - refOut[3] = (GLfloat) (GLshort) v[3]; - } - break; - case 46: - { - GLshort s[1]; - s[0] = (GLshort) v[0]; - glVertexAttrib1svARB(index, s); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = 0.0F; - refOut[2] = 0.0F; - refOut[3] = 1.0F; - } - break; - case 47: - { - GLshort s[2]; - s[0] = (GLshort) v[0]; - s[1] = (GLshort) v[1]; - glVertexAttrib2svARB(index, s); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = 0.0F; - refOut[3] = 1.0F; - } - break; - case 48: - { - GLshort s[3]; - s[0] = (GLshort) v[0]; - s[1] = (GLshort) v[1]; - s[2] = (GLshort) v[2]; - glVertexAttrib3svARB(index, s); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = (GLfloat) (GLshort) v[2]; - refOut[3] = 1.0F; - } - break; - case 49: - { - GLshort s[4]; - s[0] = (GLshort) v[0]; - s[1] = (GLshort) v[1]; - s[2] = (GLshort) v[2]; - s[3] = (GLshort) v[3]; - glVertexAttrib4svARB(index, s); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = (GLfloat) (GLshort) v[2]; - refOut[3] = (GLfloat) (GLshort) v[3]; - } - break; - case 50: - { - GLshort s[4]; - for (int i = 0; i < 4; i++) - s[i] = FLOAT_TO_SHORT(v[i]); - glVertexAttrib4NsvARB(index, s); - COPY4(refOut, v); - } - break; - // ** GLubyte-valued functions - case 51: - { - glVertexAttrib4NubARB(index, FLOAT_TO_UBYTE(v[0]), FLOAT_TO_UBYTE(v[1]), FLOAT_TO_UBYTE(v[2]), FLOAT_TO_UBYTE(v[3])); - COPY4(refOut, v); - } - break; - case 52: - { - GLubyte ub[4]; - for (int i = 0; i < 4; i++ ) - ub[i] = FLOAT_TO_UBYTE(v[i]); - glVertexAttrib4NubvARB(index, ub); - COPY4(refOut, v); - } - break; - case 53: - { - GLubyte ub[4]; - for (int i = 0; i < 4; i++ ) - ub[i] = (GLubyte) v[i]; - glVertexAttrib4ubvARB(index, ub); - refOut[0] = (GLfloat) (GLubyte) v[0]; - refOut[1] = (GLfloat) (GLubyte) v[1]; - refOut[2] = (GLfloat) (GLubyte) v[2]; - refOut[3] = (GLfloat) (GLubyte) v[3]; - } - break; - // ** GLbyte-valued functions - case 54: - { - GLbyte b[4]; - for (int i = 0; i < 4; i++ ) - b[i] = FLOAT_TO_BYTE(v[i]); - glVertexAttrib4NbvARB(index, b); - COPY4(refOut, v); - } - break; - case 55: - { - GLbyte b[4]; - for (int i = 0; i < 4; i++ ) - b[i] = (GLbyte) v[i]; - glVertexAttrib4bvARB(index, b); - refOut[0] = (GLfloat) (GLbyte) v[0]; - refOut[1] = (GLfloat) (GLbyte) v[1]; - refOut[2] = (GLfloat) (GLbyte) v[2]; - refOut[3] = (GLfloat) (GLbyte) v[3]; - } - break; - // ** GLint-valued functions - case 56: - { - GLint iv[4]; - for (int i = 0; i < 4; i++ ) - iv[i] = FLOAT_TO_INT(v[i]); - glVertexAttrib4NivARB(index, iv); - COPY4(refOut, v); - } - break; - case 57: - { - GLint iv[4]; - for (int i = 0; i < 4; i++ ) - iv[i] = (GLint) v[i]; - glVertexAttrib4ivARB(index, iv); - refOut[0] = (GLfloat) (GLint) v[0]; - refOut[1] = (GLfloat) (GLint) v[1]; - refOut[2] = (GLfloat) (GLint) v[2]; - refOut[3] = (GLfloat) (GLint) v[3]; - } - break; - // ** GLuint-valued functions - case 58: - { - GLuint ui[4]; - for (int i = 0; i < 4; i++ ) - ui[i] = FLOAT_TO_UINT(v[i]); - glVertexAttrib4NuivARB(index, ui); - COPY4(refOut, v); - } - break; - case 59: - { - GLuint ui[4]; - for (int i = 0; i < 4; i++ ) - ui[i] = (GLint) v[i]; - glVertexAttrib4uivARB(index, ui); - refOut[0] = (GLfloat) (GLint) v[0]; - refOut[1] = (GLfloat) (GLint) v[1]; - refOut[2] = (GLfloat) (GLint) v[2]; - refOut[3] = (GLfloat) (GLint) v[3]; - } - break; - // ** GLushort-valued functions - case 60: - { - GLushort us[4]; - for (int i = 0; i < 4; i++ ) - us[i] = FLOAT_TO_USHORT(v[i]); - glVertexAttrib4NusvARB(index, us); - COPY4(refOut, v); - } - break; - case 61: - { - GLushort us[4]; - for (int i = 0; i < 4; i++ ) - us[i] = (GLint) v[i]; - glVertexAttrib4usvARB(index, us); - refOut[0] = (GLfloat) (GLint) v[0]; - refOut[1] = (GLfloat) (GLint) v[1]; - refOut[2] = (GLfloat) (GLint) v[2]; - refOut[3] = (GLfloat) (GLint) v[3]; - } - break; -#endif - -#if defined(GL_VERSION_2_0) - case 62: - { - glVertexAttrib1f(index, v[0]); - COPY1(refOut, v); - } - break; - case 63: - { - glVertexAttrib2f(index, v[0], v[1]); - COPY2(refOut, v); - } - break; - case 64: - { - glVertexAttrib3f(index, v[0], v[1], v[2]); - COPY3(refOut, v); - } - break; - case 65: - { - glVertexAttrib4f(index, v[0], v[1], v[2], v[3]); - COPY4(refOut, v); - } - break; - case 66: - { - glVertexAttrib1fv(index, v); - COPY1(refOut, v); - } - break; - case 67: - { - glVertexAttrib2fv(index, v); - COPY2(refOut, v); - } - break; - case 68: - { - glVertexAttrib3fv(index, v); - COPY3(refOut, v); - } - break; - case 69: - { - glVertexAttrib4fv(index, v); - COPY4(refOut, v); - } - break; - // ** GLdouble-valued functions - case 70: - { - glVertexAttrib1d(index, v[0]); - COPY1(refOut, v); - } - break; - case 71: - { - glVertexAttrib2d(index, v[0], v[1]); - COPY2(refOut, v); - } - break; - case 72: - { - glVertexAttrib3d(index, v[0], v[1], v[2]); - COPY3(refOut, v); - } - break; - case 73: - { - glVertexAttrib4d(index, v[0], v[1], v[2], v[3]); - COPY4(refOut, v); - } - break; - case 74: - { - GLdouble d[1]; - d[0] = v[0]; - glVertexAttrib1dv(index, d); - COPY1(refOut, v); - } - break; - case 75: - { - GLdouble d[2]; - d[0] = v[0]; - d[1] = v[1]; - glVertexAttrib2dv(index, d); - COPY2(refOut, v); - } - break; - case 76: - { - GLdouble d[3]; - d[0] = v[0]; - d[1] = v[1]; - d[2] = v[2]; - glVertexAttrib3dv(index, d); - COPY3(refOut, v); - } - break; - case 77: - { - GLdouble d[4]; - d[0] = v[0]; - d[1] = v[1]; - d[2] = v[2]; - d[3] = v[3]; - glVertexAttrib4dv(index, d); - COPY4(refOut, v); - } - break; - // ** GLshort-valued functions - case 78: - { - glVertexAttrib1s(index, (GLshort) v[0]); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = 0.0F; - refOut[2] = 0.0F; - refOut[3] = 1.0F; - } - break; - case 79: - { - glVertexAttrib2s(index, (GLshort) v[0], (GLshort) v[1]); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = 0.0F; - refOut[3] = 1.0F; - } - break; - case 80: - { - glVertexAttrib3s(index, (GLshort) v[0], (GLshort) v[1], (GLshort) v[2]); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = (GLfloat) (GLshort) v[2]; - refOut[3] = 1.0F; - } - break; - case 81: - { - glVertexAttrib4s(index, (GLshort) v[0], (GLshort) v[1], (GLshort) v[2], (GLshort) v[3]); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = (GLfloat) (GLshort) v[2]; - refOut[3] = (GLfloat) (GLshort) v[3]; - } - break; - case 82: - { - GLshort s[1]; - s[0] = (GLshort) v[0]; - glVertexAttrib1sv(index, s); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = 0.0F; - refOut[2] = 0.0F; - refOut[3] = 1.0F; - } - break; - case 83: - { - GLshort s[2]; - s[0] = (GLshort) v[0]; - s[1] = (GLshort) v[1]; - glVertexAttrib2sv(index, s); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = 0.0F; - refOut[3] = 1.0F; - } - break; - case 84: - { - GLshort s[3]; - s[0] = (GLshort) v[0]; - s[1] = (GLshort) v[1]; - s[2] = (GLshort) v[2]; - glVertexAttrib3sv(index, s); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = (GLfloat) (GLshort) v[2]; - refOut[3] = 1.0F; - } - break; - case 85: - { - GLshort s[4]; - s[0] = (GLshort) v[0]; - s[1] = (GLshort) v[1]; - s[2] = (GLshort) v[2]; - s[3] = (GLshort) v[3]; - glVertexAttrib4sv(index, s); - refOut[0] = (GLfloat) (GLshort) v[0]; - refOut[1] = (GLfloat) (GLshort) v[1]; - refOut[2] = (GLfloat) (GLshort) v[2]; - refOut[3] = (GLfloat) (GLshort) v[3]; - } - break; - case 86: - { - GLshort s[4]; - for (int i = 0; i < 4; i++) - s[i] = FLOAT_TO_SHORT(v[i]); - glVertexAttrib4Nsv(index, s); - COPY4(refOut, v); - } - break; - // ** GLubyte-valued functions - case 87: - { - glVertexAttrib4Nub(index, FLOAT_TO_UBYTE(v[0]), FLOAT_TO_UBYTE(v[1]), FLOAT_TO_UBYTE(v[2]), FLOAT_TO_UBYTE(v[3])); - COPY4(refOut, v); - } - break; - case 88: - { - GLubyte ub[4]; - for (int i = 0; i < 4; i++ ) - ub[i] = FLOAT_TO_UBYTE(v[i]); - glVertexAttrib4Nubv(index, ub); - COPY4(refOut, v); - } - break; - case 89: - { - GLubyte ub[4]; - for (int i = 0; i < 4; i++ ) - ub[i] = (GLubyte) v[i]; - glVertexAttrib4ubv(index, ub); - refOut[0] = (GLfloat) (GLubyte) v[0]; - refOut[1] = (GLfloat) (GLubyte) v[1]; - refOut[2] = (GLfloat) (GLubyte) v[2]; - refOut[3] = (GLfloat) (GLubyte) v[3]; - } - break; - // ** GLbyte-valued functions - case 90: - { - GLbyte b[4]; - for (int i = 0; i < 4; i++ ) - b[i] = FLOAT_TO_BYTE(v[i]); - glVertexAttrib4Nbv(index, b); - COPY4(refOut, v); - } - break; - case 91: - { - GLbyte b[4]; - for (int i = 0; i < 4; i++ ) - b[i] = (GLbyte) v[i]; - glVertexAttrib4bv(index, b); - refOut[0] = (GLfloat) (GLbyte) v[0]; - refOut[1] = (GLfloat) (GLbyte) v[1]; - refOut[2] = (GLfloat) (GLbyte) v[2]; - refOut[3] = (GLfloat) (GLbyte) v[3]; - } - break; - // ** GLint-valued functions - case 92: - { - GLint iv[4]; - for (int i = 0; i < 4; i++ ) - iv[i] = FLOAT_TO_INT(v[i]); - glVertexAttrib4Niv(index, iv); - COPY4(refOut, v); - } - break; - case 93: - { - GLint iv[4]; - for (int i = 0; i < 4; i++ ) - iv[i] = (GLint) v[i]; - glVertexAttrib4iv(index, iv); - refOut[0] = (GLfloat) (GLint) v[0]; - refOut[1] = (GLfloat) (GLint) v[1]; - refOut[2] = (GLfloat) (GLint) v[2]; - refOut[3] = (GLfloat) (GLint) v[3]; - } - break; - // ** GLuint-valued functions - case 94: - { - GLuint ui[4]; - for (int i = 0; i < 4; i++ ) - ui[i] = FLOAT_TO_UINT(v[i]); - glVertexAttrib4Nuiv(index, ui); - COPY4(refOut, v); - } - break; - case 95: - { - GLuint ui[4]; - for (int i = 0; i < 4; i++ ) - ui[i] = (GLint) v[i]; - glVertexAttrib4uiv(index, ui); - refOut[0] = (GLfloat) (GLint) v[0]; - refOut[1] = (GLfloat) (GLint) v[1]; - refOut[2] = (GLfloat) (GLint) v[2]; - refOut[3] = (GLfloat) (GLint) v[3]; - } - break; - // ** GLushort-valued functions - case 96: - { - GLushort us[4]; - for (int i = 0; i < 4; i++ ) - us[i] = FLOAT_TO_USHORT(v[i]); - glVertexAttrib4Nusv(index, us); - COPY4(refOut, v); - } - break; - case 97: - { - GLushort us[4]; - for (int i = 0; i < 4; i++ ) - us[i] = (GLint) v[i]; - glVertexAttrib4usv(index, us); - refOut[0] = (GLfloat) (GLint) v[0]; - refOut[1] = (GLfloat) (GLint) v[1]; - refOut[2] = (GLfloat) (GLint) v[2]; - refOut[3] = (GLfloat) (GLint) v[3]; - } - break; -#endif - - default: - // never get here! - abort(); - } - - assert(98 == NUM_NV_ATTRIB_FUNCS + NUM_ARB_ATTRIB_FUNCS + NUM_2_0_ATTRIB_FUNCS); -} - - -// Test if 'a and 'b' are within an epsilon of each other -static bool -NearlyEqual(const GLfloat a[4], const GLfloat b[4]) -{ - const GLfloat epsilon = 0.05; - if (fabsf(a[0] - b[0]) > epsilon || - fabsf(a[1] - b[1]) > epsilon || - fabsf(a[2] - b[2]) > epsilon || - fabsf(a[3] - b[3]) > epsilon) - return 0; - else - return 1; -} - - -void VertAttribTest::FailMessage(VertAttribResult &r, const char *msg, - const char *func, int dlistMode) const -{ - // record the failure - r.pass = false; - - // print the message - env->log << name << ": FAIL " - << r.config->conciseDescription() << '\n'; - env->log << "\t" << msg << " (Testing " << func << " in "; - - if (dlistMode) - env->log << "display list mode)\n"; - else - env->log << "immediate mode)\n"; -} - - - -// Test setting/getting a set of vertex attribute values -// Return true if pass, false if fail -bool -VertAttribTest::TestAttribs(VertAttribResult &r, - int attribFunc, - Aliasing aliasing, - int numAttribs) -{ - static const GLfloat refValues[7] = { 1.0F, 0.8F, 0.6F, 0.5F, 0.4F, 0.2F, 0.0F }; - GLfloat refValue[32][4]; - GLfloat refOut[32][4]; - bool result = true; - - assert(numAttribs <= 32); - - // Initialize the refValue array - int refIndex = 0; - for (int i = 1; i < numAttribs; i++) { - refValue[i][0] = refValues[refIndex++ % 7]; - refValue[i][1] = refValues[refIndex++ % 7]; - refValue[i][2] = refValues[refIndex++ % 7]; - refValue[i][3] = refValues[refIndex++ % 7]; - } - - for (int dlist = 0; dlist < 2; dlist++) { - - // set a couple conventional attribs for later aliasing tests - glNormal3f(-1.0F, -2.0F, -3.0F); - glTexCoord4f(-1.0F, -2.0F, -3.0F, -4.0F); - - if (dlist == 1) { - glNewList(42, GL_COMPILE); - } - - // Set all the vertex attributes - for (int i = 1; i < numAttribs; i++) { - SetAttrib(i, refValue[i], attribFunc, refOut[i]); - } - - if (dlist == 1) { - glEndList(); - glCallList(42); - } - - // Test all the vertex attributes - for (int i = 1; i < numAttribs; i++) { - const GLfloat *expected = refOut[i]; - GLfloat v[4]; - glGetVertexAttribfvNV(i, GL_CURRENT_VERTEX_ATTRIB_ARB, v); - if (!NearlyEqual(v, expected)) { - char msg[1000]; - sprintf(msg, "Vertex Attribute %d is (%g, %g, %g, %g) but expected (%g, %g, %g, %g)", - i, v[0], v[1], v[2], v[3], - expected[0], expected[1], expected[2], expected[3]); - FailMessage(r, msg, AttribFuncNames[attribFunc], dlist); - result = false; - } - } - - if (aliasing == REQUIRED) { - // spot check a few aliased attribs - GLfloat v[4]; - glGetFloatv(GL_CURRENT_NORMAL, v); - v[3] = refOut[2][3]; - if (!NearlyEqual(v, refOut[2])) { - FailMessage(r, "Setting attribute 2 did not update GL_CURRENT_NORMAL", AttribFuncNames[attribFunc], dlist); - result = false; - } - - glGetFloatv(GL_CURRENT_TEXTURE_COORDS, v); - if (!NearlyEqual(v, refOut[8])) { - FailMessage(r, "Setting attribute 8 did not update GL_CURRENT_TEXTURE_COORDS", AttribFuncNames[attribFunc], dlist); - result = false; - } - } - else if (aliasing == DISALLOWED) { - // spot check a few non-aliased attribs - GLfloat v[4]; - glGetFloatv(GL_CURRENT_NORMAL, v); - if (v[0] != -1.0F || - v[1] != -2.0F || - v[2] != -3.0F) { - FailMessage(r, "GL_CURRENT_NORMAL was erroneously set by a glVertexAttrib call", AttribFuncNames[attribFunc], dlist); - result = false; - } - glGetFloatv(GL_CURRENT_TEXTURE_COORDS, v); - if (v[0] != -1.0F || - v[1] != -2.0F || - v[2] != -3.0F || - v[3] != -4.0F) { - FailMessage(r, "GL_CURRENT_TEXTURE_COORDS was erroneously set by a glVertexAttrib call", AttribFuncNames[attribFunc], dlist); - result = false; - } - } - - } // dlist loop - - return result; -} - - -// Test the GL_NV_vertex_program functions -// Return true if pass, false if fail -bool -VertAttribTest::TestNVfuncs(VertAttribResult &r) -{ - bool result = true; -#ifdef GL_NV_vertex_program - const GLint numAttribs = 16; - const Aliasing aliasing = REQUIRED; - - r.numNVtested = 0; - - for (int attribFunc = 0; attribFunc < NUM_NV_ATTRIB_FUNCS; attribFunc++) { - bool b; - b = TestAttribs(r, attribFunc, aliasing, numAttribs); - if (!b) - result = false; - r.numNVtested++; - } -#else - (void) r; -#endif - return result; -} - - -// Test the GL_ARB_vertex_program/shader functions -// Return true if pass, false if fail -bool -VertAttribTest::TestARBfuncs(VertAttribResult &r, bool shader) -{ - bool result = true; -#if defined(GL_ARB_vertex_program) || defined(GL_ARB_vertex_shader) - GLint numAttribs; - - glGetIntegerv(GL_MAX_VERTEX_ATTRIBS_ARB, &numAttribs); - assert(numAttribs > 0); - - r.numARBtested = 0; - - if (shader) { - // test GL_ARB_vertex_shader (aliasing is disallowed) - const Aliasing aliasing = DISALLOWED; - for (int i = 0; i < NUM_ARB_ATTRIB_FUNCS; i++) { - int attribFunc = NUM_NV_ATTRIB_FUNCS + i; - bool b; - b = TestAttribs(r, attribFunc, aliasing, numAttribs); - if (!b) - result = false; - r.numARBtested++; - } - } - else { - // test GL_ARB_vertex_program: - // Determine if attribute aliasing is allowed - Aliasing aliasing; - if (GLUtils::haveExtension("GL_ARB_vertex_shader")) { - aliasing = DISALLOWED; - } - else { - // check for OpenGL 2.x support - char *vers = (char *) glGetString(GL_VERSION); - if (vers[0] == '2' && vers[1] == '.') { - aliasing = DISALLOWED; - } - else { - assert(vers[0] == '1'); /* revisit when we have OpenGL 3.x */ - aliasing = OPTIONAL; - } - } - for (int i = 0; i < NUM_ARB_ATTRIB_FUNCS; i++) { - int attribFunc = NUM_NV_ATTRIB_FUNCS + i; - bool b; - b = TestAttribs(r, attribFunc, aliasing, numAttribs); - if (!b) - result = false; - r.numARBtested++; - } - } -#else - (void) r; -#endif - return result; -} - - -// Test the OpenGL 2.x glVertexAttrib functions -// Return true if pass, false if fail -bool -VertAttribTest::Test20funcs(VertAttribResult &r) -{ - bool result = true; -#ifdef GL_VERSION_2_0 - GLint numAttribs; - const Aliasing aliasing = DISALLOWED; - - glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &numAttribs); - assert(numAttribs > 0); - - r.num20tested = 0; - - for (int i = 0; i < NUM_2_0_ATTRIB_FUNCS; i++) { - int attribFunc = NUM_NV_ATTRIB_FUNCS + NUM_ARB_ATTRIB_FUNCS+ i; - bool b; - b = TestAttribs(r, attribFunc, aliasing, numAttribs); - if (!b) - result = false; - r.num20tested++; - } -#else - (void) r; -#endif - return result; -} - - -void -VertAttribTest::runOne(VertAttribResult& r, Window&) -{ - - assert(sizeof(AttribFuncNames) / sizeof(AttribFuncNames[0]) == - NUM_NV_ATTRIB_FUNCS + NUM_ARB_ATTRIB_FUNCS + NUM_2_0_ATTRIB_FUNCS); - - r.pass = true; -#ifdef GL_NV_vertex_program - if (GLUtils::haveExtension("GL_NV_vertex_program")) { - bool p = TestNVfuncs(r); - if (!p) - r.pass = false; - } -#endif -#ifdef GL_ARB_vertex_program - if (GLUtils::haveExtension("GL_ARB_vertex_program")) { - bool p = TestARBfuncs(r, false); - if (!p) - r.pass = false; - } -#endif -#ifdef GL_ARB_vertex_shader - if (GLUtils::haveExtension("GL_ARB_vertex_shader")) { - bool p = TestARBfuncs(r, true); - if (!p) - r.pass = false; - } -#endif -#ifdef GL_VERSION_2_0 - const char *vers = (const char *) glGetString(GL_VERSION); - if (vers[0] == '2' && vers[1] == '.') { - bool p = Test20funcs(r); - if (!p) - r.pass = false; - } -#endif -} - - -void -VertAttribTest::logOne(VertAttribResult& r) -{ - logPassFail(r); - logConcise(r); - logStats(r); -} - - -void -VertAttribTest::logStats(VertAttribResult& r) -{ - env->log << "\t" << r.numNVtested << " GL_NV_vertex_program functions tested\n"; - env->log << "\t" << r.numARBtested << " GL_ARB_vertex_program/shader functions tested\n"; - env->log << "\t" << r.num20tested << " OpenGL 2.0 functions tested\n"; -} - - -// Instantiate this test object -VertAttribTest vertAttribTest("vertattrib", "window, rgb", - "Verify that the glVertexAttribNV, glVertexAttribARB, and glVertexAttrib\n" - "functions all work correctly.\n"); - - -} // namespace GLEAN diff --git a/tests/glean/tvertattrib.h b/tests/glean/tvertattrib.h deleted file mode 100644 index ba6964001..000000000 --- a/tests/glean/tvertattrib.h +++ /dev/null @@ -1,95 +0,0 @@ -// BEGIN_COPYRIGHT -*- glean -*- -// -// Copyright (C) 1999 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 - - -#ifndef __tvertattrib_h__ -#define __tvertattrib_h__ - -#include "tbase.h" - -// Avoid name collision on Windows -#undef OPTIONAL - -namespace GLEAN { - - -class VertAttribResult: public BaseResult -{ -public: - bool pass; - int numNVtested, numARBtested, num20tested; - - VertAttribResult() - { - numNVtested = numARBtested = num20tested = 0; - } - - virtual void putresults(ostream& s) const - { - s << pass - << ' ' << numNVtested - << ' ' << numARBtested - << ' ' << num20tested - << '\n'; - } - - virtual bool getresults(istream& s) - { - s >> pass >> numNVtested >> numARBtested >> num20tested; - return s.good(); - } -}; - - -class VertAttribTest: public BaseTest<VertAttribResult> -{ -public: - GLEAN_CLASS(VertAttribTest, VertAttribResult); - virtual void logStats(VertAttribResult& r); - -private: - enum Aliasing { - REQUIRED, - DISALLOWED, - OPTIONAL - }; - - void FailMessage(VertAttribResult &r, const char *msg, - const char *ext, int dlistMode) const; - bool TestAttribs(VertAttribResult &r, - int attribFunc, - Aliasing aliasing, - int numAttribs); - bool TestNVfuncs(VertAttribResult &r); - bool TestARBfuncs(VertAttribResult &r, bool shader); - bool Test20funcs(VertAttribResult &r); -}; - -} // namespace GLEAN - -#endif // __tvertattrib_h__ diff --git a/tests/no_error.py b/tests/no_error.py index e63d3939b..3e063130c 100644 --- a/tests/no_error.py +++ b/tests/no_error.py @@ -21,8 +21,7 @@ profile.test_list = TestDict() # Add a modified version of each PiglitGLTest as a khr_no_error variant. # Shader runner doesn't explitly test for expected errors so we add shader -# tests as is. We actively filter GleanTest instances as well as GLSL parser -# and any other type of tests. +# tests as is. We actively filter GLSL parser and any other type of tests. for name, test in six.iteritems(old_test_list): if isinstance(test, (PiglitGLTest, ShaderTest, MultiShaderTest)): profile.test_list['{} khr_no_error'.format(name)] = test diff --git a/tests/quick.py b/tests/quick.py index 5107d9fe4..1a7d674d0 100644 --- a/tests/quick.py +++ b/tests/quick.py @@ -16,7 +16,7 @@ from __future__ import ( import random from framework import grouptools -from framework.test import (GleanTest, PiglitGLTest) +from framework.test import PiglitGLTest from tests.all import profile as _profile __all__ = ['profile'] @@ -41,8 +41,6 @@ class FilterVsIn(object): profile = _profile.copy() # pylint: disable=invalid-name -GleanTest.GLOBAL_PARAMS += ["--quick"] - # Set the --quick flag on a few image_load_store_tests with profile.test_list.group_manager( PiglitGLTest, |