i965/msaa: Adjust 3DSTATE_MULTISAMPLE packet for 8x MSAA.
authorPaul Berry <stereotype441@gmail.com>
Wed, 18 Jul 2012 04:06:01 +0000 (21:06 -0700)
committerPaul Berry <stereotype441@gmail.com>
Tue, 24 Jul 2012 21:52:58 +0000 (14:52 -0700)
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/gen6_multisample_state.c

index 336e7c508a528ad03a414f8fb7b18ee18e593a13..b8201a6767b63b3452a5c92cd82c37563d5ce5bd 100644 (file)
@@ -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();
 }