[Piglit] [PATCH] gl-3.2-compat: test gl_*Color built-ins with geometry shaders
Marek Olšák
maraeo at gmail.com
Wed May 23 21:18:43 UTC 2018
Tested-by: Marek Olšák <marek.olsak at amd.com>
Acked-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Mon, May 21, 2018 at 4:32 AM, Timothy Arceri <tarceri at itsqueeze.com>
wrote:
> This updates the existing vertex shader test and makes it more
> flexable.
> ---
> tests/spec/gl-2.0/vertex-program-two-side.c | 195 +++++++++++++++-----
> 1 file changed, 145 insertions(+), 50 deletions(-)
>
> diff --git a/tests/spec/gl-2.0/vertex-program-two-side.c
> b/tests/spec/gl-2.0/vertex-program-two-side.c
> index 81cf11d9d..c53668124 100644
> --- a/tests/spec/gl-2.0/vertex-program-two-side.c
> +++ b/tests/spec/gl-2.0/vertex-program-two-side.c
> @@ -66,6 +66,16 @@ static float secondary_frontcolor[4] = {0.0, 0.25, 0.0,
> 0.0};
> static float secondary_backcolor[4] = {0.0, 0.0, 0.25, 0.0};
> static int draw_secondary_loc;
>
> +char *vs_outputs[4] = {"", "", "", ""};
> +char *gs_outputs[4] = {"", "", "", ""};
> +char *gs_inputs_outputs[4] = {"", "", "", ""};
> +
> +static const char *dummy_vs_source =
> + "void main()\n"
> + "{\n"
> + " gl_Position = gl_Vertex;\n"
> + "}\n";
> +
> static const char *fs_source =
> "uniform bool draw_secondary;\n"
> "void main()\n"
> @@ -76,24 +86,13 @@ static const char *fs_source =
> " gl_FragColor = gl_Color;\n"
> "}\n";
>
> -enum piglit_result
> -piglit_display(void)
> +static bool
> +probe_colors()
> {
> + bool pass = true;
> int x1 = 0, y1 = 0;
> int w = piglit_width / 2, h = piglit_height / 2;
> int x2 = piglit_width - w, y2 = piglit_height - h;
> - bool pass = true;
> -
> - glClearColor(0.5, 0.5, 0.5, 0.5);
> - glClear(GL_COLOR_BUFFER_BIT);
> -
> - glUniform1i(draw_secondary_loc, false);
> - piglit_draw_rect(-1, 0, 1, 1); /* top left */
> - piglit_draw_rect( 1, 0, -1, 1); /* top right */
> -
> - glUniform1i(draw_secondary_loc, true);
> - piglit_draw_rect(-1, -1, 1, 1); /* bot left */
> - piglit_draw_rect( 1, -1, -1, 1); /* bot right */
>
> if (front) {
> pass = pass && piglit_probe_rect_rgba(x1, y2, w, h,
> @@ -127,13 +126,41 @@ piglit_display(void)
> }
> }
>
> - piglit_present_results();
> + return pass;
> +}
>
> - return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +static bool
> +test_prog(unsigned prog, const char *test_name)
> +{
> + glUseProgram(prog);
> + draw_secondary_loc = glGetUniformLocation(prog, "draw_secondary");
> + assert(draw_secondary_loc != -1);
> +
> + if (enabled)
> + glEnable(GL_VERTEX_PROGRAM_TWO_SIDE);
> +
> + /* Draw */
> + glClearColor(0.5, 0.5, 0.5, 0.5);
> + glClear(GL_COLOR_BUFFER_BIT);
> +
> + glUniform1i(draw_secondary_loc, false);
> + piglit_draw_rect(-1, 0, 1, 1); /* top left */
> + piglit_draw_rect( 1, 0, -1, 1); /* top right */
> +
> + glUniform1i(draw_secondary_loc, true);
> + piglit_draw_rect(-1, -1, 1, 1); /* bot left */
> + piglit_draw_rect( 1, -1, -1, 1); /* bot right */
> +
> + /* probe and report result */
> + bool pass = probe_colors();
> + piglit_report_subtest_result(pass ? PIGLIT_PASS : PIGLIT_FAIL,
> "%s",
> + test_name);
> +
> + return pass;
> }
>
> static void
> -setup_output(char **out, const char *name, float *values)
> +setup_vs_output(char **out, const char *name, float *values)
> {
> (void)!asprintf(out,
> " %s = vec4(%f, %f, %f, %f);\n",
> @@ -144,15 +171,94 @@ setup_output(char **out, const char *name, float
> *values)
> values[3]);
> }
>
> -void
> -piglit_init(int argc, char **argv)
> +static void
> +setup_gs_vars(char **in_out, char **out, const char *name, float *values)
> +{
> + (void)!asprintf(in_out, " %s = gl_in[i].%s;\n", name, name);
> + (void)!asprintf(out, " %s = vec4(%f, %f, %f, %f);\n",
> + name,
> + values[0],
> + values[1],
> + values[2],
> + values[3]);
> +}
> +
> +static void
> +create_gs_source(char **gs_source, char **builtins)
> +{
> + (void)!asprintf(gs_source,
> + "#version 150 compatibility\n"
> + "layout(triangles) in;\n"
> + "layout(triangle_strip, max_vertices = 3) out;\n"
> + "\n"
> + "void main()\n"
> + "{\n"
> + " for (int i = 0; i < 3; i++) {\n"
> + " gl_Position = gl_in[i].gl_Position;\n"
> + " %s%s%s%s\n"
> + " EmitVertex();\n"
> + " }\n"
> + "}\n",
> + builtins[0],
> + builtins[1],
> + builtins[2],
> + builtins[3]);
> +}
> +
> +enum piglit_result
> +piglit_display(void)
> {
> - char *vs_outputs[4] = {"", "", "", ""};
> char *vs_source;
> - int i;
> + char *gs_source;
> + char *gs_source2;
> + bool pass;
>
> - piglit_require_GLSL();
> + (void)!asprintf(&vs_source,
> + "void main()\n"
> + "{\n"
> + " gl_Position = gl_Vertex;\n"
> + "%s%s%s%s"
> + "}\n",
> + vs_outputs[0],
> + vs_outputs[1],
> + vs_outputs[2],
> + vs_outputs[3]);
> +
> + prog = piglit_build_simple_program(vs_source, fs_source);
> + pass = test_prog(prog, "vs and fs");
> +
> + if (piglit_get_gl_version() >= 32) {
> + /* Test the gs outputs only */
> + create_gs_source(&gs_source, gs_outputs);
> + prog = piglit_build_simple_program_multiple_shaders(
> + GL_VERTEX_SHADER, dummy_vs_source,
> + GL_GEOMETRY_SHADER, gs_source,
> + GL_FRAGMENT_SHADER, fs_source,
> + 0);
> +
> + pass = pass && test_prog(prog, "gs-out and fs");
> +
> + /* Test both the gs outputs and inputs */
> + create_gs_source(&gs_source2, gs_inputs_outputs);
> + prog = piglit_build_simple_program_multiple_shaders(
> + GL_VERTEX_SHADER, vs_source,
> + GL_GEOMETRY_SHADER, gs_source2,
> + GL_FRAGMENT_SHADER, fs_source,
> + 0);
> +
> + pass = pass && test_prog(prog, "vs, gs and fs");
> + } else {
> + piglit_report_subtest_result(PIGLIT_SKIP, "gs-out and
> fs");
> + piglit_report_subtest_result(PIGLIT_SKIP, "vs, gs and
> fs");
> + }
>
> + return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> + piglit_require_GLSL();
> piglit_require_gl_version(20);
>
> printf("Window quadrants show:\n");
> @@ -162,7 +268,7 @@ piglit_init(int argc, char **argv)
> printf("| front gl_SecondaryColor | back gl_SecondaryColor |\n");
> printf("+-------------------------+------------------------+\n");
>
> - for (i = 1; i < argc; i++) {
> + for (unsigned i = 1; i < argc; i++) {
> if (strcmp(argv[i], "enabled") == 0) {
> enabled = true;
> } else if (strcmp(argv[i], "front") == 0) {
> @@ -178,31 +284,20 @@ piglit_init(int argc, char **argv)
> }
> }
>
> - if (front)
> - setup_output(&vs_outputs[0], "gl_FrontColor", frontcolor);
> - if (back)
> - setup_output(&vs_outputs[1], "gl_BackColor", backcolor);
> - if (front2)
> - setup_output(&vs_outputs[2], "gl_FrontSecondaryColor",
> secondary_frontcolor);
> - if (back2)
> - setup_output(&vs_outputs[3], "gl_BackSecondaryColor",
> secondary_backcolor);
> -
> - (void)!asprintf(&vs_source,
> - "void main()\n"
> - "{\n"
> - " gl_Position = gl_Vertex;\n"
> - "%s%s%s%s"
> - "}\n",
> - vs_outputs[0],
> - vs_outputs[1],
> - vs_outputs[2],
> - vs_outputs[3]);
> -
> - prog = piglit_build_simple_program(vs_source, fs_source);
> - glUseProgram(prog);
> - draw_secondary_loc = glGetUniformLocation(prog, "draw_secondary");
> - assert(draw_secondary_loc != -1);
> -
> - if (enabled)
> - glEnable(GL_VERTEX_PROGRAM_TWO_SIDE);
> + if (front) {
> + setup_vs_output(&vs_outputs[0], "gl_FrontColor",
> frontcolor);
> + setup_gs_vars(&gs_inputs_outputs[0], &gs_outputs[0],
> "gl_FrontColor", frontcolor);
> + }
> + if (back) {
> + setup_vs_output(&vs_outputs[1], "gl_BackColor",
> backcolor);
> + setup_gs_vars(&gs_inputs_outputs[1], &gs_outputs[1],
> "gl_BackColor", backcolor);
> + }
> + if (front2) {
> + setup_vs_output(&vs_outputs[2], "gl_FrontSecondaryColor",
> secondary_frontcolor);
> + setup_gs_vars(&gs_inputs_outputs[2], &gs_outputs[2],
> "gl_FrontSecondaryColor", secondary_frontcolor);
> + }
> + if (back2) {
> + setup_vs_output(&vs_outputs[3], "gl_BackSecondaryColor",
> secondary_backcolor);
> + setup_gs_vars(&gs_inputs_outputs[3], &gs_outputs[3],
> "gl_BackSecondaryColor", secondary_backcolor);
> + }
> }
> --
> 2.17.0
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/piglit
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/piglit/attachments/20180523/1fde2c4f/attachment-0001.html>
More information about the Piglit
mailing list