[Mesa-dev] [PATCH v02 35/37] i965: Port gen6+ multisample state emitting code to genxml.
Kenneth Graunke
kenneth at whitecape.org
Wed Apr 26 01:10:09 UTC 2017
On Monday, April 24, 2017 3:19:30 PM PDT Rafael Antognolli wrote:
> Emit 3DSTATE_MULTISAMPLE using brw_batch_emit.
>
> Signed-off-by: Rafael Antognolli <rafael.antognolli at intel.com>
> ---
> src/mesa/drivers/dri/i965/brw_context.h | 9 +-
> src/mesa/drivers/dri/i965/brw_state.h | 2 +-
> src/mesa/drivers/dri/i965/gen6_multisample_state.c | 6 +-
> src/mesa/drivers/dri/i965/gen8_multisample_state.c | 18 +--
> src/mesa/drivers/dri/i965/genX_state_upload.c | 102 +++++++++++++-
> 5 files changed, 101 insertions(+), 36 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
> index 8bd8863..cef54b8 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -1532,15 +1532,6 @@ brw_blorp_copytexsubimage(struct brw_context *brw,
> int dstX0, int dstY0,
> int width, int height);
>
> -/* gen6_multisample_state.c */
> -unsigned
> -gen6_determine_sample_mask(struct brw_context *brw);
> -
> -void
> -gen6_emit_3dstate_multisample(struct brw_context *brw,
> - unsigned num_samples);
> -void
> -gen6_emit_3dstate_sample_mask(struct brw_context *brw, unsigned mask);
> void
> gen6_get_sample_position(struct gl_context *ctx,
> struct gl_framebuffer *fb,
> diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h
> index acb7334..2b5b1c4 100644
> --- a/src/mesa/drivers/dri/i965/brw_state.h
> +++ b/src/mesa/drivers/dri/i965/brw_state.h
> @@ -109,7 +109,6 @@ extern const struct brw_tracked_state gen7_cs_push_constants;
> extern const struct brw_tracked_state gen6_binding_table_pointers;
> extern const struct brw_tracked_state gen6_color_calc_state;
> extern const struct brw_tracked_state gen6_gs_binding_table;
> -extern const struct brw_tracked_state gen6_multisample_state;
> extern const struct brw_tracked_state gen6_renderbuffer_surfaces;
> extern const struct brw_tracked_state gen6_sampler_state;
> extern const struct brw_tracked_state gen6_sol_surface;
> @@ -122,7 +121,6 @@ extern const struct brw_tracked_state gen7_push_constant_space;
> extern const struct brw_tracked_state gen7_urb;
> extern const struct brw_tracked_state haswell_cut_index;
> extern const struct brw_tracked_state gen8_index_buffer;
> -extern const struct brw_tracked_state gen8_multisample_state;
> extern const struct brw_tracked_state gen8_pma_fix;
> extern const struct brw_tracked_state gen8_vf_topology;
> extern const struct brw_tracked_state brw_cs_work_groups_surface;
> diff --git a/src/mesa/drivers/dri/i965/gen6_multisample_state.c b/src/mesa/drivers/dri/i965/gen6_multisample_state.c
> index a59ffec..77c5fd6 100644
> --- a/src/mesa/drivers/dri/i965/gen6_multisample_state.c
> +++ b/src/mesa/drivers/dri/i965/gen6_multisample_state.c
> @@ -122,7 +122,7 @@ gen6_set_sample_maps(struct gl_context *ctx)
> /**
> * 3DSTATE_MULTISAMPLE
> */
> -void
> +static void
> gen6_emit_3dstate_multisample(struct brw_context *brw,
> unsigned num_samples)
> {
> @@ -160,7 +160,7 @@ gen6_emit_3dstate_multisample(struct brw_context *brw,
> ADVANCE_BATCH();
> }
>
> -unsigned
> +static unsigned
> gen6_determine_sample_mask(struct brw_context *brw)
> {
> struct gl_context *ctx = &brw->ctx;
> @@ -195,7 +195,7 @@ gen6_determine_sample_mask(struct brw_context *brw)
> /**
> * 3DSTATE_SAMPLE_MASK
> */
> -void
> +static void
> gen6_emit_3dstate_sample_mask(struct brw_context *brw, unsigned mask)
> {
> BEGIN_BATCH(2);
I'm confused. Shouldn't you delete gen6_determine_sample_mask,
gen6_emit_3dstate_sample_mask, upload_multisample_state, and the
gen6_multisample_state atom from this file?
You're also creating them in genX_state_upload.c and these look unused.
> index e36d037..7a31a5d 100644
> --- a/src/mesa/drivers/dri/i965/gen8_multisample_state.c
> +++ b/src/mesa/drivers/dri/i965/gen8_multisample_state.c
> @@ -69,21 +69,3 @@ gen8_emit_3dstate_sample_pattern(struct brw_context *brw)
> OUT_BATCH(brw_multisample_positions_1x_2x);
> ADVANCE_BATCH();
> }
> -
> -
> -static void
> -upload_multisample_state(struct brw_context *brw)
> -{
> - gen8_emit_3dstate_multisample(brw, brw->num_samples);
> - gen6_emit_3dstate_sample_mask(brw, gen6_determine_sample_mask(brw));
> -}
> -
> -const struct brw_tracked_state gen8_multisample_state = {
> - .dirty = {
> - .mesa = _NEW_MULTISAMPLE,
> - .brw = BRW_NEW_BLORP |
> - BRW_NEW_CONTEXT |
> - BRW_NEW_NUM_SAMPLES,
> - },
> - .emit = upload_multisample_state
> -};
> diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c b/src/mesa/drivers/dri/i965/genX_state_upload.c
> index b7475dc..77c9efc 100644
> --- a/src/mesa/drivers/dri/i965/genX_state_upload.c
> +++ b/src/mesa/drivers/dri/i965/genX_state_upload.c
> @@ -24,6 +24,7 @@
> #include <assert.h>
>
> #include "common/gen_device_info.h"
> +#include "common/gen_sample_positions.h"
> #include "genxml/gen_macros.h"
>
> #include "main/bufferobj.h"
> @@ -36,6 +37,7 @@
> #include "brw_defines.h"
> #endif
> #include "brw_draw.h"
> +#include "brw_multisample_state.h"
> #include "brw_state.h"
> #include "brw_wm.h"
> #include "brw_util.h"
> @@ -3105,6 +3107,98 @@ static const struct brw_tracked_state genX(wm_push_constants) = {
> .emit = genX(upload_wm_push_constants),
> };
>
> +/* ---------------------------------------------------------------------- */
> +
> +static unsigned
> +genX(determine_sample_mask)(struct brw_context *brw)
> +{
> + struct gl_context *ctx = &brw->ctx;
> + float coverage = 1.0f;
> + float coverage_invert = false;
> + unsigned sample_mask = ~0u;
> +
> + /* BRW_NEW_NUM_SAMPLES */
> + unsigned num_samples = brw->num_samples;
> +
> + if (_mesa_is_multisample_enabled(ctx)) {
> + if (ctx->Multisample.SampleCoverage) {
> + coverage = ctx->Multisample.SampleCoverageValue;
> + coverage_invert = ctx->Multisample.SampleCoverageInvert;
> + }
> + if (ctx->Multisample.SampleMask) {
> + sample_mask = ctx->Multisample.SampleMaskValue;
> + }
> + }
> +
> + if (num_samples > 1) {
> + 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;
> + return coverage_bits & sample_mask;
> + } else {
> + return 1;
> + }
> +}
> +
> +/* ---------------------------------------------------------------------- */
> +
> +static void
> +genX(emit_3dstate_multisample2)(struct brw_context *brw,
> + unsigned num_samples)
> +{
> + assert(brw->num_samples <= 16);
> +
> + unsigned log2_samples = ffs(MAX2(num_samples, 1)) - 1;
> +
> + brw_batch_emit(brw, GENX(3DSTATE_MULTISAMPLE), multi) {
> + multi.PixelLocation = CENTER;
> + multi.NumberofMultisamples = log2_samples;
> +#if GEN_GEN < 8
> +#if GEN_GEN >= 7
We could use a single level of #if's by doing:
#if GEN_GEN == 6
GEN_SAMPLE_POS_4X(multi.Sample);
#elif GEN_GEN == 7
switch ...
#endif
With that, and the dead gen6_multisample_state.c code deleted,
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
> diff --git a/src/mesa/drivers/dri/i965/gen8_multisample_state.c b/src/mesa/drivers/dri/i965/gen8_multisample_state.c
> + switch (num_samples) {
> + case 1:
> + GEN_SAMPLE_POS_1X(multi.Sample);
> + break;
> + case 2:
> + GEN_SAMPLE_POS_2X(multi.Sample);
> + break;
> + case 4:
> + GEN_SAMPLE_POS_4X(multi.Sample);
> + break;
> + case 8:
> + GEN_SAMPLE_POS_8X(multi.Sample);
> + break;
> + default:
> + break;
> + }
> +#else
> + GEN_SAMPLE_POS_4X(multi.Sample);
> +#endif
> +#endif
> + }
> +}
> +
> +static void
> +genX(upload_multisample_state)(struct brw_context *brw)
> +{
> + genX(emit_3dstate_multisample2)(brw, brw->num_samples);
> +
> + brw_batch_emit(brw, GENX(3DSTATE_SAMPLE_MASK), sm) {
> + sm.SampleMask = genX(determine_sample_mask)(brw);
> + }
> +}
> +
> +static const struct brw_tracked_state genX(multisample_state) = {
> + .dirty = {
> + .mesa = _NEW_MULTISAMPLE,
> + .brw = BRW_NEW_BLORP |
> + BRW_NEW_CONTEXT |
> + BRW_NEW_NUM_SAMPLES,
> + },
> + .emit = genX(upload_multisample_state)
> +};
> +
> #endif
>
> /* ---------------------------------------------------------------------- */
> @@ -3586,7 +3680,7 @@ genX(upload_ps)(struct brw_context *brw)
> * in 3DSTATE_SAMPLE_MASK; the values should match. */
> /* _NEW_BUFFERS, _NEW_MULTISAMPLE */
> #if GEN_IS_HASWELL
> - ps.SampleMask = gen6_determine_sample_mask(brw);
> + ps.SampleMask = genX(determine_sample_mask(brw));
> #endif
>
> /* 3DSTATE_PS expects the number of threads per PSD, which is always 64;
> @@ -4280,7 +4374,7 @@ genX(init_atoms)(struct brw_context *brw)
> &brw_vs_samplers,
> &brw_gs_samplers,
> &gen6_sampler_state,
> - &gen6_multisample_state,
> + &genX(multisample_state),
>
> &genX(vs_state),
> &genX(gs_state),
> @@ -4364,7 +4458,7 @@ genX(init_atoms)(struct brw_context *brw)
> &brw_tcs_samplers,
> &brw_tes_samplers,
> &brw_gs_samplers,
> - &gen6_multisample_state,
> + &genX(multisample_state),
>
> &genX(vs_state),
> &genX(hs_state),
> @@ -4451,7 +4545,7 @@ genX(init_atoms)(struct brw_context *brw)
> &brw_tcs_samplers,
> &brw_tes_samplers,
> &brw_gs_samplers,
> - &gen8_multisample_state,
> + &genX(multisample_state),
>
> &genX(vs_state),
> &genX(hs_state),
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170425/7f52a365/attachment-0001.sig>
More information about the mesa-dev
mailing list