[Mesa-dev] [PATCH 12/13] radeonsi: remove color_two_side from the shader key

Marek Olšák maraeo at gmail.com
Sun Jan 4 15:18:51 PST 2015


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

This can be done using the SPI mapping only. If two_side is disabled,
VS COLOR is loaded to both PS COLOR and PS BCOLOR inputs.

The disadvantage is that the PS always chooses the color according to FACE
even though two_side is disabled.

Since PS color inputs can only be used in the GL compatibility profile, only
legacy apps should be affected, which is acceptable.

The PS shader key now only contains states for PS exports. The key can be
eliminated completely by implementing a pixel shader export subroutine,
so that we can stop compiling PS on demand. (it's also necessary for taking
advantage of all the SPI color and Z formats)
---
 src/gallium/drivers/radeonsi/si_pipe.h          |  1 +
 src/gallium/drivers/radeonsi/si_shader.c        |  3 +--
 src/gallium/drivers/radeonsi/si_shader.h        |  1 -
 src/gallium/drivers/radeonsi/si_state_shaders.c | 27 ++++++++++++++-----------
 4 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
index ba305e7..00825c1 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -135,6 +135,7 @@ struct si_context {
 	/* shader information */
 	unsigned			sprite_coord_enable;
 	bool				flatshade;
+	bool				color_two_side;
 	struct si_descriptors		vertex_buffers;
 	struct si_buffer_resources	const_buffers[SI_NUM_SHADERS];
 	struct si_buffer_resources	rw_buffers[SI_NUM_SHADERS];
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index 89099e2..1073723 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -479,8 +479,7 @@ static void declare_input_fs(
 	 */
 	intr_name = interp_param ? "llvm.SI.fs.interp" : "llvm.SI.fs.constant";
 
-	if (decl->Semantic.Name == TGSI_SEMANTIC_COLOR &&
-	    si_shader_ctx->shader->key.ps.color_two_side) {
+	if (decl->Semantic.Name == TGSI_SEMANTIC_COLOR) {
 		LLVMValueRef args[4];
 		LLVMValueRef face, is_face_positive;
 		LLVMValueRef back_attr_number =
diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h
index 21692f0..93461be 100644
--- a/src/gallium/drivers/radeonsi/si_shader.h
+++ b/src/gallium/drivers/radeonsi/si_shader.h
@@ -121,7 +121,6 @@ union si_shader_key {
 	struct {
 		unsigned	export_16bpc:8;
 		unsigned	last_cbuf:3;
-		unsigned	color_two_side:1;
 		unsigned	alpha_func:3;
 		unsigned	alpha_to_one:1;
 	} ps;
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
index 437dd95..282fcf2 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -360,15 +360,12 @@ static INLINE void si_shader_selector_key(struct pipe_context *ctx,
 			key->ps.last_cbuf = MAX2(sctx->framebuffer.state.nr_cbufs, 1) - 1;
 		key->ps.export_16bpc = sctx->framebuffer.export_16bpc;
 
-		if (sctx->queued.named.rasterizer) {
-			key->ps.color_two_side = sctx->queued.named.rasterizer->two_side;
-
-			if (sctx->queued.named.blend) {
-				key->ps.alpha_to_one = sctx->queued.named.blend->alpha_to_one &&
-						       sctx->queued.named.rasterizer->multisample_enable &&
-						       !sctx->framebuffer.cb0_is_integer;
-			}
+		if (sctx->queued.named.rasterizer && sctx->queued.named.blend) {
+			key->ps.alpha_to_one = sctx->queued.named.blend->alpha_to_one &&
+					       sctx->queued.named.rasterizer->multisample_enable &&
+					       !sctx->framebuffer.cb0_is_integer;
 		}
+
 		if (sctx->queued.named.dsa) {
 			key->ps.alpha_func = sctx->queued.named.dsa->alpha_func;
 
@@ -622,6 +619,7 @@ static void si_update_spi_map(struct si_context *sctx)
 		unsigned index = psinfo->input_semantic_index[i];
 		unsigned interpolate = psinfo->input_interpolate[i];
 		unsigned param_offset = ps->ps_input_param_offset[i];
+		bool is_bcolor = false;
 
 		if (name == TGSI_SEMANTIC_POSITION ||
 		    name == TGSI_SEMANTIC_FACE)
@@ -657,10 +655,13 @@ bcolor:
 			       R_028644_SPI_PS_INPUT_CNTL_0 + param_offset * 4,
 			       tmp);
 
-		if (name == TGSI_SEMANTIC_COLOR &&
-		    ps->key.ps.color_two_side) {
-			name = TGSI_SEMANTIC_BCOLOR;
+		if (name == TGSI_SEMANTIC_COLOR && !is_bcolor) {
 			param_offset++;
+			is_bcolor = true;
+			/* If two-sided colors are enabled, load BCOLOR,
+			 * otherwise load COLOR again. */
+			if (sctx->color_two_side)
+				name = TGSI_SEMANTIC_BCOLOR;
 			goto bcolor;
 		}
 	}
@@ -776,9 +777,11 @@ void si_update_shaders(struct si_context *sctx)
 
 	if (si_pm4_state_changed(sctx, ps) || si_pm4_state_changed(sctx, vs) ||
 	    sctx->sprite_coord_enable != rs->sprite_coord_enable ||
-	    sctx->flatshade != rs->flatshade) {
+	    sctx->flatshade != rs->flatshade ||
+	    sctx->color_two_side != rs->two_side) {
 		sctx->sprite_coord_enable = rs->sprite_coord_enable;
 		sctx->flatshade = rs->flatshade;
+		sctx->color_two_side = rs->two_side;
 		si_update_spi_map(sctx);
 	}
 
-- 
2.1.0



More information about the mesa-dev mailing list