[Mesa-dev] [PATCH 20/20] radeonsi: remove all varyings for depth-only rendering or rasterization off

Marek Olšák maraeo at gmail.com
Wed Nov 16 18:38:43 UTC 2016


From: Marek Olšák <marek.olsak at amd.com>

---
 src/gallium/drivers/radeonsi/si_pipe.h          |  1 +
 src/gallium/drivers/radeonsi/si_state.c         |  2 ++
 src/gallium/drivers/radeonsi/si_state_shaders.c | 19 ++++++++++++++++++-
 3 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
index 847281e..42cbecb 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -160,20 +160,21 @@ struct si_images_info {
 	uint32_t			compressed_colortex_mask;
 	unsigned			enabled_mask;
 };
 
 struct si_framebuffer {
 	struct r600_atom		atom;
 	struct pipe_framebuffer_state	state;
 	unsigned			nr_samples;
 	unsigned			log_samples;
 	unsigned			compressed_cb_mask;
+	unsigned			colorbuf_enabled_4bit;
 	unsigned			spi_shader_col_format;
 	unsigned			spi_shader_col_format_alpha;
 	unsigned			spi_shader_col_format_blend;
 	unsigned			spi_shader_col_format_blend_alpha;
 	unsigned			color_is_int8; /* bitmask */
 	unsigned			dirty_cbufs;
 	bool				dirty_zsbuf;
 	bool				any_dst_linear;
 };
 
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
index b30bec1..c459d37 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -2325,20 +2325,21 @@ static void si_set_framebuffer_state(struct pipe_context *ctx,
 	/* Take the maximum of the old and new count. If the new count is lower,
 	 * dirtying is needed to disable the unbound colorbuffers.
 	 */
 	sctx->framebuffer.dirty_cbufs |=
 		(1 << MAX2(sctx->framebuffer.state.nr_cbufs, state->nr_cbufs)) - 1;
 	sctx->framebuffer.dirty_zsbuf |= sctx->framebuffer.state.zsbuf != state->zsbuf;
 
 	si_dec_framebuffer_counters(&sctx->framebuffer.state);
 	util_copy_framebuffer_state(&sctx->framebuffer.state, state);
 
+	sctx->framebuffer.colorbuf_enabled_4bit = 0;
 	sctx->framebuffer.spi_shader_col_format = 0;
 	sctx->framebuffer.spi_shader_col_format_alpha = 0;
 	sctx->framebuffer.spi_shader_col_format_blend = 0;
 	sctx->framebuffer.spi_shader_col_format_blend_alpha = 0;
 	sctx->framebuffer.color_is_int8 = 0;
 
 	sctx->framebuffer.compressed_cb_mask = 0;
 	sctx->framebuffer.nr_samples = util_framebuffer_get_num_samples(state);
 	sctx->framebuffer.log_samples = util_logbase2(sctx->framebuffer.nr_samples);
 	sctx->framebuffer.any_dst_linear = false;
@@ -2347,20 +2348,21 @@ static void si_set_framebuffer_state(struct pipe_context *ctx,
 		if (!state->cbufs[i])
 			continue;
 
 		surf = (struct r600_surface*)state->cbufs[i];
 		rtex = (struct r600_texture*)surf->base.texture;
 
 		if (!surf->color_initialized) {
 			si_initialize_color_surface(sctx, surf);
 		}
 
+		sctx->framebuffer.colorbuf_enabled_4bit |= 0xf << (i * 4);
 		sctx->framebuffer.spi_shader_col_format |=
 			surf->spi_shader_col_format << (i * 4);
 		sctx->framebuffer.spi_shader_col_format_alpha |=
 			surf->spi_shader_col_format_alpha << (i * 4);
 		sctx->framebuffer.spi_shader_col_format_blend |=
 			surf->spi_shader_col_format_blend << (i * 4);
 		sctx->framebuffer.spi_shader_col_format_blend_alpha |=
 			surf->spi_shader_col_format_blend_alpha << (i * 4);
 
 		if (surf->color_is_int8)
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
index 7834f87..cd4b339 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -860,21 +860,38 @@ static void si_shader_selector_key_hw_vs(struct si_context *sctx,
 {
 	struct si_shader_selector *ps = sctx->ps_shader.cso;
 
 	key->opt.hw_vs.clip_disable =
 		sctx->queued.named.rasterizer->clip_plane_enable == 0 &&
 		(vs->info.clipdist_writemask ||
 		 vs->info.writes_clipvertex) &&
 		!vs->info.culldist_writemask;
 
 	/* Find out if PS is disabled. */
-	bool ps_disabled = ps == NULL;
+	bool ps_disabled = true;
+	if (ps) {
+		bool ps_modifies_zs = ps->info.uses_kill ||
+				      ps->info.writes_z ||
+				      ps->info.writes_stencil ||
+				      ps->info.writes_samplemask ||
+				      si_get_alpha_test_func(sctx) != PIPE_FUNC_ALWAYS;
+
+		unsigned ps_colormask = sctx->framebuffer.colorbuf_enabled_4bit &
+					sctx->queued.named.blend->cb_target_mask;
+		if (!ps->info.properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS])
+			ps_colormask &= ps->colors_written_4bit;
+
+		ps_disabled = sctx->queued.named.rasterizer->rasterizer_discard ||
+			      (!ps_colormask &&
+			       !ps_modifies_zs &&
+			       !ps->info.writes_memory);
+	}
 
 	/* Find out which VS outputs aren't used by the PS. */
 	uint64_t outputs_written = vs->outputs_written;
 	uint32_t outputs_written2 = vs->outputs_written2;
 	uint64_t inputs_read = 0;
 	uint32_t inputs_read2 = 0;
 
 	outputs_written &= ~0x3; /* ignore POSITION, PSIZE */
 
 	if (!ps_disabled) {
-- 
2.7.4



More information about the mesa-dev mailing list