[Piglit] [PATCH] primitive-restart: test transform feedback for GL >= 3.0

Jordan Justen jordan.l.justen at intel.com
Wed Jun 27 15:41:01 PDT 2012


Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
---
 tests/general/primitive-restart.c |   62 +++++++++++++++++++++++++++++++++++--
 1 file changed, 59 insertions(+), 3 deletions(-)

diff --git a/tests/general/primitive-restart.c b/tests/general/primitive-restart.c
index cbeb882..a8a817f 100644
--- a/tests/general/primitive-restart.c
+++ b/tests/general/primitive-restart.c
@@ -67,7 +67,9 @@ static const GLfloat black[4] = {0.0, 0.0, 0.0, 0.0};
 static GLboolean Have_NV;
 static GLboolean Have_31;
 static GLboolean TestGL31;
+static GLboolean TestTransformFeedback = GL_FALSE;
 
+static GLuint generated_query;
 
 static GLboolean
 check_rendering(void)
@@ -300,6 +302,7 @@ test_draw_by_index(VBO_CFG vbo_cfg, GLboolean one_by_one, GLenum primMode, GLenu
    uintptr_t index_offset = 0;
    uintptr_t vbo_data_size = sizeof(verts) + sizeof(indices);
    GLuint i, j;
+   GLuint expected_primitives_generated;
 
    if ((vbo_cfg != DISABLE_VBO) && (vbo_cfg != VBO_INDEX_ONLY)) {
       create_vbo1 = GL_TRUE;
@@ -359,6 +362,7 @@ test_draw_by_index(VBO_CFG vbo_cfg, GLboolean one_by_one, GLenum primMode, GLenu
 
       num_elems = j;
       primStr = "GL_TRIANGLE_STRIP";
+      expected_primitives_generated = 24;
    }
    else {
       const GLfloat y = 0.5 * piglit_height;
@@ -385,6 +389,7 @@ test_draw_by_index(VBO_CFG vbo_cfg, GLboolean one_by_one, GLenum primMode, GLenu
 
       num_elems = j;
       primStr = "GL_LINE_STRIP";
+      expected_primitives_generated = 12;
    }
 
    assert(num_elems <= NUM_ELEMS);
@@ -436,6 +441,10 @@ test_draw_by_index(VBO_CFG vbo_cfg, GLboolean one_by_one, GLenum primMode, GLenu
 
    glEnableClientState(GL_VERTEX_ARRAY);
 
+   if (TestTransformFeedback) {
+      glBeginQuery(GL_PRIMITIVES_GENERATED, generated_query);
+   }
+
    assert(glGetError()==0);
    enable_restart(restart_index);
 
@@ -464,6 +473,21 @@ test_draw_by_index(VBO_CFG vbo_cfg, GLboolean one_by_one, GLenum primMode, GLenu
    }
 
    pass = check_rendering();
+
+   if (pass && TestTransformFeedback) {
+      GLuint num_generated_primitives;
+
+      glEndQuery(GL_PRIMITIVES_GENERATED);
+      glGetQueryObjectuiv(generated_query, GL_QUERY_RESULT,
+                          &num_generated_primitives);
+
+      if (expected_primitives_generated != num_generated_primitives) {
+         fprintf(stderr, "Transform Feedback: expected=%u, got=%u\n",
+                 expected_primitives_generated, num_generated_primitives);
+         pass = GL_FALSE;
+      }
+   }
+
    if (!pass) {
       fprintf(stderr, "%s: failure drawing with %s(%s, %s), %s\n",
               TestName,
@@ -516,6 +540,7 @@ test_draw_arrays(VBO_CFG vbo_cfg)
    GLuint test;
    const GLenum primMode = GL_LINE_STRIP;
    GLuint vbo = 0;
+   GLuint expected_primitives_generated;
 
    x = 0.0;
 
@@ -556,12 +581,20 @@ test_draw_arrays(VBO_CFG vbo_cfg)
     */
    for (test = 0; test < 3 && pass; test++) {
       /* choose the restart index */
-      if (test == 0)
+      if (test == 0) {
          restart_index = 0;
-      else if (test == 1)
+         expected_primitives_generated = NUM_VERTS - 2;
+      } else if (test == 1) {
          restart_index = NUM_VERTS - 1;
-      else
+         expected_primitives_generated = NUM_VERTS - 2;
+      } else {
          restart_index = NUM_VERTS / 2;
+         expected_primitives_generated = NUM_VERTS - 3;
+      }
+
+      if (TestTransformFeedback) {
+         glBeginQuery(GL_PRIMITIVES_GENERATED, generated_query);
+      }
 
       /* draw */
       glClear(GL_COLOR_BUFFER_BIT);
@@ -600,6 +633,24 @@ test_draw_arrays(VBO_CFG vbo_cfg)
             }
          }
       }
+
+      if (pass && TestTransformFeedback) {
+         GLuint num_generated_primitives;
+
+         glEndQuery(GL_PRIMITIVES_GENERATED);
+         glGetQueryObjectuiv(generated_query, GL_QUERY_RESULT,
+                             &num_generated_primitives);
+
+         if (expected_primitives_generated != num_generated_primitives) {
+            fprintf(stderr, "Transform Feedback: expected=%u, got=%u\n",
+                    expected_primitives_generated, num_generated_primitives);
+            pass = GL_FALSE;
+         }
+      }
+
+      if (!pass) {
+         break;
+      }
    }
 
    piglit_present_results();
@@ -685,6 +736,7 @@ piglit_init(int argc, char **argv)
 {
    Have_NV = piglit_is_extension_supported("GL_NV_primitive_restart");
    Have_31 = piglit_get_gl_version() >= 31;
+   TestTransformFeedback = piglit_get_gl_version() >= 30;
 
    if (argc >= 2) {
       VBO_CFG vbo_cfg;
@@ -711,5 +763,9 @@ piglit_init(int argc, char **argv)
       exit(1);
    }
 
+   if (TestTransformFeedback) {
+      glGenQueries(1, &generated_query);
+   }
+
    glClearColor(0, 0, 0, 0);
 }
-- 
1.7.9.5



More information about the Piglit mailing list