[Piglit] [PATCH] arb_fb_no_attach: check that multi-sampling produces the right samples

Ilia Mirkin imirkin at alum.mit.edu
Tue Feb 2 22:53:20 CET 2016


Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
---
 tests/spec/arb_framebuffer_no_attachments/query.c | 44 +++++++++++++++++++++--
 1 file changed, 41 insertions(+), 3 deletions(-)

diff --git a/tests/spec/arb_framebuffer_no_attachments/query.c b/tests/spec/arb_framebuffer_no_attachments/query.c
index e1d921c..36a4b59 100644
--- a/tests/spec/arb_framebuffer_no_attachments/query.c
+++ b/tests/spec/arb_framebuffer_no_attachments/query.c
@@ -79,7 +79,9 @@ void
 piglit_init(int argc, char **argv)
 {
 	GLuint buffer, fbo, vao;
-	GLint prog;
+	GLint prog, max_samples;
+	int i;
+	unsigned samples[16];
 	bool pass = true;
 
 	piglit_require_gl_version(31);
@@ -165,8 +167,44 @@ piglit_init(int argc, char **argv)
 	piglit_draw_rect(-1, -1, 2, 2);
 	glEndQuery(GL_SAMPLES_PASSED);
 
-	pass &= compare_counter((piglit_width / 2) * (piglit_height / 2),
-				"fb resize");
+	piglit_width /= 2;
+	piglit_height /= 2;
+	pass &= compare_counter(piglit_width * piglit_height, "fb resize");
+
+	/* Go through and check that the number of samples passed
+	 * matches the requested sample count. The implementation may
+	 * silently upgrade the number of samples to some hw-supported
+	 * value, and there's no way to query it until GL 4.5, so we
+	 * just get the values for all the valid sample values, and
+	 * mark the test as skip if the "current" amount is the same
+	 * as the next one. This should account for any non-crazy MS
+	 * level upgrade schemes.
+	 */
+	glGetIntegerv(GL_MAX_FRAMEBUFFER_SAMPLES, &max_samples);
+	max_samples = MIN2(32, max_samples);
+	for (i = 2; i <= max_samples; i += 2) {
+		glFramebufferParameteri(GL_FRAMEBUFFER,
+					GL_FRAMEBUFFER_DEFAULT_SAMPLES, i);
+
+		glBeginQuery(GL_SAMPLES_PASSED, query);
+		piglit_draw_rect(-1, -1, 2, 2);
+		glEndQuery(GL_SAMPLES_PASSED);
+
+		glGetQueryObjectuiv(query, GL_QUERY_RESULT, &samples[i / 2 - 1]);
+	}
+
+	for (i = 2; i <= max_samples; i += 2) {
+		if (i < max_samples && samples[i / 2 - 1] == samples[i / 2]) {
+			piglit_report_subtest_result(PIGLIT_SKIP, "MS%d", i);
+			continue;
+		}
+		if (samples[i / 2 - 1] != i * piglit_width * piglit_height) {
+			piglit_report_subtest_result(PIGLIT_FAIL, "MS%d", i);
+			pass = false;
+		} else {
+			piglit_report_subtest_result(PIGLIT_PASS, "MS%d", i);
+		}
+	}
 
 	glDeleteFramebuffers(1, &fbo);
 	glDeleteVertexArrays(1, &vao);
-- 
2.4.10



More information about the Piglit mailing list