[Piglit] [RFC] glean: remove pixel formats test
Timothy Arceri
tarceri at itsqueeze.com
Fri Jun 30 05:01:31 UTC 2017
On 30/06/17 14:49, Timothy Arceri wrote:
> In the bug for porting glean tests to piglit this is
> listed as "covered by Piglit" "Check & Remove".
>
> Since that list was made we also now have a public CTS.
>
> This is another of the extra slow glean tests. Can we
> assume this is all covered and remove?
For the record, a quick grep shows that all the extensions used in this
test are covered in piglit at least in some form.
>
> https://bugs.freedesktop.org/show_bug.cgi?id=65676
> ---
> tests/all.py | 1 -
> tests/glean/CMakeLists.gl.txt | 1 -
> tests/glean/tpixelformats.cpp | 1675 -----------------------------------------
> tests/glean/tpixelformats.h | 98 ---
> 4 files changed, 1775 deletions(-)
> delete mode 100644 tests/glean/tpixelformats.cpp
> delete mode 100644 tests/glean/tpixelformats.h
>
> diff --git a/tests/all.py b/tests/all.py
> index 4d19da1..c5d0672 100644
> --- a/tests/all.py
> +++ b/tests/all.py
> @@ -292,21 +292,20 @@ for basedir in [os.path.join(TESTS_DIR, 'apitrace', 'traces')]:
> 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')
> g('pointSprite')
> # 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')
> g('texCombine4')
> g('texture_srgb')
> diff --git a/tests/glean/CMakeLists.gl.txt b/tests/glean/CMakeLists.gl.txt
> index 9bbf324..7a9ccb0 100644
> --- a/tests/glean/CMakeLists.gl.txt
> +++ b/tests/glean/CMakeLists.gl.txt
> @@ -27,21 +27,20 @@ piglit_add_executable (glean
> options.cpp
> rc.cpp
> tapi2.cpp
> tbasic.cpp
> tbinding.cpp
> test.cpp
> tfbo.cpp
> tfragprog1.cpp
> tglsl1.cpp
> tmultitest.cpp
> - tpixelformats.cpp
> tpointsprite.cpp
> tshaderapi.cpp
> ttexcombine.cpp
> ttexcombine4.cpp
> ttexcube.cpp
> ttexenv.cpp
> ttexgen.cpp
> ttexture_srgb.cpp
> ttexunits.cpp
> tvertarraybgra.cpp
> diff --git a/tests/glean/tpixelformats.cpp b/tests/glean/tpixelformats.cpp
> deleted file mode 100644
> index d9818dc..0000000
> --- 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 d0edb94..0000000
> --- 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__
> -
>
More information about the Piglit
mailing list