From: Marek Olšák <marek.ol...@amd.com>

---
 tests/opengl.py                              |  6 ++
 tests/spec/gl-3.0/multidrawarrays-vertexid.c | 64 +++++++++++++++-----
 2 files changed, 56 insertions(+), 14 deletions(-)

diff --git a/tests/opengl.py b/tests/opengl.py
index 6944fd79d..ce67d485b 100644
--- a/tests/opengl.py
+++ b/tests/opengl.py
@@ -1746,20 +1746,26 @@ with profile.test_list.group_manager(
     g(['arb_draw_indirect-draw-elements-prim-restart'])
     g(['arb_draw_indirect-draw-elements-prim-restart-ugly'])
     g(['arb_draw_indirect-draw-arrays-instances'])
     g(['arb_draw_indirect-draw-arrays-shared-binding'])
     g(['arb_draw_indirect-transform-feedback'])
     g(['arb_draw_indirect-vertexid'],
       'gl_VertexID used with glDrawArraysIndirect')
     g(['arb_draw_indirect-vertexid', 'elements'],
       'gl_VertexID used with glDrawElementsIndirect')
 
+# Group ARB_draw_indirect
+with profile.test_list.group_manager(
+        PiglitGLTest,
+        grouptools.join('spec', 'ARB_multi_draw_indirect')) as g:
+    g(['gl-3.0-multidrawarrays-vertexid', '-indirect'],
+
 # Group ARB_fragment_program
 with profile.test_list.group_manager(
         PiglitGLTest,
         grouptools.join('spec', 'ARB_fragment_program')) as g:
     g(['arb_fragment_program-minmax'], 'minmax')
     g(['fp-abs-01'])
     g(['fp-fog'])
     g(['fp-formats'])
     g(['fp-fragment-position'])
     g(['fp-incomplete-tex'])
diff --git a/tests/spec/gl-3.0/multidrawarrays-vertexid.c 
b/tests/spec/gl-3.0/multidrawarrays-vertexid.c
index 47ee89e78..099cc44c7 100644
--- a/tests/spec/gl-3.0/multidrawarrays-vertexid.c
+++ b/tests/spec/gl-3.0/multidrawarrays-vertexid.c
@@ -35,35 +35,58 @@ PIGLIT_GL_TEST_CONFIG_BEGIN
        config.window_visual = PIGLIT_GL_VISUAL_DOUBLE | PIGLIT_GL_VISUAL_RGBA;
        config.khr_no_error_support = PIGLIT_NO_ERRORS;
 
 PIGLIT_GL_TEST_CONFIG_END
 
 static const float green[]   = { 0, 1, 0, 1 };
 static const float blue[]    = { 0, 0, 1, 1 };
 static const float gold[]    = { 1, 1, 0, 1 };
 static const float magenta[] = { 1, 0, 1, 1 };
 
+static bool indirect;
+
 enum piglit_result
 piglit_display(void)
 {
        bool pass = true;
        static const GLint first[] = { 4, 8, 12, 16 };
        static const GLsizei count[ARRAY_SIZE(first)] = { 4, 4, 4, 4 };
 
        glViewport(0, 0, piglit_width, piglit_height);
        glClearColor(0.2, 0.2, 0.2, 0.2);
        glClear(GL_COLOR_BUFFER_BIT);
 
-       glMultiDrawArrays(GL_TRIANGLE_FAN,
-                         first,
-                         count,
-                         ARRAY_SIZE(count));
+       if (indirect) {
+               unsigned data[ARRAY_SIZE(count) * 4];
+
+               for (unsigned i = 0; i < ARRAY_SIZE(count); i++) {
+                       data[i*4+0] = count[i];
+                       data[i*4+1] = 1;
+                       data[i*4+2] = first[i];
+                       data[i*4+3] = 0;
+               }
+               GLuint ib;
+
+               glGenBuffers(1, &ib);
+               glBindBuffer(GL_DRAW_INDIRECT_BUFFER, ib);
+               glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(data), data,
+                            GL_STATIC_DRAW);
+
+               glMultiDrawArraysIndirect(GL_TRIANGLE_FAN, NULL,
+                                         ARRAY_SIZE(count), 0);
+               glDeleteBuffers(1, &ib);
+       } else {
+               glMultiDrawArrays(GL_TRIANGLE_FAN,
+                                 first,
+                                 count,
+                                 ARRAY_SIZE(count));
+       }
 
        pass = piglit_probe_rect_rgba(0, 0,
                                      piglit_width / 2, piglit_height /2,
                                      green)
                && pass;
        pass = piglit_probe_rect_rgba(piglit_width / 2, 0,
                                      piglit_width / 2, piglit_height / 2,
                                      blue)
                && pass;
        pass = piglit_probe_rect_rgba(0, piglit_height /2,
@@ -76,20 +99,28 @@ piglit_display(void)
                && pass;
 
        piglit_present_results();
 
        return pass ? PIGLIT_PASS : PIGLIT_FAIL;
 }
 
 void
 piglit_init(int argc, char **argv)
 {
+       for (int i = 1; i < argc; i++) {
+               if (strcmp(argv[i], "-indirect") == 0) {
+                       piglit_require_extension("GL_ARB_multi_draw_indirect");
+                       puts("Testing GL_ARB_multi_draw_indirect");
+                       indirect = true;
+               }
+       }
+
        static const GLfloat verts[] = {
                /* These vertices should never be accessed due to the way
                 * glMultiDrawArrays is called.
                 */
                -1.0, -1.0,
                 1.0, -1.0,
                 1.0,  1.0,
                -1.0,  1.0,
 
                -1.0, -1.0,
@@ -150,26 +181,31 @@ piglit_init(int argc, char **argv)
                "       gl_Position = piglit_vertex;\n"
                "}\n",
 
                "#version 130\n"
                "in vec3 c;\n"
                "\n"
                "void main() {\n"
                "       gl_FragColor = vec4(c, 1);\n"
                "}\n");
 
-       GLuint vao;
-       GLuint buf;
-
        glUseProgram(prog);
 
-       glGenVertexArrays(1, &vao);
-       glBindVertexArray(vao);
+       if (indirect) {
+               /* Use non-VBO attributes to test this codepath. */
+               glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, verts);
+       } else {
+               GLuint vao;
+               GLuint buf;
+
+               glGenVertexArrays(1, &vao);
+               glBindVertexArray(vao);
 
-       glGenBuffers(1, &buf);
-       glBindBuffer(GL_ARRAY_BUFFER, buf);
-       glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts,
-                    GL_STATIC_DRAW);
+               glGenBuffers(1, &buf);
+               glBindBuffer(GL_ARRAY_BUFFER, buf);
+               glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts,
+                            GL_STATIC_DRAW);
 
-       glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void *) 0);
+               glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void *) 0);
+       }
        glEnableVertexAttribArray(0);
 }
-- 
2.17.1

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to