diff options
Diffstat (limited to 'src')
-rw-r--r-- | 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 336e7c508a5..b8201a6767b 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(); } |