[Piglit] [PATCH 2/2] shader_draw_parameters: Also test using an indirect draw
Antia Puentes
apuentes at igalia.com
Thu Jan 25 18:49:47 UTC 2018
Reviewed-by: Antia Puentes <apuentes at igalia.com>
On 10/11/17 19:05, Neil Roberts wrote:
> The test can now take an extra argument ‘indirect’ which will cause
> it to emit the draw calls via an indirect buffer. This is useful to
> test at least on i965 because emitting the gl_BaseVertex takes a
> different path in that case.
> ---
> tests/all.py | 10 +-
> tests/spec/arb_shader_draw_parameters/basevertex.c | 122 +++++++++++++++++----
> 2 files changed, 104 insertions(+), 28 deletions(-)
>
> diff --git a/tests/all.py b/tests/all.py
> index ae4a995..e9d5583 100644
> --- a/tests/all.py
> +++ b/tests/all.py
> @@ -4903,15 +4903,17 @@ with profile.test_list.group_manager(
> grouptools.join('spec', 'ARB_shader_draw_parameters')) as g:
> g(['arb_shader_draw_parameters-drawid', 'drawid'], 'drawid')
> g(['arb_shader_draw_parameters-drawid', 'vertexid'], 'drawid-vertexid')
> - g(['arb_shader_draw_parameters-basevertex', 'basevertex'], 'basevertex')
> - g(['arb_shader_draw_parameters-basevertex', 'baseinstance'], 'baseinstance')
> - g(['arb_shader_draw_parameters-basevertex', 'basevertex-baseinstance'], 'basevertex-baseinstance')
> - g(['arb_shader_draw_parameters-basevertex', 'vertexid-zerobased'], 'vertexid-zerobased')
> g(['arb_shader_draw_parameters-drawid-indirect', 'drawid'], 'drawid-indirect')
> g(['arb_shader_draw_parameters-drawid-indirect', 'basevertex'], 'drawid-indirect-basevertex')
> g(['arb_shader_draw_parameters-drawid-indirect', 'baseinstance'], 'drawid-indirect-baseinstance')
> g(['arb_shader_draw_parameters-drawid-indirect', 'vertexid'], 'drawid-indirect-vertexid')
>
> + variables = ('basevertex', 'baseinstance', 'basevertex-baseinstance', 'vertexid-zerobased')
> + for v in variables:
> + g(['arb_shader_draw_parameters-basevertex', v], v)
> + for v in variables:
> + g(['arb_shader_draw_parameters-basevertex', v, 'indirect'], v + '-indirect')
> +
> # Group ARB_indirect_parameters
> with profile.test_list.group_manager(
> PiglitGLTest,
> diff --git a/tests/spec/arb_shader_draw_parameters/basevertex.c b/tests/spec/arb_shader_draw_parameters/basevertex.c
> index 333d4e2..4db6cd1 100644
> --- a/tests/spec/arb_shader_draw_parameters/basevertex.c
> +++ b/tests/spec/arb_shader_draw_parameters/basevertex.c
> @@ -1,5 +1,5 @@
> /*
> - * Copyright © 2015 Intel Corporation
> + * Copyright © 2015, 2017 Intel Corporation
> *
> * Permission is hereby granted, free of charge, to any person obtaining a
> * copy of this software and associated documentation files (the "Software"),
> @@ -82,6 +82,8 @@ static const char fs_text[] =
> " gl_FragColor = color;\n"
> "}\n";
>
> +static bool opt_draw_indirect = false;
> +
> void
> piglit_init(int argc, char **argv)
> {
> @@ -105,16 +107,102 @@ piglit_init(int argc, char **argv)
> piglit_report_result(PIGLIT_FAIL);
> }
>
> + if (argc > 2) {
> + if (strcmp(argv[2], "indirect") == 0) {
> + opt_draw_indirect = true;
> + } else {
> + printf("Unknown second argument: %s\n", argv[2]);
> + piglit_report_result(PIGLIT_FAIL);
> + }
> + }
> +
> piglit_require_GLSL_version(330);
>
> piglit_require_extension("GL_ARB_shader_draw_parameters");
> piglit_require_extension("GL_ARB_base_instance");
> + if (opt_draw_indirect)
> + piglit_require_extension("GL_ARB_draw_indirect");
>
> prog = piglit_build_simple_program(vs_text, fs_text);
>
> glUseProgram(prog);
> }
>
> +static void
> +draw_direct(void)
> +{
> + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, NULL);
> +
> + /* We use this monster to draw the right half of the
> + * window. Base vertex so that we can reuse the indices to
> + * draw with vertices and colors 4-7, base instance so that we
> + * can verify that the value presented in the shader is
> + * correct. We only draw one instance so the only effect of
> + * instancing is that gl_BaseInstanceARB is 7.
> + */
> + glDrawElementsInstancedBaseVertexBaseInstance(GL_TRIANGLES, 6,
> + GL_UNSIGNED_INT,
> + NULL, 1,
> + 4, /* basevertex */
> + 7 /* baseinstance */);
> +
> + /* Test using glDrawArrays with a non-zero ‘first’ parameter.
> + * This value should be included in gl_VertexID but not in
> + * gl_BaseVertex.
> + */
> + glDrawArrays(GL_TRIANGLE_STRIP,
> + 8, /* first */
> + 4 /* count */);
> +}
> +
> +static void
> +draw_indirect(void)
> +{
> + GLuint params_bo;
> +
> + static const GLuint draw_params[] = {
> + 6, /* count */
> + 1, /* prim count */
> + 0, /* firstIndex */
> + 0, /* baseVertex */
> + 0, /* baseInstance */
> +
> + 6, /* count */
> + 1, /* prim count */
> + 0, /* firstIndex */
> + 4, /* baseVertex */
> + 7, /* baseInstance */
> +
> + 4, /* count */
> + 1, /* prim count */
> + 8, /* first */
> + 0, /* baseInstance */
> + };
> +
> + glGenBuffers(1, ¶ms_bo);
> + glBindBuffer(GL_DRAW_INDIRECT_BUFFER, params_bo);
> + glBufferData(GL_DRAW_INDIRECT_BUFFER,
> + sizeof draw_params,
> + draw_params,
> + GL_STATIC_DRAW);
> +
> + /* The draw commands are all equivalent to those in draw_direct. */
> +
> + glDrawElementsIndirect(GL_TRIANGLES,
> + GL_UNSIGNED_INT,
> + (void *) 0);
> +
> + glDrawElementsIndirect(GL_TRIANGLES,
> + GL_UNSIGNED_INT,
> + (void *) (5 * sizeof draw_params[0]));
> +
> + glDrawArraysIndirect(GL_TRIANGLE_STRIP,
> + (void *) (10 * sizeof draw_params[0]));
> +
> + glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0);
> + glDeleteBuffers(1, ¶ms_bo);
> +}
> +
> enum piglit_result
> piglit_display()
> {
> @@ -162,7 +250,7 @@ piglit_display()
>
> float green[] = { 0, 1, 0, 1 };
>
> - GLuint vao, vbo;
> + GLuint vao, vbo, ibo;
> glGenVertexArrays(1, &vao);
> glBindVertexArray(vao);
>
> @@ -170,6 +258,10 @@ piglit_display()
> glBindBuffer(GL_ARRAY_BUFFER, vbo);
> glBufferData(GL_ARRAY_BUFFER, 2048, NULL, GL_STATIC_DRAW);
>
> + glGenBuffers(1, &ibo);
> + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
> + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof indices, indices, GL_STATIC_DRAW);
> +
> glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), 0);
> glVertexAttribIPointer(1, 4, GL_UNSIGNED_INT, 4 * sizeof(int), (void *) 1024);
>
> @@ -180,28 +272,10 @@ piglit_display()
> glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertex_array), vertex_array);
> glBufferSubData(GL_ARRAY_BUFFER, 1024, sizeof(reference_array), reference_array);
>
> - glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, indices);
> -
> - /* We use this monster to draw the right half of the
> - * window. Base vertex so that we can reuse the indices to
> - * draw with vertices and colors 4-7, base instance so that we
> - * can verify that the value presented in the shader is
> - * correct. We only draw one instance so the only effect of
> - * instancing is that gl_BaseInstanceARB is 7.
> - */
> - glDrawElementsInstancedBaseVertexBaseInstance(GL_TRIANGLES, 6,
> - GL_UNSIGNED_INT,
> - indices, 1,
> - 4, /* basevertex */
> - 7 /* baseinstance */);
> -
> - /* Test using glDrawArrays with a non-zero ‘first’ parameter.
> - * This value should be included in gl_VertexID but not in
> - * gl_BaseVertex.
> - */
> - glDrawArrays(GL_TRIANGLE_STRIP,
> - 8, /* first */
> - 4 /* count */);
> + if (opt_draw_indirect)
> + draw_indirect();
> + else
> + draw_direct();
>
> pass = piglit_probe_rect_rgba(0, 0, piglit_width, piglit_height,
> green);
More information about the Piglit
mailing list