[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