[Piglit] [PATCH] Add test glsl-uniform-out-of-bounds-2.c

Frank Henigman fjhenigman at google.com
Mon Nov 12 18:09:51 PST 2012


Any feedback on this?  Thanks.

On Mon, Nov 5, 2012 at 2:39 PM, Frank Henigman <fjhenigman at google.com>wrote:

> This test shows the problem fixed by my "add bounds checking for
> uniform array access" patch, sent to mesa-dev on Nov. 2.
>
> Check behavior of glGetUniformLocation, glGetUniform and glUniform(Matrix)
> when attempting to access non-existent array elements.
> ---
>  tests/all.tests                              |    1 +
>  tests/shaders/CMakeLists.gl.txt              |    1 +
>  tests/shaders/glsl-uniform-out-of-bounds-2.c |  155
> ++++++++++++++++++++++++++
>  3 files changed, 157 insertions(+), 0 deletions(-)
>  create mode 100644 tests/shaders/glsl-uniform-out-of-bounds-2.c
>
> diff --git a/tests/all.tests b/tests/all.tests
> index 0a8a5aa..63bf1f6 100644
> --- a/tests/all.tests
> +++ b/tests/all.tests
> @@ -240,6 +240,7 @@ add_plain_test(shaders, 'glsl-novertexdata')
>  add_plain_test(shaders, 'glsl-preprocessor-comments')
>  add_plain_test(shaders, 'glsl-reload-source')
>  add_plain_test(shaders, 'glsl-uniform-out-of-bounds')
> +add_plain_test(shaders, 'glsl-uniform-out-of-bounds-2')
>  add_plain_test(shaders, 'glsl-uniform-update')
>  add_plain_test(shaders, 'glsl-unused-varying')
>  add_plain_test(shaders, 'glsl-fs-bug25902')
> diff --git a/tests/shaders/CMakeLists.gl.txt
> b/tests/shaders/CMakeLists.gl.txt
> index 6ac0230..93cbf7b 100644
> --- a/tests/shaders/CMakeLists.gl.txt
> +++ b/tests/shaders/CMakeLists.gl.txt
> @@ -66,6 +66,7 @@ piglit_add_executable (glsl-reload-source
> glsl-reload-source.c)
>  piglit_add_executable (glsl-unused-varying glsl-unused-varying.c)
>  piglit_add_executable (glsl-uniform-update glsl-uniform-update.c)
>  piglit_add_executable (glsl-uniform-out-of-bounds
> glsl-uniform-out-of-bounds.c)
> +piglit_add_executable (glsl-uniform-out-of-bounds-2
> glsl-uniform-out-of-bounds-2.c)
>  piglit_add_executable (glsl-fs-bug25902 glsl-fs-bug25902.c)
>  piglit_add_executable (glsl-fs-color-matrix glsl-fs-color-matrix.c)
>  piglit_add_executable (glsl-fs-exp2 glsl-fs-exp2.c)
> diff --git a/tests/shaders/glsl-uniform-out-of-bounds-2.c
> b/tests/shaders/glsl-uniform-out-of-bounds-2.c
> new file mode 100644
> index 0000000..94a9f88
> --- /dev/null
> +++ b/tests/shaders/glsl-uniform-out-of-bounds-2.c
> @@ -0,0 +1,155 @@
> +/*
> + * Copyright 2012 Google Inc.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, write to the Free Software
> + * Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA
> 02110-1301, USA
> + *
> + * Authors:
> + *   Frank Henigman <fjhenigman at google.com>
> + */
> +
> +#include "piglit-util-gl-common.h"
> +
> +PIGLIT_GL_TEST_CONFIG_BEGIN
> +
> +       config.supports_gl_compat_version = 10;
> +
> +       config.window_width = 100;
> +       config.window_height = 100;
> +       config.window_visual = PIGLIT_GL_VISUAL_RGB |
> PIGLIT_GL_VISUAL_DOUBLE;
> +
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +static GLint prog;
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +       /* unreached */
> +       return PIGLIT_FAIL;
> +}
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +       GLint vs, fs, len;
> +       GLchar name[99];
> +       int size;
> +       GLenum type;
> +       int i, j, activeIdx;
> +       enum piglit_result result = PIGLIT_PASS;
> +       GLint min = -1, max = -1;
> +       GLint numActive;
> +       GLfloat v[16];
> +
> +       piglit_require_gl_version(20);
> +
> +       vs = piglit_compile_shader_text(GL_VERTEX_SHADER,
> +               "attribute vec4 p;\n"
> +               "void main() { gl_Position = p; }\n"
> +       );
> +       fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER,
> +               "uniform vec4 v[4];\n"
> +               "uniform mat4 m[4];\n"
> +               "void main() { gl_FragColor = v[1] + m[1][1]; }\n"
> +       );
> +
> +       prog = piglit_link_simple_program(vs, fs);
> +       glUseProgram(prog);
> +       glGetProgramiv(prog, GL_ACTIVE_UNIFORMS, &numActive);
> +       printf("num active %d\n", numActive);
> +
> +       for ( activeIdx = 0; activeIdx < numActive; ++activeIdx ) {
> +               glGetActiveUniform(prog, activeIdx,
> sizeof(name)/sizeof(name[0]), NULL, &len, &type, name);
> +               printf("name %s length %d\n", name, len);
> +               if (name[1] != 0) continue;
> +               if (name[0] == 'v') {
> +                       size = 4;
> +               } else if (name[0] == 'm' ) {
> +                       size = 16;
> +               } else {
> +                       continue;
> +               }
> +
> +               // try each location in array, plus some outside
> +               for ( i = -2; i < len + 2; ++i ) {
> +                       GLchar buf[9];
> +                       sprintf(buf, "%c[%d]", name[0], i);
> +                       GLint loc = glGetUniformLocation(prog, buf);
> +                       int isActive;
> +                       if (loc == -1) {
> +                               printf("no index %d\n", i);
> +                               isActive = 0;
> +                       } else {
> +                               isActive = 1;
> +                               if (min == -1 || loc < min) min = loc;
> +                               if (max == -1 || loc > max) max = loc;
> +
> +                               // write, read back, compare
> +                               for ( j = 0; j < 16; ++j ) v[j] = j + 11;
> +                               if (size == 4 ) {
> +                                       glUniform4fv(loc, 1, v);
> +                               } else {
> +                                       glUniformMatrix4fv(loc, 1,
> GL_FALSE, v);
> +                               }
> +                               glGetUniformfv(prog, loc, v);
> +                               for ( j = 0; j < size; ++j ) {
> +                                       if (v[j] != j + 11) {
> +                                               printf("FAIL: value at
> index %d\n", i);
> +                                               result = PIGLIT_FAIL;
> +                                               break;
> +                                       }
> +                               }
> +                       }
> +
> +                       // does glGetActiveUniform agree with
> glGetUniformLocation?
> +                       if (isActive ^ (0 <= i && i < len)) {
> +                               printf("FAIL: inconsistent reporting of
> active array elements\n");
> +                               result = PIGLIT_FAIL;
> +                       }
> +               }
> +       }
> +
> +       // make up some bogus locations
> +       GLint bogus[99];
> +       int nbogus = 0;
> +       for ( i = 1; i < 6; ++i ) {
> +               bogus[nbogus++] = min - i;
> +               bogus[nbogus++] = max + i;
> +               bogus[nbogus++] = max + (1<<16) + i - 3;
> +       }
> +
> +       // test bogus locations
> +       for ( i = 0; i < nbogus; ++i ) {
> +               if (bogus[i] == -1) continue;
> +               printf("try bogus location %d\n", bogus[i]);
> +               glUniform4fv(bogus[i], 1, v);
> +               if (glGetError() != GL_INVALID_OPERATION) {
> +                       printf("FAIL: wrote bogus location\n");
> +                       result = PIGLIT_FAIL;
> +               }
> +               glUniformMatrix4fv(bogus[i], 1, GL_FALSE, v);
> +               if (glGetError() != GL_INVALID_OPERATION) {
> +                       printf("FAIL: wrote bogus location (matrix)\n");
> +                       result = PIGLIT_FAIL;
> +               }
> +               glGetUniformfv(prog, bogus[i], v);
> +               if (glGetError() != GL_INVALID_OPERATION) {
> +                       printf("FAIL: read bogus location\n");
> +                       result = PIGLIT_FAIL;
> +               }
> +       }
> +
> +       piglit_report_result(result);
> +}
> --
> 1.7.7.3
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20121112/0c9f7312/attachment-0001.html>


More information about the Piglit mailing list