Ilia Mirkin kindly tested this with nvidia's driver and sadly the patch causes the test to fail for 32x MSAA. At this point I think maybe the best course of action is to abandon this patch and just relax the accuracy requirements for the test. I will post some separate patches for this.
- Neil Neil Roberts <n...@linux.intel.com> writes: > 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 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/piglit