[Piglit] [PATCH] ARB_point_parameters: port glean test pointatten to piglit

Brian Paul brianp at vmware.com
Wed Jun 28 23:41:33 UTC 2017


LGTM.

Reviewed-by: Brian Paul <brianp at vmware.com>


On 06/28/2017 05:33 PM, Timothy Arceri wrote:
> Ping. Any comments on  this?
>
> If not I'll probably push this soon as its one of the bigger bottle
> necks in my piglit runs.
>
> On 21/06/17 10:33, Timothy Arceri wrote:
>> ---
>>   tests/all.py                                       |   6 +-
>>   tests/glean/CMakeLists.gl.txt                      |   1 -
>>   tests/glean/tpointatten.cpp                        | 294
>> ---------------------
>>   tests/glean/tpointatten.h                          |  78 ------
>>   tests/llvmpipe.py                                  |   1 -
>>   tests/spec/CMakeLists.txt                          |   1 +
>>   tests/spec/arb_point_parameters/CMakeLists.gl.txt  |  13 +
>>   tests/spec/arb_point_parameters/CMakeLists.txt     |   1 +
>>   .../spec/arb_point_parameters/point-attenuation.c  | 232
>> ++++++++++++++++
>>   9 files changed, 252 insertions(+), 375 deletions(-)
>>   delete mode 100644 tests/glean/tpointatten.cpp
>>   delete mode 100644 tests/glean/tpointatten.h
>>   create mode 100644 tests/spec/arb_point_parameters/CMakeLists.gl.txt
>>   create mode 100644 tests/spec/arb_point_parameters/CMakeLists.txt
>>   create mode 100644 tests/spec/arb_point_parameters/point-attenuation.c
>>
>> diff --git a/tests/all.py b/tests/all.py
>> index f0a7c05..9e19e1f 100644
>> --- a/tests/all.py
>> +++ b/tests/all.py
>> @@ -293,21 +293,20 @@ 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('pointAtten')
>>       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')
>> @@ -2232,20 +2231,25 @@ with profile.test_list.group_manager(
>>           grouptools.join('spec', 'ARB_occlusion_query')) as g:
>>       g(['occlusion_query'])
>>       g(['occlusion_query_conform'])
>>       g(['occlusion_query_lifetime'])
>>       g(['occlusion_query_meta_fragments'])
>>       g(['occlusion_query_meta_no_fragments'])
>>       g(['occlusion_query_meta_save'])
>>       g(['occlusion_query_order'])
>>       g(['gen_delete_while_active'])
>> +with profile.test_list.group_manager(
>> +        PiglitGLTest,
>> +        grouptools.join('spec', 'ARB_point_parameters')) as g:
>> +    g(['arb_point_parameters-point-attenuation'])
>> +
>>   # Group ARB_separate_shader_objects
>>   with profile.test_list.group_manager(
>>           PiglitGLTest,
>>           grouptools.join('spec', 'ARB_separate_shader_objects')) as g:
>>
>> g(['arb_separate_shader_object-ActiveShaderProgram-invalid-program'],
>>         'ActiveShaderProgram with invalid program')
>>       g(['arb_separate_shader_object-GetProgramPipelineiv'],
>>         'GetProgramPipelineiv')
>>       g(['arb_separate_shader_object-dlist'], 'Display lists (Compat)')
>>       g(['arb_separate_shader_object-IsProgramPipeline'],
>> diff --git a/tests/glean/CMakeLists.gl.txt
>> b/tests/glean/CMakeLists.gl.txt
>> index 576cde1..9bbf324 100644
>> --- a/tests/glean/CMakeLists.gl.txt
>> +++ b/tests/glean/CMakeLists.gl.txt
>> @@ -28,21 +28,20 @@ piglit_add_executable (glean
>>       rc.cpp
>>       tapi2.cpp
>>       tbasic.cpp
>>       tbinding.cpp
>>       test.cpp
>>       tfbo.cpp
>>       tfragprog1.cpp
>>       tglsl1.cpp
>>       tmultitest.cpp
>>       tpixelformats.cpp
>> -    tpointatten.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/tpointatten.cpp b/tests/glean/tpointatten.cpp
>> deleted file mode 100644
>> index 49d9dac..0000000
>> --- a/tests/glean/tpointatten.cpp
>> +++ /dev/null
>> @@ -1,294 +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
>> -
>> -// tpointatten.h:  Test GL_ARB_point_parameters extension.
>> -// Brian Paul  6 October 2005
>> -
>> -
>> -#include "tpointatten.h"
>> -#include <cassert>
>> -#include <cmath>
>> -
>> -
>> -namespace GLEAN {
>> -
>> -// Max tested point size
>> -#define MAX_SIZE 24.0
>> -
>> -
>> -/* Clamp X to [MIN,MAX] */
>> -#define CLAMP( X, MIN, MAX )  ( (X)<(MIN) ? (MIN) : ((X)>(MAX) ?
>> (MAX) : (X)) )
>> -
>> -void
>> -PointAttenuationTest::setup(void)
>> -{
>> -    glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, aliasedLimits);
>> -    glGetFloatv(GL_SMOOTH_POINT_SIZE_RANGE, smoothLimits);
>> -    glMatrixMode(GL_PROJECTION);
>> -    glLoadIdentity();
>> -    glOrtho(-10.0, 10.0, -10.0, 10.0, -10.0, 10.0);
>> -    glMatrixMode(GL_MODELVIEW);
>> -    glLoadIdentity();
>> -}
>> -
>> -
>> -void
>> -PointAttenuationTest::reportFailure(GLfloat initSize,
>> -                    const GLfloat attenuation[3],
>> -                    GLfloat min, GLfloat max,
>> -                    GLfloat eyeZ, GLboolean smooth,
>> -                    GLfloat expected, GLfloat actual) const
>> -{
>> -    env->log << "\tFAILURE:\n";
>> -    env->log << "\tExpected size: " << expected << "  Actual size: "
>> << actual << "\n";
>> -    env->log << "\tSize: " << initSize << "\n";
>> -    env->log << "\tMin: " << min << "  Max: " << max << "\n";
>> -    env->log << "\tAttenuation: " << attenuation[0] << " " <<
>> attenuation[1] << " " << attenuation[2] << "\n";
>> -    env->log << "\tEye Z: " << eyeZ << "\n";
>> -    if (smooth)
>> -        env->log << "\tSmooth/antialiased\n";
>> -    else
>> -        env->log << "\tAliased\n";
>> -}
>> -
>> -
>> -void
>> -PointAttenuationTest::reportSuccess(int count, GLboolean smooth) const
>> -{
>> -    env->log << "PASS: " << count;
>> -    if (smooth)
>> -        env->log << " aliased combinations tested.\n";
>> -    else
>> -        env->log << " antialiased combinations tested.\n";
>> -}
>> -
>> -
>> -// Compute the expected point size given various point state
>> -GLfloat
>> -PointAttenuationTest::expectedSize(GLfloat initSize,
>> -                   const GLfloat attenuation[3],
>> -                   GLfloat min, GLfloat max,
>> -                   GLfloat eyeZ, GLboolean smooth) const
>> -{
>> -    const GLfloat dist = fabs(eyeZ);
>> -    const GLfloat atten = sqrt(1.0 / (attenuation[0] +
>> -                      attenuation[1] * dist +
>> -                      attenuation[2] * dist * dist));
>> -
>> -    float size = initSize * atten;
>> -
>> -    size = CLAMP(size, min, max);
>> -
>> -    if (smooth)
>> -        size = CLAMP(size, smoothLimits[0], smoothLimits[1]);
>> -    else
>> -        size = CLAMP(size, aliasedLimits[0], aliasedLimits[1]);
>> -    return size;
>> -}
>> -
>> -
>> -// measure size of rendered point at yPos (in model coords)
>> -GLfloat
>> -PointAttenuationTest::measureSize(GLfloat yPos) const
>> -{
>> -    assert(yPos >= -10.0);
>> -    assert(yPos <= 10.0);
>> -    float yNdc = (yPos + 10.0) / 20.0;  // See glOrtho above
>> -    int x = 0;
>> -    int y = (int) (yNdc * windowHeight);
>> -    int w = windowWidth;
>> -    int h = 3;
>> -    GLfloat image[3 * windowWidth * 3]; // three rows of RGB values
>> -
>> -    // Read three row of pixels and add up colors in each row.
>> -    // Use the row with the greatest sum.  This helps gives us a bit
>> -    // of leeway in vertical point positioning.
>> -    // Colors should be white or shades of gray if smoothing is enabled.
>> -    glReadPixels(x, y - 1, w, h, GL_RGB, GL_FLOAT, image);
>> -
>> -    float sum[3] = { 0.0, 0.0, 0.0 };
>> -    for (int j = 0; j < 3; j++) {
>> -        for (int i = 0; i < w; i++) {
>> -            int k = j * 3 * w + i * 3;
>> -            sum[j] += (image[k+0] + image[k+1] + image[k+2]) / 3.0;
>> -        }
>> -    }
>> -
>> -    // find max of the row sums
>> -    if (sum[0] >= sum[1] && sum[0] >= sum[2])
>> -        return sum[0];
>> -    else if (sum[1] >= sum[0] && sum[1] >= sum[2])
>> -        return sum[1];
>> -    else
>> -        return sum[2];
>> -}
>> -
>> -
>> -bool
>> -PointAttenuationTest::testPointRendering(GLboolean smooth)
>> -{
>> -    // epsilon is the allowed size difference in pixels between the
>> -    // expected and actual rendering.
>> -    const GLfloat epsilon = (smooth ? 1.5 : 1.0) + 0.0;
>> -    GLfloat atten[3];
>> -    int count = 0;
>> -    unsigned testNo, testStride;
>> -
>> -    // Enable front buffer if you want to see the rendering
>> -    glDrawBuffer(GL_FRONT);
>> -    glReadBuffer(GL_FRONT);
>> -
>> -    if (env->options.quick)
>> -        testStride = 5;  // a prime number
>> -    else
>> -        testStride = 1;
>> -    testNo = 0;
>> -    printf("stride %u\n", testStride);
>> -
>> -    if (smooth) {
>> -        glEnable(GL_POINT_SMOOTH);
>> -        glEnable(GL_BLEND);
>> -        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
>> -    }
>> -    else {
>> -        glDisable(GL_POINT_SMOOTH);
>> -        glDisable(GL_BLEND);
>> -    }
>> -
>> -    for (int a = 0; a < 3; a++) {
>> -        atten[0] = pow(10.0, -a);
>> -        for (int b = -2; b < 3; b++) {
>> -            atten[1] = (b == -1) ? 0.0 : pow(10.0, -b);
>> -            for (int c = -2; c < 3; c++) {
>> -                atten[2] = (c == -1) ? 0.0 : pow(10.0, -c);
>> -
>> glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, atten);
>> -                for (float min = 1.0; min < MAX_SIZE; min += 10) {
>> -                    glPointParameterfARB(GL_POINT_SIZE_MIN_ARB, min);
>> -                    for (float max = min; max < MAX_SIZE; max += 10) {
>> -                        glPointParameterfARB(GL_POINT_SIZE_MAX_ARB,
>> max);
>> -                        for (float size = 1.0; size < MAX_SIZE; size
>> += 8) {
>> -                            glPointSize(size);
>> -
>> -                            testNo++;
>> -                            if (testNo % testStride != 0) {
>> -                                // skip this test
>> -                                continue;
>> -                            }
>> -
>> -                            // draw column of points
>> -                            glClear(GL_COLOR_BUFFER_BIT);
>> -                            glBegin(GL_POINTS);
>> -                            for (float z = -6.0; z <= 6.0; z += 1.0) {
>> -                                glVertex3f(0, z, z);
>> -                            }
>> -                            glEnd();
>> -
>> -                            // test the column of points
>> -                            for (float z = -6.0; z <= 6.0; z += 1.0) {
>> -                                count++;
>> -                                float expected
>> -                                    = expectedSize(size, atten, min,
>> max,
>> -                                                   z, smooth);
>> -                                float actual = measureSize(z);
>> -                                if (fabs(expected - actual) > epsilon) {
>> -                                    reportFailure(size, atten, min, max,
>> -                                                  z, smooth,
>> -                                                  expected, actual);
>> -                                    return false;
>> -                                }
>> -                                else if(0){
>> -                                    printf("pass z=%f exp=%f act=%f\n",
>> -                                           z, expected, actual);
>> -                                }
>> -                            }
>> -                        }
>> -                    }
>> -                }
>> -            }
>> -        }
>> -    }
>> -    printf("Tested %u\n", testNo);
>> -
>> -    reportSuccess(count, smooth);
>> -    return true;
>> -}
>> -
>> -void
>> -PointAttenuationTest::runOne(BasicResult &r, Window &w)
>> -{
>> -    (void) w;  // silence warning
>> -    r.pass = true;
>> -    errorCode = 0;
>> -    errorPos = NULL;
>> -
>> -    setup();
>> -
>> -    if (r.pass)
>> -        r.pass = testPointRendering(GL_FALSE);
>> -    if (r.pass)
>> -        r.pass = testPointRendering(GL_TRUE);
>> -}
>> -
>> -
>> -void
>> -PointAttenuationTest::logOne(BasicResult &r)
>> -{
>> -    if (r.pass) {
>> -        logPassFail(r);
>> -        logConcise(r);
>> -    }
>> -}
>> -
>> -
>> -// constructor
>> -PointAttenuationTest::PointAttenuationTest(const char *testName,
>> -                       const char *filter,
>> -                       const char *extensions,
>> -                       const char *description)
>> -    : BasicTest(testName, filter, extensions, description)
>> -{
>> -    fWidth  = windowWidth;
>> -    fHeight = windowHeight;
>> -    errorCode = GL_NO_ERROR;
>> -    errorPos = NULL;
>> -    for (int i = 0; i < 2; i++) {
>> -        aliasedLimits[i] = 0;
>> -        smoothLimits[i] = 0;
>> -    }
>> -}
>> -
>> -
>> -
>> -// The test object itself:
>> -PointAttenuationTest pointAttenuationTest("pointAtten", "window, rgb",
>> -    "GL_ARB_point_parameters",
>> -    "Test point size attenuation with the GL_ARB_point_parameters
>> extension.\n");
>> -
>> -
>> -
>> -} // namespace GLEAN
>> diff --git a/tests/glean/tpointatten.h b/tests/glean/tpointatten.h
>> deleted file mode 100644
>> index 4592202..0000000
>> --- a/tests/glean/tpointatten.h
>> +++ /dev/null
>> @@ -1,78 +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
>> -
>> -// tpointatten.h:  Test GL_ARB_point_parameters extension.
>> -// Brian Paul  6 October 2005
>> -
>> -#ifndef __tpointatten_h__
>> -#define __tpointatten_h__
>> -
>> -#include "tbasic.h"
>> -
>> -namespace GLEAN {
>> -
>> -#define windowWidth 100
>> -#define windowHeight 503   // yes, odd
>> -
>> -
>> -class PointAttenuationTest: public BasicTest
>> -{
>> -public:
>> -    PointAttenuationTest(const char *testName,
>> -                 const char *filter,
>> -                 const char *extensions,
>> -                 const char *description);
>> -
>> -    virtual void runOne(BasicResult& r, Window& w);
>> -    virtual void logOne(BasicResult& r);
>> -
>> -private:
>> -    GLenum errorCode;
>> -    const char *errorPos;
>> -    GLfloat aliasedLimits[2];  // min/max
>> -    GLfloat smoothLimits[2];   // min/max
>> -
>> -    void setup(void);
>> -    bool testPointRendering(GLboolean smooth);
>> -    void reportFailure(GLfloat initSize,
>> -               const GLfloat attenuation[3],
>> -               GLfloat min, GLfloat max,
>> -               GLfloat eyeZ, GLboolean smooth,
>> -               GLfloat expected, GLfloat actual) const;
>> -    void reportSuccess(int count, GLboolean smooth) const;
>> -    GLfloat expectedSize(GLfloat initSize,
>> -                 const GLfloat attenuation[3],
>> -                 GLfloat min, GLfloat max,
>> -                 GLfloat eyeZ, GLboolean smooth) const;
>> -    GLfloat measureSize(GLfloat yPos) const;
>> -};
>> -
>> -} // namespace GLEAN
>> -
>> -#endif // __tpointatten_h__
>> -
>> diff --git a/tests/llvmpipe.py b/tests/llvmpipe.py
>> index 0ebd88b..52168c4 100644
>> --- a/tests/llvmpipe.py
>> +++ b/tests/llvmpipe.py
>> @@ -17,18 +17,17 @@ profile = _profile.copy()  # pylint:
>> disable=invalid-name
>>   def remove(key):
>>       try:
>>           del profile.test_list[key]
>>       except KeyError:
>>           sys.stderr.write('warning: test %s does not exist\n' % key)
>>           sys.stderr.flush()
>>   # These take too long or too much memory
>> -remove(join('glean', 'pointAtten'))
>>   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'))
>>   if platform.system() != 'Windows':
>>       remove(join('glx', 'glx-multithread-shader-compile'))
>> diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt
>> index dbf0cf1..fea2561 100644
>> --- a/tests/spec/CMakeLists.txt
>> +++ b/tests/spec/CMakeLists.txt
>> @@ -34,20 +34,21 @@ add_subdirectory (arb_gpu_shader5)
>>   add_subdirectory (arb_gpu_shader_fp64)
>>   add_subdirectory (arb_instanced_arrays)
>>   add_subdirectory (arb_internalformat_query)
>>   add_subdirectory (arb_internalformat_query2)
>>   add_subdirectory (arb_invalidate_subdata)
>>   add_subdirectory (arb_map_buffer_alignment)
>>   add_subdirectory (arb_map_buffer_range)
>>   add_subdirectory (arb_multisample)
>>   add_subdirectory (arb_occlusion_query)
>>   add_subdirectory (arb_occlusion_query2)
>> +add_subdirectory (arb_point_parameters)
>>   add_subdirectory (arb_provoking_vertex)
>>   add_subdirectory (arb_robustness)
>>   add_subdirectory (arb_sample_shading)
>>   add_subdirectory (arb_sampler_objects)
>>   add_subdirectory (arb_seamless_cube_map)
>>   add_subdirectory (amd_seamless_cubemap_per_texture)
>>   add_subdirectory (amd_vertex_shader_layer)
>>   add_subdirectory (amd_vertex_shader_viewport_index)
>>   add_subdirectory (arb_separate_shader_objects)
>>   add_subdirectory (arb_shader_subroutine)
>> diff --git a/tests/spec/arb_point_parameters/CMakeLists.gl.txt
>> b/tests/spec/arb_point_parameters/CMakeLists.gl.txt
>> new file mode 100644
>> index 0000000..18b7300
>> --- /dev/null
>> +++ b/tests/spec/arb_point_parameters/CMakeLists.gl.txt
>> @@ -0,0 +1,13 @@
>> +include_directories(
>> +    ${GLEXT_INCLUDE_DIR}
>> +    ${OPENGL_INCLUDE_PATH}
>> +    ${piglit_SOURCE_DIR}/tests/util
>> +)
>> +
>> +link_libraries (
>> +    piglitutil_${piglit_target_api}
>> +    ${OPENGL_gl_LIBRARY}
>> +)
>> +
>> +piglit_add_executable (arb_point_parameters-point-attenuation
>> point-attenuation.c)
>> +
>> diff --git a/tests/spec/arb_point_parameters/CMakeLists.txt
>> b/tests/spec/arb_point_parameters/CMakeLists.txt
>> new file mode 100644
>> index 0000000..144a306
>> --- /dev/null
>> +++ b/tests/spec/arb_point_parameters/CMakeLists.txt
>> @@ -0,0 +1 @@
>> +piglit_include_target_api()
>> diff --git a/tests/spec/arb_point_parameters/point-attenuation.c
>> b/tests/spec/arb_point_parameters/point-attenuation.c
>> new file mode 100644
>> index 0000000..ed77064
>> --- /dev/null
>> +++ b/tests/spec/arb_point_parameters/point-attenuation.c
>> @@ -0,0 +1,232 @@
>> +/* Copyright © 2005 Brian Paul
>> + *
>> + * 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 (including
>> the next
>> + * paragraph) 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
>> + * THE AUTHORS OR COPYRIGHT HOLDERS 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.
>> + */
>> +
>> +/** @file point-attenuation.c
>> + *
>> + * Test GL_ARB_point_parameters extension.
>> + */
>> +
>> +#include <math.h>
>> +
>> +#include "piglit-util-gl.h"
>> +
>> +#define windowWidth 100
>> +#define windowHeight 503 /* yes, odd */
>> +
>> +PIGLIT_GL_TEST_CONFIG_BEGIN
>> +    config.supports_gl_compat_version = 10;
>> +    config.window_visual = PIGLIT_GL_VISUAL_DOUBLE |
>> PIGLIT_GL_VISUAL_RGBA;
>> +    config.window_width = windowWidth;
>> +    config.window_height = windowHeight;
>> +PIGLIT_GL_TEST_CONFIG_END
>> +
>> +/* Max tested point size */
>> +#define MAX_SIZE 24.0
>> +
>> +/* Clamp X to [MIN,MAX] */
>> +#define CLAMP( X, MIN, MAX )  ( (X)<(MIN) ? (MIN) : ((X)>(MAX) ?
>> (MAX) : (X)) )
>> +
>> +GLfloat aliasedLimits[2];  /* min/max */
>> +GLfloat smoothLimits[2];   /* min/max */
>> +
>> +static void
>> +reportFailure(GLfloat initSize, const GLfloat attenuation[3],
>> +              GLfloat min, GLfloat max, GLfloat eyeZ,
>> +              GLfloat expected, GLfloat actual)
>> +{
>> +    fprintf(stderr, "Expected size: %f Actual size: %f\n", expected,
>> actual);
>> +    fprintf(stderr, "Size: %f\n", initSize);
>> +    fprintf(stderr, "Min: %f Max %f\n", min, max);
>> +    fprintf(stderr, "Attenuation %f %f %f\n", attenuation[0] ,
>> attenuation[1], attenuation[2]);
>> +    fprintf(stderr, "Eye Z: %f\n", eyeZ);
>> +}
>> +
>> +
>> +/* Compute the expected point size given various point state */
>> +static GLfloat
>> +expectedSize(GLfloat initSize,
>> +             const GLfloat attenuation[3],
>> +             GLfloat min, GLfloat max,
>> +             GLfloat eyeZ, GLboolean smooth)
>> +{
>> +    const GLfloat dist = fabs(eyeZ);
>> +    const GLfloat atten = sqrt(1.0 / (attenuation[0] +
>> +                      attenuation[1] * dist +
>> +                      attenuation[2] * dist * dist));
>> +
>> +    float size = initSize * atten;
>> +
>> +    size = CLAMP(size, min, max);
>> +
>> +    if (smooth)
>> +        size = CLAMP(size, smoothLimits[0], smoothLimits[1]);
>> +    else
>> +        size = CLAMP(size, aliasedLimits[0], aliasedLimits[1]);
>> +    return size;
>> +}
>> +
>> +
>> +/* measure size of rendered point at yPos (in model coords) */
>> +static GLfloat
>> +measureSize(GLfloat yPos)
>> +{
>> +    assert(yPos >= -10.0);
>> +    assert(yPos <= 10.0);
>> +    float yNdc = (yPos + 10.0) / 20.0;  /* See glOrtho above */
>> +    int x = 0;
>> +    int y = (int) (yNdc * windowHeight);
>> +    int w = windowWidth;
>> +    int h = 3;
>> +    GLfloat image[3 * windowWidth * 3]; /* three rows of RGB values */
>> +
>> +    /* Read three row of pixels and add up colors in each row.
>> +     * Use the row with the greatest sum.  This helps gives us a bit
>> +     * of leeway in vertical point positioning.
>> +     * Colors should be white or shades of gray if smoothing is enabled.
>> +     */
>> +    glReadPixels(x, y - 1, w, h, GL_RGB, GL_FLOAT, image);
>> +
>> +    float sum[3] = { 0.0, 0.0, 0.0 };
>> +    for (int j = 0; j < 3; j++) {
>> +        for (int i = 0; i < w; i++) {
>> +            int k = j * 3 * w + i * 3;
>> +            sum[j] += (image[k+0] + image[k+1] + image[k+2]) / 3.0;
>> +        }
>> +    }
>> +
>> +    /* find max of the row sums */
>> +    if (sum[0] >= sum[1] && sum[0] >= sum[2])
>> +        return sum[0];
>> +    else if (sum[1] >= sum[0] && sum[1] >= sum[2])
>> +        return sum[1];
>> +    else
>> +        return sum[2];
>> +}
>> +
>> +
>> +static bool
>> +testPointRendering(bool smooth)
>> +{
>> +    /* epsilon is the allowed size difference in pixels between the
>> +     * expected and actual rendering.
>> +     */
>> +    const GLfloat epsilon = (smooth ? 1.5 : 1.0) + 0.0;
>> +    GLfloat atten[3];
>> +
>> +    if (smooth) {
>> +        glEnable(GL_POINT_SMOOTH);
>> +        glEnable(GL_BLEND);
>> +        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
>> +    }
>> +    else {
>> +        glDisable(GL_POINT_SMOOTH);
>> +        glDisable(GL_BLEND);
>> +    }
>> +
>> +    for (int a = 0; a < 3; a++) {
>> +        atten[0] = pow(10.0, -a);
>> +        for (int b = -2; b < 3; b++) {
>> +            atten[1] = (b == -1) ? 0.0 : pow(10.0, -b);
>> +            for (int c = -2; c < 3; c++) {
>> +                atten[2] = (c == -1) ? 0.0 : pow(10.0, -c);
>> +
>> glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, atten);
>> +                for (float min = 1.0; min < MAX_SIZE; min += 10) {
>> +                    glPointParameterfARB(GL_POINT_SIZE_MIN_ARB, min);
>> +                    for (float max = min; max < MAX_SIZE; max += 10) {
>> +                        glPointParameterfARB(GL_POINT_SIZE_MAX_ARB,
>> max);
>> +                        for (float size = 1.0; size < MAX_SIZE; size
>> += 8) {
>> +                            glPointSize(size);
>> +
>> +                            /* draw column of points */
>> +                            glClear(GL_COLOR_BUFFER_BIT);
>> +                            glBegin(GL_POINTS);
>> +                            for (float z = -6.0; z <= 6.0; z += 1.0) {
>> +                                glVertex3f(0, z, z);
>> +                            }
>> +                            glEnd();
>> +
>> +                            /* test the column of points */
>> +                            for (float z = -6.0; z <= 6.0; z += 1.0) {
>> +                                float expected
>> +                                    = expectedSize(size, atten, min,
>> max,
>> +                                                   z, smooth);
>> +                                float actual = measureSize(z);
>> +                                if (fabs(expected - actual) > epsilon) {
>> +                                    reportFailure(size, atten, min, max,
>> +                                                  z, expected, actual);
>> +                                    return false;
>> +                                }
>> +                                else if(0){
>> +                                    printf("pass z=%f exp=%f act=%f\n",
>> +                                           z, expected, actual);
>> +                                }
>> +                            }
>> +                        }
>> +                    }
>> +                }
>> +            }
>> +        }
>> +    }
>> +
>> +    if (!piglit_check_gl_error(0))
>> +        return false;
>> +
>> +    return true;
>> +}
>> +
>> +enum piglit_result
>> +piglit_display(void)
>> +{
>> +    bool smooth = false;
>> +    bool pass = testPointRendering(smooth);
>> +    piglit_report_subtest_result(pass ? PIGLIT_PASS : PIGLIT_FAIL,
>> +            "Antialiased combinations");
>> +
>> +    smooth = true;
>> +    bool pass2 = testPointRendering(smooth) && pass;
>> +    piglit_report_subtest_result(pass2 ? PIGLIT_PASS : PIGLIT_FAIL,
>> +            "Aliased combinations");
>> +
>> +    return pass && pass2 ? PIGLIT_PASS : PIGLIT_FAIL;
>> +}
>> +
>> +void
>> +piglit_init(int argc, char **argv)
>> +{
>> +    piglit_require_extension("GL_ARB_point_parameters");
>> +
>> +    for (int i = 0; i < 2; i++) {
>> +        aliasedLimits[i] = 0;
>> +        smoothLimits[i] = 0;
>> +    }
>> +
>> +    glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, aliasedLimits);
>> +    glGetFloatv(GL_SMOOTH_POINT_SIZE_RANGE, smoothLimits);
>> +    glMatrixMode(GL_PROJECTION);
>> +    glLoadIdentity();
>> +    glOrtho(-10.0, 10.0, -10.0, 10.0, -10.0, 10.0);
>> +    glMatrixMode(GL_MODELVIEW);
>> +    glLoadIdentity();
>> +
>> +    if (!piglit_check_gl_error(0))
>> +        piglit_report_result(PIGLIT_FAIL);
>> +}
>>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> https://urldefense.proofpoint.com/v2/url?u=https-3A__lists.freedesktop.org_mailman_listinfo_piglit&d=DwIGaQ&c=uilaK90D4TOVoH58JNXRgQ&r=Ie7_encNUsqxbSRbqbNgofw0ITcfE8JKfaUjIQhncGA&m=580c9ANzjKQ-d452y4FKUG0qUq6WQ2iyVsqYuHlTEGw&s=5MxlhIvRLHXsX5VucO0QMsru29vMoD3Eei3DRufs_Jg&e=
>



More information about the Piglit mailing list