This fixes false negatives for hardware using the sampling positions described by D3D on 16x MSAA. Please see the comment explaining the issue. --- tests/spec/ext_framebuffer_multisample/common.cpp | 37 ++++++++++++++++++++--- tests/spec/ext_framebuffer_multisample/common.h | 3 +- 2 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/tests/spec/ext_framebuffer_multisample/common.cpp b/tests/spec/ext_framebuffer_multisample/common.cpp index d7be84f..944e45d 100644 --- a/tests/spec/ext_framebuffer_multisample/common.cpp +++ b/tests/spec/ext_framebuffer_multisample/common.cpp @@ -371,7 +371,7 @@ Test::show(Fbo *src_fbo, int x_offset, int y_offset) * full FBO. */ void -Test::draw_pattern(int x_offset, int y_offset, int width, int height) +Test::draw_pattern(float x_offset, float y_offset, int width, int height) { /* Need a projection matrix such that: * xc = ((xe + 1) * pattern_width/2 - x_offset) * 2/width - 1 @@ -449,6 +449,33 @@ Test::draw_to_default_framebuffer() /** * Draw the entire test image, rendering it a piece at a time. + * + * The reference image is created as if it was super-sampled using an + * evenly spaced grid of supersample_factor*supersample_factor + * positions. Normally the sampling positions would effectively be in + * the center of each of the squares of this grid. However, the + * sampling positions used by most hardware is programmable in + * multiples of 1/16th of a pixel ranging from 0.0 to 0.9375 because + * that how it is described in D3D. That means it is possible to have + * a sampling position that is exactly on the left or top border of a + * pixel. If we let the sampling position be in the center of the grid + * then when supersample_factor is 16 there will be positions from + * 0.03125 to 0.96875. It is therefore possible that the sampling + * positions chosen by the hardware will be outside of the area of the + * chosen sampling positions for the reference image. That means it's + * possible for the reference image to report that a pixel is wholly + * unlit whereas the hardware legitimately lights up one of its samples. + * To fix this the reference image is shifted by half of the size of a + * square in this grid so that it is as if the sampling positions are + * at the bottom left corners of the squares. That way if the hardware + * is following the D3D model for the sampling positions then any + * possible position that can be programmed will coincide with one of + * the positions in the supersampled reference image. If this is not + * done then the test will report false negatives for hardware using + * the sampling positions recommended by D3D for 16x MSAA. There is a + * diagram explaining this problem here: + * + * http://busydoingnothing.co.uk/accuracy-test-is-broken/ */ void Test::draw_reference_image() @@ -464,9 +491,11 @@ Test::draw_reference_image() glBindFramebuffer(GL_DRAW_FRAMEBUFFER, supersample_fbo.handle); supersample_fbo.set_viewport(); - int x_offset = h * downsampled_width; - int y_offset = v * downsampled_height; - draw_pattern(x_offset, y_offset, + float sample_shift = 0.5f / supersample_factor; + float x_offset = h * downsampled_width; + float y_offset = v * downsampled_height; + draw_pattern(x_offset - sample_shift, + y_offset - sample_shift, downsampled_width, downsampled_height); if (manifest_program) diff --git a/tests/spec/ext_framebuffer_multisample/common.h b/tests/spec/ext_framebuffer_multisample/common.h index 948a1d4..c0452f4 100644 --- a/tests/spec/ext_framebuffer_multisample/common.h +++ b/tests/spec/ext_framebuffer_multisample/common.h @@ -117,7 +117,8 @@ private: void resolve(piglit_util_fbo::Fbo *fbo, GLbitfield which_buffers); void downsample_color(int downsampled_width, int downsampled_height); void show(piglit_util_fbo::Fbo *src_fbo, int x_offset, int y_offset); - void draw_pattern(int x_offset, int y_offset, int width, int height); + void draw_pattern(float x_offset, float y_offset, + int width, int height); /** The test pattern to draw. */ piglit_util_test_pattern::TestPattern *pattern; -- 1.9.3 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/piglit