<div dir="ltr"><div>For the series:</div><div><br></div><div>Reviewed-by: Marek Olšák <<a href="mailto:marek.olsak@amd.com">marek.olsak@amd.com</a>></div><div><br></div><div>Marek<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, May 27, 2018 at 11:22 PM, Timothy Arceri <span dir="ltr"><<a href="mailto:tarceri@itsqueeze.com" target="_blank">tarceri@itsqueeze.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">---<br>
 tests/spec/gl-2.0/vertex-<wbr>program-two-side.c | 157 ++++++++++++++++++--<br>
 1 file changed, 147 insertions(+), 10 deletions(-)<br>
<br>
diff --git a/tests/spec/gl-2.0/vertex-<wbr>program-two-side.c b/tests/spec/gl-2.0/vertex-<wbr>program-two-side.c<br>
index c53668124..a659e521b 100644<br>
--- a/tests/spec/gl-2.0/vertex-<wbr>program-two-side.c<br>
+++ b/tests/spec/gl-2.0/vertex-<wbr>program-two-side.c<br>
@@ -66,9 +66,18 @@ static float secondary_frontcolor[4] = {0.0, 0.25, 0.0, 0.0};<br>
 static float secondary_backcolor[4] = {0.0, 0.0, 0.25, 0.0};<br>
 static int draw_secondary_loc;<br>
<br>
+char *dummy_outputs[4] = {"", "", "", ""};<br>
 char *vs_outputs[4] = {"", "", "", ""};<br>
 char *gs_outputs[4] = {"", "", "", ""};<br>
 char *gs_inputs_outputs[4] = {"", "", "", ""};<br>
+char *tcs_outputs[4] = {"", "", "", ""};<br>
+char *tcs_inputs_outputs[4] = {"", "", "", ""};<br>
+char *tes_outputs[4] = {"", "", "", ""};<br>
+char *tes_inputs_outputs[4] = {"", "", "", ""};<br>
+<br>
+const char * tests[7] = {"vs and fs", "gs-out and fs", "vs, gs and fs",<br>
+                        "tes-out and fs", "tcs-out, tes and fs",<br>
+                        "vs, tcs, tes and fs", NULL };<br>
<br>
 static const char *dummy_vs_source =<br>
        "void main()\n"<br>
@@ -130,7 +139,7 @@ probe_colors()<br>
 }<br>
<br>
 static bool<br>
-test_prog(unsigned prog, const char *test_name)<br>
+test_prog(unsigned prog, const char *test_name, bool use_patches)<br>
 {<br>
        glUseProgram(prog);<br>
        draw_secondary_loc = glGetUniformLocation(prog, "draw_secondary");<br>
@@ -144,12 +153,12 @@ test_prog(unsigned prog, const char *test_name)<br>
        glClear(GL_COLOR_BUFFER_BIT);<br>
<br>
        glUniform1i(draw_secondary_<wbr>loc, false);<br>
-       piglit_draw_rect(-1,  0,  1, 1); /* top left */<br>
-       piglit_draw_rect( 1,  0, -1, 1); /* top right */<br>
+       piglit_draw_rect_custom(-1,  0,  1, 1, use_patches, 1); /* top left */<br>
+       piglit_draw_rect_custom( 1,  0, -1, 1, use_patches, 1); /* top right */<br>
<br>
        glUniform1i(draw_secondary_<wbr>loc, true);<br>
-       piglit_draw_rect(-1, -1,  1, 1); /* bot left */<br>
-       piglit_draw_rect( 1, -1, -1, 1); /* bot right */<br>
+       piglit_draw_rect_custom(-1, -1,  1, 1, use_patches, 1); /* bot left */<br>
+       piglit_draw_rect_custom( 1, -1, -1, 1, use_patches, 1); /* bot right */<br>
<br>
        /* probe and report result */<br>
        bool pass = probe_colors();<br>
@@ -183,6 +192,30 @@ setup_gs_vars(char **in_out, char **out, const char *name, float *values)<br>
                        values[3]);<br>
 }<br>
<br>
+static void<br>
+setup_tcs_vars(char **in_out, char **out, const char *name, float *values)<br>
+{<br>
+       (void)!asprintf(in_out, "       gl_out[gl_InvocationID].%s = gl_in[gl_InvocationID].%s;\n", name, name);<br>
+       (void)!asprintf(out, "  gl_out[gl_InvocationID].%s = vec4(%f, %f, %f, %f);\n",<br>
+                       name,<br>
+                       values[0],<br>
+                       values[1],<br>
+                       values[2],<br>
+                       values[3]);<br>
+}<br>
+<br>
+static void<br>
+setup_tes_vars(char **in_out, char **out, const char *name, float *values)<br>
+{<br>
+       (void)!asprintf(in_out, "       INTERP_QUAD(gl_in[0].%s, %s);\n", name, name);<br>
+       (void)!asprintf(out, "  INTERP_QUAD(vec4(%f, %f, %f, %f), %s);\n",<br>
+                       values[0],<br>
+                       values[1],<br>
+                       values[2],<br>
+                       values[3],<br>
+                       name);<br>
+}<br>
+<br>
 static void<br>
 create_gs_source(char **gs_source, char **builtins)<br>
 {<br>
@@ -205,12 +238,58 @@ create_gs_source(char **gs_source, char **builtins)<br>
                builtins[3]);<br>
 }<br>
<br>
+static void<br>
+create_tess_source(char **tcs_source, char **tcs_builtins,<br>
+                   char **tes_source, char **tes_builtins)<br>
+{<br>
+       (void)!asprintf(tcs_source,<br>
+               "#version 150 compatibility\n"<br>
+               "#extension GL_ARB_tessellation_shader: require\n"<br>
+               "layout(vertices = 4) out;\n"<br>
+               "\n"<br>
+               "void main()\n"<br>
+               "{\n"<br>
+               "       gl_out[gl_InvocationID].gl_<wbr>Position = gl_in[gl_InvocationID].gl_<wbr>Position;\n"<br>
+               "       gl_TessLevelOuter = float[4](1.0, 1.0, 1.0, 1.0);\n"<br>
+               "       gl_TessLevelInner = float[2](1.0, 1.0);\n"<br>
+               "       %s%s%s%s\n"<br>
+               "}\n",<br>
+               tcs_builtins[0],<br>
+               tcs_builtins[1],<br>
+               tcs_builtins[2],<br>
+               tcs_builtins[3]);<br>
+<br>
+       (void)!asprintf(tes_source,<br>
+               "#version 150 compatibility\n"<br>
+               "#extension GL_ARB_tessellation_shader: require\n"<br>
+               "layout(quads) in;\n"<br>
+               "\n"<br>
+               "#define INTERP_QUAD(INi, OUT) do { \\\n"<br>
+               "       vec4 v[4]; \\\n"<br>
+               "       for (int i = 0; i < 4; i++) v[i] = INi; \\\n"<br>
+               "               OUT = mix(mix(v[0], v[1], gl_TessCoord[0]), mix(v[2], v[3], \\\n"<br>
+               "                         gl_TessCoord[0]), gl_TessCoord[1]); \\\n"<br>
+               "} while(false);\n"<br>
+               "\n"<br>
+               "void main()\n"<br>
+               "{\n"<br>
+               "       INTERP_QUAD(gl_in[i].gl_<wbr>Position, gl_Position);\n"<br>
+               "       %s%s%s%s\n"<br>
+               "}\n",<br>
+               tes_builtins[0],<br>
+               tes_builtins[1],<br>
+               tes_builtins[2],<br>
+               tes_builtins[3]);<br>
+}<br>
+<br>
 enum piglit_result<br>
 piglit_display(void)<br>
 {<br>
        char *vs_source;<br>
        char *gs_source;<br>
        char *gs_source2;<br>
+       char *tcs_source;<br>
+       char *tes_source;<br>
        bool pass;<br>
<br>
        (void)!asprintf(&vs_source,<br>
@@ -225,7 +304,7 @@ piglit_display(void)<br>
                 vs_outputs[3]);<br>
<br>
        prog = piglit_build_simple_program(<wbr>vs_source, fs_source);<br>
-       pass = test_prog(prog, "vs and fs");<br>
+       pass = test_prog(prog, tests[0], false);<br>
<br>
        if (piglit_get_gl_version() >= 32) {<br>
                /* Test the gs outputs only */<br>
@@ -236,7 +315,7 @@ piglit_display(void)<br>
                        GL_FRAGMENT_SHADER, fs_source,<br>
                        0);<br>
<br>
-               pass = pass && test_prog(prog, "gs-out and fs");<br>
+               pass = pass && test_prog(prog, tests[1], false);<br>
<br>
                /* Test both the gs outputs and inputs */<br>
                create_gs_source(&gs_source2, gs_inputs_outputs);<br>
@@ -246,10 +325,58 @@ piglit_display(void)<br>
                        GL_FRAGMENT_SHADER, fs_source,<br>
                        0);<br>
<br>
-               pass = pass && test_prog(prog, "vs, gs and fs");<br>
+               pass = pass && test_prog(prog, tests[2], false);<br>
+<br>
+               if (piglit_is_extension_<wbr>supported("GL_ARB_<wbr>tessellation_shader")) {<br>
+                       /* Test tes outputs only */<br>
+                       create_tess_source(&tcs_<wbr>source, dummy_outputs,<br>
+                                          &tes_source, tes_outputs);<br>
+                       prog = piglit_build_simple_program_<wbr>multiple_shaders(<br>
+                               GL_VERTEX_SHADER, dummy_vs_source,<br>
+                               GL_TESS_CONTROL_SHADER, tcs_source,<br>
+                               GL_TESS_EVALUATION_SHADER, tes_source,<br>
+                               GL_FRAGMENT_SHADER, fs_source,<br>
+                               0);<br>
+                       pass = pass && test_prog(prog, tests[3], true);<br>
+                       free(tcs_source);<br>
+                       free(tes_source);<br>
+<br>
+                       /* Test tcs outputs and tes inputs/outputs */<br>
+                       create_tess_source(&tcs_<wbr>source, tcs_outputs,<br>
+                                          &tes_source, tes_inputs_outputs);<br>
+                       prog = piglit_build_simple_program_<wbr>multiple_shaders(<br>
+                               GL_VERTEX_SHADER, dummy_vs_source,<br>
+                               GL_TESS_CONTROL_SHADER, tcs_source,<br>
+                               GL_TESS_EVALUATION_SHADER, tes_source,<br>
+                               GL_FRAGMENT_SHADER, fs_source,<br>
+                               0);<br>
+                       pass = pass && test_prog(prog, tests[4], true);<br>
+                       free(tcs_source);<br>
+                       free(tes_source);<br>
+<br>
+                       /* Test tcs inputs/outputs and tes inputs/outputs */<br>
+                       create_tess_source(&tcs_<wbr>source, tcs_inputs_outputs,<br>
+                                          &tes_source, tes_inputs_outputs);<br>
+                       prog = piglit_build_simple_program_<wbr>multiple_shaders(<br>
+                               GL_VERTEX_SHADER, vs_source,<br>
+                               GL_TESS_CONTROL_SHADER, tcs_source,<br>
+                               GL_TESS_EVALUATION_SHADER, tes_source,<br>
+                               GL_FRAGMENT_SHADER, fs_source,<br>
+                               0);<br>
+                       pass = pass && test_prog(prog, tests[5], true);<br>
+                       free(tcs_source);<br>
+                       free(tes_source);<br>
+               } else {<br>
+               piglit_report_subtest_result(<wbr>PIGLIT_SKIP, tests[3]);<br>
+               piglit_report_subtest_result(<wbr>PIGLIT_SKIP, tests[4]);<br>
+               piglit_report_subtest_result(<wbr>PIGLIT_SKIP, tests[5]);<br>
+               }<br>
        } else {<br>
-               piglit_report_subtest_result(<wbr>PIGLIT_SKIP, "gs-out and fs");<br>
-               piglit_report_subtest_result(<wbr>PIGLIT_SKIP, "vs, gs and fs");<br>
+               piglit_report_subtest_result(<wbr>PIGLIT_SKIP, tests[1]);<br>
+               piglit_report_subtest_result(<wbr>PIGLIT_SKIP, tests[2]);<br>
+               piglit_report_subtest_result(<wbr>PIGLIT_SKIP, tests[3]);<br>
+               piglit_report_subtest_result(<wbr>PIGLIT_SKIP, tests[4]);<br>
+               piglit_report_subtest_result(<wbr>PIGLIT_SKIP, tests[5]);<br>
        }<br>
<br>
        return pass ? PIGLIT_PASS : PIGLIT_FAIL;<br>
@@ -284,20 +411,30 @@ piglit_init(int argc, char **argv)<br>
                }<br>
        }<br>
<br>
+       piglit_register_subtests(<wbr>tests);<br>
+<br>
        if (front) {<br>
                setup_vs_output(&vs_outputs[0]<wbr>, "gl_FrontColor", frontcolor);<br>
                setup_gs_vars(&gs_inputs_<wbr>outputs[0], &gs_outputs[0], "gl_FrontColor", frontcolor);<br>
+               setup_tcs_vars(&tcs_inputs_<wbr>outputs[0], &tcs_outputs[0], "gl_FrontColor", frontcolor);<br>
+               setup_tes_vars(&tes_inputs_<wbr>outputs[0], &tes_outputs[0], "gl_FrontColor", frontcolor);<br>
        }<br>
        if (back) {<br>
                setup_vs_output(&vs_outputs[1]<wbr>, "gl_BackColor", backcolor);<br>
                setup_gs_vars(&gs_inputs_<wbr>outputs[1], &gs_outputs[1], "gl_BackColor", backcolor);<br>
+               setup_tcs_vars(&tcs_inputs_<wbr>outputs[1], &tcs_outputs[1], "gl_BackColor", backcolor);<br>
+               setup_tes_vars(&tes_inputs_<wbr>outputs[1], &tes_outputs[1], "gl_BackColor", backcolor);<br>
        }<br>
        if (front2) {<br>
                setup_vs_output(&vs_outputs[2]<wbr>, "gl_FrontSecondaryColor", secondary_frontcolor);<br>
                setup_gs_vars(&gs_inputs_<wbr>outputs[2], &gs_outputs[2], "gl_FrontSecondaryColor", secondary_frontcolor);<br>
+               setup_tcs_vars(&tcs_inputs_<wbr>outputs[2], &tcs_outputs[2], "gl_FrontSecondaryColor", secondary_frontcolor);<br>
+               setup_tes_vars(&tes_inputs_<wbr>outputs[2], &tes_outputs[2], "gl_FrontSecondaryColor", secondary_frontcolor);<br>
        }<br>
        if (back2) {<br>
                setup_vs_output(&vs_outputs[3]<wbr>, "gl_BackSecondaryColor", secondary_backcolor);<br>
                setup_gs_vars(&gs_inputs_<wbr>outputs[3], &gs_outputs[3], "gl_BackSecondaryColor", secondary_backcolor);<br>
+               setup_tcs_vars(&tcs_inputs_<wbr>outputs[3], &tcs_outputs[3], "gl_BackSecondaryColor", secondary_backcolor);<br>
+               setup_tes_vars(&tes_inputs_<wbr>outputs[3], &tes_outputs[3], "gl_BackSecondaryColor", secondary_backcolor);<br>
        }<br>
 }<br>
<span class="HOEnZb"><font color="#888888">-- <br>
2.17.0<br>
<br>
______________________________<wbr>_________________<br>
Piglit mailing list<br>
<a href="mailto:Piglit@lists.freedesktop.org">Piglit@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/piglit" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/piglit</a><br>
</font></span></blockquote></div><br></div>