X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fgen6_multisample_state.c;h=8444c0c9bae581f5da54a6a94cbc94ea171ebe26;hb=627c15cde46a76e9bce4425646c5caba11788ec4;hp=fd3dd0e53637bb221c0a2992d59922703b679e77;hpb=16f7510ad30070b7bd4eff494f7937f6ee257547;p=mesa.git diff --git a/src/mesa/drivers/dri/i965/gen6_multisample_state.c b/src/mesa/drivers/dri/i965/gen6_multisample_state.c index fd3dd0e5363..8444c0c9bae 100644 --- a/src/mesa/drivers/dri/i965/gen6_multisample_state.c +++ b/src/mesa/drivers/dri/i965/gen6_multisample_state.c @@ -26,6 +26,7 @@ #include "brw_context.h" #include "brw_defines.h" #include "brw_multisample_state.h" +#include "main/framebuffer.h" void gen6_get_sample_position(struct gl_context *ctx, @@ -34,19 +35,21 @@ gen6_get_sample_position(struct gl_context *ctx, { uint8_t bits; - switch (fb->Visual.samples) { + switch (_mesa_geometric_samples(fb)) { case 1: result[0] = result[1] = 0.5f; return; + case 2: + bits = brw_multisample_positions_1x_2x >> (8 * index); + break; case 4: - bits = brw_multisample_positions_4x[0] >> (8 * index); + bits = brw_multisample_positions_4x >> (8 * index); break; case 8: bits = brw_multisample_positions_8x[index >> 2] >> (8 * (index & 3)); break; default: - assert(!"Not implemented"); - return; + unreachable("Not implemented"); } /* Convert from U0.4 back to a floating point coordinate. */ @@ -54,6 +57,51 @@ gen6_get_sample_position(struct gl_context *ctx, result[1] = (bits & 0xf) / 16.0f; } +/** + * Sample index layout shows the numbering of slots in a rectangular + * grid of samples with in a pixel. Sample number layout shows the + * rectangular grid of samples roughly corresponding to the real sample + * locations with in a pixel. Sample number layout matches the sample + * index layout in case of 2X and 4x MSAA, but they are different in + * case of 8X MSAA. + * + * 2X MSAA sample index / number layout + * --------- + * | 0 | 1 | + * --------- + * + * 4X MSAA sample index / number layout + * --------- + * | 0 | 1 | + * --------- + * | 2 | 3 | + * --------- + * + * 8X MSAA sample index layout 8x MSAA sample number layout + * --------- --------- + * | 0 | 1 | | 5 | 2 | + * --------- --------- + * | 2 | 3 | | 4 | 6 | + * --------- --------- + * | 4 | 5 | | 0 | 3 | + * --------- --------- + * | 6 | 7 | | 7 | 1 | + * --------- --------- + * + * A sample map is used to map sample indices to sample numbers. + */ +void +gen6_set_sample_maps(struct gl_context *ctx) +{ + uint8_t map_2x[2] = {0, 1}; + uint8_t map_4x[4] = {0, 1, 2, 3}; + uint8_t map_8x[8] = {5, 2, 4, 6, 0, 3, 7, 1}; + + memcpy(ctx->Const.SampleMap2x, map_2x, sizeof(map_2x)); + memcpy(ctx->Const.SampleMap4x, map_4x, sizeof(map_4x)); + memcpy(ctx->Const.SampleMap8x, map_8x, sizeof(map_8x)); +} + /** * 3DSTATE_MULTISAMPLE */ @@ -74,7 +122,7 @@ gen6_emit_3dstate_multisample(struct brw_context *brw, break; case 4: number_of_multisamples = MS_NUMSAMPLES_4; - sample_positions_3210 = brw_multisample_positions_4x[0]; + sample_positions_3210 = brw_multisample_positions_4x; break; case 8: number_of_multisamples = MS_NUMSAMPLES_8; @@ -82,13 +130,9 @@ gen6_emit_3dstate_multisample(struct brw_context *brw, sample_positions_7654 = brw_multisample_positions_8x[1]; break; default: - assert(!"Unrecognized num_samples in gen6_emit_3dstate_multisample"); - break; + unreachable("Unrecognized num_samples in gen6_emit_3dstate_multisample"); } - /* 3DSTATE_MULTISAMPLE is nonpipelined. */ - intel_emit_post_sync_nonzero_flush(brw); - int len = brw->gen >= 7 ? 4 : 3; BEGIN_BATCH(len); OUT_BATCH(_3DSTATE_MULTISAMPLE << 16 | (len - 2)); @@ -99,16 +143,16 @@ gen6_emit_3dstate_multisample(struct brw_context *brw, ADVANCE_BATCH(); } - unsigned gen6_determine_sample_mask(struct brw_context *brw) { struct gl_context *ctx = &brw->ctx; - float coverage = 1.0; + float coverage = 1.0f; float coverage_invert = false; unsigned sample_mask = ~0u; - unsigned num_samples = ctx->DrawBuffer->Visual.samples; + /* BRW_NEW_NUM_SAMPLES */ + unsigned num_samples = brw->num_samples; if (ctx->Multisample._Enabled) { if (ctx->Multisample.SampleCoverage) { @@ -121,7 +165,7 @@ gen6_determine_sample_mask(struct brw_context *brw) } if (num_samples > 1) { - int coverage_int = (int) (num_samples * coverage + 0.5); + int coverage_int = (int) (num_samples * coverage + 0.5f); uint32_t coverage_bits = (1 << coverage_int) - 1; if (coverage_invert) coverage_bits ^= (1 << num_samples) - 1; @@ -131,7 +175,6 @@ gen6_determine_sample_mask(struct brw_context *brw) } } - /** * 3DSTATE_SAMPLE_MASK */ @@ -144,25 +187,19 @@ gen6_emit_3dstate_sample_mask(struct brw_context *brw, unsigned mask) ADVANCE_BATCH(); } - -static void upload_multisample_state(struct brw_context *brw) +static void +upload_multisample_state(struct brw_context *brw) { - struct gl_context *ctx = &brw->ctx; - - /* _NEW_BUFFERS, _NEW_MULTISAMPLE */ - unsigned num_samples = ctx->DrawBuffer->Visual.samples; - - gen6_emit_3dstate_multisample(brw, num_samples); + /* BRW_NEW_NUM_SAMPLES */ + gen6_emit_3dstate_multisample(brw, brw->num_samples); gen6_emit_3dstate_sample_mask(brw, gen6_determine_sample_mask(brw)); } - const struct brw_tracked_state gen6_multisample_state = { .dirty = { - .mesa = _NEW_BUFFERS | - _NEW_MULTISAMPLE, - .brw = BRW_NEW_CONTEXT, - .cache = 0 + .mesa = _NEW_MULTISAMPLE, + .brw = BRW_NEW_CONTEXT | + BRW_NEW_NUM_SAMPLES, }, .emit = upload_multisample_state };