[Piglit] [PATCH] arb_sample_shading: Add gl_SampleMaskIn subtest with msaa disabled, fix test

sroland at vmware.com sroland at vmware.com
Sun Feb 4 23:03:11 UTC 2018


From: Roland Scheidegger <sroland at vmware.com>

The spec says with msaa disabled gl_SampleMaskIn is always 1.
This is not particularly related to arb_sample_shading, but drivers may
do different workarounds depending on the state of sample shading and the
presence of bits in the shader which would force per-sample execution, so it
seems appropriate to test here.
At least r600/eg will fail (the hw will give the coverage mask for the pixel,
not the coverage per sample or 1 if msaa is disabled).
Since the existing partition test could only be passed when giving the wrong
answer for this, I would expect more drivers to fail...

This also fixes the partition test with msaa disabled, as it expected a wrong
gl_SampleMaskIn value in this case (it could easily verify gl_SampleMaskIn is
1 but omit it from there as it's quite likely multiple things are failing in
the test simultaneously and then the failures can't be distinguished - the new
test for this also doesn't require atomics).
---
 .../arb_sample_shading/execution/samplemask.cpp    | 109 ++++++++++++++++++---
 1 file changed, 96 insertions(+), 13 deletions(-)

diff --git a/tests/spec/arb_sample_shading/execution/samplemask.cpp b/tests/spec/arb_sample_shading/execution/samplemask.cpp
index 74baddc11..8ed65ff42 100644
--- a/tests/spec/arb_sample_shading/execution/samplemask.cpp
+++ b/tests/spec/arb_sample_shading/execution/samplemask.cpp
@@ -34,7 +34,11 @@
  * 2. The bits of gl_SampleMaskIn over all fragment shader invocations form a
  *    partition of the set of samples. This subtest requires
  *    ARB_shader_atomic_counters to disambiguate between fragment shader
- *    invocations.
+ *    invocations. (Also verifies sampleID is 0 when msaa is disabled.)
+ * Additionally, there's a test to just verify gl_SampleMaskIn is 1 when 
+ * msaa is disabled (regardless of per-sample frequency shader or sample
+ * shading). (Omitted from test 2 because it's difficult to track down
+ * what's going wrong if drivers fail too many parts of the test.)
  *
  * The sample rate is controlled in one of two ways: Either glMinSampleShading
  * or a fragment shader variant that uses gl_SampleID is used.
@@ -71,21 +75,24 @@ enum rate_mode {
 static int num_samples;
 static int actual_num_samples;
 static bool partition_check_supported;
+static bool mask_in_one_supported;
 static const char *procname;
 static const char *testname;
 static const char *sample_rate;
 static unsigned prog_fix_sample_mask[2];
 static unsigned prog_fix_check;
+static unsigned prog_mask_in_one[2];
 static unsigned prog_partition_write[2];
 static unsigned prog_partition_check;
 static unsigned prog_partition_check_have_sampleid;
+static unsigned prog_partition_check_msaa_disabled;
 static Fbo ms_fbo;
 static Fbo ms_ifbo;
 
 static void
 print_usage_and_exit(const char *prog_name)
 {
-	printf("Usage: %s <num_samples> <rate> {fix|partition|all}\n"
+	printf("Usage: %s <num_samples> <rate> {fix|partition|mask_in_one|all}\n"
 	       "where <rate> is either a floating point MinSampleShading value\n"
 	       "             or 'sample', 'noms', or 'all'\n",
 	       prog_name);
@@ -165,6 +172,16 @@ compile_shaders(void)
 		"  }\n"
 		"}\n";
 
+	static const char frag_mask_in_one[] =
+		"#version 130\n"
+		"#extension GL_ARB_gpu_shader5 : enable\n"
+		"#extension GL_ARB_sample_shading : enable\n"
+		"out vec4 out_color;\n"
+		"void main()\n"
+		"{\n"
+		"  out_color = vec4(float(gl_SampleMaskIn[0]) / 10.0, 0.0, %s, 0.0);\n"
+		"}\n";
+
 	static const char frag_partition_write[] =
 		"#version 140\n"
 		"#extension GL_ARB_gpu_shader5 : enable\n"
@@ -183,16 +200,23 @@ compile_shaders(void)
 		"uniform isampler2DMS tex;\n"
 		"uniform int num_samples;\n"
 		"uniform bool have_sampleid;\n"
+		"uniform bool msaa_disabled;\n"
 		"out vec4 out_color;\n"
 		"void main()\n"
 		"{\n"
 		"  out_color = vec4(0, 1, 0, 1);\n"
 		"  for (int i = 0; i < num_samples; ++i) {\n"
 		"    ivec4 di = texelFetch(tex, ivec2(gl_FragCoord.xy), i);\n"
-		"    if ((di.x & (1 << i)) == 0)\n"
-		"      out_color = vec4(0.1, float(i) / 255, 0, 0);\n"
-		"    if (have_sampleid && di.z != i)\n"
-		"      out_color = vec4(0.2, float(i) / 255, float(di.z) / 255, 0);\n"
+		"    if (msaa_disabled) {\n"
+		"      /* omit di.x == 1 test here, drivers fail multiple parts already... */\n"
+		"      if (di.z != 0)\n"
+		"        out_color = vec4(0.2, float(i) / 255, float(di.z) / 255, 0);\n"
+		"    } else {\n"
+		"      if ((di.x & (1 << i)) == 0)\n"
+		"        out_color = vec4(0.1, float(i) / 255, float(di.x) / 255, 0);\n"
+		"      if (have_sampleid && di.z != i)\n"
+		"        out_color = vec4(0.2, float(i) / 255, float(di.z) / 255, 0);\n"
+		"    };\n"
 		"    for (int j = i + 1; j < num_samples; ++j) {\n"
 		"      ivec2 dj = texelFetch(tex, ivec2(gl_FragCoord.xy), j).xy;\n"
 		"      bool overlap = (di.x & dj.x) != 0;\n"
@@ -212,6 +236,10 @@ compile_shaders(void)
 	glUniform1i(glGetUniformLocation(prog_fix_check, "tex"), 0);
 	glUniform1i(glGetUniformLocation(prog_fix_check, "num_samples"), actual_num_samples);
 
+	if (mask_in_one_supported) {
+		build_program_variants(prog_mask_in_one, vert_fan, frag_mask_in_one);
+	}
+
 	if (partition_check_supported) {
 		build_program_variants(prog_partition_write, vert_fan, frag_partition_write);
 		prog_partition_check = piglit_build_simple_program(vert_passthrough, frag_partition_check);
@@ -221,17 +249,21 @@ compile_shaders(void)
 			    actual_num_samples);
 		prog_partition_check_have_sampleid =
 			glGetUniformLocation(prog_partition_check, "have_sampleid");
+		prog_partition_check_msaa_disabled =
+			glGetUniformLocation(prog_partition_check, "msaa_disabled");
 	}
 }
 
 static void
-draw_fan(enum rate_mode mode, float sample_rate)
+draw_fan(enum rate_mode mode, float sample_rate, bool msaa_force_disable)
 {
+	if (mode == rate_mode_sampleid_noms || msaa_force_disable) {
+		glDisable(GL_MULTISAMPLE);
+	}
 	if (mode == rate_mode_sampleshading) {
 		glEnable(GL_SAMPLE_SHADING);
 		glMinSampleShading(sample_rate);
-	} else if (mode == rate_mode_sampleid_noms)
-		glDisable(GL_MULTISAMPLE);
+	}
 	glDrawArrays(GL_TRIANGLE_FAN, 0, 2 + 4 * VERTICES_PER_EDGE);
 	glDisable(GL_SAMPLE_SHADING);
 	glEnable(GL_MULTISAMPLE);
@@ -251,7 +283,49 @@ test_fix(enum rate_mode mode, float sample_rate)
 	glEnable(GL_BLEND);
 	glBlendFunc(GL_ONE, GL_ONE);
 
-	draw_fan(mode, sample_rate);
+	draw_fan(mode, sample_rate, false);
+
+	glDisable(GL_BLEND);
+
+	/* 2. Use the check shader to check correctness. */
+	glBindFramebuffer(GL_DRAW_FRAMEBUFFER, piglit_winsys_fbo);
+	glClear(GL_COLOR_BUFFER_BIT);
+
+	glUseProgram(prog_fix_check);
+	glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, ms_fbo.color_tex[0]);
+
+	piglit_draw_rect(-1, -1, 2, 2);
+
+	static const float expected[4] = { 0, 1, 0, 1 };
+	if (!piglit_probe_rect_rgba(0, 0, WINDOW_SIZE, WINDOW_SIZE, expected))
+		return PIGLIT_FAIL;
+
+	if (!piglit_check_gl_error(GL_NO_ERROR))
+		piglit_report_result(PIGLIT_FAIL);
+
+	return PIGLIT_PASS;
+}
+
+static enum piglit_result
+test_mask_in_one(enum rate_mode mode, float sample_rate)
+{
+	glClearColor(0.0, 0.0, 0.0, 0.0);
+
+	/* 1. Draw everything outputting gl_SampleMaskIn, with msaa disabled; */
+	glBindFramebuffer(GL_DRAW_FRAMEBUFFER, ms_fbo.handle);
+	glClear(GL_COLOR_BUFFER_BIT);
+
+	/*
+	 * We'll abuse the sampleid_noms mode here and use the prog without
+	 * sample id to so we still have 3 somewhat meaningful modes - of
+	 * course with msaa always disabled it should always be the same.
+	 */
+	glUseProgram(prog_mask_in_one[mode == rate_mode_sampleid]);
+
+	glEnable(GL_BLEND);
+	glBlendFunc(GL_ONE, GL_ONE);
+
+	draw_fan(mode, sample_rate, true);
 
 	glDisable(GL_BLEND);
 
@@ -284,7 +358,7 @@ test_partition(enum rate_mode mode, float sample_rate)
 
 	glUseProgram(prog_partition_write[mode != rate_mode_sampleshading]);
 
-	draw_fan(mode, sample_rate);
+	draw_fan(mode, sample_rate, false);
 
 	glBindFramebuffer(GL_DRAW_FRAMEBUFFER, piglit_winsys_fbo);
 	glClearColor(0.0, 0.0, 0.0, 0.0);
@@ -292,6 +366,7 @@ test_partition(enum rate_mode mode, float sample_rate)
 
 	glUseProgram(prog_partition_check);
 	glUniform1i(prog_partition_check_have_sampleid, mode == rate_mode_sampleid);
+	glUniform1i(prog_partition_check_msaa_disabled, mode == rate_mode_sampleid_noms);
 	glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, ms_ifbo.color_tex[0]);
 
 	piglit_draw_rect(-1, -1, 2, 2);
@@ -364,12 +439,17 @@ piglit_display()
 
 	if (all || !strcmp(testname, "fix")) {
 		run = true;
-		pass = iterate_sample_rates(testname, test_fix) && pass;
+		pass = iterate_sample_rates("fix", test_fix) && pass;
+	}
+
+	if (all || !strcmp(testname, "mask_in_one")) {
+		run = true;
+		pass = iterate_sample_rates("mask_in_one", test_mask_in_one) && pass;
 	}
 
 	if (all || !strcmp(testname, "partition")) {
 		run = true;
-		pass = iterate_sample_rates(testname, test_partition) && pass;
+		pass = iterate_sample_rates("partition", test_partition) && pass;
 	}
 
 	if (!run)
@@ -408,6 +488,9 @@ piglit_init(int argc, char **argv)
 		piglit_is_extension_supported("GL_ARB_gpu_shader5") &&
 		piglit_is_extension_supported("GL_ARB_shader_atomic_counters");
 
+	mask_in_one_supported =
+		piglit_is_extension_supported("GL_ARB_gpu_shader5");
+
 	/* Skip the test if num_samples > GL_MAX_SAMPLES */
 	GLint max_samples;
 	glGetIntegerv(GL_MAX_SAMPLES, &max_samples);
-- 
2.12.3



More information about the Piglit mailing list