예제 #1
0
/** @todoc const Containers::ArrayReference makes Doxygen grumpy */
void TransformFeedback::attachImplementationDSA(const GLuint firstIndex, std::initializer_list<std::tuple<Buffer*, GLintptr, GLsizeiptr>> buffers) {
    for(std::size_t i = 0; i != buffers.size(); ++i) {
        Buffer* buffer;
        GLintptr offset;
        GLsizeiptr size;
        std::tie(buffer, offset, size) = *(buffers.begin() + i);

        glTransformFeedbackBufferRange(_id, firstIndex + i, buffer ? buffer->id() : 0, offset, size);
    }
}
예제 #2
0
void TransformFeedback::attachImplementationDSA(const GLuint index, Buffer& buffer, const GLintptr offset, const GLsizeiptr size) {
    glTransformFeedbackBufferRange(_id, index, buffer.id(), offset, size);
}
예제 #3
0
void
piglit_init(int argc, char **argv)
{
	static const char *varyings[] = { "valOut1", "valOut2" };
	GLuint size, start;
	GLint inAttrib;
	int i;

	/* Check the driver. */
	piglit_require_extension("GL_ARB_transform_feedback3");
	piglit_require_extension("GL_ARB_direct_state_access");

	/* Create shaders. */
	prog = piglit_build_simple_program_unlinked(vstext, NULL);
	glTransformFeedbackVaryings(prog, 2, varyings,
					GL_SEPARATE_ATTRIBS);
	glLinkProgram(prog);
	if (!piglit_link_check_status(prog)) {
		glDeleteProgram(prog);
		piglit_report_result(PIGLIT_FAIL);
	}
	glUseProgram(prog);

	/* Set up the Vertex Array Buffer */
	glEnable(GL_VERTEX_ARRAY);
	glGenVertexArrays(1, &vao);
	glBindVertexArray(vao);

	/* Set up the input data buffer */
	glGenBuffers(1, &input_buf);
	glBindBuffer(GL_ARRAY_BUFFER, input_buf);
	glBufferData(GL_ARRAY_BUFFER, sizeof(inputs), inputs, GL_STATIC_DRAW);
	inAttrib = glGetAttribLocation(prog, "valIn");
	piglit_check_gl_error(GL_NO_ERROR);
	glVertexAttribPointer(inAttrib, 1, GL_FLOAT, GL_FALSE, 0, 0);
	glEnableVertexAttribArray(inAttrib);

	/* set the initial state */
	ctx.active = false;
	ctx.paused = false;
	for (i = 0; i < 3; i++) {
		ctx.bo_state[i].binding = 0;
		ctx.bo_state[i].start = 0;
		ctx.bo_state[i].size = 0;
	}
	check_active_paused_state("initial state");
	check_binding_state("initial state");

	/* Set up the transform feedback buffer */
	glGenBuffers(3, xfb_buf);
	for (i = 0; i < 2; i++) {
		start = rand() & 0xFC;
		size = 0x100 + (rand() & 0xFFC);

		glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, xfb_buf[i]);
		piglit_check_gl_error(GL_NO_ERROR);
		glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER,
				 size, NULL, GL_STREAM_READ);
		piglit_check_gl_error(GL_NO_ERROR);
		glTransformFeedbackBufferRange(0, i, xfb_buf[i], start, size);
		piglit_check_gl_error(GL_NO_ERROR);

		ctx.bo_state[i].binding = xfb_buf[i];
		ctx.bo_state[i].start = start;
		ctx.bo_state[i].size = size;
	}

	check_binding_state("post-binding state");
}