[Piglit] [PATCH] arb_sample_shading: Add gl_SampleMaskIn subtest with msaa disabled, fix test
Brian Paul
brianp at vmware.com
Mon Feb 5 16:12:30 UTC 2018
On 02/04/2018 04:03 PM, sroland at vmware.com wrote:
> 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).
Can you line-wrap the comments to be a bit shorter?
> ---
> .../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);
>
Looks OK to me, though I didn't closely study this.
I ran the GL_ARB_sample_shading tests on my NVIDIA card before/after
your patch. Of the new mask_in_one test cases, 24 passed while 48
failed. I haven't investigated. Is that a concern?
Reviewed-by: Brian Paul <brianp at vmware.com>
More information about the Piglit
mailing list