[Piglit] [PATCH] ARB_seamless_cube_map: test that sample from three faces returns value without border color
Steve Miller
dervishx at gmail.com
Thu Aug 15 12:40:58 PDT 2013
add new test to existing arb_seamless_cube_map group: sample three adjoining
faces and use average. if three faces are the same color, that color must
be used.
add test to makelists and all.tests
---
tests/all.tests | 1 +
tests/spec/arb_seamless_cube_map/CMakeLists.gl.txt | 1 +
.../arb_seamless_cube_map/three-faces-average.c | 142 +++++++++++++++++++++
3 files changed, 144 insertions(+)
create mode 100644 tests/spec/arb_seamless_cube_map/three-faces-average.c
diff --git a/tests/all.tests b/tests/all.tests
index 8766572..7240312 100644
--- a/tests/all.tests
+++ b/tests/all.tests
@@ -2233,6 +2233,7 @@ arb_seamless_cube_map = Group()
spec['ARB_seamless_cube_map'] = arb_seamless_cube_map
add_plain_test(arb_seamless_cube_map, 'arb_seamless_cubemap')
add_plain_test(arb_seamless_cube_map, 'arb_seamless_cubemap-initially-disabled')
+add_plain_test(arb_seamless_cube_map, 'arb_seamless_cubemap-three-faces-average')
amd_seamless_cubemap_per_texture = Group()
spec['AMD_seamless_cubemap_per_texture'] = amd_seamless_cubemap_per_texture
diff --git a/tests/spec/arb_seamless_cube_map/CMakeLists.gl.txt b/tests/spec/arb_seamless_cube_map/CMakeLists.gl.txt
index eac572a..e31759a 100644
--- a/tests/spec/arb_seamless_cube_map/CMakeLists.gl.txt
+++ b/tests/spec/arb_seamless_cube_map/CMakeLists.gl.txt
@@ -11,5 +11,6 @@ link_libraries (
piglit_add_executable (arb_seamless_cubemap arb_seamless_cubemap.c)
piglit_add_executable (arb_seamless_cubemap-initially-disabled initially-disabled.c)
+piglit_add_executable (arb_seamless_cubemap-three-faces-average three-faces-average.c)
# vim: ft=cmake:
diff --git a/tests/spec/arb_seamless_cube_map/three-faces-average.c b/tests/spec/arb_seamless_cube_map/three-faces-average.c
new file mode 100644
index 0000000..5c3609d
--- /dev/null
+++ b/tests/spec/arb_seamless_cube_map/three-faces-average.c
@@ -0,0 +1,142 @@
+/*
+ * Copyright © Marek Olšák <maraeo at gmail.com>
+ *
+ * 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
+ * AUTHORS 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.
+ */
+
+/*
+ * Test verifies that when sampling from three ajoining faces in a cube map,
+ * samples will be averaged.If they share the same value, that value must be
+ * guaranteed to be the result of the average. Resulting color should not include
+ * border color contamination.
+ */
+
+/*
+ * ARB_seamless_cube_map Section 3.8.7 says:
+ * "If LINEAR filtering is done within a miplevel, always apply wrap mode
+ * CLAMP_TO_BORDER. Then, ...
+ *
+ * If a texture sample location would lie in the texture border in
+ * both u and v (in one of the corners of the cube), there is no
+ * unique neighboring face from which to extract one texel. The
+ * recommended method is to average the values of the three
+ * available samples. However, implementations are free to
+ * construct this fourth texel in another way, so long as, when the
+ * three available samples have the same value, this texel also has
+ * that value."
+ */
+
+#include "piglit-util-gl-common.h"
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+ config.supports_gl_compat_version = 10;
+
+ config.window_width = 100;
+ config.window_height = 40;
+ config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
+
+PIGLIT_GL_TEST_CONFIG_END
+
+static const float red[3] = { 1., 0., 0. };
+static const float blue[3] = { 0., 0., 1. };
+static const float black[3] = { 0., 0., 0. };
+
+static const GLenum targets[6] = {
+ GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB
+};
+
+static void draw_quad(int x, int y, float s, float t, float r)
+{
+ glBegin(GL_QUADS);
+ glTexCoord3f(s, t, r);
+ glVertex2i(x, y);
+ glVertex2i(x, y+20);
+ glVertex2i(x+20, y+20);
+ glVertex2i(x+20, y);
+ glEnd();
+}
+
+void piglit_init( int argc, char **argv)
+{
+ GLint i;
+
+ piglit_require_extension( "GL_ARB_texture_cube_map" );
+ piglit_require_extension( "GL_ARB_seamless_cube_map" );
+
+ glBindTexture( GL_TEXTURE_CUBE_MAP_ARB, 1 );
+ /* set filter to linear, hardware should behave as if
+ * wrap modes are set to CLAMP_TO_BORDER
+ */
+ glTexParameterfv( GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_BORDER_COLOR,
+ black );
+ glTexParameteri( GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER,
+ GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER,
+ GL_LINEAR );
+
+ /* texture positive axes/faces red */
+ for( i = 0; i < 3; i++ )
+ {
+ glTexImage2D( targets[i], 0, GL_RGBA8, 1, 1, 0, GL_RGB, GL_FLOAT,
+ red );
+ }
+
+ /* texuture negative axes/faces blue */
+ for( i = 3; i < 6; i++ )
+ {
+ glTexImage2D( targets[i], 0, GL_RGBA8, 1, 1, 0, GL_RGB, GL_FLOAT,
+ blue );
+ }
+
+ glEnable( GL_TEXTURE_CUBE_MAP_ARB );
+
+ glClearColor( 0.0, 0.0, 0.0, 0.0 );
+
+ piglit_ortho_projection( piglit_width, piglit_height, GL_FALSE );
+}
+
+enum piglit_result piglit_display(void)
+{
+ bool pass = true;
+
+ glClear( GL_COLOR_BUFFER_BIT );
+
+ glEnable( GL_TEXTURE_CUBE_MAP_SEAMLESS );
+
+ /* texcoords should target vector to upper corner */
+ draw_quad( 10, 10, 0.5, 0.5, 0.5 );
+ /* expect red */
+ pass = piglit_probe_pixel_rgb( 20, 20, red ) && pass;
+
+ /* texcoords should target vector to bottom corner */
+ draw_quad ( 40, 10, -0.5, -0.5, -0.5 );
+ /* expect blue */
+ pass = piglit_probe_pixel_rgb( 50, 20, blue ) && pass;
+
+ glDisable( GL_TEXTURE_CUBE_MAP_SEAMLESS );
+
+ piglit_present_results();
+
+ return pass ? PIGLIT_PASS : PIGLIT_FAIL;
+}
--
1.8.3.1
More information about the Piglit
mailing list