[Piglit] [PATCH V2] ARB_seamless_cube_map: test that sample from three faces returns value without border color
Paul Berry
stereotype441 at gmail.com
Fri Aug 23 06:49:17 PDT 2013
On 22 August 2013 11:38, Steve Miller <dervishx at gmail.com> wrote:
> 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
>
> V2 : test now uses contemporary pipeline
> ---
> tests/all.tests | 1 +
> tests/spec/arb_seamless_cube_map/CMakeLists.gl.txt | 1 +
> .../arb_seamless_cube_map/three-faces-average.c | 211
> +++++++++++++++++++++
> 3 files changed, 213 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 6bf9f37..f6f8a50 100644
> --- a/tests/all.tests
> +++ b/tests/all.tests
> @@ -2269,6 +2269,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..3d5f5c5
> --- /dev/null
> +++ b/tests/spec/arb_seamless_cube_map/three-faces-average.c
> @@ -0,0 +1,211 @@
> +/*
> + * Copyright © 2013 Intel Corporation
> + *
> + * 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 adjoining 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.supports_gl_core_version = 31;
> +
> + config.window_visual = PIGLIT_GL_VISUAL_RGB |
> PIGLIT_GL_VISUAL_DOUBLE;
> +
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +const char *vs_text =
> +{
> + "#version 130\n"
> + "\n"
> + "in vec2 vertex;\n"
> + "\n"
> + "void main() {\n"
> + " gl_Position = vec4( vertex.xy, 0, 1);\n"
> + "}\n"
>
You can make vertex a vec4 and then just do "gl_Position = vertex;".
OpenGL will automatically fill in z=0 and w=1 for you on the vertex input,
since you specify size=2 in the call to glVertexAttribPointer.
> +};
> +
> +const char *fs_text =
> +{
> + "#version 130\n"
> + "\n"
> + "uniform samplerCube cubeTex;\n"
> + "uniform vec3 cubeVec;\n"
> + "\n"
> + "void main() {\n"
> + " gl_FragColor = texture( cubeTex, cubeVec );\n"
>
Style nit pick (both here and in the rest of the test): generally in Piglit
we don't put spaces between the parens and the first/last argument, so this
should be:
gl_FragColor = texture(cubeTex, cubeVec);
I realize that not all Piglit code follows that standard, so I can
understand if you were cribbing from code that formatted things differently.
> + "}\n"
> +};
> +
> +static const float red[3] = { 1., 0., 0. };
> +static const float blue[3] = { 0., 0., 1. };
> +static const float green[3] = { 0., 1.0, 0. };
> +
> +static GLuint prog;
> +static GLuint vao;
> +static GLuint vbo;
> +static GLuint cubeMap;
> +
> +static GLint cubeVec_loc;
> +static GLfloat cubeVecPositive[3] = { 0.5, 0.5, 0.5 };
> +static GLfloat cubeVecNegative[3] = { -0.5, -0.5, -0.5 };
> +
> +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 GLfloat quad_01[4][2] =
> +{
> + { -1., -1. },
> + { -1., 0. },
> + { 0., 0. },
> + { 0., -1. }
> +};
> +
> +static GLfloat quad_02[4][2] =
> +{
> + { 0., 0. },
> + { 0., 1. },
> + { 1., 1. },
> + { 1., 0. }
> +};
> +
> +void piglit_init( int argc, char **argv)
> +{
> + GLint i;
> + GLuint vertex_index;
> +
> + if( piglit_get_gl_version() < 32 ) {
> + piglit_require_extension("GL_ARB_seamless_cube_map");
> + }
> +
> + /* create program */
> + prog = piglit_build_simple_program( vs_text, fs_text );
> + glUseProgram( prog );
> +
> + /* create buffers */
> + glGenBuffers( 1, &vbo );
> + glBindBuffer( GL_ARRAY_BUFFER, vbo );
> + glBufferData( GL_ARRAY_BUFFER, sizeof( quad_01 ) + sizeof( quad_02
> ),
> + NULL, GL_STATIC_DRAW );
> + glBufferSubData( GL_ARRAY_BUFFER, 0, sizeof( quad_01 ),
> + &quad_01 );
> + glBufferSubData( GL_ARRAY_BUFFER, sizeof( quad_01 ), sizeof(
> quad_02 ),
> + &quad_02 );
> +
> + glGenVertexArrays( 1, &vao );
> + glBindVertexArray( vao );
> +
> + vertex_index = glGetAttribLocation( prog, "vertex" );
> +
> + /* vertex attribs */
> + glEnableVertexAttribArray( vertex_index );
> +
> + glVertexAttribPointer( vertex_index, 2, GL_FLOAT, GL_FALSE, 0, 0 );
> +
> + glGenTextures( 1, &cubeMap );
> + glBindTexture( GL_TEXTURE_CUBE_MAP_ARB, cubeMap );
> +
> + /* 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,
> + green );
> + 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 );
> + }
> +
> + /* uniform texcoord input */
> + cubeVec_loc = glGetUniformLocation( prog, "cubeVec" );
> +
> + glClearColor( 0.0, 0.0, 0.0, 0.0 );
>
Technically this call isn't needed, since this is the default clear color.
> +
> + if( !piglit_check_gl_error( GL_NO_ERROR ) )
> + piglit_report_result( PIGLIT_FAIL );
> +
> +}
> +
> +enum piglit_result piglit_display(void)
> +{
> + bool pass = true;
> +
> + glClear( GL_COLOR_BUFFER_BIT );
> +
> + glEnable( GL_TEXTURE_CUBE_MAP_SEAMLESS );
>
Spurious extra indentation.
> +
> + /* texcoords should target vector to upper corner */
> + glUniform3fv( cubeVec_loc, 1, cubeVecPositive );
> + glDrawArrays( GL_TRIANGLE_FAN, 0, 4 );
> +
> + /* expect red */
> + pass = piglit_probe_rect_rgb( 0, 0, 75, 75, red ) && pass;
> +
> + /* texcoords should target vector to bottom corner */
> + glUniform3fv( cubeVec_loc, 1, cubeVecNegative );
> + glDrawArrays( GL_TRIANGLE_FAN, 4, 4 );
> +
> + /* expect blue */
> + pass = piglit_probe_rect_rgb( 75, 75, 75,75, blue ) && pass;
> +
> + glDisable( GL_TEXTURE_CUBE_MAP_SEAMLESS );
>
This call isn't necessary--we don't need to un-do GL state at the end of a
piglit test.
> +
> + piglit_present_results();
> +
> + return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> --
> 1.8.3.1
>
All of my comments are minor, so with or without the changes, this patch is:
Reviewed-by: Paul Berry <stereotype441 at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20130823/176da2d7/attachment-0001.html>
More information about the Piglit
mailing list