Hi Neil, We still get intermittent failures with this threshold, and have historically disabled the multisample accuracy tests in CI.
Can we relax the threshold a bit more? -Mark Neil Roberts <n...@linux.intel.com> writes: > The unlit and totally_lit stats are supposed to count the pixels where > either a primitive completely covers the pixel or no primitive touches > it at all. However this is effectively only determined by checking > whether any primitive has intersected one of the supersample positions > of the reference image. It's completely possible for a primitive to > intersect the pixel boundary but completely miss any of the > supersample positions. The GL implementation is free to pick whatever > multisample positions it wants within the pixel boundary so it's also > possible for a primitive to intersect a multisample position but miss > all of the supersample positions of the reference image. To cope with > this this patch now allows a small margin of error for the pixels that > are either fully lit or fully unlit. > > This was causing the test to give false negatives for i965 with the > 16x MSAA positions because in that case it chooses positions that are > exactly on the pixel boundary and these would be outside of the grid > of positions chosen by the supersampling in the reference image. The > positions used are actually those described by the D3D API so it is > possible that other hardware would have the same problem. > --- > tests/spec/ext_framebuffer_multisample/common.cpp | 43 > +++++++++++++++++------ > 1 file changed, 33 insertions(+), 10 deletions(-) > > diff --git a/tests/spec/ext_framebuffer_multisample/common.cpp > b/tests/spec/ext_framebuffer_multisample/common.cpp > index d7be84f..fb42cc5 100644 > --- a/tests/spec/ext_framebuffer_multisample/common.cpp > +++ b/tests/spec/ext_framebuffer_multisample/common.cpp > @@ -530,15 +530,6 @@ Test::measure_accuracy() > } > } > > - printf("Pixels that should be unlit\n"); > - unlit_stats.summarize(); > - pass = unlit_stats.is_perfect() && pass; > - printf("Pixels that should be totally lit\n"); > - totally_lit_stats.summarize(); > - pass = totally_lit_stats.is_perfect() && pass; > - printf("Pixels that should be partially lit\n"); > - partially_lit_stats.summarize(); > - > double error_threshold; > if (test_resolve) { > /* For depth and stencil resolves, the implementation > @@ -558,7 +549,39 @@ Test::measure_accuracy() > error_threshold = 0.333 * > pow(0.6, log((double)effective_num_samples) / log(2.0)); > } > - printf("The error threshold for this test is %f\n", error_threshold); > + > + /* The unlit and totally_lit stats are supposed to count the > + * pixels where either a primitive completely covers the pixel > + * or no primitive touches it at all. However this is > + * effectively only determined by checking whether any > + * primitive has intersected one of the supersample positions > + * of the reference image. It's completely possible for a > + * primitive to intersect the pixel boundary but completely > + * miss any of the supersample positions. The GL > + * implementation is free to pick whatever multisample > + * positions it wants within the pixel boundary so it's also > + * possible for a primitive to intersect a multisample > + * position but miss all of the supersample positions of the > + * reference image. To cope with this we allow a small margin > + * of error for the pixels that are either fully lit or fully > + * unlit. > + */ > + double full_pixel_threshold = error_threshold * 0.05f; > + > + printf("Pixels that should be unlit\n"); > + unlit_stats.summarize(); > + pass = unlit_stats.is_better_than(full_pixel_threshold) && pass; > + printf("Pixels that should be totally lit\n"); > + totally_lit_stats.summarize(); > + pass = totally_lit_stats.is_better_than(full_pixel_threshold) && pass; > + printf("The error threshold for unlit and totally lit " > + "pixels test is %f\n", > + full_pixel_threshold); > + printf("Pixels that should be partially lit\n"); > + partially_lit_stats.summarize(); > + > + printf("The error threshold for partially lit pixels is %f\n", > + error_threshold); > pass = partially_lit_stats.is_better_than(error_threshold) && pass; > // TODO: deal with sRGB. > return pass; > -- > 1.9.3 > > _______________________________________________ > Piglit mailing list > Piglit@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/piglit _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit