[Piglit] [PATCH] lineloop: add test for checking behavior with many immediate mode verts

Jose Fonseca jfonseca at vmware.com
Wed Jul 16 06:09:23 PDT 2014


On 16/07/14 02:57, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> line loops are difficult to handle because when trying to accumulate vertex
> data in a buffer the loop must be closed at the end - this is problematic if
> using any kind of fixed size buffer. With immediate mode api (presumably
> display lists have similar problems) this exposes a bug in mesa when the
> buffer gets full and data is wrapped around (each buffer forms its own
> incorrect line loop) (actually it seems to expose two bugs, one in vbo,
> one in draw). See https://bugs.freedesktop.org/show_bug.cgi?id=81174.
> This only tests line loops, not the primitive-from-hell, GL_POLYGON, which
> should have the same problem but only with fill mode line...
> ---
>   tests/all.py                    |  1 +
>   tests/general/CMakeLists.gl.txt |  1 +
>   tests/general/lineloop.c        | 99 +++++++++++++++++++++++++++++++++++++++++
>   3 files changed, 101 insertions(+)
>   create mode 100644 tests/general/lineloop.c
>
> diff --git a/tests/all.py b/tests/all.py
> index 17d5d9b..3de9061 100644
> --- a/tests/all.py
> +++ b/tests/all.py
> @@ -745,6 +745,7 @@ add_plain_test(gl11, 'hiz')
>   add_plain_test(gl11, 'infinite-spot-light')
>   add_plain_test(gl11, 'line-aa-width')
>   add_concurrent_test(gl11, 'line-flat-clip-color')
> +add_plain_test(gl11, 'lineloop')
>   add_plain_test(gl11, 'linestipple')
>   add_plain_test(gl11, 'longprim')
>   add_concurrent_test(gl11, 'masked-clear')
> diff --git a/tests/general/CMakeLists.gl.txt b/tests/general/CMakeLists.gl.txt
> index cd25124..5917df2 100644
> --- a/tests/general/CMakeLists.gl.txt
> +++ b/tests/general/CMakeLists.gl.txt
> @@ -74,6 +74,7 @@ IF (UNIX)
>   	target_link_libraries (line-aa-width m)
>   ENDIF (UNIX)
>   piglit_add_executable (line-flat-clip-color line-flat-clip-color.c)
> +piglit_add_executable (lineloop lineloop.c)
>   piglit_add_executable (longprim longprim.c)
>   piglit_add_executable (masked-clear masked-clear.c)
>   piglit_add_executable (pos-array pos-array.c)
> diff --git a/tests/general/lineloop.c b/tests/general/lineloop.c
> new file mode 100644
> index 0000000..734743f
> --- /dev/null
> +++ b/tests/general/lineloop.c
> @@ -0,0 +1,99 @@
> +/*
> + * Copyright (c) 2014 VMware, Inc.
> + *
> + * 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 lineloop.c
> + *
> + * Test line loop with many vertices.
> + * No additional lines should appear due to buffer splitting.
> + */
> +
> +#include "piglit-util-gl-common.h"
> +
> +#define WSIZE 400
> +
> +PIGLIT_GL_TEST_CONFIG_BEGIN
> +
> +	config.supports_gl_compat_version = 10;
> +        config.window_width = WSIZE;
> +        config.window_height = WSIZE;
> +	config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
> +
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +static const char *TestName = "lineloop";
> +static int vert_count = 10000;
> +
> +static void
> +draw(GLuint numVerts)
> +{
> +   GLuint i;
> +
> +   glColor3f(1,0,1);
> +   glBegin(GL_LINE_LOOP);
> +   for (i = 0; i < numVerts; i++) {
> +      glVertex3f(sin(i*M_PI*2/numVerts), cos(i*M_PI*2/numVerts),0);
> +   }
> +   glEnd();
> +}
> +
> +static void
> +test_prims(void)
> +{
> +   if (!piglit_automatic)
> +      printf("%s: %u vertices\n", TestName, vert_count);
> +   glClear(GL_COLOR_BUFFER_BIT);
> +   draw(vert_count);
> +   piglit_present_results();
> +}
> +
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +   float expected[4] = {0.0f, 0.0f, 0.0f, 0.0f};
> +   int pass;
> +   int half_quad = (int)((float)(WSIZE/2) / sqrt(2.0f) - 1.0f);
> +   test_prims();
> +   pass = piglit_probe_rect_rgb(WSIZE / 2 - half_quad,
> +                                WSIZE / 2 - half_quad,
> +                                half_quad, half_quad, expected);
> +   return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> +
> +
> +void
> +piglit_init(int argc, char**argv)
> +{
> +   int i;
> +   for (i = 1; i < argc; ++i) {
> +      if (i + 1 < argc) {
> +         if (strcmp(argv[i], "-count") == 0) {
> +            vert_count = strtoul(argv[++i], NULL, 0);
> +         }
> +      }
> +   }
> +
> +   glViewport(0,0, WSIZE, WSIZE);
> +   glOrtho(-1,1,-1,1,-1,1);
> +}
>

Looks good to me.

Jose


More information about the Piglit mailing list