From: Marek Olšák <marek.ol...@amd.com> --- tests/opengl.py | 3 +- .../multidrawelements.c | 69 +++++++++++++------ 2 files changed, 50 insertions(+), 22 deletions(-)
diff --git a/tests/opengl.py b/tests/opengl.py index ce67d485b..3ca4ee74b 100644 --- a/tests/opengl.py +++ b/tests/opengl.py @@ -1750,21 +1750,22 @@ with profile.test_list.group_manager( 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'], + g(['gl-3.0-multidrawarrays-vertexid', '-indirect']) + g(['arb_draw_elements_base_vertex-multidrawelements', '-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']) diff --git a/tests/spec/arb_draw_elements_base_vertex/multidrawelements.c b/tests/spec/arb_draw_elements_base_vertex/multidrawelements.c index a18d77d37..1038631d3 100644 --- a/tests/spec/arb_draw_elements_base_vertex/multidrawelements.c +++ b/tests/spec/arb_draw_elements_base_vertex/multidrawelements.c @@ -48,21 +48,20 @@ * DrawElementsBaseVertex(mode, count[i], type, * indices[i], basevertex[i]); * */ #include "piglit-util-gl.h" PIGLIT_GL_TEST_CONFIG_BEGIN config.supports_gl_compat_version = 10; - config.supports_gl_core_version = 31; config.window_width = 200; config.window_height = 200; config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE; config.khr_no_error_support = PIGLIT_NO_ERRORS; PIGLIT_GL_TEST_CONFIG_END const char *vs_source = { "#version 130\n" @@ -99,89 +98,117 @@ static GLfloat vertices[] = { 1.0,-1.0 }; static GLsizei vertices_size = sizeof(vertices); static GLuint indices[] = { 0, 1, 2, 1, 2, 3, /* top square */ 4, 5, 6, 5, 6, 7, /* bot square */ }; static GLsizei indices_size = sizeof(indices); -static const GLvoid * const indices_offset[] = { - (GLvoid*) 0, (GLvoid*)(6 * sizeof(GLuint)) +static const uintptr_t indices_offset[] = { + 0, 6 * sizeof(GLuint) }; static GLsizei indices_count[] = { 6, 6 }; static GLint basevertex[] = { 2, 2 }; +static bool indirect; 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; + } + } + GLuint program; GLuint vertex_index; piglit_require_GLSL_version(130); if (piglit_get_gl_version() < 32) { piglit_require_extension("GL_ARB_draw_elements_base_vertex"); } /* Create program */ program = piglit_build_simple_program(vs_source, fs_source); glUseProgram(program); + /* Retrieve index from vs */ + vertex_index = glGetAttribLocation(program, "vertex"); + glEnableVertexAttribArray(vertex_index); /* Gen vertex array buffer */ - glGenBuffers(1, &vertexBuffer); - glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); - glBufferData(GL_ARRAY_BUFFER, vertices_size, vertices, GL_STATIC_DRAW); + if (indirect) { + /* Use non-VBO attributes to test this codepath. */ + glVertexAttribPointer(vertex_index, 2, GL_FLOAT, GL_FALSE, 0, vertices); + } else { + glGenBuffers(1, &vertexBuffer); + glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); + glBufferData(GL_ARRAY_BUFFER, vertices_size, vertices, GL_STATIC_DRAW); + + glVertexAttribPointer(vertex_index, 2, GL_FLOAT, GL_FALSE, 0, 0); + } /* Gen indices array buffer */ glGenBuffers(1, &indexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices_size, indices, GL_STATIC_DRAW); - /* Gen VAO */ - glGenVertexArrays(1, &vao); - glBindVertexArray(vao); - - /* Retrieve index from vs */ - vertex_index = glGetAttribLocation(program, "vertex"); - - /* Enabel vertexAttribPointer */ - glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); - glEnableVertexAttribArray(vertex_index); - glVertexAttribPointer(vertex_index, 2, GL_FLOAT, GL_FALSE, 0, 0); - if(!piglit_check_gl_error(GL_NO_ERROR)) piglit_report_result(PIGLIT_FAIL); } enum piglit_result piglit_display(void) { bool pass = true; float green[] = {0, 1, 0}; float blue[] = {0, 0, 1}; glClearColor(blue[0], blue[1], blue[2], 1.0); glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(vao); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); - glMultiDrawElementsBaseVertex(GL_TRIANGLES, indices_count, - GL_UNSIGNED_INT, (GLvoid*)indices_offset, - 2, basevertex); + if (indirect) { + unsigned data[2 * 5]; + + for (unsigned i = 0; i < 2; i++) { + data[i*5+0] = indices_count[i]; + data[i*5+1] = 1; + data[i*5+2] = indices_offset[i] / sizeof(GLuint); + data[i*5+3] = basevertex[i]; + data[i*5+4] = 0; + } + GLuint ib; + + glGenBuffers(1, &ib); + glBindBuffer(GL_DRAW_INDIRECT_BUFFER, ib); + glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(data), data, + GL_STATIC_DRAW); + + glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, NULL, 2, 0); + glDeleteBuffers(1, &ib); + } else { + glMultiDrawElementsBaseVertex(GL_TRIANGLES, indices_count, + GL_UNSIGNED_INT, (GLvoid*)indices_offset, + 2, basevertex); + } /* Check for test pass */ pass = piglit_probe_pixel_rgb(100, 175, blue) && pass; pass = piglit_probe_pixel_rgb(100, 125, green) && pass; pass = piglit_probe_pixel_rgb(100, 75, blue) && pass; pass = piglit_probe_pixel_rgb(100, 25, green) && pass; if(!piglit_check_gl_error(GL_NO_ERROR)) pass = false; -- 2.17.1 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit