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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to