[Mesa-dev] [PATCH] radeonsi: pass alpha_ref value to PS in the user sgpr

Vadim Girlin vadimgirlin at gmail.com
Thu Oct 10 10:49:32 CEST 2013


Currently it's hardcoded in the shader, so every change requires
compilation of the shader variant, killing the performance
in Serious Sam 3 and probably other apps.

This patch passes alpha_ref in the user sgpr and removes it from
the shader key.

Signed-off-by: Vadim Girlin <vadimgirlin at gmail.com>
---
 src/gallium/drivers/radeonsi/radeonsi_shader.c |  8 ++++--
 src/gallium/drivers/radeonsi/radeonsi_shader.h | 39 +++++++++++++-------------
 src/gallium/drivers/radeonsi/si_state.c        |  7 ++---
 3 files changed, 29 insertions(+), 25 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c
index 97ed4e3..5279bb0 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_shader.c
+++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c
@@ -570,11 +570,14 @@ static void si_alpha_test(struct lp_build_tgsi_context *bld_base,
 
 	if (si_shader_ctx->shader->key.ps.alpha_func != PIPE_FUNC_NEVER) {
 		LLVMValueRef out_ptr = si_shader_ctx->radeon_bld.soa.outputs[index][3];
+		LLVMValueRef alpha_ref = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn,
+				SI_PARAM_ALPHA_REF);
+
 		LLVMValueRef alpha_pass =
 			lp_build_cmp(&bld_base->base,
 				     si_shader_ctx->shader->key.ps.alpha_func,
 				     LLVMBuildLoad(gallivm->builder, out_ptr, ""),
-				     lp_build_const_float(gallivm, si_shader_ctx->shader->key.ps.alpha_ref));
+				     alpha_ref);
 		LLVMValueRef arg =
 			lp_build_select(&bld_base->base,
 					alpha_pass,
@@ -1569,7 +1572,7 @@ static void create_function(struct si_shader_context *si_shader_ctx)
 {
 	struct lp_build_tgsi_context *bld_base = &si_shader_ctx->radeon_bld.soa.bld_base;
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
-	LLVMTypeRef params[20], f32, i8, i32, v2i32, v3i32;
+	LLVMTypeRef params[21], f32, i8, i32, v2i32, v3i32;
 	unsigned i, last_sgpr, num_params;
 
 	i8 = LLVMInt8TypeInContext(gallivm->context);
@@ -1614,6 +1617,7 @@ static void create_function(struct si_shader_context *si_shader_ctx)
 		break;
 
 	case TGSI_PROCESSOR_FRAGMENT:
+		params[SI_PARAM_ALPHA_REF] = f32;
 		params[SI_PARAM_PRIM_MASK] = i32;
 		last_sgpr = SI_PARAM_PRIM_MASK;
 		params[SI_PARAM_PERSP_SAMPLE] = v2i32;
diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.h b/src/gallium/drivers/radeonsi/radeonsi_shader.h
index 1db8bb8..c9e851a 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_shader.h
+++ b/src/gallium/drivers/radeonsi/radeonsi_shader.h
@@ -37,9 +37,10 @@
 #define SI_SGPR_VERTEX_BUFFER	6  /* VS only */
 #define SI_SGPR_SO_BUFFER	8  /* VS only, stream-out */
 #define SI_SGPR_START_INSTANCE	10 /* VS only */
+#define SI_SGPR_ALPHA_REF	6  /* PS only */
 
 #define SI_VS_NUM_USER_SGPR	11
-#define SI_PS_NUM_USER_SGPR	6
+#define SI_PS_NUM_USER_SGPR	7
 
 /* LLVM function parameter indices */
 #define SI_PARAM_CONST		0
@@ -53,23 +54,24 @@
 /* the other VS parameters are assigned dynamically */
 
 /* PS only parameters */
-#define SI_PARAM_PRIM_MASK		3
-#define SI_PARAM_PERSP_SAMPLE		4
-#define SI_PARAM_PERSP_CENTER		5
-#define SI_PARAM_PERSP_CENTROID		6
-#define SI_PARAM_PERSP_PULL_MODEL	7
-#define SI_PARAM_LINEAR_SAMPLE		8
-#define SI_PARAM_LINEAR_CENTER		9
-#define SI_PARAM_LINEAR_CENTROID	10
-#define SI_PARAM_LINE_STIPPLE_TEX	11
-#define SI_PARAM_POS_X_FLOAT		12
-#define SI_PARAM_POS_Y_FLOAT		13
-#define SI_PARAM_POS_Z_FLOAT		14
-#define SI_PARAM_POS_W_FLOAT		15
-#define SI_PARAM_FRONT_FACE		16
-#define SI_PARAM_ANCILLARY		17
-#define SI_PARAM_SAMPLE_COVERAGE	18
-#define SI_PARAM_POS_FIXED_PT		19
+#define SI_PARAM_ALPHA_REF		3
+#define SI_PARAM_PRIM_MASK		4
+#define SI_PARAM_PERSP_SAMPLE		5
+#define SI_PARAM_PERSP_CENTER		6
+#define SI_PARAM_PERSP_CENTROID		7
+#define SI_PARAM_PERSP_PULL_MODEL	8
+#define SI_PARAM_LINEAR_SAMPLE		9
+#define SI_PARAM_LINEAR_CENTER		10
+#define SI_PARAM_LINEAR_CENTROID	11
+#define SI_PARAM_LINE_STIPPLE_TEX	12
+#define SI_PARAM_POS_X_FLOAT		13
+#define SI_PARAM_POS_Y_FLOAT		14
+#define SI_PARAM_POS_Z_FLOAT		15
+#define SI_PARAM_POS_W_FLOAT		16
+#define SI_PARAM_FRONT_FACE		17
+#define SI_PARAM_ANCILLARY		18
+#define SI_PARAM_SAMPLE_COVERAGE	19
+#define SI_PARAM_POS_FIXED_PT		20
 
 struct si_shader_io {
 	unsigned		name;
@@ -124,7 +126,6 @@ union si_shader_key {
 		unsigned	alpha_func:3;
 		unsigned	flatshade:1;
 		unsigned	alpha_to_one:1;
-		float		alpha_ref;
 	} ps;
 	struct {
 		unsigned	instance_divisors[PIPE_MAX_ATTRIBS];
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
index 3e771b2..da7c3d0 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -744,6 +744,9 @@ static void *si_create_dsa_state(struct pipe_context *ctx,
 	if (state->alpha.enabled) {
 		dsa->alpha_func = state->alpha.func;
 		dsa->alpha_ref = state->alpha.ref_value;
+
+		si_pm4_set_reg(pm4, R_00B030_SPI_SHADER_USER_DATA_PS_0 +
+		               SI_SGPR_ALPHA_REF * 4, fui(dsa->alpha_ref));
 	} else {
 		dsa->alpha_func = PIPE_FUNC_ALWAYS;
 	}
@@ -2116,10 +2119,6 @@ static INLINE void si_shader_selector_key(struct pipe_context *ctx,
 			    rctx->framebuffer.cbufs[0] &&
 			    util_format_is_pure_integer(rctx->framebuffer.cbufs[0]->texture->format))
 				key->ps.alpha_func = PIPE_FUNC_ALWAYS;
-
-			if (key->ps.alpha_func != PIPE_FUNC_ALWAYS &&
-			    key->ps.alpha_func != PIPE_FUNC_NEVER)
-				key->ps.alpha_ref = rctx->queued.named.dsa->alpha_ref;
 		} else {
 			key->ps.alpha_func = PIPE_FUNC_ALWAYS;
 		}
-- 
1.8.3.1



More information about the mesa-dev mailing list