From: Marek Olšák Date: Fri, 15 Jan 2016 20:58:53 +0000 (+0100) Subject: radeonsi: disable SPI color outputs the shader doesn't write X-Git-Tag: upstream/17.1.0~13069 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=99dfeb01bd5c3e059968e934f3ec88b2fe43e3f4;p=platform%2Fupstream%2Fmesa.git radeonsi: disable SPI color outputs the shader doesn't write Reviewed-by: Nicolai Hähnle --- diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index f49290a..50375e2 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -213,6 +213,10 @@ struct si_shader_selector { /* PS parameters. */ unsigned db_shader_control; + /* Set 0xf or 0x0 (4 bits) per each written output. + * ANDed with spi_shader_col_format. + */ + unsigned colors_written_4bit; /* masks of "get_unique_index" bits */ uint64_t outputs_written; diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 59aee54..79f2335 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -647,6 +647,12 @@ static inline void si_shader_selector_key(struct pipe_context *ctx, if (sctx->b.chip_class <= CIK && sctx->b.family != CHIP_HAWAII) key->ps.color_is_int8 = sctx->framebuffer.color_is_int8; + /* Disable unwritten outputs (if WRITE_ALL_CBUFS isn't enabled). */ + if (!key->ps.last_cbuf) { + key->ps.spi_shader_col_format &= sel->colors_written_4bit; + key->ps.color_is_int8 &= sel->info.colors_written; + } + if (rs) { bool is_poly = (sctx->current_rast_prim >= PIPE_PRIM_TRIANGLES && sctx->current_rast_prim <= PIPE_PRIM_POLYGON) || @@ -831,6 +837,12 @@ static void *si_create_shader_selector(struct pipe_context *ctx, } sel->esgs_itemsize = util_last_bit64(sel->outputs_written) * 16; break; + + case PIPE_SHADER_FRAGMENT: + for (i = 0; i < 8; i++) + if (sel->info.colors_written & (1 << i)) + sel->colors_written_4bit |= 0xf << (4 * i); + break; } /* DB_SHADER_CONTROL */