[Mesa-dev] [PATCH] arb_indirect_parameters: add basic rendering tests

Ilia Mirkin imirkin at alum.mit.edu
Sat Jan 2 12:30:58 PST 2016


Errr... wrong list. And forgot to add to all.py. Please disregard,
will send a fixed version to the right list shortly.

On Sat, Jan 2, 2016 at 3:02 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> Creates an array with 3 draws, the last of which is "bad", and makes
> sure that the "bad" one is never drawn. Parameter count is supplied from
> an earlier XFB draw to ensure that proper fencing occurs.
>
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
>  tests/spec/CMakeLists.txt                          |   1 +
>  .../spec/arb_indirect_parameters/CMakeLists.gl.txt |  13 ++
>  tests/spec/arb_indirect_parameters/CMakeLists.txt  |   1 +
>  .../spec/arb_indirect_parameters/tf-count-arrays.c | 220 ++++++++++++++++++++
>  .../arb_indirect_parameters/tf-count-elements.c    | 229 +++++++++++++++++++++
>  5 files changed, 464 insertions(+)
>  create mode 100644 tests/spec/arb_indirect_parameters/CMakeLists.gl.txt
>  create mode 100644 tests/spec/arb_indirect_parameters/CMakeLists.txt
>  create mode 100644 tests/spec/arb_indirect_parameters/tf-count-arrays.c
>  create mode 100644 tests/spec/arb_indirect_parameters/tf-count-elements.c
>
> diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt
> index 3c4bcfb..a984734 100644
> --- a/tests/spec/CMakeLists.txt
> +++ b/tests/spec/CMakeLists.txt
> @@ -142,3 +142,4 @@ add_subdirectory (mesa_pack_invert)
>  add_subdirectory (ext_texture_format_bgra8888)
>  add_subdirectory (oes_draw_elements_base_vertex)
>  add_subdirectory (arb_shader_draw_parameters)
> +add_subdirectory (arb_indirect_parameters)
> diff --git a/tests/spec/arb_indirect_parameters/CMakeLists.gl.txt b/tests/spec/arb_indirect_parameters/CMakeLists.gl.txt
> new file mode 100644
> index 0000000..88f533d
> --- /dev/null
> +++ b/tests/spec/arb_indirect_parameters/CMakeLists.gl.txt
> @@ -0,0 +1,13 @@
> +include_directories(
> +       ${GLEXT_INCLUDE_DIR}
> +       ${OPENGL_INCLUDE_PATH}
> +       ${piglit_SOURCE_DIR}/tests/mesa/util
> +)
> +
> +link_libraries (
> +       piglitutil_${piglit_target_api}
> +       ${OPENGL_gl_LIBRARY}
> +)
> +
> +piglit_add_executable (arb_indirect_parameters-tf-count-elements tf-count-elements.c)
> +piglit_add_executable (arb_indirect_parameters-tf-count-arrays tf-count-arrays.c)
> diff --git a/tests/spec/arb_indirect_parameters/CMakeLists.txt b/tests/spec/arb_indirect_parameters/CMakeLists.txt
> new file mode 100644
> index 0000000..144a306
> --- /dev/null
> +++ b/tests/spec/arb_indirect_parameters/CMakeLists.txt
> @@ -0,0 +1 @@
> +piglit_include_target_api()
> diff --git a/tests/spec/arb_indirect_parameters/tf-count-arrays.c b/tests/spec/arb_indirect_parameters/tf-count-arrays.c
> new file mode 100644
> index 0000000..e88a7ba
> --- /dev/null
> +++ b/tests/spec/arb_indirect_parameters/tf-count-arrays.c
> @@ -0,0 +1,220 @@
> +/*
> + * Copyright (C) 2016 Ilia Mirkin
> + *
> + * 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.
> + */
> +
> +#include "piglit-util-gl.h"
> +
> +PIGLIT_GL_TEST_CONFIG_BEGIN
> +
> +       config.supports_gl_core_version = 31;
> +       config.window_visual = PIGLIT_GL_VISUAL_RGBA | PIGLIT_GL_VISUAL_DOUBLE;
> +
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +static const char *vs_tf =
> +       "#version 140\n"
> +       "out int tf;\n"
> +       "uniform int tf_val;\n"
> +       "void main() { gl_Position = vec4(0); tf = tf_val; }\n";
> +
> +static const char *vs_draw =
> +       "#version 140\n"
> +       "out vec4 color;\n"
> +       "in vec4 vtx, in_color;\n"
> +       "void main() { gl_Position = vtx; color = in_color; }\n";
> +
> +static const char *fs_draw =
> +       "#version 140\n"
> +       "out vec4 c;\n"
> +       "in vec4 color;\n"
> +       "void main() { c = color; }\n";
> +
> +static GLint tf_prog, draw_prog;
> +static GLint tf_val;
> +static GLuint tf_vao, draw_vao;
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +       static const char *varying = "tf";
> +       static const unsigned cmds[] = {
> +               4, 1, 0, 0,
> +               4, 1, 4, 0,
> +               4, 1, 8, 0,
> +       };
> +       static const struct {
> +               float vertex_array[12 * 2];
> +               float colors[12 * 4];
> +       } geometry = {
> +               {
> +                       -1, -1,
> +                       0, -1,
> +                       0, 1,
> +                       -1, 1,
> +
> +                       0, -1,
> +                       1, -1,
> +                       1, 1,
> +                       0, 1,
> +
> +                       -1, -1,
> +                       1, -1,
> +                       1, 1,
> +                       -1, 1,
> +               },
> +               {
> +                       0, 1, 0, 1,
> +                       0, 1, 0, 1,
> +                       0, 1, 0, 1,
> +                       0, 1, 0, 1,
> +
> +                       0, 1, 1, 1,
> +                       0, 1, 1, 1,
> +                       0, 1, 1, 1,
> +                       0, 1, 1, 1,
> +
> +                       1, 0, 0, 0,
> +                       1, 0, 0, 0,
> +                       1, 0, 0, 0,
> +                       1, 0, 0, 0,
> +               },
> +       };
> +
> +       GLuint vbo, dbo;
> +
> +       piglit_require_extension("GL_ARB_indirect_parameters");
> +
> +       tf_prog = piglit_build_simple_program_unlinked(vs_tf, NULL);
> +       draw_prog = piglit_build_simple_program(vs_draw, fs_draw);
> +
> +       glTransformFeedbackVaryings(tf_prog, 1, &varying,
> +                                   GL_INTERLEAVED_ATTRIBS);
> +       glLinkProgram(tf_prog);
> +       if (!piglit_link_check_status(tf_prog))
> +               piglit_report_result(PIGLIT_FAIL);
> +       tf_val = glGetUniformLocation(tf_prog, "tf_val");
> +
> +       glGenVertexArrays(1, &tf_vao);
> +
> +       glGenVertexArrays(1, &draw_vao);
> +       glBindVertexArray(draw_vao);
> +
> +       glGenBuffers(1, &vbo);
> +       glBindBuffer(GL_ARRAY_BUFFER, vbo);
> +       glBufferData(GL_ARRAY_BUFFER, sizeof(geometry), &geometry, GL_STATIC_DRAW);
> +
> +       glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE,
> +                             2 * sizeof(GLfloat), NULL);
> +
> +       glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE,
> +                             4 * sizeof(GLfloat), (void *)(12 * 2 * 4));
> +       glEnableVertexAttribArray(0);
> +       glEnableVertexAttribArray(1);
> +
> +       glGenBuffers(1, &dbo);
> +       glBindBuffer(GL_DRAW_INDIRECT_BUFFER, dbo);
> +       glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(cmds), cmds, GL_STATIC_DRAW);
> +}
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +       GLuint xfb_buf;
> +       bool pass = true;
> +       unsigned *map;
> +
> +       static const float g[] = {0, 1, 0, 1};
> +       static const float gb[] = {0, 1, 1, 1};
> +
> +       glClearColor(0.2, 0.2, 0.2, 0.2);
> +       glClear(GL_COLOR_BUFFER_BIT);
> +
> +       glGenBuffers(1, &xfb_buf);
> +       glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, xfb_buf);
> +       glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 8, NULL, GL_STATIC_READ);
> +
> +       glEnable(GL_RASTERIZER_DISCARD);
> +       glBindVertexArray(tf_vao);
> +       glUseProgram(tf_prog);
> +
> +       /* write a 2 into xfb_buf[0] */
> +       glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, xfb_buf, 0, 4);
> +       glUniform1i(tf_val, 2);
> +       glBeginTransformFeedback(GL_POINTS);
> +       glDrawArrays(GL_POINTS, 0, 1);
> +       glEndTransformFeedback();
> +
> +       /* write a 0 into xfb_buf[1] */
> +       glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, xfb_buf, 4, 4);
> +       glUniform1i(tf_val, 0);
> +       glBeginTransformFeedback(GL_POINTS);
> +       glDrawArrays(GL_POINTS, 0, 1);
> +       glEndTransformFeedback();
> +
> +       glDisable(GL_RASTERIZER_DISCARD);
> +       glBindVertexArray(draw_vao);
> +       glUseProgram(draw_prog);
> +
> +       /* Draw the g/gb halves */
> +       glBindBuffer(GL_PARAMETER_BUFFER_ARB, xfb_buf);
> +       glMultiDrawArraysIndirectCountARB(
> +                       GL_TRIANGLE_FAN,
> +                       0, 0, 2, 0);
> +
> +       pass &= piglit_probe_rect_rgba(0, 0, piglit_width / 2, piglit_height,
> +                                      g);
> +       pass &= piglit_probe_rect_rgba(piglit_width / 2, 0,
> +                                      piglit_width / 2, piglit_height,
> +                                      gb);
> +       if (!pass) {
> +               printf("first draw failed\n");
> +               goto end;
> +       }
> +
> +       /* Overdraw with the red quad, except count = 0 */
> +       glMultiDrawArraysIndirectCountARB(
> +                       GL_TRIANGLE_FAN,
> +                       (2 * 4 * 4), 4, 1, 0);
> +
> +       pass &= piglit_probe_rect_rgba(0, 0, piglit_width / 2, piglit_height,
> +                                      g);
> +       pass &= piglit_probe_rect_rgba(piglit_width / 2, 0,
> +                                      piglit_width / 2, piglit_height,
> +                                      gb);
> +       if (!pass)
> +               printf("second draw did something when it shouldn't have.\n");
> +
> +end:
> +       piglit_present_results();
> +       map = glMapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, GL_READ_ONLY);
> +       if (map[0] != 2) {
> +               printf("map[0] != 2\n");
> +               pass = false;
> +       }
> +       if (map[1] != 0) {
> +               printf("map[1] != 0\n");
> +               pass = false;
> +       }
> +       glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
> +       glDeleteBuffers(1, &xfb_buf);
> +       return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> diff --git a/tests/spec/arb_indirect_parameters/tf-count-elements.c b/tests/spec/arb_indirect_parameters/tf-count-elements.c
> new file mode 100644
> index 0000000..6ba646f
> --- /dev/null
> +++ b/tests/spec/arb_indirect_parameters/tf-count-elements.c
> @@ -0,0 +1,229 @@
> +/*
> + * Copyright (C) 2016 Ilia Mirkin
> + *
> + * 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.
> + */
> +
> +#include "piglit-util-gl.h"
> +
> +PIGLIT_GL_TEST_CONFIG_BEGIN
> +
> +       config.supports_gl_core_version = 31;
> +       config.window_visual = PIGLIT_GL_VISUAL_RGBA | PIGLIT_GL_VISUAL_DOUBLE;
> +
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +static const char *vs_tf =
> +       "#version 140\n"
> +       "out int tf;\n"
> +       "uniform int tf_val;\n"
> +       "void main() { gl_Position = vec4(0); tf = tf_val; }\n";
> +
> +static const char *vs_draw =
> +       "#version 140\n"
> +       "out vec4 color;\n"
> +       "in vec4 vtx, in_color;\n"
> +       "void main() { gl_Position = vtx; color = in_color; }\n";
> +
> +static const char *fs_draw =
> +       "#version 140\n"
> +       "out vec4 c;\n"
> +       "in vec4 color;\n"
> +       "void main() { c = color; }\n";
> +
> +static GLint tf_prog, draw_prog;
> +static GLint tf_val;
> +static GLuint tf_vao, draw_vao;
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +       static const char *varying = "tf";
> +       static const unsigned cmds[] = {
> +               6, 1, 0, 0, 0,
> +               6, 1, 0, 4, 0,
> +               6, 1, 0, 8, 0,
> +       };
> +       static const struct {
> +               float vertex_array[12 * 2];
> +               float colors[12 * 4];
> +       } geometry = {
> +               {
> +                       -1, -1,
> +                       0, -1,
> +                       0, 1,
> +                       -1, 1,
> +
> +                       0, -1,
> +                       1, -1,
> +                       1, 1,
> +                       0, 1,
> +
> +                       -1, -1,
> +                       1, -1,
> +                       1, 1,
> +                       -1, 1,
> +               },
> +               {
> +                       0, 1, 0, 1,
> +                       0, 1, 0, 1,
> +                       0, 1, 0, 1,
> +                       0, 1, 0, 1,
> +
> +                       0, 1, 1, 1,
> +                       0, 1, 1, 1,
> +                       0, 1, 1, 1,
> +                       0, 1, 1, 1,
> +
> +                       1, 0, 0, 0,
> +                       1, 0, 0, 0,
> +                       1, 0, 0, 0,
> +                       1, 0, 0, 0,
> +               },
> +       };
> +
> +       static const int indices[12] = {
> +               0, 1, 2,
> +               0, 2, 3,
> +       };
> +
> +       GLuint vbo, ibo, dbo;
> +
> +       piglit_require_extension("GL_ARB_indirect_parameters");
> +
> +       tf_prog = piglit_build_simple_program_unlinked(vs_tf, NULL);
> +       draw_prog = piglit_build_simple_program(vs_draw, fs_draw);
> +
> +       glTransformFeedbackVaryings(tf_prog, 1, &varying,
> +                                   GL_INTERLEAVED_ATTRIBS);
> +       glLinkProgram(tf_prog);
> +       if (!piglit_link_check_status(tf_prog))
> +               piglit_report_result(PIGLIT_FAIL);
> +       tf_val = glGetUniformLocation(tf_prog, "tf_val");
> +
> +       glGenVertexArrays(1, &tf_vao);
> +
> +       glGenVertexArrays(1, &draw_vao);
> +       glBindVertexArray(draw_vao);
> +
> +       glGenBuffers(1, &vbo);
> +       glBindBuffer(GL_ARRAY_BUFFER, vbo);
> +       glBufferData(GL_ARRAY_BUFFER, sizeof(geometry), &geometry, GL_STATIC_DRAW);
> +
> +       glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE,
> +                             2 * sizeof(GLfloat), NULL);
> +
> +       glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE,
> +                             4 * sizeof(GLfloat), (void *)(12 * 2 * 4));
> +       glEnableVertexAttribArray(0);
> +       glEnableVertexAttribArray(1);
> +
> +       glGenBuffers(1, &ibo);
> +       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
> +       glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
> +
> +       glGenBuffers(1, &dbo);
> +       glBindBuffer(GL_DRAW_INDIRECT_BUFFER, dbo);
> +       glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(cmds), cmds, GL_STATIC_DRAW);
> +}
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +       GLuint xfb_buf;
> +       bool pass = true;
> +       unsigned *map;
> +
> +       static const float g[] = {0, 1, 0, 1};
> +       static const float gb[] = {0, 1, 1, 1};
> +
> +       glClearColor(0.2, 0.2, 0.2, 0.2);
> +       glClear(GL_COLOR_BUFFER_BIT);
> +
> +       glGenBuffers(1, &xfb_buf);
> +       glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, xfb_buf);
> +       glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 8, NULL, GL_STATIC_READ);
> +
> +       glEnable(GL_RASTERIZER_DISCARD);
> +       glBindVertexArray(tf_vao);
> +       glUseProgram(tf_prog);
> +
> +       /* write a 2 into xfb_buf[0] */
> +       glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, xfb_buf, 0, 4);
> +       glUniform1i(tf_val, 2);
> +       glBeginTransformFeedback(GL_POINTS);
> +       glDrawArrays(GL_POINTS, 0, 1);
> +       glEndTransformFeedback();
> +
> +       /* write a 0 into xfb_buf[1] */
> +       glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, xfb_buf, 4, 4);
> +       glUniform1i(tf_val, 0);
> +       glBeginTransformFeedback(GL_POINTS);
> +       glDrawArrays(GL_POINTS, 0, 1);
> +       glEndTransformFeedback();
> +
> +       glDisable(GL_RASTERIZER_DISCARD);
> +       glBindVertexArray(draw_vao);
> +       glUseProgram(draw_prog);
> +
> +       /* Draw the g/gb halves */
> +       glBindBuffer(GL_PARAMETER_BUFFER_ARB, xfb_buf);
> +       glMultiDrawElementsIndirectCountARB(
> +                       GL_TRIANGLES, GL_UNSIGNED_INT,
> +                       0, 0, 2, 0);
> +
> +       pass &= piglit_probe_rect_rgba(0, 0, piglit_width / 2, piglit_height,
> +                                      g);
> +       pass &= piglit_probe_rect_rgba(piglit_width / 2, 0,
> +                                      piglit_width / 2, piglit_height,
> +                                      gb);
> +       if (!pass) {
> +               printf("first draw failed\n");
> +               goto end;
> +       }
> +
> +       /* Overdraw with the red quad, except count = 0 */
> +       glMultiDrawElementsIndirectCountARB(
> +                       GL_TRIANGLES, GL_UNSIGNED_INT,
> +                       (2 * 5 * 4), 4, 1, 0);
> +
> +       pass &= piglit_probe_rect_rgba(0, 0, piglit_width / 2, piglit_height,
> +                                      g);
> +       pass &= piglit_probe_rect_rgba(piglit_width / 2, 0,
> +                                      piglit_width / 2, piglit_height,
> +                                      gb);
> +       if (!pass)
> +               printf("second draw did something when it shouldn't have.\n");
> +
> +end:
> +       piglit_present_results();
> +       map = glMapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, GL_READ_ONLY);
> +       if (map[0] != 2) {
> +               printf("map[0] != 2\n");
> +               pass = false;
> +       }
> +       if (map[1] != 0) {
> +               printf("map[1] != 0\n");
> +               pass = false;
> +       }
> +       glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
> +       glDeleteBuffers(1, &xfb_buf);
> +       return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> --
> 2.4.10
>


More information about the mesa-dev mailing list