void piglit_init(int argc, char **argv) { bool pass = true; bool active_res = true; bool max_active = true; bool buff_bind[2] = { true, true }; bool num_active[2] = { false, false }; bool varying_idx[2] = { false, false }; GLuint prog; piglit_require_GLSL_version(150); piglit_require_extension("GL_ARB_transform_feedback3"); piglit_require_extension("GL_ARB_enhanced_layouts"); prog = build_and_use_program(vs_two_buff_text); GLint value; GLint values[5]; glGetProgramInterfaceiv(prog, GL_TRANSFORM_FEEDBACK_BUFFER, GL_ACTIVE_RESOURCES, &value); if (value != 2) { printf("Expected 2 ACTIVE_RESOURCES found %d\n", value); active_res = false; } piglit_report_subtest_result(active_res ? PIGLIT_PASS : PIGLIT_FAIL, "Query ACTIVE_RESOURCES"); glGetProgramInterfaceiv(prog, GL_TRANSFORM_FEEDBACK_BUFFER, GL_MAX_NUM_ACTIVE_VARIABLES, &value); if (value != 3) { printf("Expected MAX_NUM_ACTIVE_VARIABLES to be 3 found %d\n", value); max_active = false; } piglit_report_subtest_result(active_res ? PIGLIT_PASS : PIGLIT_FAIL, "Query MAX_NUM_ACTIVE_VARIABLES"); GLenum props[] = {GL_BUFFER_BINDING, GL_NUM_ACTIVE_VARIABLES, GL_ACTIVE_VARIABLES}; for (unsigned i = 0; i < 2; i++) { glGetProgramResourceiv(prog, GL_TRANSFORM_FEEDBACK_BUFFER, i, 3, props, 5, NULL, values); if (values[0] != 1 && values[0] != 3) buff_bind[i] = false; if (values[0] == 1) { if(values[1] == 3) { num_active[i] = true; } else { printf("Expected 3 NUM_ACTIVE_VARIABLES " "found %d\n", values[1]); } varying_idx[i] = check_varyings_match(prog, &values[2], 3, 0); } else if (values[0] == 3) { if (values[1] == 2) { num_active[i] = true; } else { printf("Expected 2 NUM_ACTIVE_VARIABLES " "found %d\n", values[1]); } varying_idx[i] = check_varyings_match(prog, &values[2], 2, 1); } } piglit_report_subtest_result(buff_bind[0] && buff_bind[1] ? PIGLIT_PASS : PIGLIT_FAIL, "Query BUFFER_BINDING"); piglit_report_subtest_result(num_active[0] && num_active[1] ? PIGLIT_PASS : PIGLIT_FAIL, "Query NUM_ACTIVE_VARIABLES"); piglit_report_subtest_result(varying_idx[0] && varying_idx[1] ? PIGLIT_PASS : PIGLIT_FAIL, "Query ACTIVE_VARIABLES"); if (!piglit_check_gl_error(GL_NO_ERROR)) piglit_report_result(PIGLIT_FAIL); pass = active_res && max_active && buff_bind[0] && buff_bind[1] && num_active[0] && num_active[1] && varying_idx[0] && varying_idx[1]; piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL); }
void piglit_init(int argc, char **argv) { bool pass; unsigned primitive_n; GLint gs_invocation_n; GLuint queries[2*STREAMS]; GLuint xfb[STREAMS]; GLuint vao; unsigned i; piglit_require_extension("GL_ARB_gpu_shader5"); piglit_require_extension("GL_ARB_transform_feedback3"); glGetIntegerv(GL_MAX_GEOMETRY_SHADER_INVOCATIONS, &gs_invocation_n); if (!piglit_check_gl_error(GL_NO_ERROR)) piglit_report_result(PIGLIT_FAIL); if (gs_invocation_n <= 0) { printf("Maximum amount of geometry shader invocations " "needs to be positive (%u).\n", gs_invocation_n); piglit_report_result(PIGLIT_FAIL); } primitive_n = gs_invocation_n; build_and_use_program(gs_invocation_n); /* Set up the transform feedback buffers. */ glGenBuffers(ARRAY_SIZE(xfb), xfb); for (i = 0; i < ARRAY_SIZE(xfb); i++) { unsigned float_n = primitive_n * stream_float_counts[i]; glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, i, xfb[i]); glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, float_n * sizeof(float), NULL, GL_STREAM_READ); } /* Test only records using transform feedback. */ glEnable(GL_RASTERIZER_DISCARD); if (!piglit_check_gl_error(GL_NO_ERROR)) piglit_report_result(PIGLIT_FAIL); glGenQueries(ARRAY_SIZE(queries), queries); for (i = 0; i < STREAMS; i++) { glBeginQueryIndexed(GL_PRIMITIVES_GENERATED, i, queries[i]); glBeginQueryIndexed(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, i, queries[STREAMS + i]); } glGenVertexArrays(1, &vao); glBindVertexArray(vao); /* Draw and record */ glBeginTransformFeedback(GL_POINTS); glDrawArrays(GL_POINTS, 0, 1); for (i = 0; i < STREAMS; i++) { glEndQueryIndexed(GL_PRIMITIVES_GENERATED, i); glEndQueryIndexed(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, i); } glEndTransformFeedback(); glDeleteVertexArrays(1, &vao); if (!piglit_check_gl_error(GL_NO_ERROR)) piglit_report_result(PIGLIT_FAIL); pass = probe_buffers(xfb, queries, primitive_n); glDeleteBuffers(ARRAY_SIZE(xfb), xfb); glDeleteQueries(ARRAY_SIZE(queries), queries); piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL); }
void piglit_init(int argc, char **argv) { bool pass; unsigned primitive_n, gs_invocation_n; GLuint queries[2]; GLuint xfb[2]; GLuint vao; piglit_require_GLSL_version(150); piglit_require_extension("GL_ARB_transform_feedback3"); gs_invocation_n = parse_args(argc, argv); /* Zero invocations means the feedback is produced by vertex shader */ primitive_n = gs_invocation_n ? gs_invocation_n : 1; build_and_use_program(gs_invocation_n); /* Set up the transform feedback buffers. */ glGenBuffers(ARRAY_SIZE(xfb), xfb); glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, xfb[0]); glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, primitive_n * BUF_1_FLOAT_N * sizeof(float), NULL, GL_STREAM_READ); glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 1, xfb[1]); glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, primitive_n * BUF_2_FLOAT_N * sizeof(float), NULL, GL_STREAM_READ); /* Test only records using transform feedback. */ glEnable(GL_RASTERIZER_DISCARD); if (!piglit_check_gl_error(GL_NO_ERROR)) piglit_report_result(PIGLIT_FAIL); glGenQueries(2, queries); glBeginQuery(GL_PRIMITIVES_GENERATED, queries[0]); glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, queries[1]); /* Test is run under desktop OpenGL 3.2 -> use of VAOs is required */ glGenVertexArrays(1, &vao); glBindVertexArray(vao); /* Draw and record */ glBeginTransformFeedback(GL_POINTS); glDrawArrays(GL_POINTS, 0, 1); glEndQuery(GL_PRIMITIVES_GENERATED); glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); glEndTransformFeedback(); glDeleteVertexArrays(1, &vao); if (!piglit_check_gl_error(GL_NO_ERROR)) piglit_report_result(PIGLIT_FAIL); pass = probe_buffers(xfb, queries, primitive_n); glDeleteBuffers(2, xfb); glDeleteQueries(2, queries); piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL); }