enum piglit_result piglit_display(void) { check_invalid_queries(); glClear(GL_COLOR_BUFFER_BIT); glBeginTransformFeedback(GL_POINTS); ctx.active = true; check_active_paused_state("TransformFeedback started"); glPauseTransformFeedback(); ctx.paused = true; check_active_paused_state("TransformFeedback paused"); glResumeTransformFeedback(); ctx.paused = false; check_active_paused_state("TransformFeedback resumed"); glEndTransformFeedback(); ctx.active = false; check_active_paused_state("TransformFeedback ended"); /* clean-up everything */ glDeleteBuffers(3, xfb_buf); glDeleteBuffers(1, &input_buf); glDeleteVertexArrays(1, &vao); glDeleteProgram(prog); return pass ? PIGLIT_PASS : PIGLIT_FAIL; }
void TransformFeedback::resume() { bindInternal(); glResumeTransformFeedback(); }
void TransformFeedback::resume() { glResumeTransformFeedback(); }
void piglit_init(int argc, char **argv) { static const char *varyings[] = {"x"}; GLuint buffers[3]; GLuint vao; GLuint prog; GLuint queries[4]; GLuint xfb[2]; bool pass = true; #ifdef PIGLIT_USE_OPENGL piglit_require_transform_feedback(); piglit_require_GLSL_version(130); piglit_require_extension("GL_ARB_vertex_array_object"); piglit_require_extension("GL_ARB_transform_feedback2"); #endif /* This is all just the boot-strap work for the test. */ glGenTransformFeedbacks(ARRAY_SIZE(xfb), xfb); glGenBuffers(ARRAY_SIZE(buffers), buffers); glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buffers[0]); glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 1024, NULL, GL_STREAM_READ); glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buffers[1]); glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 1024, NULL, GL_STREAM_READ); glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0); glGenVertexArrays(1, &vao); glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, buffers[2]); glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 1 * sizeof(GLfloat), 0); glEnableVertexAttribArray(0); glGenQueries(ARRAY_SIZE(queries), queries); prog = piglit_build_simple_program_unlinked(vstext, fstext); glTransformFeedbackVaryings(prog, 1, varyings, GL_INTERLEAVED_ATTRIBS); glLinkProgram(prog); if (!piglit_link_check_status(prog)) { pass = false; goto done; } glUseProgram(prog); glEnable(GL_RASTERIZER_DISCARD); /* Here's the actual test. */ glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, xfb[0]); glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buffers[0]); glBeginTransformFeedback(GL_POINTS); glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, queries[0]); glDrawArrays(GL_POINTS, 0, 4); glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); glPauseTransformFeedback(); pass = piglit_check_gl_error(GL_NO_ERROR) && pass; glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, xfb[1]); glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buffers[1]); glBeginTransformFeedback(GL_POINTS); pass = piglit_check_gl_error(GL_NO_ERROR) && pass; glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, queries[1]); glDrawArrays(GL_POINTS, 4, 2); glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); glPauseTransformFeedback(); pass = piglit_check_gl_error(GL_NO_ERROR) && pass; glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, xfb[0]); glResumeTransformFeedback(); pass = piglit_check_gl_error(GL_NO_ERROR) && pass; glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, queries[2]); glDrawArrays(GL_POINTS, 6, 4); glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); glEndTransformFeedback(); pass = piglit_check_gl_error(GL_NO_ERROR) && pass; glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, xfb[1]); glResumeTransformFeedback(); pass = piglit_check_gl_error(GL_NO_ERROR) && pass; glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, queries[3]); glDrawArrays(GL_POINTS, 10, 2); glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); glEndTransformFeedback(); pass = piglit_check_gl_error(GL_NO_ERROR) && pass; glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0); glBindVertexArray(0); /* The first XFB should have 8 primitives generated, and the buffer * object should contain the values {1.0, 2.0, 3.0, 4.0, 7.0, 8.0, * 9.0, 10.0}. */ { static const float expected_xfb_data[] = { 1.0, 2.0, 3.0, 4.0, 7.0, 8.0, 9.0, 10.0 }; glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); pass = check_results(1, ARRAY_SIZE(expected_xfb_data), expected_xfb_data, queries[0], queries[2]) && pass; } /* The second XFB should have 4 primitives generated, and the buffer * object should contain the values {5.0, 6.0, 11.0, 12.0}. */ { static const float expected_xfb_data[] = { 5.0, 6.0, 11.0, 12.0 }; glBindBuffer(GL_ARRAY_BUFFER, buffers[1]); pass = check_results(2, ARRAY_SIZE(expected_xfb_data), expected_xfb_data, queries[1], queries[3]) && pass; } glBindBuffer(GL_ARRAY_BUFFER, 0); done: glBindVertexArray(0); glDeleteVertexArrays(1, &vao); glDeleteBuffers(ARRAY_SIZE(buffers), buffers); glDeleteQueries(ARRAY_SIZE(queries), queries); glDeleteTransformFeedbacks(ARRAY_SIZE(xfb), xfb); glUseProgram(0); glDeleteProgram(prog); piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL); }