[Piglit] [PATCH] multisample-accuracy: Shift the reference image by 1/32th of a pixel
Neil Roberts
neil at linux.intel.com
Thu Oct 22 09:13:10 PDT 2015
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
More information about the Piglit
mailing list