[Piglit] [PATCH 1/2] multisample-accuracy: Add an error margin for lit/unlit pixels

Mark Janes mark.a.janes at intel.com
Fri Jul 20 19:07:37 UTC 2018


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 <neil at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit


More information about the Piglit mailing list