[Mesa-dev] [PATCH 01/10] radeonsi: adjust checking for SC bug workarounds
Nicolai Hähnle
nhaehnle at gmail.com
Fri Mar 31 06:13:53 UTC 2017
On 30.03.2017 19:15, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> no change in behavior, just making sure that no later chips will use
> the workarounds
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
> ---
> src/gallium/drivers/radeonsi/si_pipe.c | 4 ++++
> src/gallium/drivers/radeonsi/si_pipe.h | 1 +
> src/gallium/drivers/radeonsi/si_state.c | 12 ++++++++----
> 3 files changed, 13 insertions(+), 4 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
> index 18b56fa..c32546f 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.c
> +++ b/src/gallium/drivers/radeonsi/si_pipe.c
> @@ -835,20 +835,24 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws)
> (sscreen->b.chip_class == CIK &&
> sscreen->b.info.pfp_fw_version >= 211 &&
> sscreen->b.info.me_fw_version >= 173) ||
> (sscreen->b.chip_class == SI &&
> sscreen->b.info.pfp_fw_version >= 121 &&
> sscreen->b.info.me_fw_version >= 87);
>
> sscreen->has_ds_bpermute = HAVE_LLVM >= 0x0309 &&
> sscreen->b.chip_class >= VI;
>
> + sscreen->has_msaa_sample_loc_bug = (sscreen->b.family >= CHIP_POLARIS10 &&
> + sscreen->b.family <= CHIP_POLARIS12) ||
> + sscreen->b.family == CHIP_VEGA10;
> +
> sscreen->b.has_cp_dma = true;
> sscreen->b.has_streamout = true;
>
> /* Some chips have RB+ registers, but don't support RB+. Those must
> * always disable it.
> */
> if (sscreen->b.family == CHIP_STONEY ||
> sscreen->b.chip_class >= GFX9) {
> sscreen->b.has_rbplus = true;
>
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
> index 3a6503a..9225899 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.h
> +++ b/src/gallium/drivers/radeonsi/si_pipe.h
> @@ -72,20 +72,21 @@ struct si_compute;
> struct hash_table;
> struct u_suballocator;
>
> struct si_screen {
> struct r600_common_screen b;
> unsigned gs_table_depth;
> unsigned tess_offchip_block_dw_size;
> bool has_distributed_tess;
> bool has_draw_indirect_multi;
> bool has_ds_bpermute;
> + bool has_msaa_sample_loc_bug;
>
> /* Whether shaders are monolithic (1-part) or separate (3-part). */
> bool use_monolithic_shaders;
> bool record_llvm_ir;
>
> mtx_t shader_parts_mutex;
> struct si_shader_part *vs_prologs;
> struct si_shader_part *vs_epilogs;
> struct si_shader_part *tcs_epilogs;
> struct si_shader_part *gs_prologs;
> diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
> index f8c6faf..78d6996 100644
> --- a/src/gallium/drivers/radeonsi/si_state.c
> +++ b/src/gallium/drivers/radeonsi/si_state.c
> @@ -914,21 +914,21 @@ static void si_bind_rs_state(struct pipe_context *ctx, void *state)
> (struct si_state_rasterizer*)sctx->queued.named.rasterizer;
> struct si_state_rasterizer *rs = (struct si_state_rasterizer *)state;
>
> if (!state)
> return;
>
> if (!old_rs || old_rs->multisample_enable != rs->multisample_enable) {
> si_mark_atom_dirty(sctx, &sctx->db_render_state);
>
> /* Update the small primitive filter workaround if necessary. */
> - if (sctx->b.family >= CHIP_POLARIS10 &&
> + if (sctx->screen->has_msaa_sample_loc_bug &&
> sctx->framebuffer.nr_samples > 1)
> si_mark_atom_dirty(sctx, &sctx->msaa_sample_locs.atom);
> }
>
> r600_viewport_set_rast_deps(&sctx->b, rs->scissor_enable, rs->clip_halfz);
>
> si_pm4_bind_state(sctx, rasterizer, rs);
> si_update_poly_offset_state(sctx);
>
> si_mark_atom_dirty(sctx, &sctx->clip_regs);
> @@ -2854,50 +2854,54 @@ static void si_emit_framebuffer_state(struct si_context *sctx, struct r600_atom
>
> sctx->framebuffer.dirty_cbufs = 0;
> sctx->framebuffer.dirty_zsbuf = false;
> }
>
> static void si_emit_msaa_sample_locs(struct si_context *sctx,
> struct r600_atom *atom)
> {
> struct radeon_winsys_cs *cs = sctx->b.gfx.cs;
> unsigned nr_samples = sctx->framebuffer.nr_samples;
> + bool has_msaa_sample_loc_bug = sctx->screen->has_msaa_sample_loc_bug;
>
> /* Smoothing (only possible with nr_samples == 1) uses the same
> * sample locations as the MSAA it simulates.
> */
> if (nr_samples <= 1 && sctx->smoothing_enabled)
> nr_samples = SI_NUM_SMOOTH_AA_SAMPLES;
>
> /* On Polaris, the small primitive filter uses the sample locations
> * even when MSAA is off, so we need to make sure they're set to 0.
> */
> - if (sctx->b.family >= CHIP_POLARIS10)
> + if (has_msaa_sample_loc_bug)
> nr_samples = MAX2(nr_samples, 1);
>
> if (nr_samples >= 1 &&
> (nr_samples != sctx->msaa_sample_locs.nr_samples)) {
> sctx->msaa_sample_locs.nr_samples = nr_samples;
> cayman_emit_msaa_sample_locs(cs, nr_samples);
> }
>
> if (sctx->b.family >= CHIP_POLARIS10) {
> struct si_state_rasterizer *rs = sctx->queued.named.rasterizer;
> unsigned small_prim_filter_cntl =
> S_028830_SMALL_PRIM_FILTER_ENABLE(1) |
> - S_028830_LINE_FILTER_DISABLE(sctx->b.chip_class == VI); /* line bug */
> + /* line bug */
> + S_028830_LINE_FILTER_DISABLE(sctx->b.family <= CHIP_POLARIS12);
>
> /* The alternative of setting sample locations to 0 would
> * require a DB flush to avoid Z errors, see
> * https://bugs.freedesktop.org/show_bug.cgi?id=96908
> */
> - if (sctx->framebuffer.nr_samples > 1 && rs && !rs->multisample_enable)
> + if (has_msaa_sample_loc_bug &&
> + sctx->framebuffer.nr_samples > 1 &&
> + rs && !rs->multisample_enable)
> small_prim_filter_cntl &= C_028830_SMALL_PRIM_FILTER_ENABLE;
>
> radeon_set_context_reg(cs, R_028830_PA_SU_SMALL_PRIM_FILTER_CNTL,
> small_prim_filter_cntl);
> }
> }
>
> static void si_emit_msaa_config(struct si_context *sctx, struct r600_atom *atom)
> {
> struct radeon_winsys_cs *cs = sctx->b.gfx.cs;
>
--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
More information about the mesa-dev
mailing list