[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