[Piglit] [PATCH 04/12] Remove texture env combine Glean test
Fabian Bieler
fabianbieler at fastmail.fm
Thu Nov 9 21:27:38 UTC 2017
Replaced by new piglit ext_texture_env_combine-combine test.
---
tests/all.py | 1 -
tests/glean/CMakeLists.gl.txt | 1 -
tests/glean/ttexcombine.cpp | 1715 -----------------------------------------
tests/glean/ttexcombine.h | 137 ----
tests/llvmpipe.py | 1 -
5 files changed, 1855 deletions(-)
delete mode 100644 tests/glean/ttexcombine.cpp
delete mode 100644 tests/glean/ttexcombine.h
diff --git a/tests/all.py b/tests/all.py
index ce52dac..3fd1153 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -303,7 +303,6 @@ with profile.test_list.group_manager(GleanTest, 'glean') as g:
# exactRGBA is not included intentionally, because it's too strict and
# the equivalent functionality is covered by other tests
g('shaderAPI')
- g('texCombine')
g('texCube')
g('texEnv')
g('texgen')
diff --git a/tests/glean/CMakeLists.gl.txt b/tests/glean/CMakeLists.gl.txt
index b082eec..42bcada 100644
--- a/tests/glean/CMakeLists.gl.txt
+++ b/tests/glean/CMakeLists.gl.txt
@@ -36,7 +36,6 @@ piglit_add_executable (glean
tmultitest.cpp
tpixelformats.cpp
tshaderapi.cpp
- ttexcombine.cpp
ttexcombine4.cpp
ttexcube.cpp
ttexenv.cpp
diff --git a/tests/glean/ttexcombine.cpp b/tests/glean/ttexcombine.cpp
deleted file mode 100644
index 1a41c4d..0000000
--- a/tests/glean/ttexcombine.cpp
+++ /dev/null
@@ -1,1715 +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
-
-
-// ttexcombine.cpp: Test the GL_EXT_texture_env_combine extension
-// Author: Brian Paul (brianp at valinux.com) September 2000
-//
-// GL_EXT_texture_env_dot3 extension test
-// Author: Gareth Hughes (gareth at valinux.com) January 2001
-//
-// GL_ARB_texture_env_crossbar extension test
-// Author: Brian Paul (brian at tungstengraphics.com) December 2002
-//
-// The challenge with testing this extension is dealing with combinatorial
-// explosion. There are 16 state variables in this extension:
-//
-// GL_COMBINE_RGB_EXT which has 5 possible values
-// GL_COMBINE_ALPHA_EXT which has 5 possible values
-// GL_SOURCE0_RGB_EXT which has 4 possible values
-// GL_SOURCE1_RGB_EXT which has 4 possible values
-// GL_SOURCE2_RGB_EXT which has 4 possible values
-// GL_SOURCE0_ALPHA_EXT which has 4 possible values
-// GL_SOURCE1_ALPHA_EXT which has 4 possible values
-// GL_SOURCE2_ALPHA_EXT which has 4 possible values
-// GL_OPERAND0_RGB_EXT which has 4 possible values
-// GL_OPERAND1_RGB_EXT which has 4 possible values
-// GL_OPERAND2_RGB_EXT which has 2 possible values
-// GL_OPERAND0_ALPHA_EXT which has 2 possible values
-// GL_OPERAND1_ALPHA_EXT which has 2 possible values
-// GL_OPERAND2_ALPHA_EXT which has 1 possible value
-// GL_RGB_SCALE_EXT which has 3 possible values
-// GL_ALPHA_SCALE which has 3 possible values
-//
-// The product of those values is 117,964,800. And that's just for one
-// texture unit! If we wanted to fully exercise N texture units we'd
-// need to run 117,964,800 ^ N tests! Ideally we'd also like to test
-// with a number of different fragment, texenv and texture colors.
-// Clearly we can't test everything.
-//
-// So, we've partitioned the combination space into subsets defined
-// by the ReplaceParams[], AddParams[], InterpolateParams[], etc arrays.
-// For multitexture, we do an even more limited set of tests: testing
-// all permutations of the 5 combine modes on all texture units.
-//
-// In the future we might look at programs that use the combine
-// extension to see which mode combination are important to them and
-// put them into this test.
-//
-
-#include "ttexcombine.h"
-#include <cassert>
-#include <stdio.h>
-#include <cmath>
-
-#define CLAMP(VAL, MIN, MAX) \
- ((VAL) < (MIN) ? (MIN) : ((VAL) > (MAX) ? (MAX) : (VAL)))
-
-#define COPY4(DST, SRC) \
-{ \
- (DST)[0] = (SRC)[0]; \
- (DST)[1] = (SRC)[1]; \
- (DST)[2] = (SRC)[2]; \
- (DST)[3] = (SRC)[3]; \
-}
-
-
-namespace GLEAN {
-
-//
-// These objects define the space of tex-env combinations that we exercise.
-// Each array element is { state-var, { list of possible values, 0 } }.
-//
-
-TexCombineTest::test_param TexCombineTest::ReplaceParams[] = {
- { GL_COMBINE_RGB_EXT, { GL_REPLACE, 0 } },
- { GL_COMBINE_ALPHA_EXT, { GL_REPLACE, 0 } },
- { GL_SOURCE0_RGB_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_SOURCE0_ALPHA_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_OPERAND0_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND0_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_RGB_SCALE_EXT, { 1, 2, 4, 0 } },
- { GL_ALPHA_SCALE, { 1, 2, 4, 0 } },
- { 0, { 0, 0, 0, 0, 0 } }
-};
-
-TexCombineTest::test_param TexCombineTest::AddParams[] = {
- { GL_COMBINE_RGB_EXT, { GL_ADD, 0 } },
- { GL_COMBINE_ALPHA_EXT, { GL_ADD, 0 } },
- { GL_SOURCE0_RGB_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_SOURCE1_RGB_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_SOURCE0_ALPHA_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_SOURCE1_ALPHA_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_OPERAND0_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND0_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_RGB_SCALE_EXT, { 1, 2, 4, 0 } },
- { GL_ALPHA_SCALE, { 1, 2, 4, 0 } },
- { 0, { 0, 0, 0, 0, 0 } }
-};
-
-TexCombineTest::test_param TexCombineTest::ModulateParams[] = {
- { GL_COMBINE_RGB_EXT, { GL_MODULATE, 0 } },
- { GL_COMBINE_ALPHA_EXT, { GL_MODULATE, 0 } },
- { GL_SOURCE0_RGB_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE1_RGB_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_SOURCE0_ALPHA_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE1_ALPHA_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_OPERAND0_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND0_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_RGB_SCALE_EXT, { 1, 2, 4, 0 } },
- { GL_ALPHA_SCALE, { 1, 2, 4, 0 } },
- { 0, { 0, 0, 0, 0, 0 } }
-};
-
-TexCombineTest::test_param TexCombineTest::AddSignedParams[] = {
- { GL_COMBINE_RGB_EXT, { GL_ADD_SIGNED_EXT, 0 } },
- { GL_COMBINE_ALPHA_EXT, { GL_ADD_SIGNED_EXT, 0 } },
- { GL_SOURCE0_RGB_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE1_RGB_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_SOURCE0_ALPHA_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE1_ALPHA_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_OPERAND0_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND0_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_RGB_SCALE_EXT, { 1, 2, 4, 0 } },
- { GL_ALPHA_SCALE, { 1, 2, 4, 0 } },
- { 0, { 0, 0, 0, 0, 0 } }
-};
-
-TexCombineTest::test_param TexCombineTest::InterpolateParams[] = {
- { GL_COMBINE_RGB_EXT, { GL_INTERPOLATE_EXT, 0 } },
- { GL_COMBINE_ALPHA_EXT, { GL_INTERPOLATE_EXT, 0 } },
- { GL_SOURCE0_RGB_EXT, { GL_TEXTURE, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE1_RGB_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_SOURCE2_RGB_EXT, { GL_TEXTURE, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE0_ALPHA_EXT, { GL_TEXTURE, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE1_ALPHA_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_SOURCE2_ALPHA_EXT, { GL_TEXTURE, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_OPERAND0_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND2_RGB_EXT, { GL_SRC_ALPHA, 0 } },
- { GL_OPERAND0_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND2_ALPHA_EXT, { GL_SRC_ALPHA, 0 } },
- { GL_RGB_SCALE_EXT, { 1, 4, 0 } },
- { GL_ALPHA_SCALE, { 1, 2, 0 } },
- { 0, { 0, 0, 0, 0, 0 } }
-};
-
-TexCombineTest::test_param TexCombineTest::Dot3RGBParams[] = {
- { GL_COMBINE_RGB_EXT, { GL_DOT3_RGB_EXT, 0 } },
- { GL_COMBINE_ALPHA_EXT, { GL_MODULATE, 0 } },
- { GL_SOURCE0_RGB_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE1_RGB_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_SOURCE0_ALPHA_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE1_ALPHA_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_OPERAND0_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND0_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_RGB_SCALE_EXT, { 1, 2, 4, 0 } },
- { GL_ALPHA_SCALE, { 1, 2, 4, 0 } },
- { 0, { 0, 0, 0, 0, 0 } }
-};
-
-TexCombineTest::test_param TexCombineTest::Dot3RGBAParams[] = {
- { GL_COMBINE_RGB_EXT, { GL_DOT3_RGBA_EXT, 0 } },
- { GL_COMBINE_ALPHA_EXT, { GL_MODULATE, 0 } },
- { GL_SOURCE0_RGB_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE1_RGB_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_SOURCE0_ALPHA_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE1_ALPHA_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_OPERAND0_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND0_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_RGB_SCALE_EXT, { 1, 2, 4, 0 } },
- { GL_ALPHA_SCALE, { 1, 2, 4, 0 } },
- { 0, { 0, 0, 0, 0, 0 } }
-};
-
-TexCombineTest::test_param TexCombineTest::ModulateAddParams[] = {
- { GL_COMBINE_RGB_EXT, { GL_MODULATE_ADD_ATI, 0 } },
- { GL_COMBINE_ALPHA_EXT, { GL_MODULATE_ADD_ATI, 0 } },
- { GL_SOURCE0_RGB_EXT, { GL_TEXTURE, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE1_RGB_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_SOURCE2_RGB_EXT, { GL_TEXTURE, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE0_ALPHA_EXT, { GL_TEXTURE, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE1_ALPHA_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_SOURCE2_ALPHA_EXT, { GL_TEXTURE, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_OPERAND0_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND2_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND0_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND2_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_RGB_SCALE_EXT, { 1, 4, 0 } },
- { GL_ALPHA_SCALE, { 1, 2, 0 } },
- { 0, { 0, 0, 0, 0, 0 } }
-};
-
-TexCombineTest::test_param TexCombineTest::ModulateSignedAddParams[] = {
- { GL_COMBINE_RGB_EXT, { GL_MODULATE_SIGNED_ADD_ATI, 0 } },
- { GL_COMBINE_ALPHA_EXT, { GL_MODULATE_SIGNED_ADD_ATI, 0 } },
- { GL_SOURCE0_RGB_EXT, { GL_TEXTURE, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE1_RGB_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_SOURCE2_RGB_EXT, { GL_TEXTURE, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE0_ALPHA_EXT, { GL_TEXTURE, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE1_ALPHA_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_SOURCE2_ALPHA_EXT, { GL_TEXTURE, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_OPERAND0_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND2_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND0_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND2_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_RGB_SCALE_EXT, { 1, 4, 0 } },
- { GL_ALPHA_SCALE, { 1, 2, 0 } },
- { 0, { 0, 0, 0, 0, 0 } }
-};
-
-TexCombineTest::test_param TexCombineTest::ModulateSubtractParams[] = {
- { GL_COMBINE_RGB_EXT, { GL_MODULATE_SUBTRACT_ATI, 0 } },
- { GL_COMBINE_ALPHA_EXT, { GL_MODULATE_SUBTRACT_ATI, 0 } },
- { GL_SOURCE0_RGB_EXT, { GL_TEXTURE, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE1_RGB_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_SOURCE2_RGB_EXT, { GL_TEXTURE, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE0_ALPHA_EXT, { GL_TEXTURE, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_SOURCE1_ALPHA_EXT, { GL_TEXTURE, GL_CONSTANT_EXT, GL_PRIMARY_COLOR_EXT, GL_PREVIOUS_EXT, 0 } },
- { GL_SOURCE2_ALPHA_EXT, { GL_TEXTURE, GL_PRIMARY_COLOR_EXT, 0 } },
- { GL_OPERAND0_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND2_RGB_EXT, { GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND0_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND1_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_OPERAND2_ALPHA_EXT, { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 0 } },
- { GL_RGB_SCALE_EXT, { 1, 4, 0 } },
- { GL_ALPHA_SCALE, { 1, 2, 0 } },
- { 0, { 0, 0, 0, 0, 0 } }
-};
-
-static void
-problem(const char *s) {
- cerr << "Problem in combine():" << s << "\n";
-}
-
-
-//
-// Set machine parameters to default values.
-//
-void
-TexCombineTest::ResetMachine(glmachine &machine) {
- for (int u = 0; u < MAX_TEX_UNITS; u++) {
- machine.COMBINE_RGB[u] = GL_MODULATE;
- machine.COMBINE_ALPHA[u] = GL_MODULATE;
- machine.SOURCE0_RGB[u] = GL_TEXTURE;
- machine.SOURCE1_RGB[u] = GL_PREVIOUS_EXT;
- machine.SOURCE2_RGB[u] = GL_CONSTANT_EXT;
- machine.SOURCE0_ALPHA[u] = GL_TEXTURE;
- machine.SOURCE1_ALPHA[u] = GL_PREVIOUS_EXT;
- machine.SOURCE2_ALPHA[u] = GL_CONSTANT_EXT;
- machine.OPERAND0_RGB[u] = GL_SRC_COLOR;
- machine.OPERAND1_RGB[u] = GL_SRC_COLOR;
- machine.OPERAND2_RGB[u] = GL_SRC_ALPHA;
- machine.OPERAND0_ALPHA[u] = GL_SRC_ALPHA;
- machine.OPERAND1_ALPHA[u] = GL_SRC_ALPHA;
- machine.OPERAND2_ALPHA[u] = GL_SRC_ALPHA;
- machine.RGB_SCALE[u] = 1.0;
- machine.ALPHA_SCALE[u] = 1.0;
- machine.TexFormat[u] = GL_RGBA;
- }
-}
-
-
-//
-// This computes the expected texcombine result for one texture unit.
-//
-void
-TexCombineTest::ComputeTexCombine(const glmachine &machine, int texUnit,
- const GLfloat prevColor[4],
- GLfloat result[4]) const {
- GLfloat term0[4], term1[4], term2[4], dot;
- const GLfloat *colorSrc0, *colorSrc1, *colorSrc2;
- const GLfloat *alphaSrc0, *alphaSrc1 = NULL, *alphaSrc2 = NULL;
- const GLfloat *fragColor = machine.FragColor;
- const GLfloat *constColor = machine.EnvColor[texUnit];
- const GLfloat *texColor = machine.TexColor[texUnit];
- int srcUnit;
-
- switch (machine.SOURCE0_RGB[texUnit]) {
- case GL_PRIMARY_COLOR_EXT:
- colorSrc0 = fragColor;
- break;
- case GL_TEXTURE:
- colorSrc0 = texColor;
- break;
- case GL_CONSTANT_EXT:
- colorSrc0 = constColor;
- break;
- case GL_PREVIOUS_EXT:
- colorSrc0 = prevColor;
- break;
- case GL_TEXTURE0_ARB:
- case GL_TEXTURE1_ARB:
- case GL_TEXTURE2_ARB:
- case GL_TEXTURE3_ARB:
- case GL_TEXTURE4_ARB:
- case GL_TEXTURE5_ARB:
- case GL_TEXTURE6_ARB:
- case GL_TEXTURE7_ARB:
- /* GL_ARB_texture_env_crossbar */
- srcUnit = machine.SOURCE0_RGB[texUnit] - GL_TEXTURE0_ARB;
- colorSrc0 = machine.TexColor[srcUnit];
- break;
- default:
- problem("bad rgbSource0");
- return;
- }
-
- switch (machine.SOURCE0_ALPHA[texUnit]) {
- case GL_PRIMARY_COLOR_EXT:
- alphaSrc0 = fragColor;
- break;
- case GL_TEXTURE:
- alphaSrc0 = texColor;
- break;
- case GL_CONSTANT_EXT:
- alphaSrc0 = constColor;
- break;
- case GL_PREVIOUS_EXT:
- alphaSrc0 = prevColor;
- break;
- case GL_TEXTURE0_ARB:
- case GL_TEXTURE1_ARB:
- case GL_TEXTURE2_ARB:
- case GL_TEXTURE3_ARB:
- case GL_TEXTURE4_ARB:
- case GL_TEXTURE5_ARB:
- case GL_TEXTURE6_ARB:
- case GL_TEXTURE7_ARB:
- /* GL_ARB_texture_env_crossbar */
- srcUnit = machine.SOURCE0_ALPHA[texUnit] - GL_TEXTURE0_ARB;
- alphaSrc0 = machine.TexColor[srcUnit];
- break;
- default:
- problem("bad alphaSource0");
- return;
- }
-
- switch (machine.SOURCE1_RGB[texUnit]) {
- case GL_PRIMARY_COLOR_EXT:
- colorSrc1 = fragColor;
- break;
- case GL_TEXTURE:
- colorSrc1 = texColor;
- break;
- case GL_CONSTANT_EXT:
- colorSrc1 = constColor;
- break;
- case GL_PREVIOUS_EXT:
- colorSrc1 = prevColor;
- break;
- case GL_TEXTURE0_ARB:
- case GL_TEXTURE1_ARB:
- case GL_TEXTURE2_ARB:
- case GL_TEXTURE3_ARB:
- case GL_TEXTURE4_ARB:
- case GL_TEXTURE5_ARB:
- case GL_TEXTURE6_ARB:
- case GL_TEXTURE7_ARB:
- /* GL_ARB_texture_env_crossbar */
- srcUnit = machine.SOURCE1_RGB[texUnit] - GL_TEXTURE0_ARB;
- colorSrc1 = machine.TexColor[srcUnit];
- break;
- default:
- problem("bad rgbSource1");
- return;
- }
-
- switch (machine.SOURCE1_ALPHA[texUnit]) {
- case GL_PRIMARY_COLOR_EXT:
- alphaSrc1 = fragColor;
- break;
- case GL_TEXTURE:
- alphaSrc1 = texColor;
- break;
- case GL_CONSTANT_EXT:
- alphaSrc1 = constColor;
- break;
- case GL_PREVIOUS_EXT:
- alphaSrc1 = prevColor;
- break;
- case GL_TEXTURE0_ARB:
- case GL_TEXTURE1_ARB:
- case GL_TEXTURE2_ARB:
- case GL_TEXTURE3_ARB:
- case GL_TEXTURE4_ARB:
- case GL_TEXTURE5_ARB:
- case GL_TEXTURE6_ARB:
- case GL_TEXTURE7_ARB:
- /* GL_ARB_texture_env_crossbar */
- srcUnit = machine.SOURCE1_ALPHA[texUnit] - GL_TEXTURE0_ARB;
- alphaSrc1 = machine.TexColor[srcUnit];
- break;
- default:
- problem("bad alphaSource1");
- return;
- }
-
- switch (machine.SOURCE2_RGB[texUnit]) {
- case GL_PRIMARY_COLOR_EXT:
- colorSrc2 = fragColor;
- break;
- case GL_TEXTURE:
- colorSrc2 = texColor;
- break;
- case GL_CONSTANT_EXT:
- colorSrc2 = constColor;
- break;
- case GL_PREVIOUS_EXT:
- colorSrc2 = prevColor;
- break;
- case GL_TEXTURE0_ARB:
- case GL_TEXTURE1_ARB:
- case GL_TEXTURE2_ARB:
- case GL_TEXTURE3_ARB:
- case GL_TEXTURE4_ARB:
- case GL_TEXTURE5_ARB:
- case GL_TEXTURE6_ARB:
- case GL_TEXTURE7_ARB:
- /* GL_ARB_texture_env_crossbar */
- srcUnit = machine.SOURCE2_RGB[texUnit] - GL_TEXTURE0_ARB;
- colorSrc2 = machine.TexColor[srcUnit];
- break;
- default:
- problem("bad rgbSource2");
- return;
- }
-
- switch (machine.SOURCE2_ALPHA[texUnit]) {
- case GL_PRIMARY_COLOR_EXT:
- alphaSrc2 = fragColor;
- break;
- case GL_TEXTURE:
- alphaSrc2 = texColor;
- break;
- case GL_CONSTANT_EXT:
- alphaSrc2 = constColor;
- break;
- case GL_PREVIOUS_EXT:
- alphaSrc2 = prevColor;
- break;
- case GL_TEXTURE0_ARB:
- case GL_TEXTURE1_ARB:
- case GL_TEXTURE2_ARB:
- case GL_TEXTURE3_ARB:
- case GL_TEXTURE4_ARB:
- case GL_TEXTURE5_ARB:
- case GL_TEXTURE6_ARB:
- case GL_TEXTURE7_ARB:
- /* GL_ARB_texture_env_crossbar */
- srcUnit = machine.SOURCE2_ALPHA[texUnit] - GL_TEXTURE0_ARB;
- alphaSrc2 = machine.TexColor[srcUnit];
- break;
- default:
- problem("bad alphaSource2");
- return;
- }
-
- switch (machine.OPERAND0_RGB[texUnit]) {
- case GL_SRC_COLOR:
- term0[0] = colorSrc0[0];
- term0[1] = colorSrc0[1];
- term0[2] = colorSrc0[2];
- break;
- case GL_ONE_MINUS_SRC_COLOR:
- term0[0] = 1.0 - colorSrc0[0];
- term0[1] = 1.0 - colorSrc0[1];
- term0[2] = 1.0 - colorSrc0[2];
- break;
- case GL_SRC_ALPHA:
- term0[0] = colorSrc0[3];
- term0[1] = colorSrc0[3];
- term0[2] = colorSrc0[3];
- break;
- case GL_ONE_MINUS_SRC_ALPHA:
- term0[0] = 1.0 - colorSrc0[3];
- term0[1] = 1.0 - colorSrc0[3];
- term0[2] = 1.0 - colorSrc0[3];
- break;
- default:
- problem("bad rgbOperand0");
- return;
- }
-
- switch (machine.OPERAND0_ALPHA[texUnit]) {
- case GL_SRC_ALPHA:
- term0[3] = alphaSrc0[3];
- break;
- case GL_ONE_MINUS_SRC_ALPHA:
- term0[3] = 1.0 - alphaSrc0[3];
- break;
- default:
- problem("bad alphaOperand0");
- return;
- }
-
- switch (machine.OPERAND1_RGB[texUnit]) {
- case GL_SRC_COLOR:
- term1[0] = colorSrc1[0];
- term1[1] = colorSrc1[1];
- term1[2] = colorSrc1[2];
- break;
- case GL_ONE_MINUS_SRC_COLOR:
- term1[0] = 1.0 - colorSrc1[0];
- term1[1] = 1.0 - colorSrc1[1];
- term1[2] = 1.0 - colorSrc1[2];
- break;
- case GL_SRC_ALPHA:
- term1[0] = colorSrc1[3];
- term1[1] = colorSrc1[3];
- term1[2] = colorSrc1[3];
- break;
- case GL_ONE_MINUS_SRC_ALPHA:
- term1[0] = 1.0 - colorSrc1[3];
- term1[1] = 1.0 - colorSrc1[3];
- term1[2] = 1.0 - colorSrc1[3];
- break;
- default:
- problem("bad rgbOperand1");
- return;
- }
-
- switch (machine.OPERAND1_ALPHA[texUnit]) {
- case GL_SRC_ALPHA:
- term1[3] = alphaSrc1[3];
- break;
- case GL_ONE_MINUS_SRC_ALPHA:
- term1[3] = 1.0 - alphaSrc1[3];
- break;
- default:
- problem("bad alphaOperand1");
- return;
- }
-
- switch (machine.OPERAND2_RGB[texUnit]) {
- case GL_SRC_COLOR:
- term2[0] = colorSrc2[0];
- term2[1] = colorSrc2[1];
- term2[2] = colorSrc2[2];
- break;
- case GL_ONE_MINUS_SRC_COLOR:
- term2[0] = 1.0 - colorSrc2[0];
- term2[1] = 1.0 - colorSrc2[1];
- term2[2] = 1.0 - colorSrc2[2];
- break;
- case GL_SRC_ALPHA:
- term2[0] = colorSrc2[3];
- term2[1] = colorSrc2[3];
- term2[2] = colorSrc2[3];
- break;
- case GL_ONE_MINUS_SRC_ALPHA:
- term2[0] = 1.0 - colorSrc2[3];
- term2[1] = 1.0 - colorSrc2[3];
- term2[2] = 1.0 - colorSrc2[3];
- break;
- default:
- problem("bad rgbOperand2");
- return;
- }
-
- switch (machine.OPERAND2_ALPHA[texUnit]) {
- case GL_SRC_ALPHA:
- term2[3] = alphaSrc2[3];
- break;
- default:
- problem("bad alphaOperand2");
- return;
- }
-
- // Final combine
- switch (machine.COMBINE_RGB[texUnit]) {
- case GL_REPLACE:
- result[0] = term0[0];
- result[1] = term0[1];
- result[2] = term0[2];
- break;
- case GL_MODULATE:
- result[0] = term0[0] * term1[0];
- result[1] = term0[1] * term1[1];
- result[2] = term0[2] * term1[2];
- break;
- case GL_ADD:
- result[0] = term0[0] + term1[0];
- result[1] = term0[1] + term1[1];
- result[2] = term0[2] + term1[2];
- break;
- case GL_ADD_SIGNED_EXT:
- result[0] = term0[0] + term1[0] - 0.5;
- result[1] = term0[1] + term1[1] - 0.5;
- result[2] = term0[2] + term1[2] - 0.5;
- break;
- case GL_INTERPOLATE_EXT:
- result[0] = term0[0] * term2[0] + term1[0] * (1.0 - term2[0]);
- result[1] = term0[1] * term2[1] + term1[1] * (1.0 - term2[1]);
- result[2] = term0[2] * term2[2] + term1[2] * (1.0 - term2[2]);
- break;
- case GL_DOT3_RGB_EXT:
- case GL_DOT3_RGBA_EXT:
- dot = ((term0[0] - 0.5) * (term1[0] - 0.5) +
- (term0[1] - 0.5) * (term1[1] - 0.5) +
- (term0[2] - 0.5) * (term1[2] - 0.5));
- result[0] = dot;
- result[1] = dot;
- result[2] = dot;
- if (machine.COMBINE_RGB[texUnit] == GL_DOT3_RGBA_EXT)
- result[3] = dot;
- break;
- case GL_MODULATE_ADD_ATI:
- result[0] = term0[0] * term2[0] + term1[0];
- result[1] = term0[1] * term2[1] + term1[1];
- result[2] = term0[2] * term2[2] + term1[2];
- break;
- case GL_MODULATE_SIGNED_ADD_ATI:
- result[0] = term0[0] * term2[0] + term1[0] - 0.5;
- result[1] = term0[1] * term2[1] + term1[1] - 0.5;
- result[2] = term0[2] * term2[2] + term1[2] - 0.5;
- break;
- case GL_MODULATE_SUBTRACT_ATI:
- result[0] = term0[0] * term2[0] - term1[0];
- result[1] = term0[1] * term2[1] - term1[1];
- result[2] = term0[2] * term2[2] - term1[2];
- break;
- default:
- problem("bad rgbCombine");
- return;
- }
-
- switch (machine.COMBINE_ALPHA[texUnit]) {
- case GL_REPLACE:
- result[3] = term0[3];
- break;
- case GL_MODULATE:
- result[3] = term0[3] * term1[3];
- break;
- case GL_ADD:
- result[3] = term0[3] + term1[3];
- break;
- case GL_ADD_SIGNED_EXT:
- result[3] = term0[3] + term1[3] - 0.5;
- break;
- case GL_INTERPOLATE_EXT:
- result[3] = term0[3] * term2[3] + term1[3] * (1.0 - term2[3]);
- break;
- case GL_MODULATE_ADD_ATI:
- result[3] = term0[3] * term2[3] + term1[3];
- break;
- case GL_MODULATE_SIGNED_ADD_ATI:
- result[3] = term0[3] * term2[3] + term1[3] - 0.5;
- break;
- case GL_MODULATE_SUBTRACT_ATI:
- result[3] = term0[3] * term2[3] - term1[3];
- break;
- default:
- problem("bad alphaCombine");
- return;
- }
-
- if (machine.COMBINE_RGB[texUnit] == GL_DOT3_RGBA_EXT) {
- result[3] = result[0];
- }
-
-
- // scaling
- // GH: Remove this crud when the ARB extension is done. It
- // most likely won't have this scale factor restriction.
- switch (machine.COMBINE_RGB[texUnit]) {
- case GL_DOT3_RGB_EXT:
- case GL_DOT3_RGBA_EXT:
- result[0] *= 4.0;
- result[1] *= 4.0;
- result[2] *= 4.0;
- break;
- default:
- result[0] *= machine.RGB_SCALE[texUnit];
- result[1] *= machine.RGB_SCALE[texUnit];
- result[2] *= machine.RGB_SCALE[texUnit];
- break;
- }
- switch (machine.COMBINE_RGB[texUnit]) {
- case GL_DOT3_RGBA_EXT:
- result[3] *= 4.0;
- break;
- default:
- result[3] *= machine.ALPHA_SCALE[texUnit];
- break;
- }
-
- // final clamping
- result[0] = CLAMP(result[0], 0.0, 1.0);
- result[1] = CLAMP(result[1], 0.0, 1.0);
- result[2] = CLAMP(result[2], 0.0, 1.0);
- result[3] = CLAMP(result[3], 0.0, 1.0);
-}
-
-
-//
-// Return string for an enum value.
-//
-const char *
-EnumString(GLenum pname)
-{
- static char s[100];
- switch (pname) {
- case GL_COMBINE_RGB_EXT:
- return "GL_COMBINE_RGB_EXT";
- case GL_COMBINE_ALPHA_EXT:
- return "GL_COMBINE_ALPHA_EXT";
- case GL_REPLACE:
- return "GL_REPLACE";
- case GL_MODULATE:
- return "GL_MODULATE";
- case GL_ADD:
- return "GL_ADD";
- case GL_ADD_SIGNED_EXT:
- return "GL_ADD_SIGNED_EXT";
- case GL_INTERPOLATE_EXT:
- return "GL_INTERPOLATE_EXT";
- case GL_DOT3_RGB_EXT:
- return "GL_DOT3_RGB_EXT";
- case GL_DOT3_RGBA_EXT:
- return "GL_DOT3_RGBA_EXT";
- case GL_MODULATE_ADD_ATI:
- return "GL_MODULATE_ADD_ATI";
- case GL_MODULATE_SIGNED_ADD_ATI:
- return "GL_MODULATE_SIGNED_ADD_ATI";
- case GL_MODULATE_SUBTRACT_ATI:
- return "GL_MODULATE_SUBTRACT_ATI";
- case GL_TEXTURE:
- return "GL_TEXTURE";
- case GL_CONSTANT_EXT:
- return "GL_CONSTANT_EXT";
- case GL_PRIMARY_COLOR_EXT:
- return "GL_PRIMARY_COLOR_EXT";
- case GL_PREVIOUS_EXT:
- return "GL_PREVIOUS_EXT";
- case GL_SRC_COLOR:
- return "GL_SRC_COLOR";
- case GL_ONE_MINUS_SRC_COLOR:
- return "GL_ONE_MINUS_SRC_COLOR";
- case GL_SRC_ALPHA:
- return "GL_SRC_ALPHA";
- case GL_ONE_MINUS_SRC_ALPHA:
- return "GL_ONE_MINUS_SRC_ALPHA";
- case GL_TEXTURE0_ARB:
- return "GL_TEXTURE0_ARB";
- case GL_TEXTURE1_ARB:
- return "GL_TEXTURE1_ARB";
- case GL_TEXTURE2_ARB:
- return "GL_TEXTURE2_ARB";
- case GL_TEXTURE3_ARB:
- return "GL_TEXTURE3_ARB";
- case GL_TEXTURE4_ARB:
- return "GL_TEXTURE4_ARB";
- case GL_TEXTURE5_ARB:
- return "GL_TEXTURE5_ARB";
- case GL_TEXTURE6_ARB:
- return "GL_TEXTURE6_ARB";
- case GL_TEXTURE7_ARB:
- return "GL_TEXTURE7_ARB";
- default:
- sprintf(s, "0x%04x", (unsigned int) pname);
- return s;
- }
-}
-
-
-//
-// Print current values of all machine state vars.
-// Used when reporting failures.
-//
-void
-TexCombineTest::PrintMachineState(const glmachine &machine) const {
-
- env->log << "\tCurrent combine state:\n";
- env->log << "\tIncoming Fragment RGBA = "
- << machine.FragColor[0] << ", "
- << machine.FragColor[1] << ", "
- << machine.FragColor[2] << ", "
- << machine.FragColor[3] << "\n";
- for (int u = 0; u < machine.NumTexUnits; u++) {
- env->log << "\tTexture Unit " << u << ":\n";
- env->log << "\t GL_COMBINE_RGB_EXT = "
- << EnumString(machine.COMBINE_RGB[u]) << "\n";
- env->log << "\t GL_COMBINE_ALPHA_EXT = "
- << EnumString(machine.COMBINE_ALPHA[u]) << "\n";
- env->log << "\t GL_SOURCE0_RGB_EXT = "
- << EnumString(machine.SOURCE0_RGB[u]) << "\n";
- env->log << "\t GL_SOURCE1_RGB_EXT = "
- << EnumString(machine.SOURCE1_RGB[u]) << "\n";
- env->log << "\t GL_SOURCE2_RGB_EXT = "
- << EnumString(machine.SOURCE2_RGB[u]) << "\n";
- env->log << "\t GL_SOURCE0_ALPHA_EXT = "
- << EnumString(machine.SOURCE0_ALPHA[u]) << "\n";
- env->log << "\t GL_SOURCE1_ALPHA_EXT = "
- << EnumString(machine.SOURCE1_ALPHA[u]) << "\n";
- env->log << "\t GL_SOURCE2_ALPHA_EXT = "
- << EnumString(machine.SOURCE2_ALPHA[u]) << "\n";
- env->log << "\t GL_OPERAND0_RGB_EXT = "
- << EnumString(machine.OPERAND0_RGB[u]) << "\n";
- env->log << "\t GL_OPERAND1_RGB_EXT = "
- << EnumString(machine.OPERAND1_RGB[u]) << "\n";
- env->log << "\t GL_OPERAND2_RGB_EXT = "
- << EnumString(machine.OPERAND2_RGB[u]) << "\n";
- env->log << "\t GL_OPERAND0_ALPHA_EXT = "
- << EnumString(machine.OPERAND0_ALPHA[u]) << "\n";
- env->log << "\t GL_OPERAND1_ALPHA_EXT = "
- << EnumString(machine.OPERAND1_ALPHA[u]) << "\n";
- env->log << "\t GL_OPERAND2_ALPHA_EXT = "
- << EnumString(machine.OPERAND2_ALPHA[u]) << "\n";
- env->log << "\t GL_RGB_SCALE_EXT = "
- << machine.RGB_SCALE[u] << "\n";
- env->log << "\t GL_ALPHA_SCALE = "
- << machine.ALPHA_SCALE[u] << "\n";
- env->log << "\t Tex Env RGBA = "
- << machine.EnvColor[u][0] << ", "
- << machine.EnvColor[u][1] << ", "
- << machine.EnvColor[u][2] << ", "
- << machine.EnvColor[u][3] << "\n";
- switch (machine.TexFormat[u]) {
- case GL_ALPHA:
- env->log << "\t Texture ALPHA = "
- << machine.TexColor[u][3] << "\n";
- break;
- case GL_LUMINANCE:
- env->log << "\t Texture LUMINANCE = "
- << machine.TexColor[u][0] << "\n";
- break;
- case GL_LUMINANCE_ALPHA:
- env->log << "\t Texture RGBA = "
- << machine.TexColor[u][0] << ", "
- << machine.TexColor[u][3] << "\n";
- break;
- case GL_INTENSITY:
- env->log << "\t Texture INTENSITY = "
- << machine.TexColor[u][0] << "\n";
- break;
- case GL_RGB:
- env->log << "\t Texture RGB = "
- << machine.TexColor[u][0] << ", "
- << machine.TexColor[u][1] << ", "
- << machine.TexColor[u][2] << "\n";
- break;
- case GL_RGBA:
- env->log << "\t Texture RGBA = "
- << machine.TexColor[u][0] << ", "
- << machine.TexColor[u][1] << ", "
- << machine.TexColor[u][2] << ", "
- << machine.TexColor[u][3] << "\n";
- break;
- }
-
- }
-}
-
-
-//
-// Check that the actual GL implementation's texture state matches what's
-// in the given glean machine state. This is only used for debugging.
-//
-bool
-TexCombineTest::VerifyMachineState(const glmachine &machine) const {
-
-#define VERIFY(var, expected) \
- glGetTexEnviv(GL_TEXTURE_ENV, var, &actual); \
- if ((GLint) (expected) != (actual)) { \
- cerr << "Expected " << var << " = " \
- << EnumString(expected) \
- << " but got " \
- << EnumString(actual) \
- << "\n"; \
- return false; \
- }
-#define VERIFYF(var, expected) \
- glGetTexEnvfv(GL_TEXTURE_ENV, var, &actualf); \
- if ((expected) != (actualf)) { \
- cerr << "Expected " << var << " = " \
- << expected \
- << " but got " \
- << actualf \
- << "\n"; \
- return false; \
- }
-
-
- for (int u = 0; u < machine.NumTexUnits; u++) {
- GLint actual;
- GLfloat actualf;
- VERIFY(GL_COMBINE_RGB_EXT, machine.COMBINE_RGB[u]);
- VERIFY(GL_COMBINE_ALPHA_EXT, machine.COMBINE_ALPHA[u]);
- VERIFY(GL_SOURCE0_RGB_EXT, machine.SOURCE0_RGB[u]);
- VERIFY(GL_SOURCE1_RGB_EXT, machine.SOURCE1_RGB[u]);
- VERIFY(GL_SOURCE2_RGB_EXT, machine.SOURCE2_RGB[u]);
- VERIFY(GL_OPERAND0_RGB_EXT, machine.OPERAND0_RGB[u]);
- VERIFY(GL_OPERAND1_RGB_EXT, machine.OPERAND1_RGB[u]);
- VERIFY(GL_OPERAND2_RGB_EXT, machine.OPERAND2_RGB[u]);
- VERIFYF(GL_RGB_SCALE_EXT, machine.RGB_SCALE[u]);
- VERIFYF(GL_ALPHA_SCALE, machine.ALPHA_SCALE[u]);
- }
-
- return true; // state is AOK
-}
-
-
-//
-// Print an error report.
-//
-void
-TexCombineTest::ReportFailure(const glmachine &machine,
- const GLfloat expected[4],
- const GLfloat rendered[4],
- BasicResult& r,
- const char *where) {
-
- env->log << name << ": FAIL "
- << r.config->conciseDescription() << '\n'
- << "\texpected "
- << expected[0] << ", "
- << expected[1] << ", "
- << expected[2] << ", "
- << expected[3] << ", got "
- << rendered[0] << ", "
- << rendered[1] << ", "
- << rendered[2] << ", "
- << rendered[3]
- << " in " << where << "\n";
- PrintMachineState(machine);
-}
-
-
-//
-// Examine a set of test params and compute the number of possible
-// state combinations.
-//
-int
-TexCombineTest::CountTestCombinations(const test_param testParams[]) const {
-
- int numTests = 1;
- for (int t = 0; testParams[t].target; t++) {
- int values = 0;
- for (int val = 0; testParams[t].validValues[val]; val++) {
- values++;
- }
- numTests *= values;
- }
- return numTests / testStride;
-}
-
-
-//
-// Setup the actual GL state and our internal simulated GL state.
-//
-void
-TexCombineTest::TexEnv(glmachine &machine, int texUnit,
- GLenum target, GLenum value) {
-
- if (machine.NumTexUnits > 1)
- glActiveTextureARB(GL_TEXTURE0_ARB + texUnit);
-
- glTexEnvi(GL_TEXTURE_ENV, target, value);
- int err = glGetError();
- if (err != GL_NO_ERROR)
- printf("Problem: glTexEnvi() generated error 0x%x\n", err);
-
- switch (target) {
- case GL_COMBINE_RGB_EXT:
- machine.COMBINE_RGB[texUnit] = value;
- break;
- case GL_COMBINE_ALPHA_EXT:
- machine.COMBINE_ALPHA[texUnit] = value;
- break;
- case GL_SOURCE0_RGB_EXT:
- machine.SOURCE0_RGB[texUnit] = value;
- break;
- case GL_SOURCE1_RGB_EXT:
- machine.SOURCE1_RGB[texUnit] = value;
- break;
- case GL_SOURCE2_RGB_EXT:
- machine.SOURCE2_RGB[texUnit] = value;
- break;
- case GL_SOURCE0_ALPHA_EXT:
- machine.SOURCE0_ALPHA[texUnit] = value;
- break;
- case GL_SOURCE1_ALPHA_EXT:
- machine.SOURCE1_ALPHA[texUnit] = value;
- break;
- case GL_SOURCE2_ALPHA_EXT:
- machine.SOURCE2_ALPHA[texUnit] = value;
- break;
- case GL_OPERAND0_RGB_EXT:
- machine.OPERAND0_RGB[texUnit] = value;
- break;
- case GL_OPERAND1_RGB_EXT:
- machine.OPERAND1_RGB[texUnit] = value;
- break;
- case GL_OPERAND2_RGB_EXT:
- machine.OPERAND2_RGB[texUnit] = value;
- break;
- case GL_OPERAND0_ALPHA_EXT:
- machine.OPERAND0_ALPHA[texUnit] = value;
- break;
- case GL_OPERAND1_ALPHA_EXT:
- machine.OPERAND1_ALPHA[texUnit] = value;
- break;
- case GL_OPERAND2_ALPHA_EXT:
- machine.OPERAND2_ALPHA[texUnit] = value;
- break;
- case GL_RGB_SCALE_EXT:
- machine.RGB_SCALE[texUnit] = value;
- break;
- case GL_ALPHA_SCALE:
- machine.ALPHA_SCALE[texUnit] = value;
- break;
- }
-}
-
-
-//
-// Make the glTexEnv calls to setup one particular set of test parameters
-// from <testParams>.
-// <testNum> must be between 0 and CountTestCombinations(testParams)-1.
-//
-void
-TexCombineTest::SetupTestEnv(struct glmachine &machine, int texUnit,
- int testNum, const struct test_param testParams[]) {
-
- int divisor = 1;
- for (int t = 0; testParams[t].target; t++) {
- int numValues = 0;
- for (int val = 0; testParams[t].validValues[val]; val++) {
- numValues++;
- }
- int v = (testNum / divisor) % numValues;
- GLenum target = testParams[t].target;
- GLenum value = testParams[t].validValues[v];
- TexEnv(machine, texUnit, target, value);
- divisor *= numValues;
- }
-}
-
-
-//
-// Set the fragment, texenv (constant), and texture colors for all the
-// machine's texture units.
-//
-void
-TexCombineTest::SetupColors(glmachine &machine) {
-
- static const GLfloat fragColor[4] = { 0.00, 0.25, 0.50, 0.75 };
- static const GLfloat envColors[][4] = {
- { 0.25, 0.50, 0.75, 1.00 },
- { 0.50, 0.75, 1.00, 0.00 },
- { 0.75, 1.00, 0.00, 0.25 },
- { 1.00, 0.00, 0.25, 0.50 }
- };
- static const GLfloat texColors[][8] = {
- { 1.00, 0.00, 0.25, 0.50 },
- { 0.75, 1.00, 0.00, 0.25 },
- { 0.50, 0.75, 1.00, 0.00 },
- { 0.25, 0.50, 0.75, 1.00 },
- // extra colors that'll only be used for crossbar test
- { 0.00, 0.00, 0.00, 0.00 },
- { 0.25, 0.50, 0.50, 0.00 },
- { 0.50, 0.25, 0.75, 0.25 },
- { 0.75, 1.00, 0.25, 0.00 }
- };
-
- COPY4(machine.FragColor, fragColor);
- glColor4fv(fragColor);
-
- for (int u = 0; u < machine.NumTexUnits; u++) {
- if (machine.NumTexUnits > 1)
- glActiveTextureARB(GL_TEXTURE0_ARB + u);
- glBindTexture(GL_TEXTURE_2D, mTextures[u]);
- glEnable(GL_TEXTURE_2D);
- 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_COMBINE_EXT);
- machine.EnvColor[u][0] = envColors[u % 4][0];
- machine.EnvColor[u][1] = envColors[u % 4][1];
- machine.EnvColor[u][2] = envColors[u % 4][2];
- machine.EnvColor[u][3] = envColors[u % 4][3];
- glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR,
- envColors[u % 4]);
-
- const GLfloat *texCol = texColors[u % 8];
-
- // Setup texture color, according to texture format
- switch (machine.TexFormat[u]) {
- case GL_RGBA:
- machine.TexColor[u][0] = texCol[0];
- machine.TexColor[u][1] = texCol[1];
- machine.TexColor[u][2] = texCol[2];
- machine.TexColor[u][3] = texCol[3];
- break;
- case GL_RGB:
- machine.TexColor[u][0] = texCol[0];
- machine.TexColor[u][1] = texCol[1];
- machine.TexColor[u][2] = texCol[2];
- machine.TexColor[u][3] = 1.0;
- break;
- case GL_ALPHA:
- machine.TexColor[u][0] = 0.0;
- machine.TexColor[u][1] = 0.0;
- machine.TexColor[u][2] = 0.0;
- machine.TexColor[u][3] = texCol[3];
- break;
- case GL_LUMINANCE:
- machine.TexColor[u][0] = texCol[0];
- machine.TexColor[u][1] = texCol[0];
- machine.TexColor[u][2] = texCol[0];
- machine.TexColor[u][3] = 1.0;
- break;
- case GL_LUMINANCE_ALPHA:
- machine.TexColor[u][0] = texCol[0];
- machine.TexColor[u][1] = texCol[0];
- machine.TexColor[u][2] = texCol[0];
- machine.TexColor[u][3] = texCol[3];
- break;
- case GL_INTENSITY:
- machine.TexColor[u][0] = texCol[0];
- machine.TexColor[u][1] = texCol[0];
- machine.TexColor[u][2] = texCol[0];
- machine.TexColor[u][3] = texCol[0];
- break;
- default:
- problem("bad texture format");
- return;
- }
-
- // Make a 4x4 solid color texture
- GLfloat image[16][4];
- int i;
- for (i = 0; i < 16; i++) {
- image[i][0] = texColors[u % 8][0];
- image[i][1] = texColors[u % 8][1];
- image[i][2] = texColors[u % 8][2];
- image[i][3] = texColors[u % 8][3];
- }
- glTexImage2D(GL_TEXTURE_2D, 0, machine.TexFormat[u],
- 4, 4, 0, GL_RGBA, GL_FLOAT, image);
-
-#if 0 // Debug
- GLfloat check[16][4];
- GLint r, g, b, a;
- glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
- GL_TEXTURE_RED_SIZE, &r);
- glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
- GL_TEXTURE_GREEN_SIZE, &g);
- glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
- GL_TEXTURE_BLUE_SIZE, &b);
- glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
- GL_TEXTURE_ALPHA_SIZE, &a);
- printf("Texture bits: %d %d %d %d\n", r, g, b, a);
- glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT,
- check);
- for (i = 0;i < 16; i++) {
- printf("%2d: %4f %4f %4f %4f %4f %4f %4f %4f\n", i,
- image[i][0], image[i][1],
- image[i][2], image[i][3],
- check[i][0], check[i][1],
- check[i][2], check[i][3]);
- }
-#endif
- }
-}
-
-
-//
-// Test texenv-combine with a single texture unit.
-//
-bool
-TexCombineTest::RunSingleTextureTest(glmachine &machine,
- const test_param testParams[], BasicResult &r, Window& w) {
-
- assert(machine.NumTexUnits == 1);
- SetupColors(machine);
-
- const int numTests = CountTestCombinations(testParams);
- //printf("Testing %d combinations\n", numTests);
-
- for (int test = 0; test < numTests; test += testStride) {
- // 0. Setup state
- ResetMachine(machine);
- SetupTestEnv(machine, 0, test, testParams);
-
- // 1. Render with OpenGL
- GLfloat renderedResult[4];
- glTexCoord2f(0, 0); // use texcoord (0,0) for all vertices
- glBegin(GL_POLYGON);
- glVertex2f(-1.0, -1.0);
- glVertex2f( 1.0, -1.0);
- glVertex2f( 1.0, 1.0);
- glVertex2f(-1.0, 1.0);
- glEnd();
- glReadPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT, renderedResult);
- if (!env->options.quick)
- w.swap();
-
- // 2. Compute expected result
- GLfloat expected[4];
- ComputeTexCombine(machine, 0, machine.FragColor, expected);
-
- // 3. Compare rendered result to expected result
- const GLfloat dr = fabs(expected[0] - renderedResult[0]);
- const GLfloat dg = fabs(expected[1] - renderedResult[1]);
- const GLfloat db = fabs(expected[2] - renderedResult[2]);
- const GLfloat da = fabs(expected[3] - renderedResult[3]);
- if (dr > mTolerance[0] || dg > mTolerance[1] ||
- db > mTolerance[2] || da > mTolerance[3]) {
- ReportFailure(machine, expected, renderedResult, r,
- "Single Texture Test");
-#if 0 // Debug
- VerifyMachineState(machine);
- // For debugging, printing the state of the previous
- // test is useful to see what's changed when we've
- // failed a test but passed the previous one.
- printf("single-texture test %d failed\n", test);
- if (test > 0) {
- printf("prev test:\n");
- SetupTestEnv(machine, 0, test - 1, testParams);
- PrintMachineState(machine);
- }
-#endif
- return false;
- }
-#if 0 // Debug
- else {
- printf("PASSED test %d!\n", test);
- env->log << "\texpected "
- << expected[0] << ", "
- << expected[1] << ", "
- << expected[2] << ", "
- << expected[3] << ", got "
- << renderedResult[0] << ", "
- << renderedResult[1] << ", "
- << renderedResult[2] << ", "
- << renderedResult[3] << "\n";
- // PrintMachineState(machine);
- }
-#endif
- }
- return true;
-}
-
-
-
-//
-// For each texture unit, test each texenv-combine mode.
-// That's 5 ^ NumTexUnits combinations.
-// Or 7 ^ numTexUnits if DOT3 combine mode is supported
-//
-int
-TexCombineTest::CountMultiTextureTestCombinations(const glmachine &machine) const {
-
- int numTests = 1;
- int numUnits = machine.NumTexUnits > 4 ? 4 : machine.NumTexUnits;
- for (int i = 0; i < numUnits; i++)
- numTests *= (haveDot3 ? 7 : 5);
-
- return numTests / testStride;
-}
-
-
-//
-// Test texenv-combine with multiple texture units.
-//
-bool
-TexCombineTest::RunMultiTextureTest(glmachine &machine, BasicResult &r,
- Window& w) {
-
- static const GLenum combineModes[10] = {
- GL_REPLACE,
- GL_ADD,
- GL_ADD_SIGNED_EXT,
- GL_MODULATE,
- GL_INTERPOLATE_EXT,
- GL_DOT3_RGB_EXT,
- GL_DOT3_RGBA_EXT,
- GL_MODULATE_ADD_ATI,
- GL_MODULATE_SIGNED_ADD_ATI,
- GL_MODULATE_SUBTRACT_ATI
- };
- static const int numModes = haveDot3 ? (haveCombine3 ? 10 : 7) : 5;
-
- // four texture units is enough to test
- if (machine.NumTexUnits > 4)
- machine.NumTexUnits = 4;
-
- const int numTests = CountMultiTextureTestCombinations(machine);
- //printf("Testing %d multitexture combinations\n", numTests);
-
- SetupColors(machine);
- for (int testNum = 0; testNum < numTests; testNum += testStride) {
- // 0. Set up texture units
- ResetMachine(machine);
- int divisor = 1;
- int u;
- for (u = 0; u < machine.NumTexUnits; u++) {
- const int m = (testNum / divisor) % numModes;
- const GLenum mode = combineModes[m];
-
- // Set GL_COMBINE_RGB_EXT and GL_COMBINE_ALPHA_EXT
- TexEnv(machine, u, GL_COMBINE_RGB_EXT, mode);
- TexEnv(machine, u, GL_COMBINE_ALPHA_EXT,
- (mode == GL_DOT3_RGB_EXT ||
- mode == GL_DOT3_RGBA_EXT) ? GL_REPLACE : mode);
- TexEnv(machine, u, GL_SOURCE0_RGB_EXT, GL_PREVIOUS_EXT);
- TexEnv(machine, u, GL_SOURCE1_RGB_EXT, GL_PREVIOUS_EXT);
- TexEnv(machine, u, GL_SOURCE2_RGB_EXT, GL_TEXTURE);
- TexEnv(machine, u, GL_SOURCE0_ALPHA_EXT, GL_PREVIOUS_EXT);
- TexEnv(machine, u, GL_SOURCE1_ALPHA_EXT, GL_PREVIOUS_EXT);
- TexEnv(machine, u, GL_SOURCE2_ALPHA_EXT, GL_TEXTURE);
- TexEnv(machine, u, GL_OPERAND0_RGB_EXT, GL_SRC_COLOR);
- TexEnv(machine, u, GL_OPERAND1_RGB_EXT, GL_ONE_MINUS_SRC_COLOR);
- TexEnv(machine, u, GL_OPERAND2_RGB_EXT, GL_SRC_ALPHA);
- TexEnv(machine, u, GL_OPERAND0_ALPHA_EXT, GL_SRC_ALPHA);
- TexEnv(machine, u, GL_OPERAND1_ALPHA_EXT, GL_ONE_MINUS_SRC_ALPHA);
- TexEnv(machine, u, GL_OPERAND2_ALPHA_EXT, GL_SRC_ALPHA);
- TexEnv(machine, u, GL_RGB_SCALE_EXT, 1);
- TexEnv(machine, u, GL_ALPHA_SCALE, 1);
-
- //printf("texenv%d = %s ", u, EnumString(mode));
- divisor *= numModes;
- }
- //printf("\n");
-
- // 1. Render with OpenGL
- GLfloat renderedResult[4];
- // use texcoord (0,0) for all vertices
- for (int u = 0; u < machine.NumTexUnits; u++)
- glMultiTexCoord2fARB(GL_TEXTURE0_ARB + u, 0, 0);
- glBegin(GL_POLYGON);
- glVertex2f(-1.0, -1.0);
- glVertex2f( 1.0, -1.0);
- glVertex2f( 1.0, 1.0);
- glVertex2f(-1.0, 1.0);
- glEnd();
- glReadPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT, renderedResult);
- if (!env->options.quick)
- w.swap();
-
- // 2. Compute expected result
- GLfloat prevColor[4];
- GLfloat expected[4] = { 0 };
- for (u = 0; u < machine.NumTexUnits; u++) {
- if (u == 0) {
- COPY4(prevColor, machine.FragColor);
- } else {
- COPY4(prevColor, expected);
- }
- ComputeTexCombine(machine, u, prevColor, expected);
- }
-
- // 3. Compare rendered result to expected result
- const GLfloat dr = fabs(expected[0] - renderedResult[0]);
- const GLfloat dg = fabs(expected[1] - renderedResult[1]);
- const GLfloat db = fabs(expected[2] - renderedResult[2]);
- const GLfloat da = fabs(expected[3] - renderedResult[3]);
- if (dr > mTolerance[0] || dg > mTolerance[1] ||
- db > mTolerance[2] || da > mTolerance[3]) {
- ReportFailure(machine, expected, renderedResult, r,
- "Multi-texture test");
-#if 0 // Debug
- printf("multitex test %d failed\n", testNum);
- if (testNum > 0) {
- printf("prev test:\n");
- SetupTestEnv(machine, 0, testNum - 1, testParams);
- PrintMachineState(machine);
- }
-#endif
-
- return false;
- }
- }
- return true;
-}
-
-
-int
-TexCombineTest::CountCrossbarCombinations() const
-{
- GLint numUnits;
- glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &numUnits);
- return numUnits;
-}
-
-
-bool
-TexCombineTest::RunCrossbarTest(glmachine &machine, BasicResult &r, Window& w) {
- // We do a really short, simple test for GL_ARB_texture_env_crossbar
- // since the preceeding tests are pretty comprehensive and the
- // crossbar feature is just an incremental addition.
- // Basically, if we have N texture units we run N tests.
- // For test [i] we set texture unit [i] to fetch the texture color
- // from unit [numUnits - i - 1]. For units != i we use the constant
- // color (0,0,0,0). We use GL_ADD mode to compute the sum over all units.
- // So effectively, the result of texture combine is simply the incoming
- // fragment color plus unit [numUnits - test - 1]'s texture color.
-
- int unit;
-
- glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, (GLint *) &Machine.NumTexUnits);
-
- // Set up constant texture state for all tests
- ResetMachine(machine);
- SetupColors(machine);
- for (unit = 0; unit < machine.NumTexUnits; unit++) {
- TexEnv(machine, unit, GL_COMBINE_RGB_EXT, GL_ADD);
- TexEnv(machine, unit, GL_COMBINE_ALPHA_EXT, GL_ADD);
- TexEnv(machine, unit, GL_SOURCE0_RGB_EXT, GL_PREVIOUS_EXT);
- TexEnv(machine, unit, GL_SOURCE0_ALPHA_EXT, GL_PREVIOUS_EXT);
- // SOURCE1_RGB/ALPHA is set below, per test
- TexEnv(machine, unit, GL_OPERAND0_RGB_EXT, GL_SRC_COLOR);
- TexEnv(machine, unit, GL_OPERAND1_RGB_EXT, GL_SRC_COLOR);
- TexEnv(machine, unit, GL_OPERAND2_RGB_EXT, GL_SRC_ALPHA);
- TexEnv(machine, unit, GL_OPERAND0_ALPHA_EXT, GL_SRC_ALPHA);
- TexEnv(machine, unit, GL_OPERAND1_ALPHA_EXT, GL_SRC_ALPHA);
- TexEnv(machine, unit, GL_OPERAND2_ALPHA_EXT, GL_SRC_ALPHA);
- TexEnv(machine, unit, GL_RGB_SCALE_EXT, 1);
- TexEnv(machine, unit, GL_ALPHA_SCALE, 1);
-
- machine.EnvColor[unit][0] = 0.0F;
- machine.EnvColor[unit][1] = 0.0F;
- machine.EnvColor[unit][2] = 0.0F;
- machine.EnvColor[unit][3] = 0.0F;
- glActiveTextureARB(GL_TEXTURE0_ARB + unit);
- glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR,
- machine.EnvColor[unit]);
- }
-
- for (int test = 0; test < machine.NumTexUnits; test++) {
- // 1. Set up texture state
- for (unit = 0; unit < machine.NumTexUnits; unit++) {
- if (unit == test) {
- const int revUnit = machine.NumTexUnits - unit - 1;
- TexEnv(machine, unit, GL_SOURCE1_RGB_EXT,
- GL_TEXTURE0_ARB + revUnit);
- TexEnv(machine, unit, GL_SOURCE1_ALPHA_EXT,
- GL_TEXTURE0_ARB + revUnit);
- }
- else {
- TexEnv(machine, unit, GL_SOURCE1_RGB_EXT, GL_CONSTANT_EXT);
- TexEnv(machine, unit, GL_SOURCE1_ALPHA_EXT, GL_CONSTANT_EXT);
- }
- }
-
- // 2. Render with OpenGL
- GLfloat renderedResult[4];
- // texcoord (0,) for all vertices is OK
- for (unit = 0; unit < machine.NumTexUnits; unit++)
- glMultiTexCoord2fARB(GL_TEXTURE0_ARB + unit, 0, 0);
- glColor4fv(machine.FragColor);
- glBegin(GL_POLYGON);
- glVertex2f(-1.0, -1.0);
- glVertex2f( 1.0, -1.0);
- glVertex2f( 1.0, 1.0);
- glVertex2f(-1.0, 1.0);
- glEnd();
- glReadPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT, renderedResult);
- if (!env->options.quick)
- w.swap();
-
- // 3. Compute expected result
- GLfloat prevColor[4];
- GLfloat expected[4];
- for (unit = 0; unit < machine.NumTexUnits; unit++) {
- if (unit == 0) {
- COPY4(prevColor, machine.FragColor);
- } else {
- COPY4(prevColor, expected);
- }
- ComputeTexCombine(machine, unit, prevColor, expected);
- }
-
- // 4. Compare rendered result to expected result
- const GLfloat dr = fabs(expected[0] - renderedResult[0]);
- const GLfloat dg = fabs(expected[1] - renderedResult[1]);
- const GLfloat db = fabs(expected[2] - renderedResult[2]);
- const GLfloat da = fabs(expected[3] - renderedResult[3]);
- if (dr > mTolerance[0] || dg > mTolerance[1] ||
- db > mTolerance[2] || da > mTolerance[3]) {
- ReportFailure(machine, expected, renderedResult, r,
- "Texture crossbar test");
-#if 0 // Debug
- printf("crossbar test %d failed\n", testNum);
- PrintMachineState(machine);
-#endif
- return false;
- }
- }
- return true;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// runOne: Run a single test case
-///////////////////////////////////////////////////////////////////////////////
-
-// XXX should we run a number of individual tests instead?
-void
-TexCombineTest::runOne(BasicResult& r, Window& w) {
- // Grab pointers to the extension functions. It's safe to use
- // these without testing them because we already know that we
- // won't be invoked except on contexts that support the
- // extension.
-
- // Test the availability of the DOT3 extenstion
- haveDot3 = GLUtils::haveExtensions("GL_EXT_texture_env_dot3");
-
- haveCrossbar = GLUtils::haveExtensions("GL_ARB_texture_env_crossbar")
- && GLUtils::haveExtensions("GL_ARB_texture_env_combine");
-
- haveCombine3 = GLUtils::haveExtensions("GL_ATI_texture_env_combine3")
- && GLUtils::haveExtensions("GL_ARB_texture_env_combine");
-
- // compute RGB error tolerance
- {
- GLint rBits, gBits, bBits, aBits;
- GLint rTexBits, gTexBits, bTexBits, aTexBits;
- GLfloat texImage[4][4][4];
- // Make dummy texture image
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0,
- GL_RGBA, GL_FLOAT, texImage);
- glGetIntegerv(GL_RED_BITS, &rBits);
- glGetIntegerv(GL_GREEN_BITS, &gBits);
- glGetIntegerv(GL_BLUE_BITS, &bBits);
- glGetIntegerv(GL_ALPHA_BITS, &aBits);
- glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
- GL_TEXTURE_RED_SIZE, &rTexBits);
- glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
- GL_TEXTURE_GREEN_SIZE, &gTexBits);
- glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
- GL_TEXTURE_BLUE_SIZE, &bTexBits);
- glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
- GL_TEXTURE_ALPHA_SIZE, &aTexBits);
- // find smaller of frame buffer and texture bits
- rBits = (rBits < rTexBits) ? rBits : rTexBits;
- gBits = (gBits < gTexBits) ? gBits : gTexBits;
- bBits = (bBits < bTexBits) ? bBits : bTexBits;
- aBits = (aBits < aTexBits) ? aBits : aTexBits;
- // tolerance is 3 bits of error
- mTolerance[0] = 8.0 / (1 << rBits);
- mTolerance[1] = 8.0 / (1 << gBits);
- mTolerance[2] = 8.0 / (1 << bBits);
- if (aBits == 0)
- mTolerance[3] = 1.0;
- else
- mTolerance[3] = 8.0 / (1 << aBits);
- /*
- printf("Tolerance: %g %g %g %g\n",
- mTolerance[0], mTolerance[1],
- mTolerance[2], mTolerance[3]);
- */
- }
-
- // Allocate our textures
- glGenTextures(MAX_TEX_UNITS, mTextures);
-
- // We'll only render a 4-pixel polygon
- glViewport(0, 0, 2, 2);
-
- ResetMachine(Machine);
- Machine.NumTexUnits = 1;
-
- // If quick mode, run fewer tests
- if (env->options.quick)
- testStride = 67; // a prime number
- else
- testStride = 1;
-
- // Do single texture unit tests first.
- bool passed = RunSingleTextureTest(Machine, ReplaceParams, r, w);
- if (passed)
- passed = RunSingleTextureTest(Machine, AddParams, r, w);
- if (passed)
- passed = RunSingleTextureTest(Machine, AddSignedParams, r, w);
- if (passed)
- passed = RunSingleTextureTest(Machine, ModulateParams, r, w);
- if (passed)
- passed = RunSingleTextureTest(Machine, InterpolateParams, r, w);
- if (passed && haveDot3)
- passed = RunSingleTextureTest(Machine, Dot3RGBParams, r, w);
- if (passed && haveDot3)
- passed = RunSingleTextureTest(Machine, Dot3RGBAParams, r, w);
- if (passed && haveCombine3)
- passed = RunSingleTextureTest(Machine, ModulateAddParams, r, w);
- if (passed && haveCombine3)
- passed = RunSingleTextureTest(Machine, ModulateSignedAddParams, r, w);
- if (passed && haveCombine3)
- passed = RunSingleTextureTest(Machine, ModulateSubtractParams, r, w);
-
- // Now do some multi-texture tests
- if (passed) {
- glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB,
- (GLint *) &Machine.NumTexUnits);
- if (Machine.NumTexUnits > 1) {
- passed = RunMultiTextureTest(Machine, r, w);
- }
- }
-
- // Do crossbar tests
- if (passed && haveCrossbar) {
- passed = RunCrossbarTest(Machine, r, w);
- }
-
- r.pass = passed;
-
- // Delete our textures
- glDeleteTextures(MAX_TEX_UNITS, mTextures);
-
-} // TexCombineTest::runOne
-
-void
-TexCombineTest::logOne(BasicResult& r) {
- if (r.pass) {
- logPassFail(r);
- logConcise(r);
- env->log << "\tTested "
- << CountTestCombinations(ReplaceParams)
- << " GL_REPLACE combinations\n";
- env->log << "\tTested "
- << CountTestCombinations(AddParams)
- << " GL_ADD combinations\n";
- env->log << "\tTested "
- << CountTestCombinations(AddSignedParams)
- << " GL_ADD_SIGNED_EXT combinations\n";
- env->log << "\tTested "
- << CountTestCombinations(ModulateParams)
- << " GL_MODULATE combinations\n";
- env->log << "\tTested "
- << CountTestCombinations(InterpolateParams)
- << " GL_INTERPOLATE_EXT combinations\n";
- if (haveDot3) {
- env->log << "\tTested "
- << CountTestCombinations(Dot3RGBParams)
- << " GL_DOT3_RGB_EXT combinations\n";
- env->log << "\tTested "
- << CountTestCombinations(Dot3RGBAParams)
- << " GL_DOT3_RGBA_EXT combinations\n";
- }
- if (haveCombine3) {
- env->log << "\tTested "
- << CountTestCombinations(ModulateAddParams)
- << " GL_MODULATE_ADD_ATI combinations\n";
- env->log << "\tTested "
- << CountTestCombinations(ModulateSignedAddParams)
- << " GL_MODULATE_SIGNED_ADD_ATI combinations\n";
- env->log << "\tTested "
- << CountTestCombinations(ModulateSubtractParams)
- << " GL_MODULATE_SUBTRACT_ATI combinations\n";
- }
- env->log << "\tTested "
- << CountMultiTextureTestCombinations(Machine)
- << " multitexture combinations\n";
- if (haveCrossbar) {
- env->log << "\tTested "
- << CountCrossbarCombinations()
- << " crossbar combinations\n";
- }
- }
-} // TexCombineTest::logOne
-
-
-///////////////////////////////////////////////////////////////////////////////
-// The test object itself:
-///////////////////////////////////////////////////////////////////////////////
-TexCombineTest texCombTest("texCombine", "window, rgb",
-
- "GL_EXT_texture_env_combine verification test.\n"
- "We only test a subset of all possible texture env combinations\n"
- "because there's simply too many to exhaustively test them all.\n");
-
-
-} // namespace GLEAN
diff --git a/tests/glean/ttexcombine.h b/tests/glean/ttexcombine.h
deleted file mode 100644
index 24ec1f0..0000000
--- a/tests/glean/ttexcombine.h
+++ /dev/null
@@ -1,137 +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
-
-
-// ttexcombing.h: Test the GL_EXT_texture_env_combine extension
-// Author: Brian Paul (brianp at valinux.com) September 2000
-
-
-#ifndef __ttexcombine_h__
-#define __ttexcombine_h__
-
-#include "tbasic.h"
-
-namespace GLEAN {
-
-#define MAX_TEX_UNITS 8
-
-class TexCombineTest: public BasicTest {
- public:
- TexCombineTest(const char* testName, const char* filter,
- const char* description):
-#if (__AGL__)
- BasicTest(testName, filter, "GL_ARB_texture_env_combine",
- description) {
-#else
- BasicTest(testName, filter, "GL_EXT_texture_env_combine",
- description) {
-#endif
- fWidth = 2;
- fHeight = 2;
- }
-
- virtual void runOne(BasicResult& r, Window& w);
- virtual void logOne(BasicResult& r);
-
- private:
- // Our model of GL machine state
- struct glmachine {
- GLenum COMBINE_RGB[MAX_TEX_UNITS];
- GLenum COMBINE_ALPHA[MAX_TEX_UNITS];
- GLenum SOURCE0_RGB[MAX_TEX_UNITS];
- GLenum SOURCE1_RGB[MAX_TEX_UNITS];
- GLenum SOURCE2_RGB[MAX_TEX_UNITS];
- GLenum SOURCE0_ALPHA[MAX_TEX_UNITS];
- GLenum SOURCE1_ALPHA[MAX_TEX_UNITS];
- GLenum SOURCE2_ALPHA[MAX_TEX_UNITS];
- GLenum OPERAND0_RGB[MAX_TEX_UNITS];
- GLenum OPERAND1_RGB[MAX_TEX_UNITS];
- GLenum OPERAND2_RGB[MAX_TEX_UNITS];
- GLenum OPERAND0_ALPHA[MAX_TEX_UNITS];
- GLenum OPERAND1_ALPHA[MAX_TEX_UNITS];
- GLenum OPERAND2_ALPHA[MAX_TEX_UNITS];
- GLfloat RGB_SCALE[MAX_TEX_UNITS];
- GLfloat ALPHA_SCALE[MAX_TEX_UNITS];
- GLfloat FragColor[4]; // fragment color
- GLfloat EnvColor[MAX_TEX_UNITS][4]; // texture env color
- GLfloat TexColor[MAX_TEX_UNITS][4]; // texture image color
- GLenum TexFormat[MAX_TEX_UNITS]; // texture base format
- int NumTexUnits;
- };
-
- // describes possible state combinations
- struct test_param {
- GLenum target;
- GLenum validValues[6];
- };
-
- glmachine Machine;
- static test_param ReplaceParams[];
- static test_param ModulateParams[];
- static test_param AddParams[];
- static test_param AddSignedParams[];
- static test_param InterpolateParams[];
- static test_param Dot3RGBParams[];
- static test_param Dot3RGBAParams[];
- static test_param ModulateAddParams[];
- static test_param ModulateSignedAddParams[];
- static test_param ModulateSubtractParams[];
- static test_param MultitexParams[];
- static test_param CrossbarParams[];
- bool haveDot3;
- bool haveCrossbar;
- bool haveCombine3;
- GLfloat mTolerance[4];
- GLuint mTextures[MAX_TEX_UNITS];
- int testStride;
-
- void ResetMachine(glmachine &machine);
- void ComputeTexCombine(const glmachine &machine, int texUnit,
- const GLfloat prevColor[4], GLfloat result[4]) const;
- void PrintMachineState(const glmachine &machine) const;
- bool VerifyMachineState(const glmachine &machine) const;
- void ReportFailure(const glmachine &machine, const GLfloat expected[4],
- const GLfloat rendered[4], BasicResult &r, const char *where);
- void TexEnv(glmachine &machine, int texUnit, GLenum target,
- GLenum value);
- void SetupTestEnv(glmachine &machine, int texUnit, int testNum,
- const test_param testParams[]);
- void SetupColors(struct glmachine &machine);
- int CountTestCombinations(const test_param testParams[]) const;
- bool RunSingleTextureTest(glmachine &machine,
- const test_param testParams[], BasicResult &r, Window &w);
- int CountMultiTextureTestCombinations(const glmachine &machine) const;
- bool RunMultiTextureTest(glmachine &machine, BasicResult &r, Window &w);
- int CountCrossbarCombinations() const;
- bool RunCrossbarTest(glmachine &machine, BasicResult &r, Window &w);
-
-}; // class TexCombineTest
-
-} // namespace GLEAN
-
-#endif // __ttexcombine_h__
diff --git a/tests/llvmpipe.py b/tests/llvmpipe.py
index 93a4664..7ccdff3 100644
--- a/tests/llvmpipe.py
+++ b/tests/llvmpipe.py
@@ -24,7 +24,6 @@ def remove(key):
# These take too long or too much memory
-remove(join('glean', 'texCombine'))
remove(join('spec', '!OpenGL 1.0', 'gl-1.0-blend-func'))
remove(join('spec', '!OpenGL 1.1', 'streaming-texture-leak'))
remove(join('spec', '!OpenGL 1.1', 'max-texture-size'))
--
2.7.4
More information about the Piglit
mailing list