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);
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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);
}