diff options
author | Chris Forbes <chrisf@ijw.co.nz> | 2013-12-01 11:03:41 +1300 |
---|---|---|
committer | Chris Forbes <chrisf@ijw.co.nz> | 2013-12-07 16:07:53 +1300 |
commit | 8064b0f2c488f5c74a8910c2a5675672e8b1e066 (patch) | |
tree | 5fa20ec89852f7ef53a255ea65c29322f05bfe0f /src/mesa/drivers/dri/i965/gen6_multisample_state.c | |
parent | 758658850bd5ba64bf2e8c04516ea1292aedcfc3 (diff) | |
download | external_mesa3d-8064b0f2c488f5c74a8910c2a5675672e8b1e066.zip external_mesa3d-8064b0f2c488f5c74a8910c2a5675672e8b1e066.tar.gz external_mesa3d-8064b0f2c488f5c74a8910c2a5675672e8b1e066.tar.bz2 |
i965: refactor sample mask calculation
Haswell needs a copy of the sample mask in 3DSTATE_PS; this makes that
convenient.
Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src/mesa/drivers/dri/i965/gen6_multisample_state.c')
-rw-r--r-- | src/mesa/drivers/dri/i965/gen6_multisample_state.c | 63 |
1 files changed, 35 insertions, 28 deletions
diff --git a/src/mesa/drivers/dri/i965/gen6_multisample_state.c b/src/mesa/drivers/dri/i965/gen6_multisample_state.c index 9f69ddc..2f2f575 100644 --- a/src/mesa/drivers/dri/i965/gen6_multisample_state.c +++ b/src/mesa/drivers/dri/i965/gen6_multisample_state.c @@ -97,40 +97,16 @@ gen6_emit_3dstate_multisample(struct brw_context *brw, } -/** - * 3DSTATE_SAMPLE_MASK - */ -void -gen6_emit_3dstate_sample_mask(struct brw_context *brw, - unsigned num_samples, float coverage, - bool coverage_invert, unsigned sample_mask) -{ - BEGIN_BATCH(2); - OUT_BATCH(_3DSTATE_SAMPLE_MASK << 16 | (2 - 2)); - if (num_samples > 1) { - int coverage_int = (int) (num_samples * coverage + 0.5); - uint32_t coverage_bits = (1 << coverage_int) - 1; - if (coverage_invert) - coverage_bits ^= (1 << num_samples) - 1; - OUT_BATCH(coverage_bits & sample_mask); - } else { - OUT_BATCH(1); - } - ADVANCE_BATCH(); -} - - -static void upload_multisample_state(struct brw_context *brw) +unsigned +gen6_determine_sample_mask(struct brw_context *brw) { struct gl_context *ctx = &brw->ctx; float coverage = 1.0; float coverage_invert = false; unsigned sample_mask = ~0u; - /* _NEW_BUFFERS */ unsigned num_samples = ctx->DrawBuffer->Visual.samples; - /* _NEW_MULTISAMPLE */ if (ctx->Multisample._Enabled) { if (ctx->Multisample.SampleCoverage) { coverage = ctx->Multisample.SampleCoverageValue; @@ -141,9 +117,40 @@ static void upload_multisample_state(struct brw_context *brw) } } + if (num_samples > 1) { + int coverage_int = (int) (num_samples * coverage + 0.5); + uint32_t coverage_bits = (1 << coverage_int) - 1; + if (coverage_invert) + coverage_bits ^= (1 << num_samples) - 1; + return coverage_bits & sample_mask; + } else { + return 1; + } +} + + +/** + * 3DSTATE_SAMPLE_MASK + */ +void +gen6_emit_3dstate_sample_mask(struct brw_context *brw, unsigned mask) +{ + BEGIN_BATCH(2); + OUT_BATCH(_3DSTATE_SAMPLE_MASK << 16 | (2 - 2)); + OUT_BATCH(mask); + ADVANCE_BATCH(); +} + + +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); - gen6_emit_3dstate_sample_mask(brw, num_samples, coverage, - coverage_invert, sample_mask); + gen6_emit_3dstate_sample_mask(brw, gen6_determine_sample_mask(brw)); } |