Each of the glArrayElement/glDrawElements tests are now run with and without enabling VBO.
Signed-off-by: Jordan Justen <[email protected]> --- tests/general/primitive-restart.c | 263 ++++++++++++++++++++++++------------- 1 file changed, 173 insertions(+), 90 deletions(-) diff --git a/tests/general/primitive-restart.c b/tests/general/primitive-restart.c index 3642ffa..b79fddd 100644 --- a/tests/general/primitive-restart.c +++ b/tests/general/primitive-restart.c @@ -45,6 +45,8 @@ static GLboolean Have_NV; static GLboolean Have_31; static GLboolean TestGL31; +#define VBO_ON GL_TRUE +#define VBO_OFF GL_FALSE static GLboolean check_rendering(void) @@ -53,9 +55,14 @@ check_rendering(void) const GLint iy = piglit_height / 2; GLboolean draw = GL_TRUE; GLfloat x; + GLboolean pass; + + pass = piglit_probe_pixel_rgb(0, 0, black); + if (!pass) { + return GL_FALSE; + } for (x = x0 + 0.5 * dx; x < x1; x += dx) { - GLboolean pass; const int ix = (int) x; if (draw) { @@ -184,33 +191,71 @@ disable_restart(void) } -static void draw_all_indices(GLboolean one_by_one, - GLenum mode, GLsizei count, +static GLuint type_size(GLenum type) +{ + switch (type) { + case GL_UNSIGNED_BYTE: + return sizeof(GLubyte); + case GL_UNSIGNED_SHORT: + return sizeof(GLushort); + case GL_UNSIGNED_INT: + return sizeof(GLuint); + default: + assert(0); + return 0; + } +} + + +static GLuint type_array_size(GLenum type, GLuint length) +{ + return length * type_size(type); +} + + +static GLuint read_index_value(const GLvoid *indices, GLenum type, GLuint index) +{ + switch (type) { + case GL_UNSIGNED_BYTE: + return (GLuint)((GLubyte*)indices)[index]; + case GL_UNSIGNED_SHORT: + return (GLuint)((GLushort*)indices)[index]; + case GL_UNSIGNED_INT: + return ((GLuint*)indices)[index]; + default: + assert(0); + } +} + + +static void write_index_value(const GLvoid *indices, GLenum type, GLuint index, GLuint value) +{ + switch (type) { + case GL_UNSIGNED_BYTE: + ((GLubyte*)indices)[index] = (GLubyte) value; + break; + case GL_UNSIGNED_SHORT: + ((GLushort*)indices)[index] = (GLushort) value; + break; + case GL_UNSIGNED_INT: + ((GLuint*)indices)[index] = value; + break; + default: + assert(0); + } +} + + +static void do_ArrayElement(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) { GLuint index; - if (one_by_one) { - glBegin(mode); - for (index = 0; index < count; index++) { - switch (type) { - case GL_UNSIGNED_BYTE: - glArrayElement(((GLubyte*)indices)[index]); - break; - case GL_UNSIGNED_SHORT: - glArrayElement(((GLushort*)indices)[index]); - break; - case GL_UNSIGNED_INT: - glArrayElement(((GLuint*)indices)[index]); - break; - default: - assert(0); - } - } - glEnd(); - } else { - glDrawElements(mode, count, type, indices); + glBegin(mode); + for (index = 0; index < count; index++) { + glArrayElement(read_index_value(indices, type, index)); } + glEnd(); } @@ -218,17 +263,21 @@ static void draw_all_indices(GLboolean one_by_one, * Test glDrawElements() with glPrimitiveRestartIndexNV(). */ static GLboolean -test_draw_by_index(GLboolean one_by_one, GLenum primMode, GLenum indexType) +test_draw_by_index(GLboolean one_by_one, GLboolean use_vbo, + GLenum primMode, GLenum indexType) { #define NUM_VERTS 48 #define NUM_ELEMS (NUM_VERTS * 5 / 4) GLfloat verts[NUM_VERTS+2][2]; - GLuint elements[NUM_ELEMS]; + GLubyte indicies[sizeof(GLuint) * NUM_ELEMS]; GLfloat x, dx; GLuint restart_index; GLuint num_elems; GLboolean pass; const char *typeStr = NULL, *primStr = NULL; + GLuint vbo; + uintptr_t index_offset = sizeof(verts); + GLuint i, j; switch (indexType) { case GL_UNSIGNED_BYTE: @@ -251,7 +300,6 @@ test_draw_by_index(GLboolean one_by_one, GLenum primMode, GLenum indexType) dx = 20.0; if (primMode == GL_TRIANGLE_STRIP) { - GLuint i, j; const GLfloat y = 0.5 * piglit_height - 10.0, dy = 20.0; for (i = 0; i < NUM_VERTS / 2; i++) { verts[i*2+0][0] = x; @@ -263,16 +311,18 @@ test_draw_by_index(GLboolean one_by_one, GLenum primMode, GLenum indexType) /* setup elements to draw series of squares w/ tri strip */ for (i = j = 0; i < NUM_VERTS; i++) { - elements[j++] = i; - if (i > 0 && i % 4 == 3) - elements[j++] = restart_index; + write_index_value(indicies, indexType, j, i); + j++; + if (i > 0 && i % 4 == 3) { + write_index_value(indicies, indexType, j, restart_index); + j++; + } } num_elems = j; primStr = "GL_TRIANGLE_STRIP"; } else { - GLuint i, j; const GLfloat y = 0.5 * piglit_height; assert(primMode == GL_LINE_STRIP); @@ -287,9 +337,12 @@ test_draw_by_index(GLboolean one_by_one, GLenum primMode, GLenum indexType) /* setup elements to draw series of disjoint lines w/ line strip */ for (i = j = 0; i < NUM_VERTS / 2; i++) { - elements[j++] = i; - if (i > 0 && i % 2 == 1) - elements[j++] = restart_index; + write_index_value(indicies, indexType, j, i); + j++; + if (i > 0 && i % 2 == 1) { + write_index_value(indicies, indexType, j, restart_index); + j++; + } } num_elems = j; @@ -300,9 +353,8 @@ test_draw_by_index(GLboolean one_by_one, GLenum primMode, GLenum indexType) /* debug */ if (0) { - GLint i; for (i = 0; i < num_elems; i++) - printf("%2d: %d\n", i, elements[i]); + printf("%2d: %d\n", i, read_index_value(indicies, indexType, i)); } piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE); @@ -311,48 +363,55 @@ test_draw_by_index(GLboolean one_by_one, GLenum primMode, GLenum indexType) glColor4fv(green); - glVertexPointer(2, GL_FLOAT, 2*sizeof(GLfloat), verts); + if (use_vbo) { + glGenBuffers(1, &vbo); + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo); + glBufferData(GL_ARRAY_BUFFER, + index_offset + sizeof(indicies), + NULL, GL_STATIC_DRAW); + glBufferSubData(GL_ARRAY_BUFFER, + 0, sizeof(verts), + verts); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, + index_offset, type_array_size(indexType, num_elems), + indicies); + glVertexPointer(2, GL_FLOAT, 0, (void *)0); + } else { + glVertexPointer(2, GL_FLOAT, 0, (void *)verts); + } + glEnableClientState(GL_VERTEX_ARRAY); assert(glGetError()==0); enable_restart(restart_index); /* Draw */ - switch (indexType) { - case GL_UNSIGNED_BYTE: - { - GLubyte ub_elements[NUM_ELEMS]; - int i; - for (i = 0; i < num_elems; i++) - ub_elements[i] = (GLubyte) elements[i]; - draw_all_indices(one_by_one, primMode, num_elems, GL_UNSIGNED_BYTE, ub_elements); - } - break; - case GL_UNSIGNED_SHORT: - { - GLushort us_elements[NUM_ELEMS]; - int i; - for (i = 0; i < num_elems; i++) - us_elements[i] = (GLushort) elements[i]; - draw_all_indices(one_by_one, primMode, num_elems, GL_UNSIGNED_SHORT, us_elements); - } - break; - case GL_UNSIGNED_INT: - draw_all_indices(one_by_one, primMode, num_elems, GL_UNSIGNED_INT, elements); - break; - default: - assert(0); + if (one_by_one) { + do_ArrayElement(primMode, num_elems, indexType, indicies); + } else if (use_vbo) { + glDrawElements(primMode, num_elems, indexType, (void*) index_offset); + } else { + glDrawElements(primMode, num_elems, indexType, indicies); } disable_restart(); + glDisableClientState(GL_VERTEX_ARRAY); + if (use_vbo) { + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glDeleteBuffers(1, &vbo); + } + pass = check_rendering(); if (!pass) { - fprintf(stderr, "%s: failure drawing with %s(%s, %s)\n", + fprintf(stderr, "%s: failure drawing with %s(%s, %s), VBO=%s\n", TestName, one_by_one ? "glArrayElement" : "glDrawElements", - primStr, typeStr); + primStr, typeStr, + use_vbo ? "on" : "off"); } piglit_present_results(); @@ -366,9 +425,9 @@ test_draw_by_index(GLboolean one_by_one, GLenum primMode, GLenum indexType) * Test glDrawElements() with glPrimitiveRestartIndexNV(). */ static GLboolean -test_draw_elements(GLenum primMode, GLenum indexType) +test_draw_elements(GLboolean use_vbo, GLenum primMode, GLenum indexType) { - return test_draw_by_index(GL_FALSE, primMode, indexType); + return test_draw_by_index(GL_FALSE, use_vbo, primMode, indexType); } @@ -376,9 +435,9 @@ test_draw_elements(GLenum primMode, GLenum indexType) * Test glArrayElement() with glPrimitiveRestartIndexNV(). */ static GLboolean -test_array_element(GLenum primMode, GLenum indexType) +test_array_element(GLboolean use_vbo, GLenum primMode, GLenum indexType) { - return test_draw_by_index(GL_TRUE, primMode, indexType); + return test_draw_by_index(GL_TRUE, use_vbo, primMode, indexType); } @@ -498,35 +557,59 @@ piglit_display(void) TestGL31 = GL_FALSE; pass = pass && test_begin_end(GL_TRIANGLE_STRIP); pass = pass && test_begin_end(GL_LINE_STRIP); - pass = pass && test_draw_elements(GL_TRIANGLE_STRIP, GL_UNSIGNED_BYTE); - pass = pass && test_draw_elements(GL_TRIANGLE_STRIP, GL_UNSIGNED_SHORT); - pass = pass && test_draw_elements(GL_TRIANGLE_STRIP, GL_UNSIGNED_INT); - pass = pass && test_draw_elements(GL_LINE_STRIP, GL_UNSIGNED_BYTE); - pass = pass && test_draw_elements(GL_LINE_STRIP, GL_UNSIGNED_SHORT); - pass = pass && test_draw_elements(GL_LINE_STRIP, GL_UNSIGNED_INT); - pass = pass && test_array_element(GL_TRIANGLE_STRIP, GL_UNSIGNED_BYTE); - pass = pass && test_array_element(GL_TRIANGLE_STRIP, GL_UNSIGNED_SHORT); - pass = pass && test_array_element(GL_TRIANGLE_STRIP, GL_UNSIGNED_INT); - pass = pass && test_array_element(GL_LINE_STRIP, GL_UNSIGNED_BYTE); - pass = pass && test_array_element(GL_LINE_STRIP, GL_UNSIGNED_SHORT); - pass = pass && test_array_element(GL_LINE_STRIP, GL_UNSIGNED_INT); + pass = pass && test_draw_elements(VBO_OFF, GL_TRIANGLE_STRIP, GL_UNSIGNED_BYTE); + pass = pass && test_draw_elements(VBO_OFF, GL_TRIANGLE_STRIP, GL_UNSIGNED_SHORT); + pass = pass && test_draw_elements(VBO_OFF, GL_TRIANGLE_STRIP, GL_UNSIGNED_INT); + pass = pass && test_draw_elements(VBO_OFF, GL_LINE_STRIP, GL_UNSIGNED_BYTE); + pass = pass && test_draw_elements(VBO_OFF, GL_LINE_STRIP, GL_UNSIGNED_SHORT); + pass = pass && test_draw_elements(VBO_OFF, GL_LINE_STRIP, GL_UNSIGNED_INT); + pass = pass && test_array_element(VBO_OFF, GL_TRIANGLE_STRIP, GL_UNSIGNED_BYTE); + pass = pass && test_array_element(VBO_OFF, GL_TRIANGLE_STRIP, GL_UNSIGNED_SHORT); + pass = pass && test_array_element(VBO_OFF, GL_TRIANGLE_STRIP, GL_UNSIGNED_INT); + pass = pass && test_array_element(VBO_OFF, GL_LINE_STRIP, GL_UNSIGNED_BYTE); + pass = pass && test_array_element(VBO_OFF, GL_LINE_STRIP, GL_UNSIGNED_SHORT); + pass = pass && test_array_element(VBO_OFF, GL_LINE_STRIP, GL_UNSIGNED_INT); + pass = pass && test_draw_elements(VBO_ON, GL_TRIANGLE_STRIP, GL_UNSIGNED_BYTE); + pass = pass && test_draw_elements(VBO_ON, GL_TRIANGLE_STRIP, GL_UNSIGNED_SHORT); + pass = pass && test_draw_elements(VBO_ON, GL_TRIANGLE_STRIP, GL_UNSIGNED_INT); + pass = pass && test_draw_elements(VBO_ON, GL_LINE_STRIP, GL_UNSIGNED_BYTE); + pass = pass && test_draw_elements(VBO_ON, GL_LINE_STRIP, GL_UNSIGNED_SHORT); + pass = pass && test_draw_elements(VBO_ON, GL_LINE_STRIP, GL_UNSIGNED_INT); + pass = pass && test_array_element(VBO_ON, GL_TRIANGLE_STRIP, GL_UNSIGNED_BYTE); + pass = pass && test_array_element(VBO_ON, GL_TRIANGLE_STRIP, GL_UNSIGNED_SHORT); + pass = pass && test_array_element(VBO_ON, GL_TRIANGLE_STRIP, GL_UNSIGNED_INT); + pass = pass && test_array_element(VBO_ON, GL_LINE_STRIP, GL_UNSIGNED_BYTE); + pass = pass && test_array_element(VBO_ON, GL_LINE_STRIP, GL_UNSIGNED_SHORT); + pass = pass && test_array_element(VBO_ON, GL_LINE_STRIP, GL_UNSIGNED_INT); pass = pass && test_draw_arrays(); } if (Have_31) { TestGL31 = GL_TRUE; - pass = pass && test_draw_elements(GL_TRIANGLE_STRIP, GL_UNSIGNED_BYTE); - pass = pass && test_draw_elements(GL_TRIANGLE_STRIP, GL_UNSIGNED_SHORT); - pass = pass && test_draw_elements(GL_TRIANGLE_STRIP, GL_UNSIGNED_INT); - pass = pass && test_draw_elements(GL_LINE_STRIP, GL_UNSIGNED_BYTE); - pass = pass && test_draw_elements(GL_LINE_STRIP, GL_UNSIGNED_SHORT); - pass = pass && test_draw_elements(GL_LINE_STRIP, GL_UNSIGNED_INT); - pass = pass && test_array_element(GL_TRIANGLE_STRIP, GL_UNSIGNED_BYTE); - pass = pass && test_array_element(GL_TRIANGLE_STRIP, GL_UNSIGNED_SHORT); - pass = pass && test_array_element(GL_TRIANGLE_STRIP, GL_UNSIGNED_INT); - pass = pass && test_array_element(GL_LINE_STRIP, GL_UNSIGNED_BYTE); - pass = pass && test_array_element(GL_LINE_STRIP, GL_UNSIGNED_SHORT); - pass = pass && test_array_element(GL_LINE_STRIP, GL_UNSIGNED_INT); + pass = pass && test_draw_elements(VBO_OFF, GL_TRIANGLE_STRIP, GL_UNSIGNED_BYTE); + pass = pass && test_draw_elements(VBO_OFF, GL_TRIANGLE_STRIP, GL_UNSIGNED_SHORT); + pass = pass && test_draw_elements(VBO_OFF, GL_TRIANGLE_STRIP, GL_UNSIGNED_INT); + pass = pass && test_draw_elements(VBO_OFF, GL_LINE_STRIP, GL_UNSIGNED_BYTE); + pass = pass && test_draw_elements(VBO_OFF, GL_LINE_STRIP, GL_UNSIGNED_SHORT); + pass = pass && test_draw_elements(VBO_OFF, GL_LINE_STRIP, GL_UNSIGNED_INT); + pass = pass && test_array_element(VBO_OFF, GL_TRIANGLE_STRIP, GL_UNSIGNED_BYTE); + pass = pass && test_array_element(VBO_OFF, GL_TRIANGLE_STRIP, GL_UNSIGNED_SHORT); + pass = pass && test_array_element(VBO_OFF, GL_TRIANGLE_STRIP, GL_UNSIGNED_INT); + pass = pass && test_array_element(VBO_OFF, GL_LINE_STRIP, GL_UNSIGNED_BYTE); + pass = pass && test_array_element(VBO_OFF, GL_LINE_STRIP, GL_UNSIGNED_SHORT); + pass = pass && test_array_element(VBO_OFF, GL_LINE_STRIP, GL_UNSIGNED_INT); + pass = pass && test_draw_elements(VBO_ON, GL_TRIANGLE_STRIP, GL_UNSIGNED_BYTE); + pass = pass && test_draw_elements(VBO_ON, GL_TRIANGLE_STRIP, GL_UNSIGNED_SHORT); + pass = pass && test_draw_elements(VBO_ON, GL_TRIANGLE_STRIP, GL_UNSIGNED_INT); + pass = pass && test_draw_elements(VBO_ON, GL_LINE_STRIP, GL_UNSIGNED_BYTE); + pass = pass && test_draw_elements(VBO_ON, GL_LINE_STRIP, GL_UNSIGNED_SHORT); + pass = pass && test_draw_elements(VBO_ON, GL_LINE_STRIP, GL_UNSIGNED_INT); + pass = pass && test_array_element(VBO_ON, GL_TRIANGLE_STRIP, GL_UNSIGNED_BYTE); + pass = pass && test_array_element(VBO_ON, GL_TRIANGLE_STRIP, GL_UNSIGNED_SHORT); + pass = pass && test_array_element(VBO_ON, GL_TRIANGLE_STRIP, GL_UNSIGNED_INT); + pass = pass && test_array_element(VBO_ON, GL_LINE_STRIP, GL_UNSIGNED_BYTE); + pass = pass && test_array_element(VBO_ON, GL_LINE_STRIP, GL_UNSIGNED_SHORT); + pass = pass && test_array_element(VBO_ON, GL_LINE_STRIP, GL_UNSIGNED_INT); pass = pass && test_draw_arrays(); } -- 1.7.10 _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
