/** @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); } }
void TransformFeedback::attachImplementationDSA(const GLuint index, Buffer& buffer, const GLintptr offset, const GLsizeiptr size) { glTransformFeedbackBufferRange(_id, index, buffer.id(), offset, size); }
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"); }