On 02/04/2018 04:03 PM, srol...@vmware.com wrote:
From: Roland Scheidegger <srol...@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 <bri...@vmware.com>
_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to