summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2010-09-22 19:12:34 -0600
committerBrian Paul <brianp@vmware.com>2010-09-22 19:12:36 -0600
commit75589a36e5cc526fb35ef37c91d4616283ecc5f7 (patch)
tree7df23e7fe1d87699bc176deb1814eac5e71b2069
parent390b0392f25dc85080a9a5c2a69926c290873e38 (diff)
pointAtten: improve measureSize() function
Before, we read one row of pixels where we expected the point to be in order to compute the point size. With some drivers single pixel points might be positioned one above or below the expected position thus causing the test to fail. Now, read thee rows of pixels to make sure we don't miss the point. The purpose of this test is to measure attenuated point size, not exact positioning of single pixel points.
-rw-r--r--src/glean/tpointatten.cpp44
1 files changed, 32 insertions, 12 deletions
diff --git a/src/glean/tpointatten.cpp b/src/glean/tpointatten.cpp
index f5ce13e..4ff1c45 100644
--- a/src/glean/tpointatten.cpp
+++ b/src/glean/tpointatten.cpp
@@ -134,16 +134,30 @@ PointAttenuationTest::measureSize(GLfloat yPos) const
int x = 0;
int y = (int) (yNdc * windowHeight);
int w = windowWidth;
- int h = 1;
- GLfloat image[windowWidth * 3];
- // Read row of pixels and add up colors, which should be white
- // or shades of gray if smoothing is enabled.
- glReadPixels(x, y, w, h, GL_RGB, GL_FLOAT, image);
- float sum = 0.0;
- for (int i = 0; i < w; i++) {
- sum += (image[i*3+0] + image[i*3+1] + image[i*3+2]) / 3.0;
+ 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;
+ }
}
- return sum;
+
+ // 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];
}
@@ -152,13 +166,13 @@ 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;
+ const GLfloat epsilon = (smooth ? 1.5 : 1.0) + 0.0;
GLfloat atten[3];
int count = 0;
// Enable front buffer if you want to see the rendering
- //glDrawBuffer(GL_FRONT);
- //glReadBuffer(GL_FRONT);
+ glDrawBuffer(GL_FRONT);
+ glReadBuffer(GL_FRONT);
if (smooth) {
glEnable(GL_POINT_SMOOTH);
@@ -192,6 +206,8 @@ PointAttenuationTest::testPointRendering(GLboolean smooth)
}
glEnd();
+ glFinish();
+
// test the column of points
for (float z = -6.0; z <= 6.0; z += 1.0) {
count++;
@@ -205,6 +221,10 @@ PointAttenuationTest::testPointRendering(GLboolean smooth)
expected, actual);
return false;
}
+ else if(0){
+ printf("pass z=%f exp=%f act=%f\n",
+ z, expected, actual);
+ }
}
}
}