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

Timothy Arceri tarceri at itsqueeze.com
Wed Jun 21 00:33:15 UTC 2017


---
 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);
+}
-- 
2.9.4



More information about the Piglit mailing list