[Mesa-dev] [PATCH 5/8] i965/msaa: Adjust 3DSTATE_MULTISAMPLE packet for 8x MSAA.

Paul Berry stereotype441 at gmail.com
Wed Jul 18 09:21:03 PDT 2012


---
 src/mesa/drivers/dri/i965/gen6_multisample_state.c |   70 ++++++++++++++++++--
 1 files changed, 64 insertions(+), 6 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/gen6_multisample_state.c b/src/mesa/drivers/dri/i965/gen6_multisample_state.c
index 336e7c5..b8201a6 100644
--- a/src/mesa/drivers/dri/i965/gen6_multisample_state.c
+++ b/src/mesa/drivers/dri/i965/gen6_multisample_state.c
@@ -36,17 +36,75 @@ gen6_emit_3dstate_multisample(struct brw_context *brw,
 {
    struct intel_context *intel = &brw->intel;
 
-   /* TODO: 8x MSAA not implemented */
-   assert(num_samples <= 4);
+   uint32_t number_of_multisamples = 0;
+   uint32_t sample_positions_3210 = 0;
+   uint32_t sample_positions_7654 = 0;
+
+   switch (num_samples) {
+   case 0:
+      number_of_multisamples = MS_NUMSAMPLES_1;
+      break;
+   case 4:
+      number_of_multisamples = MS_NUMSAMPLES_4;
+      /* Sample positions:
+       *   2 6 a e
+       * 2   0
+       * 6       1
+       * a 2
+       * e     3
+       */
+      sample_positions_3210 = 0xae2ae662;
+      break;
+   case 8:
+      number_of_multisamples = MS_NUMSAMPLES_8;
+      /* Sample positions are based on a solution to the "8 queens" puzzle.
+       * Rationale: in a solution to the 8 queens puzzle, no two queens share
+       * a row, column, or diagonal.  This is a desirable property for samples
+       * in a multisampling pattern, because it ensures that the samples are
+       * relatively uniformly distributed through the pixel.
+       *
+       * There are several solutions to the 8 queens puzzle (see
+       * http://en.wikipedia.org/wiki/Eight_queens_puzzle).  This solution was
+       * chosen because it has a queen close to the center; this should
+       * improve the accuracy of centroid interpolation, since the hardware
+       * implements centroid interpolation by choosing the centermost sample
+       * that overlaps with the primitive being drawn.
+       *
+       * Note: from the Ivy Bridge PRM, Vol2 Part1 p304 (3DSTATE_MULTISAMPLE:
+       * Programming Notes):
+       *
+       *     "When programming the sample offsets (for NUMSAMPLES_4 or _8 and
+       *     MSRASTMODE_xxx_PATTERN), the order of the samples 0 to 3 (or 7
+       *     for 8X) must have monotonically increasing distance from the
+       *     pixel center. This is required to get the correct centroid
+       *     computation in the device."
+       *
+       * Sample positions:
+       *   1 3 5 7 9 b d f
+       * 1     5
+       * 3           2
+       * 5               6
+       * 7 4
+       * 9       0
+       * b             3
+       * d         1
+       * f   7
+       */
+      sample_positions_3210 = 0xdbb39d79;
+      sample_positions_7654 = 0x3ff55117;
+      break;
+   default:
+      assert(!"Unrecognized num_samples in gen6_emit_3dstate_multisample");
+      break;
+   }
 
    int len = intel->gen >= 7 ? 4 : 3;
    BEGIN_BATCH(len);
    OUT_BATCH(_3DSTATE_MULTISAMPLE << 16 | (len - 2));
-   OUT_BATCH(MS_PIXEL_LOCATION_CENTER |
-             (num_samples > 0 ? MS_NUMSAMPLES_4 : MS_NUMSAMPLES_1));
-   OUT_BATCH(num_samples > 0 ? 0xae2ae662 : 0); /* positions for 4/8-sample */
+   OUT_BATCH(MS_PIXEL_LOCATION_CENTER | number_of_multisamples);
+   OUT_BATCH(sample_positions_3210);
    if (intel->gen >= 7)
-      OUT_BATCH(0);
+      OUT_BATCH(sample_positions_7654);
    ADVANCE_BATCH();
 }
 
-- 
1.7.7.6



More information about the mesa-dev mailing list