[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