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