[Piglit] [PATCH 2/2] gl-1.0-readpixsanity: Eliminate use of variable length arrays.
jfonseca at vmware.com
jfonseca at vmware.com
Wed Oct 29 04:48:17 PDT 2014
From: José Fonseca <jfonseca at vmware.com>
Non-standard GCC extension.
---
tests/spec/gl-1.0/readpix.c | 64 ++++++++++++++++++++++++++-------------------
1 file changed, 37 insertions(+), 27 deletions(-)
diff --git a/tests/spec/gl-1.0/readpix.c b/tests/spec/gl-1.0/readpix.c
index 7ee0be9..26f44a6 100644
--- a/tests/spec/gl-1.0/readpix.c
+++ b/tests/spec/gl-1.0/readpix.c
@@ -100,7 +100,9 @@ check_rgba(void)
double err;
int xerr, yerr;
float expected[4], expected_rgba[4], actual_rgba[4];
- GLfloat buf[piglit_width][piglit_height][4];
+ const int w = piglit_width;
+ const int h = piglit_height;
+ GLfloat *buf = (GLfloat *)malloc(h * w * 4 * sizeof *buf);
GLfloat dr, dg, db, da;
GLint rbits, gbits, bbits, abits;
glGetIntegerv(GL_RED_BITS, &rbits);
@@ -119,19 +121,18 @@ check_rgba(void)
glClear(GL_COLOR_BUFFER_BIT);
/* Read the buffer: */
- glReadPixels(0, 0, piglit_width,
- piglit_height, GL_RGBA, GL_FLOAT, buf);
+ glReadPixels(0, 0, w, h, GL_RGBA, GL_FLOAT, buf);
/*
* Now compute the error for each pixel, and record the
* worst one we find:
*/
- for (y = 0; y < piglit_height; ++y) {
- for (x = 0; x < piglit_width; ++x) {
- dr = fabs(buf[y][x][0] - expected[0]);
- dg = fabs(buf[y][x][1] - expected[1]);
- db = fabs(buf[y][x][2] - expected[2]);
- da = fabs(buf[y][x][3] - expected[3]);
+ for (y = 0; y < h; ++y) {
+ for (x = 0; x < w; ++x) {
+ dr = fabs(buf[y*w*4 + x*4 + 0] - expected[0]);
+ dg = fabs(buf[y*w*4 + x*4 + 1] - expected[1]);
+ db = fabs(buf[y*w*4 + x*4 + 2] - expected[2]);
+ da = fabs(buf[y*w*4 + x*4 + 3] - expected[3]);
err =
fmax(error_bits(dr, rbits),
fmax(error_bits(dg, gbits),
@@ -156,7 +157,7 @@ check_rgba(void)
expected_rgba[j] =
expected[j];
actual_rgba[j] =
- buf[y][x][j];
+ buf[y*w*4 + x*4 + j];
}
}
}
@@ -187,6 +188,8 @@ check_rgba(void)
}
+ free(buf);
+
return pass;
} /* check_rgba */
@@ -196,8 +199,10 @@ check_depth(void)
int i, x, y;
int thresh = 1;
bool pass = true;
- GLdouble expected, expected_depth, actual_depth;
- GLuint buf[piglit_width][piglit_height];
+ GLdouble expected, expected_depth, actual, actual_depth;
+ const int w = piglit_width;
+ const int h = piglit_height;
+ GLuint *buf = (GLuint *)malloc(h * w * sizeof *buf);
double current_error = 0.0;
GLfloat dd;
double err;
@@ -219,25 +224,25 @@ check_depth(void)
* than a GLfloat. Since this is just a sanity check, we'll
* use integer readback and settle for 32 bits at best.
*/
- glReadPixels(0, 0, piglit_width,
- piglit_height, GL_DEPTH_COMPONENT,
+ glReadPixels(0, 0, w, h,
+ GL_DEPTH_COMPONENT,
GL_UNSIGNED_INT, buf);
/*
* Now compute the error for each pixel, and record the
* worst one we find:
*/
- for (y = 0; y < piglit_height; ++y) {
- for (x = 0; x < piglit_width; ++x) {
- dd = abs(buf[y][x]/4294967295.0
- - expected);
+ for (y = 0; y < h; ++y) {
+ for (x = 0; x < w; ++x) {
+ actual = buf[y*w + x]/(double)0xffffffffU;
+ dd = abs(actual - expected);
err = error_bits(dd, dbits);
if (err > current_error) {
current_error = err;
xerr = x;
yerr = y;
expected_depth = expected;
- actual_depth = buf[y][x]/4294967295.0;
+ actual_depth = actual;
}
}
}
@@ -258,6 +263,8 @@ check_depth(void)
actual_depth);
}
+ free(buf);
+
return pass;
} /* check_depth */
@@ -278,7 +285,9 @@ check_stencil(void)
{
int i, x, y;
bool pass = true;
- GLuint buf[piglit_width][piglit_height];
+ const int w = piglit_width;
+ const int h = piglit_height;
+ GLuint *buf = (GLuint *)malloc(h * w * sizeof *buf);
GLuint expected;
GLint sbits;
glGetIntegerv(GL_STENCIL_BITS, &sbits);
@@ -291,14 +300,13 @@ check_stencil(void)
glClear(GL_STENCIL_BUFFER_BIT);
pass &= piglit_check_gl_error(GL_NO_ERROR);
- glReadPixels(0, 0, piglit_width,
- piglit_height, GL_STENCIL_INDEX,
- GL_UNSIGNED_INT, buf);
+ glReadPixels(0, 0, w, h,
+ GL_STENCIL_INDEX, GL_UNSIGNED_INT, buf);
pass &= piglit_check_gl_error(GL_NO_ERROR);
- for (y = 0; y < piglit_height && pass; ++y) {
- for (x = 0; x < piglit_width; ++x) {
- if (buf[y][x] != expected) {
+ for (y = 0; y < h && pass; ++y) {
+ for (x = 0; x < w; ++x) {
+ if (buf[y*w + x] != expected) {
pass = false;
break;
}
@@ -315,9 +323,11 @@ check_stencil(void)
printf("\tStencil failed at (%i, %i).\n",
x, y);
printf("\t\tExpected %i; got %i.\n",
- expected, buf[y][x]);
+ expected, buf[y*w + x]);
}
+ free(buf);
+
return pass;
} /* check_stencil */
--
1.9.1
More information about the Piglit
mailing list