<div dir="ltr"><div>Hi Timothy,</div><div><br></div><div>This doesn't test any gl_*Color builtins. ST_DEBUG=tgsi doesn't show a shader using COLOR where it's not a FS output.</div><div><br></div><div>Marek<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 21, 2018 at 4:32 AM, 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">This updates the existing vertex shader test and makes it more<br>
flexable.<br>
---<br>
 tests/spec/gl-2.0/vertex-<wbr>program-two-side.c | 195 +++++++++++++++-----<br>
 1 file changed, 145 insertions(+), 50 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 81cf11d9d..c53668124 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,6 +66,16 @@ 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 *vs_outputs[4] = {"", "", "", ""};<br>
+char *gs_outputs[4] = {"", "", "", ""};<br>
+char *gs_inputs_outputs[4] = {"", "", "", ""};<br>
+<br>
+static const char *dummy_vs_source =<br>
+       "void main()\n"<br>
+       "{\n"<br>
+       "       gl_Position = gl_Vertex;\n"<br>
+       "}\n";<br>
+<br>
 static const char *fs_source =<br>
        "uniform bool draw_secondary;\n"<br>
        "void main()\n"<br>
@@ -76,24 +86,13 @@ static const char *fs_source =<br>
        "               gl_FragColor = gl_Color;\n"<br>
        "}\n";<br>
<br>
-enum piglit_result<br>
-piglit_display(void)<br>
+static bool<br>
+probe_colors()<br>
 {<br>
+       bool pass = true;<br>
        int x1 = 0, y1 = 0;<br>
        int w = piglit_width / 2, h = piglit_height / 2;<br>
        int x2 = piglit_width - w, y2 = piglit_height - h;<br>
-       bool pass = true;<br>
-<br>
-       glClearColor(0.5, 0.5, 0.5, 0.5);<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>
-<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>
<br>
        if (front) {<br>
                pass = pass && piglit_probe_rect_rgba(x1, y2, w, h,<br>
@@ -127,13 +126,41 @@ piglit_display(void)<br>
                }<br>
        }<br>
<br>
-       piglit_present_results();<br>
+       return pass;<br>
+}<br>
<br>
-       return pass ? PIGLIT_PASS : PIGLIT_FAIL;<br>
+static bool<br>
+test_prog(unsigned prog, const char *test_name)<br>
+{<br>
+       glUseProgram(prog);<br>
+       draw_secondary_loc = glGetUniformLocation(prog, "draw_secondary");<br>
+       assert(draw_secondary_loc != -1);<br>
+<br>
+       if (enabled)<br>
+               glEnable(GL_VERTEX_PROGRAM_<wbr>TWO_SIDE);<br>
+<br>
+       /* Draw */<br>
+       glClearColor(0.5, 0.5, 0.5, 0.5);<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>
+<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>
+<br>
+       /* probe and report result */<br>
+       bool pass = probe_colors();<br>
+       piglit_report_subtest_result(<wbr>pass ? PIGLIT_PASS : PIGLIT_FAIL, "%s",<br>
+                                    test_name);<br>
+<br>
+       return pass;<br>
 }<br>
<br>
 static void<br>
-setup_output(char **out, const char *name, float *values)<br>
+setup_vs_output(char **out, const char *name, float *values)<br>
 {<br>
        (void)!asprintf(out,<br>
                 "      %s = vec4(%f, %f, %f, %f);\n",<br>
@@ -144,15 +171,94 @@ setup_output(char **out, const char *name, float *values)<br>
                 values[3]);<br>
 }<br>
<br>
-void<br>
-piglit_init(int argc, char **argv)<br>
+static void<br>
+setup_gs_vars(char **in_out, char **out, const char *name, float *values)<br>
+{<br>
+       (void)!asprintf(in_out, "       %s = gl_in[i].%s;\n", name, name);<br>
+       (void)!asprintf(out, "  %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>
+create_gs_source(char **gs_source, char **builtins)<br>
+{<br>
+       (void)!asprintf(gs_source,<br>
+               "#version 150 compatibility\n"<br>
+               "layout(triangles) in;\n"<br>
+               "layout(triangle_strip, max_vertices = 3) out;\n"<br>
+               "\n"<br>
+               "void main()\n"<br>
+               "{\n"<br>
+               "       for (int i = 0; i < 3; i++) {\n"<br>
+               "               gl_Position = gl_in[i].gl_Position;\n"<br>
+               "               %s%s%s%s\n"<br>
+               "               EmitVertex();\n"<br>
+               "       }\n"<br>
+               "}\n",<br>
+               builtins[0],<br>
+               builtins[1],<br>
+               builtins[2],<br>
+               builtins[3]);<br>
+}<br>
+<br>
+enum piglit_result<br>
+piglit_display(void)<br>
 {<br>
-       char *vs_outputs[4] = {"", "", "", ""};<br>
        char *vs_source;<br>
-       int i;<br>
+       char *gs_source;<br>
+       char *gs_source2;<br>
+       bool pass;<br>
<br>
-       piglit_require_GLSL();<br>
+       (void)!asprintf(&vs_source,<br>
+                "void main()\n"<br>
+                "{\n"<br>
+                "      gl_Position = gl_Vertex;\n"<br>
+                "%s%s%s%s"<br>
+                "}\n",<br>
+                vs_outputs[0],<br>
+                vs_outputs[1],<br>
+                vs_outputs[2],<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>
+<br>
+       if (piglit_get_gl_version() >= 32) {<br>
+               /* Test the gs outputs only */<br>
+               create_gs_source(&gs_source, gs_outputs);<br>
+               prog = piglit_build_simple_program_<wbr>multiple_shaders(<br>
+                       GL_VERTEX_SHADER, dummy_vs_source,<br>
+                       GL_GEOMETRY_SHADER, gs_source,<br>
+                       GL_FRAGMENT_SHADER, fs_source,<br>
+                       0);<br>
+<br>
+               pass = pass && test_prog(prog, "gs-out and fs");<br>
+<br>
+               /* Test both the gs outputs and inputs */<br>
+               create_gs_source(&gs_source2, gs_inputs_outputs);<br>
+               prog = piglit_build_simple_program_<wbr>multiple_shaders(<br>
+                       GL_VERTEX_SHADER, vs_source,<br>
+                       GL_GEOMETRY_SHADER, gs_source2,<br>
+                       GL_FRAGMENT_SHADER, fs_source,<br>
+                       0);<br>
+<br>
+               pass = pass && test_prog(prog, "vs, gs and fs");<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>
+       }<br>
<br>
+       return pass ? PIGLIT_PASS : PIGLIT_FAIL;<br>
+}<br>
+<br>
+void<br>
+piglit_init(int argc, char **argv)<br>
+{<br>
+       piglit_require_GLSL();<br>
        piglit_require_gl_version(20);<br>
<br>
        printf("Window quadrants show:\n");<br>
@@ -162,7 +268,7 @@ piglit_init(int argc, char **argv)<br>
        printf("| front gl_SecondaryColor | back gl_SecondaryColor |\n");<br>
        printf("+---------------------<wbr>----+------------------------+<wbr>\n");<br>
<br>
-       for (i = 1; i < argc; i++) {<br>
+       for (unsigned i = 1; i < argc; i++) {<br>
                if (strcmp(argv[i], "enabled") == 0) {<br>
                        enabled = true;<br>
                } else if (strcmp(argv[i], "front") == 0) {<br>
@@ -178,31 +284,20 @@ piglit_init(int argc, char **argv)<br>
                }<br>
        }<br>
<br>
-       if (front)<br>
-               setup_output(&vs_outputs[0], "gl_FrontColor", frontcolor);<br>
-       if (back)<br>
-               setup_output(&vs_outputs[1], "gl_BackColor", backcolor);<br>
-       if (front2)<br>
-               setup_output(&vs_outputs[2], "gl_FrontSecondaryColor", secondary_frontcolor);<br>
-       if (back2)<br>
-               setup_output(&vs_outputs[3], "gl_BackSecondaryColor", secondary_backcolor);<br>
-<br>
-       (void)!asprintf(&vs_source,<br>
-                "void main()\n"<br>
-                "{\n"<br>
-                "      gl_Position = gl_Vertex;\n"<br>
-                "%s%s%s%s"<br>
-                "}\n",<br>
-                vs_outputs[0],<br>
-                vs_outputs[1],<br>
-                vs_outputs[2],<br>
-                vs_outputs[3]);<br>
-<br>
-       prog = piglit_build_simple_program(<wbr>vs_source, fs_source);<br>
-       glUseProgram(prog);<br>
-       draw_secondary_loc = glGetUniformLocation(prog, "draw_secondary");<br>
-       assert(draw_secondary_loc != -1);<br>
-<br>
-       if (enabled)<br>
-               glEnable(GL_VERTEX_PROGRAM_<wbr>TWO_SIDE);<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>
+       }<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>
+       }<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>
+       }<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>
+       }<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>