<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>