コード例 #1
0
ファイル: TransformFeedback.cpp プロジェクト: ariosx/magnum
void TransformFeedback::attachImplementationDSA(const GLuint index, Buffer& buffer) {
    glTransformFeedbackBufferBase(_id, index, buffer.id());
}
コード例 #2
0
ファイル: TransformFeedback.cpp プロジェクト: ariosx/magnum
/** @todoc const Containers::ArrayReference makes Doxygen grumpy */
void TransformFeedback::attachImplementationDSA(const GLuint firstIndex, std::initializer_list<Buffer*> buffers) {
    for(std::size_t i = 0; i != buffers.size(); ++i)
        glTransformFeedbackBufferBase(_id, firstIndex + i, *(buffers.begin() + i) ? (*(buffers.begin() + i))->id() : 0);
}
コード例 #3
0
enum piglit_result
piglit_display(void)
{
	GLint max_bind_points = 0;
	GLuint q, num_prims;
	bool pass = true, test = true;
	GLfloat *v, *w;
	int i;

	/* init the transform feedback buffers */
	glGenBuffers(3, xfb_buf);
	glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, xfb_buf[2]);
	piglit_check_gl_error(GL_NO_ERROR);

	/* Fetch the number of bind points */
	glGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_BUFFERS, &max_bind_points);
	PIGLIT_SUBTEST_ERROR(GL_NO_ERROR, pass, "fetch maximum number of bind "
			     "points");

	if (piglit_khr_no_error)
		goto valid_calls;

	/* bind a non-existing transform feedback BO */
	glTransformFeedbackBufferBase(1337, 0, 0);
	PIGLIT_SUBTEST_ERROR(GL_INVALID_OPERATION, pass,
			"bind non-existing transform feedback BO");

	/* bind a non-existing output BO */
	glTransformFeedbackBufferBase(0, 0, 1337);
	PIGLIT_SUBTEST_ERROR(GL_INVALID_VALUE, pass, "bind a non-existing "
			     "output BO");

	/* bind to a negative index */
	glTransformFeedbackBufferBase(0, -1, xfb_buf[2]);
	PIGLIT_SUBTEST_ERROR(GL_INVALID_VALUE, pass, "bind negative index");

	/* bind to an index == max */
	glTransformFeedbackBufferBase(0, max_bind_points, xfb_buf[2]);
	PIGLIT_SUBTEST_ERROR(GL_INVALID_VALUE, pass, "bind to index == "
			     "max_bind_points (%i)", max_bind_points);

valid_calls:
	/* Set up the transform feedback buffer */
	for (i = 0; i < 2; i++) {
		glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, xfb_buf[i]);
		glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER,
				 xfb_buf_size, NULL, GL_STREAM_READ);
		glTransformFeedbackBufferBase(0, i, xfb_buf[i]);
		piglit_check_gl_error(GL_NO_ERROR);
	}

	/* Set up the query that checks the # of primitives handled */
	glGenQueries(1, &q);
	glBeginQuery(GL_PRIMITIVES_GENERATED, q);
	piglit_check_gl_error(GL_NO_ERROR);

	/* do the transform feedback */
	glBeginTransformFeedback(GL_POINTS);
	glBindBuffer(GL_ARRAY_BUFFER, input_buf);
	glDrawArrays(GL_POINTS, 0, NUM_INPUTS);
	glEndTransformFeedback();

	glEndQuery(GL_PRIMITIVES_GENERATED);

	/* check the number of primitives */
	glGetQueryObjectuiv(q, GL_QUERY_RESULT, &num_prims);
	glDeleteQueries(1, &q);
	printf("%u primitives generated:\n", num_prims);
	if (num_prims != NUM_INPUTS) {
		printf("Incorrect number of prims generated.\n");
		printf("Found %u, expected %u\n", num_prims, NUM_INPUTS);
		pass = false;
		test = false;
	}

	/* check the result */
	glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, xfb_buf[0]);
	v = glMapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, GL_READ_ONLY);
	piglit_check_gl_error(GL_NO_ERROR);
	glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, xfb_buf[1]);
	w = glMapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, GL_READ_ONLY);
	piglit_check_gl_error(GL_NO_ERROR);

	for (i = 0; i < num_prims; i++) {
		printf("%2d: (%2.0g, %2.0g) : ", i, v[i], w[i]);
		if (!equal(v[i], out1_ret[i]) || !equal(w[i], out2_ret[i])) {
			printf("NOK, expected (%2.0g, %2.0g)\n",
			       out1_ret[i], out2_ret[i]);
			test = false;
		} else
			printf("OK\n");
	}
	PIGLIT_SUBTEST_CONDITION(test, pass, "general test");

	piglit_present_results();

	/* clean-up everything */
	glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, xfb_buf[0]);
	glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
	glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, xfb_buf[1]);
	glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
	glDeleteBuffers(3, xfb_buf);
	glDeleteBuffers(1, &input_buf);
	glDeleteVertexArrays(1, &vao);
	glDeleteProgram(prog);

	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
}