[Piglit] [PATCH] Test that fragment shader writes to render targets are properly ordered.

Paul Berry stereotype441 at gmail.com
Tue Jul 24 15:15:32 PDT 2012


On 24 July 2012 15:14, Paul Berry <stereotype441 at gmail.com> wrote:

> Some hardware platforms (e.g. i965 gen6+) are capable of processing
> the fragments corresponding to multiple primitives in parallel, even
> if those primitives overlap on the screen.  This test verifies that in
> such situations, the fragment shader outputs are written to the
> framebuffer in the correct order.
>

Argh, I forgot to add this to all.tests.  I'll fix that before pushing.


> ---
>  tests/spec/glsl-1.30/execution/CMakeLists.gl.txt   |    1 +
>  .../glsl-1.30/execution/fs-execution-ordering.c    |  178
> ++++++++++++++++++++
>  2 files changed, 179 insertions(+), 0 deletions(-)
>  create mode 100644 tests/spec/glsl-1.30/execution/fs-execution-ordering.c
>
> diff --git a/tests/spec/glsl-1.30/execution/CMakeLists.gl.txt
> b/tests/spec/glsl-1.30/execution/CMakeLists.gl.txt
> index a582c3f..6737bb1 100644
> --- a/tests/spec/glsl-1.30/execution/CMakeLists.gl.txt
> +++ b/tests/spec/glsl-1.30/execution/CMakeLists.gl.txt
> @@ -19,3 +19,4 @@ ENDIF (NOT MSVC)
>  piglit_add_executable (vertexid-beginend vertexid-beginend.c)
>  piglit_add_executable (vertexid-drawarrays vertexid-drawarrays.c)
>  piglit_add_executable (vertexid-drawelements vertexid-drawelements.c)
> +piglit_add_executable (fs-execution-ordering fs-execution-ordering.c)
> diff --git a/tests/spec/glsl-1.30/execution/fs-execution-ordering.c
> b/tests/spec/glsl-1.30/execution/fs-execution-ordering.c
> new file mode 100644
> index 0000000..ccb0b77
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/execution/fs-execution-ordering.c
> @@ -0,0 +1,178 @@
> +/*
> + * Copyright © 2012 Intel Corporation
> + *
> + * 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.
> + */
> +
> +/**
> + * fs-execution-ordering.c
> + *
> + * Confirm that fragment shader outputs are written to the color
> + * buffer in the correct order, even if some fragments take
> + * dramatically longer to execute than others.
> + *
> + * Since this test is looking for race conditions, it repeats 100
> + * times, drawing different primitives sizes, to increase the chances
> + * of a race condition occurring.
> + */
> +
> +#include "piglit-util-gl-common.h"
> +
> +#define SHIFT_COUNT 64
> +
> +PIGLIT_GL_TEST_MAIN(
> +   100 /* window_width */,
> +   100 /* window_height */,
> +   GLUT_DOUBLE | GLUT_RGB | GLUT_ALPHA)
> +
> +#define SMALL_COMPOSITE 4
> +#define LARGE_PRIME 7919
> +
> +GLint prog;
> +GLuint vbo_handle;
> +
> +static const char *vstext =
> +       "#version 130\n"
> +       "in uint num;\n"
> +       "in vec4 pos;\n"
> +       "flat out uint number_to_classify;\n"
> +       "\n"
> +       "void main()\n"
> +       "{\n"
> +       "  gl_Position = pos;\n"
> +       "  number_to_classify = num;\n"
> +       "}\n";
> +
> +/* This fragment shader implements a simple primality test using trial
> + * division.  It outputs a color of red if its input is prime, and
> + * green if its input is composite.
> + *
> + * Note: no special effort has been made to use a very fast algorithm,
> + * since the purpose of the shader is to have dramatically different
> + * execution times based on the input parameter.
> + */
> +static const char *fstext =
> +       "#version 130\n"
> +       "flat in uint number_to_classify;\n"
> +       "\n"
> +       "void main()\n"
> +       "{\n"
> +       "  bool factor_found = false;\n"
> +       "  for (uint i = 2u; i < number_to_classify; ++i) {\n"
> +       "    if (number_to_classify % i == 0u)\n"
> +       "      factor_found = true;\n"
> +       "  }\n"
> +       "  gl_FragColor = factor_found ?\n"
> +       "    vec4(0.0, 1.0, 0.0, 1.0) :\n"
> +       "    vec4(1.0, 0.0, 0.0, 1.0);\n"
> +       "}\n";
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +       GLuint vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vstext);
> +       GLuint fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fstext);
> +       prog = piglit_link_simple_program(vs, fs);
> +       glGenBuffers(1, &vbo_handle);
> +
> +       if (!piglit_check_gl_error(GL_NO_ERROR))
> +               piglit_report_result(PIGLIT_FAIL);
> +}
> +
> +bool
> +do_test(unsigned size)
> +{
> +       float expected_color[4] = { 0.0, 1.0, 0.0, 1.0 };
> +
> +       /* Set up the necessary vertex array to draw two squares, each
> +        * size x size pixels.  The first square is drawn using a
> +        * large prime number for the "num" parameter, so it will be
> +        * drawn in red and take a long time to compute.  The second
> +        * square is drawn using a small composite number for the
> +        * "num" parameter, so it will be drawn in green and take a
> +        * short time to compute.
> +        *
> +        * Even though the second square takes a short time to
> +        * compute, it should be written to the color buffer after the
> +        * first square, so the result should be a green square.
> +        */
> +       GLfloat xmin = -1.0;
> +       GLfloat ymin = -1.0;
> +       GLfloat xmax = 2.0 * size / piglit_width - 1.0;
> +       GLfloat ymax = 2.0 * size / piglit_height - 1.0;
> +       struct vertex_attributes {
> +               GLfloat pos[2];
> +               GLuint num;
> +       } vertex_data[] = {
> +               { { xmin, ymin }, LARGE_PRIME },
> +               { { xmin, ymax }, LARGE_PRIME },
> +               { { xmax, ymax }, LARGE_PRIME },
> +               { { xmin, ymin }, LARGE_PRIME },
> +               { { xmax, ymax }, LARGE_PRIME },
> +               { { xmax, ymin }, LARGE_PRIME },
> +               { { xmin, ymin }, SMALL_COMPOSITE },
> +               { { xmax, ymax }, SMALL_COMPOSITE },
> +               { { xmax, ymin }, SMALL_COMPOSITE },
> +               { { xmin, ymin }, SMALL_COMPOSITE },
> +               { { xmin, ymax }, SMALL_COMPOSITE },
> +               { { xmax, ymax }, SMALL_COMPOSITE },
> +       };
> +
> +       size_t stride = sizeof(vertex_data[0]);
> +       GLint pos_index = glGetAttribLocation(prog, "pos");
> +       GLint num_index = glGetAttribLocation(prog, "num");
> +       glBindBuffer(GL_ARRAY_BUFFER, vbo_handle);
> +       glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_data), &vertex_data,
> +                    GL_STATIC_DRAW);
> +       glVertexAttribPointer(pos_index, 2, GL_FLOAT, GL_FALSE, stride,
> +                             (void *) offsetof(struct vertex_attributes,
> +                                               pos));
> +       glVertexAttribIPointer(num_index, 1, GL_UNSIGNED_INT, stride,
> +                              (void *) offsetof(struct vertex_attributes,
> +                                                num));
> +       glEnableVertexAttribArray(pos_index);
> +       glEnableVertexAttribArray(num_index);
> +
> +       /* Draw the squares and check their color. */
> +       glDrawArrays(GL_TRIANGLES, 0, ARRAY_SIZE(vertex_data));
> +       return piglit_probe_rect_rgba(0, 0, size, size, expected_color);
> +}
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +       enum piglit_result result = PIGLIT_PASS;
> +       unsigned size;
> +
> +       glUseProgram(prog);
> +       glClear(GL_COLOR_BUFFER_BIT);
> +
> +       for (size = 1; size <= 100; ++size) {
> +               if (!do_test(size)) {
> +                       printf("Failed at rect size %dx%d\n", size, size);
> +                       result = PIGLIT_FAIL;
> +                       break;
> +               }
> +       }
> +
> +       piglit_present_results();
> +
> +       return result;
> +}
> --
> 1.7.7.6
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20120724/3d2889e9/attachment-0001.html>


More information about the Piglit mailing list