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;
}
Example #2
0
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);
}