[Piglit] [PATCH 2/2] gl-1.0-readpixsanity: Eliminate use of variable length arrays.
Jan Vesely
jan.vesely at rutgers.edu
Wed Oct 29 09:20:25 PDT 2014
On Wed, 2014-10-29 at 11:48 +0000, jfonseca at vmware.com wrote:
> From: José Fonseca <jfonseca at vmware.com>
>
> Non-standard GCC extension.
just FYI, it's not GCC extension, it's c99 standard.
maybe we can use more msvc compatible set of gcc flags (-std=c89
-pedantic? ) for code that needs to compile in windows
jan
> ---
> 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 */
>
--
Jan Vesely <jan.vesely at rutgers.edu>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20141029/ed80e327/attachment.sig>
More information about the Piglit
mailing list