<div dir="ltr"><div>Acked-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 Wed, May 9, 2018 at 11:51 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">Bugzilla: <a href="https://bugs.freedesktop.org/show_bug.cgi?id=78097" rel="noreferrer" target="_blank">https://bugs.freedesktop.org/<wbr>show_bug.cgi?id=78097</a><br>
---<br>
 tests/opengl.py                         |   2 +<br>
 tests/spec/gl-3.0/CMakeLists.<wbr>gl.txt     |   1 +<br>
 tests/spec/gl-3.0/dlist-uint-<wbr>uniforms.c | 305 ++++++++++++++++++++++++<br>
 3 files changed, 308 insertions(+)<br>
 create mode 100644 tests/spec/gl-3.0/dlist-uint-<wbr>uniforms.c<br>
<br>
diff --git a/tests/opengl.py b/tests/opengl.py<br>
index 347e8c5d4..9c43d32c9 100644<br>
--- a/tests/opengl.py<br>
+++ b/tests/opengl.py<br>
@@ -899,6 +899,8 @@ with profile.test_list.group_<wbr>manager(<br>
     g(['clearbuffer-invalid-<wbr>buffer'])<br>
     g(['clearbuffer-mixed-format']<wbr>)<br>
     g(['clearbuffer-stencil'])<br>
+    g(['gl-3.0-dlist-uint-<wbr>uniforms'],<br>
+      'dlist-uint-uniforms')<br>
     g(['genmipmap-errors'])<br>
     g(['getfragdatalocation'])<br>
     g(['integer-errors'])<br>
diff --git a/tests/spec/gl-3.0/<wbr>CMakeLists.gl.txt b/tests/spec/gl-3.0/<wbr>CMakeLists.gl.txt<br>
index 6e9635c9c..e9bcb3627 100644<br>
--- a/tests/spec/gl-3.0/<wbr>CMakeLists.gl.txt<br>
+++ b/tests/spec/gl-3.0/<wbr>CMakeLists.gl.txt<br>
@@ -9,6 +9,7 @@ link_libraries (<br>
 )<br>
<br>
 piglit_add_executable (gl-3.0-bound-resource-limits bound-resource-limits.c)<br>
+piglit_add_executable (gl-3.0-dlist-uint-uniforms dlist-uint-uniforms.c)<br>
 piglit_add_executable (gl-3.0-multidrawarrays-<wbr>vertexid multidrawarrays-vertexid.c)<br>
 piglit_add_executable (gl-3.0-minmax minmax.c)<br>
 piglit_add_executable (gl-3.0-render-integer render-integer.c)<br>
diff --git a/tests/spec/gl-3.0/dlist-<wbr>uint-uniforms.c b/tests/spec/gl-3.0/dlist-<wbr>uint-uniforms.c<br>
new file mode 100644<br>
index 000000000..b1f52c98c<br>
--- /dev/null<br>
+++ b/tests/spec/gl-3.0/dlist-<wbr>uint-uniforms.c<br>
@@ -0,0 +1,305 @@<br>
+/*<br>
+ * Copyright © 2014 Intel Corporation<br>
+ *<br>
+ * Permission is hereby granted, free of charge, to any person obtaining a<br>
+ * copy of this software and associated documentation files (the "Software"),<br>
+ * to deal in the Software without restriction, including without limitation<br>
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,<br>
+ * and/or sell copies of the Software, and to permit persons to whom the<br>
+ * Software is furnished to do so, subject to the following conditions:<br>
+ *<br>
+ * The above copyright notice and this permission notice (including the next<br>
+ * paragraph) shall be included in all copies or substantial portions of the<br>
+ * Software.<br>
+ *<br>
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL<br>
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING<br>
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS<br>
+ * IN THE SOFTWARE.<br>
+ */<br>
+<br>
+/**<br>
+ * Verify that unsigned glUniform* commands added in GL 3.0 are compiled into<br>
+ * display lists.<br>
+ *<br>
+ * This test is adapted from tests/spec/arb_separate_<wbr>shader_objects/dlist.c<br>
+ */<br>
+#include "piglit-util-gl.h"<br>
+<br>
+PIGLIT_GL_TEST_CONFIG_BEGIN<br>
+<br>
+       /* No supports_gl_core_version setting because there are no display<br>
+        * lists in core profile.<br>
+        */<br>
+       config.supports_gl_compat_<wbr>version = 30;<br>
+       config.window_visual = PIGLIT_GL_VISUAL_DOUBLE | PIGLIT_GL_VISUAL_RGBA;<br>
+       config.khr_no_error_support = PIGLIT_NO_ERRORS;<br>
+<br>
+PIGLIT_GL_TEST_CONFIG_END<br>
+<br>
+static bool Uniformui(void);<br>
+<br>
+void<br>
+piglit_init(int argc, char **argv)<br>
+{<br>
+       unsigned glsl_version;<br>
+       bool pass = true;<br>
+<br>
+       pass = Uniformui() && pass;<br>
+<br>
+       piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL);<br>
+}<br>
+<br>
+enum mode {<br>
+       set_scalar,<br>
+       set_vector,<br>
+       get_and_compare<br>
+};<br>
+<br>
+#define UINT_UNIFORM(type, n, suffix)                          \<br>
+       do {                                                    \<br>
+               type inbuf[n];                                  \<br>
+               type outbuf[n];                                 \<br>
+               unsigned jjj;                                   \<br>
+                                                               \<br>
+               for (jjj = 0; jjj < n; jjj++)                   \<br>
+                       outbuf[jjj] = (type) value++;           \<br>
+                                                               \<br>
+               switch (m) {                                    \<br>
+               case set_scalar:                                \<br>
+                       switch (n) {                            \<br>
+                       case 1:                                 \<br>
+                               glUniform1 ## suffix            \<br>
+                                       (loc,                   \<br>
+                                        outbuf[0]);            \<br>
+                               break;                          \<br>
+                       case 2:                                 \<br>
+                               glUniform2 ## suffix            \<br>
+                                       (loc,                   \<br>
+                                        outbuf[0],             \<br>
+                                        outbuf[1]);            \<br>
+                               break;                          \<br>
+                       case 3:                                 \<br>
+                               glUniform3 ## suffix            \<br>
+                                       (loc,                   \<br>
+                                        outbuf[0],             \<br>
+                                        outbuf[1],             \<br>
+                                        outbuf[2]);            \<br>
+                               break;                          \<br>
+                       case 4:                                 \<br>
+                               glUniform4 ## suffix            \<br>
+                                       (loc,                   \<br>
+                                        outbuf[0],             \<br>
+                                        outbuf[1],             \<br>
+                                        outbuf[2],             \<br>
+                                        outbuf[3]);            \<br>
+                               break;                          \<br>
+                       default:                                \<br>
+                               printf("internal error - "      \<br>
+                                      "cannot set_scalar a "   \<br>
+                                      "%d count\n", n);        \<br>
+                               pass = false;                   \<br>
+                               break;                          \<br>
+                       }                                       \<br>
+                       break;                                  \<br>
+                                                               \<br>
+               case set_vector:                                \<br>
+                       glUniform ## n ## suffix ## v           \<br>
+                               (loc, 1, outbuf);               \<br>
+                       break;                                  \<br>
+                                                               \<br>
+               case get_and_compare:                           \<br>
+                       glGetUniform ## suffix ## v             \<br>
+                               (prog, loc, inbuf);             \<br>
+                       if (memcmp(inbuf, outbuf,               \<br>
+                                  sizeof(type) * n) != 0) {    \<br>
+                               printf("            %s data "   \<br>
+                                      "does not match.\n",     \<br>
+                                      name);                   \<br>
+                               pass = false;                   \<br>
+                       }                                       \<br>
+                       break;                                  \<br>
+               }                                               \<br>
+       } while (0)<br>
+<br>
+/**<br>
+ * Set or get/verify all the active uniforms in a program<br>
+ *<br>
+ * \param prog        Program to operate on<br>
+ * \param base_value  Value set (or expected) for the first element of the<br>
+ *                    first uniform.  Each element expects a successively<br>
+ *                    incremented value.<br>
+ * \param m           Mode of operation.  Set using scalars (e.g., using<br>
+ *                    \c glUniform4f), set using vectors (e.g., using<br>
+ *                    \c glUniform4fv), or get and verify.<br>
+ */<br>
+bool<br>
+process_program_uniforms(<wbr>GLuint prog, unsigned base_value, enum mode m)<br>
+{<br>
+       unsigned num_uniforms;<br>
+       unsigned i;<br>
+       unsigned value;<br>
+       bool pass = true;<br>
+<br>
+       glGetProgramiv(prog, GL_ACTIVE_UNIFORMS, (GLint *) &num_uniforms);<br>
+<br>
+       value = base_value;<br>
+       for (i = 0; i < num_uniforms; i++) {<br>
+               GLint size;<br>
+               GLenum type;<br>
+               char name[64];<br>
+               GLuint loc;<br>
+<br>
+               glGetActiveUniform(prog, i, sizeof(name), NULL,<br>
+                                  &size, &type, name);<br>
+<br>
+               loc = glGetUniformLocation(prog, name);<br>
+               if (loc == -1) {<br>
+                       printf("%s was active, but could not get location.\n",<br>
+                              name);<br>
+                       pass = false;<br>
+                       continue;<br>
+               }<br>
+<br>
+               switch (type) {<br>
+<br>
+               case GL_UNSIGNED_INT:<br>
+                       UINT_UNIFORM(unsigned, 1, ui);<br>
+                       break;<br>
+               case GL_UNSIGNED_INT_VEC2:<br>
+                       UINT_UNIFORM(unsigned, 2, ui);<br>
+                       break;<br>
+               case GL_UNSIGNED_INT_VEC3:<br>
+                       UINT_UNIFORM(unsigned, 3, ui);<br>
+                       break;<br>
+               case GL_UNSIGNED_INT_VEC4:<br>
+                       UINT_UNIFORM(unsigned, 4, ui);<br>
+                       break;<br>
+               }<br>
+       }<br>
+<br>
+       return pass;<br>
+}<br>
+<br>
+static bool<br>
+process_shader(const char *func, const char *source)<br>
+{<br>
+       static const struct {<br>
+               GLenum list_mode;<br>
+               enum mode setter_mode;<br>
+               const char *setter_mode_name;<br>
+               unsigned base_value;<br>
+       } tests[] = {<br>
+               {<br>
+                       GL_COMPILE,<br>
+                       set_scalar, "scalar",<br>
+                       5<br>
+               },<br>
+               {<br>
+                       GL_COMPILE,<br>
+                       set_vector, "vector",<br>
+                       7<br>
+               },<br>
+               {<br>
+                       GL_COMPILE_AND_EXECUTE,<br>
+                       set_scalar, "scalar",<br>
+                       11<br>
+               },<br>
+               {<br>
+                       GL_COMPILE_AND_EXECUTE,<br>
+                       set_vector, "vector",<br>
+                       13<br>
+               }<br>
+       };<br>
+<br>
+       bool pass = true;<br>
+<br>
+       printf("Testing gl%s\n", func);<br>
+<br>
+       GLuint vs = piglit_compile_shader_text(GL_<wbr>VERTEX_SHADER, source);<br>
+       GLuint prog = piglit_link_simple_program(vs, 0);<br>
+<br>
+       glUseProgram(prog);<br>
+<br>
+       GLuint list = glGenLists(1);<br>
+<br>
+       for (unsigned i = 0; i < ARRAY_SIZE(tests); i++) {<br>
+               const unsigned post_compile_base_value =<br>
+                       (tests[i].list_mode == GL_COMPILE)<br>
+                       ? 0 : tests[i].base_value;<br>
+<br>
+               printf("    %s: %s mode\n",<br>
+                      piglit_get_gl_enum_name(tests[<wbr>i].list_mode),<br>
+                      tests[i].setter_mode_name);<br>
+<br>
+               printf("        pre-initialize\n");<br>
+               pass = process_program_uniforms(prog, 0, tests[i].setter_mode)<br>
+                       && pass;<br>
+               pass = process_program_uniforms(prog, 0, get_and_compare)<br>
+                       && pass;<br>
+<br>
+               glNewList(list, tests[i].list_mode);<br>
+               printf("        compiling\n");<br>
+               pass = process_program_uniforms(prog,<br>
+                                               tests[i].base_value,<br>
+                                               tests[i].setter_mode)<br>
+                       && pass;<br>
+               glEndList();<br>
+<br>
+               printf("        post-compile verify\n");<br>
+               pass = process_program_uniforms(prog, post_compile_base_value,<br>
+                                               get_and_compare)<br>
+                       && pass;<br>
+<br>
+               /* Reset the values back.  This is useful if GL_COMPILE<br>
+                * executed the commands and for GL_COMPILE_AND_EXECUTE.  We<br>
+                * want to know that glCallList changed things.<br>
+                */<br>
+               printf("        restore original values\n");<br>
+               pass = process_program_uniforms(prog, 0, tests[i].setter_mode)<br>
+                       && pass;<br>
+               pass = process_program_uniforms(prog, 0, get_and_compare)<br>
+                       && pass;<br>
+<br>
+               printf("        post-glCallList verify\n");<br>
+               glCallList(list);<br>
+               pass = process_program_uniforms(prog, tests[i].base_value,<br>
+                                               get_and_compare)<br>
+                       && pass;<br>
+       }<br>
+<br>
+       glDeleteLists(list, 1);<br>
+<br>
+       pass = piglit_check_gl_error(GL_NO_<wbr>ERROR) && pass;<br>
+<br>
+       return pass;<br>
+}<br>
+<br>
+bool<br>
+Uniformui(void)<br>
+{<br>
+       const char *source =<br>
+               "#version 130\n"<br>
+               "uniform uint s;\n"<br>
+               "uniform uvec2 v2;\n"<br>
+               "uniform uvec3 v3;\n"<br>
+               "uniform uvec4 v4;\n"<br>
+               "\n"<br>
+               "void main()\n"<br>
+               "{\n"<br>
+               "    gl_Position = vec4(v3, s) + vec4(v2, v2) + vec4(v4);\n"<br>
+               "}\n"<br>
+               ;<br>
+<br>
+       return process_shader(__func__, source);<br>
+}<br>
+<br>
+enum piglit_result<br>
+piglit_display(void)<br>
+{<br>
+       /* NOTREACHED */<br>
+       return PIGLIT_FAIL;<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>