<div dir="ltr"><div class="gmail_quote"><div>The values can't be set per CB.</div><div><br></div><div>Marek<br></div><div dir="ltr"><br></div><div dir="ltr">On Mon, Oct 29, 2018 at 7:04 AM Samuel Pitoiset <<a href="mailto:samuel.pitoiset@gmail.com">samuel.pitoiset@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Are the values similar when they are set per CB instead of globally?<br>
<br>
On 10/27/18 4:28 AM, Marek Olšák wrote:<br>
> From: Marek Olšák <<a href="mailto:marek.olsak@amd.com" target="_blank">marek.olsak@amd.com</a>><br>
> <br>
> ---<br>
>   src/gallium/drivers/radeonsi/si_pipe.h  |  1 +<br>
>   src/gallium/drivers/radeonsi/si_state.c | 14 +++++++++++++-<br>
>   2 files changed, 14 insertions(+), 1 deletion(-)<br>
> <br>
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h<br>
> index dc95afb7421..0807c8ddacc 100644<br>
> --- a/src/gallium/drivers/radeonsi/si_pipe.h<br>
> +++ b/src/gallium/drivers/radeonsi/si_pipe.h<br>
> @@ -610,20 +610,21 @@ struct si_framebuffer {<br>
>       unsigned                        spi_shader_col_format_blend;<br>
>       unsigned                        spi_shader_col_format_blend_alpha;<br>
>       ubyte                           nr_samples:5; /* at most 16xAA */<br>
>       ubyte                           log_samples:3; /* at most 4 = 16xAA */<br>
>       ubyte                           nr_color_samples; /* at most 8xAA */<br>
>       ubyte                           compressed_cb_mask;<br>
>       ubyte                           uncompressed_cb_mask;<br>
>       ubyte                           color_is_int8;<br>
>       ubyte                           color_is_int10;<br>
>       ubyte                           dirty_cbufs;<br>
> +     ubyte                           dcc_overwrite_combiner_watermark;<br>
>       bool                            dirty_zsbuf;<br>
>       bool                            any_dst_linear;<br>
>       bool                            CB_has_shader_readable_metadata;<br>
>       bool                            DB_has_shader_readable_metadata;<br>
>   };<br>
>   <br>
>   enum si_quant_mode {<br>
>       /* This is the list we want to support. */<br>
>       SI_QUANT_MODE_16_8_FIXED_POINT_1_256TH,<br>
>       SI_QUANT_MODE_14_10_FIXED_POINT_1_1024TH,<br>
> diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c<br>
> index 36dce381539..43d76d19916 100644<br>
> --- a/src/gallium/drivers/radeonsi/si_state.c<br>
> +++ b/src/gallium/drivers/radeonsi/si_state.c<br>
> @@ -106,26 +106,27 @@ static void si_emit_cb_render_state(struct si_context *sctx)<br>
>       if (sctx->chip_class >= VI) {<br>
>               /* DCC MSAA workaround for blending.<br>
>                * Alternatively, we can set CB_COLORi_DCC_CONTROL.OVERWRITE_-<br>
>                * COMBINER_DISABLE, but that would be more complicated.<br>
>                */<br>
>               bool oc_disable = (sctx->chip_class == VI ||<br>
>                                  sctx->chip_class == GFX9) &&<br>
>                                 blend &&<br>
>                                 blend->blend_enable_4bit & cb_target_mask &&<br>
>                                 sctx->framebuffer.nr_samples >= 2;<br>
> +             unsigned watermark = sctx->framebuffer.dcc_overwrite_combiner_watermark;<br>
>   <br>
>               radeon_opt_set_context_reg(<br>
>                               sctx, R_028424_CB_DCC_CONTROL,<br>
>                               SI_TRACKED_CB_DCC_CONTROL,<br>
>                               S_028424_OVERWRITE_COMBINER_MRT_SHARING_DISABLE(1) |<br>
> -                             S_028424_OVERWRITE_COMBINER_WATERMARK(4) |<br>
> +                             S_028424_OVERWRITE_COMBINER_WATERMARK(watermark) |<br>
>                               S_028424_OVERWRITE_COMBINER_DISABLE(oc_disable));<br>
>       }<br>
>   <br>
>       /* RB+ register settings. */<br>
>       if (sctx->screen->rbplus_allowed) {<br>
>               unsigned spi_shader_col_format =<br>
>                       sctx->ps_shader.cso ?<br>
>                       sctx->ps_shader.current->key.part.ps.epilog.spi_shader_col_format : 0;<br>
>               unsigned sx_ps_downconvert = 0;<br>
>               unsigned sx_blend_opt_epsilon = 0;<br>
> @@ -2848,20 +2849,21 @@ static void si_set_framebuffer_state(struct pipe_context *ctx,<br>
>       sctx->framebuffer.color_is_int10 = 0;<br>
>   <br>
>       sctx->framebuffer.compressed_cb_mask = 0;<br>
>       sctx->framebuffer.uncompressed_cb_mask = 0;<br>
>       sctx->framebuffer.nr_samples = util_framebuffer_get_num_samples(state);<br>
>       sctx->framebuffer.nr_color_samples = sctx->framebuffer.nr_samples;<br>
>       sctx->framebuffer.log_samples = util_logbase2(sctx->framebuffer.nr_samples);<br>
>       sctx->framebuffer.any_dst_linear = false;<br>
>       sctx->framebuffer.CB_has_shader_readable_metadata = false;<br>
>       sctx->framebuffer.DB_has_shader_readable_metadata = false;<br>
> +     unsigned num_bpp64_colorbufs = 0;<br>
>   <br>
>       for (i = 0; i < state->nr_cbufs; i++) {<br>
>               if (!state->cbufs[i])<br>
>                       continue;<br>
>   <br>
>               surf = (struct si_surface*)state->cbufs[i];<br>
>               tex = (struct si_texture*)surf->base.texture;<br>
>   <br>
>               if (!surf->color_initialized) {<br>
>                       si_initialize_color_surface(sctx, surf);<br>
> @@ -2894,35 +2896,45 @@ static void si_set_framebuffer_state(struct pipe_context *ctx,<br>
>                   tex->buffer.b.b.nr_storage_samples < tex->buffer.b.b.nr_samples) {<br>
>                       sctx->framebuffer.nr_color_samples =<br>
>                               MIN2(sctx->framebuffer.nr_color_samples,<br>
>                                    tex->buffer.b.b.nr_storage_samples);<br>
>                       sctx->framebuffer.nr_color_samples =<br>
>                               MAX2(1, sctx->framebuffer.nr_color_samples);<br>
>               }<br>
>   <br>
>               if (tex->surface.is_linear)<br>
>                       sctx->framebuffer.any_dst_linear = true;<br>
> +             if (tex->surface.bpe >= 8)<br>
> +                     num_bpp64_colorbufs++;<br>
>   <br>
>               if (vi_dcc_enabled(tex, surf->base.u.tex.level))<br>
>                       sctx->framebuffer.CB_has_shader_readable_metadata = true;<br>
>   <br>
>               si_context_add_resource_size(sctx, surf->base.texture);<br>
>   <br>
>               p_atomic_inc(&tex->framebuffers_bound);<br>
>   <br>
>               if (tex->dcc_gather_statistics) {<br>
>                       /* Dirty tracking must be enabled for DCC usage analysis. */<br>
>                       sctx->framebuffer.compressed_cb_mask |= 1 << i;<br>
>                       vi_separate_dcc_start_query(sctx, tex);<br>
>               }<br>
>       }<br>
>   <br>
> +     /* For optimal DCC performance. */<br>
> +     if (sctx->chip_class == VI)<br>
> +             sctx->framebuffer.dcc_overwrite_combiner_watermark = 4;<br>
> +     else if (num_bpp64_colorbufs >= 5)<br>
> +             sctx->framebuffer.dcc_overwrite_combiner_watermark = 8;<br>
> +     else<br>
> +             sctx->framebuffer.dcc_overwrite_combiner_watermark = 6;<br>
> +<br>
>       struct si_texture *zstex = NULL;<br>
>   <br>
>       if (state->zsbuf) {<br>
>               surf = (struct si_surface*)state->zsbuf;<br>
>               zstex = (struct si_texture*)surf->base.texture;<br>
>   <br>
>               if (!surf->depth_initialized) {<br>
>                       si_init_depth_surface(sctx, surf);<br>
>               }<br>
>   <br>
> <br>
</blockquote></div></div>