[Mesa-dev] [PATCH 2/4] radeonsi: interpolate colors after interpolation weight shuffling

Marek Olšák maraeo at gmail.com
Tue Oct 4 22:35:51 UTC 2016


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

---
 src/gallium/drivers/radeonsi/si_shader.c | 96 ++++++++++++++++----------------
 1 file changed, 48 insertions(+), 48 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index 30bf093..590ae64 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -7268,68 +7268,20 @@ static bool si_compile_ps_prolog(struct si_screen *sscreen,
 			/* Select LINEAR_CENTROID. */
 			for (i = 0; i < 2; i++) {
 				tmp = LLVMBuildSelect(gallivm->builder, bc_optimize,
 						      center[i], centroid[i], "");
 				ret = LLVMBuildInsertValue(gallivm->builder, ret,
 							   tmp, base + 10 + i, "");
 			}
 		}
 	}
 
-	/* Interpolate colors. */
-	for (i = 0; i < 2; i++) {
-		unsigned writemask = (key->ps_prolog.colors_read >> (i * 4)) & 0xf;
-		unsigned face_vgpr = key->ps_prolog.num_input_sgprs +
-				     key->ps_prolog.face_vgpr_index;
-		LLVMValueRef interp[2], color[4];
-		LLVMValueRef interp_ij = NULL, prim_mask = NULL, face = NULL;
-
-		if (!writemask)
-			continue;
-
-		/* If the interpolation qualifier is not CONSTANT (-1). */
-		if (key->ps_prolog.color_interp_vgpr_index[i] != -1) {
-			unsigned interp_vgpr = key->ps_prolog.num_input_sgprs +
-					       key->ps_prolog.color_interp_vgpr_index[i];
-
-			/* Get the (i,j) updated by bc_optimize handling. */
-			interp[0] = LLVMBuildExtractValue(gallivm->builder, ret,
-							  interp_vgpr, "");
-			interp[1] = LLVMBuildExtractValue(gallivm->builder, ret,
-							  interp_vgpr + 1, "");
-			interp_ij = lp_build_gather_values(gallivm, interp, 2);
-			interp_ij = LLVMBuildBitCast(gallivm->builder, interp_ij,
-						     ctx.v2i32, "");
-		}
-
-		/* Use the absolute location of the input. */
-		prim_mask = LLVMGetParam(func, SI_PS_NUM_USER_SGPR);
-
-		if (key->ps_prolog.states.color_two_side) {
-			face = LLVMGetParam(func, face_vgpr);
-			face = LLVMBuildBitCast(gallivm->builder, face, ctx.i32, "");
-		}
-
-		interp_fs_input(&ctx,
-				key->ps_prolog.color_attr_index[i],
-				TGSI_SEMANTIC_COLOR, i,
-				key->ps_prolog.num_interp_inputs,
-				key->ps_prolog.colors_read, interp_ij,
-				prim_mask, face, color);
-
-		while (writemask) {
-			unsigned chan = u_bit_scan(&writemask);
-			ret = LLVMBuildInsertValue(gallivm->builder, ret, color[chan],
-						   num_params++, "");
-		}
-	}
-
 	/* Force per-sample interpolation. */
 	if (key->ps_prolog.states.force_persp_sample_interp) {
 		unsigned i, base = key->ps_prolog.num_input_sgprs;
 		LLVMValueRef persp_sample[2];
 
 		/* Read PERSP_SAMPLE. */
 		for (i = 0; i < 2; i++)
 			persp_sample[i] = LLVMGetParam(func, base + i);
 		/* Overwrite PERSP_CENTER. */
 		for (i = 0; i < 2; i++)
@@ -7384,20 +7336,68 @@ static bool si_compile_ps_prolog(struct si_screen *sscreen,
 		/* Overwrite LINEAR_SAMPLE. */
 		for (i = 0; i < 2; i++)
 			ret = LLVMBuildInsertValue(gallivm->builder, ret,
 						   linear_center[i], base + 6 + i, "");
 		/* Overwrite LINEAR_CENTROID. */
 		for (i = 0; i < 2; i++)
 			ret = LLVMBuildInsertValue(gallivm->builder, ret,
 						   linear_center[i], base + 10 + i, "");
 	}
 
+	/* Interpolate colors. */
+	for (i = 0; i < 2; i++) {
+		unsigned writemask = (key->ps_prolog.colors_read >> (i * 4)) & 0xf;
+		unsigned face_vgpr = key->ps_prolog.num_input_sgprs +
+				     key->ps_prolog.face_vgpr_index;
+		LLVMValueRef interp[2], color[4];
+		LLVMValueRef interp_ij = NULL, prim_mask = NULL, face = NULL;
+
+		if (!writemask)
+			continue;
+
+		/* If the interpolation qualifier is not CONSTANT (-1). */
+		if (key->ps_prolog.color_interp_vgpr_index[i] != -1) {
+			unsigned interp_vgpr = key->ps_prolog.num_input_sgprs +
+					       key->ps_prolog.color_interp_vgpr_index[i];
+
+			/* Get the (i,j) updated by bc_optimize handling. */
+			interp[0] = LLVMBuildExtractValue(gallivm->builder, ret,
+							  interp_vgpr, "");
+			interp[1] = LLVMBuildExtractValue(gallivm->builder, ret,
+							  interp_vgpr + 1, "");
+			interp_ij = lp_build_gather_values(gallivm, interp, 2);
+			interp_ij = LLVMBuildBitCast(gallivm->builder, interp_ij,
+						     ctx.v2i32, "");
+		}
+
+		/* Use the absolute location of the input. */
+		prim_mask = LLVMGetParam(func, SI_PS_NUM_USER_SGPR);
+
+		if (key->ps_prolog.states.color_two_side) {
+			face = LLVMGetParam(func, face_vgpr);
+			face = LLVMBuildBitCast(gallivm->builder, face, ctx.i32, "");
+		}
+
+		interp_fs_input(&ctx,
+				key->ps_prolog.color_attr_index[i],
+				TGSI_SEMANTIC_COLOR, i,
+				key->ps_prolog.num_interp_inputs,
+				key->ps_prolog.colors_read, interp_ij,
+				prim_mask, face, color);
+
+		while (writemask) {
+			unsigned chan = u_bit_scan(&writemask);
+			ret = LLVMBuildInsertValue(gallivm->builder, ret, color[chan],
+						   num_params++, "");
+		}
+	}
+
 	/* Tell LLVM to insert WQM instruction sequence when needed. */
 	if (key->ps_prolog.wqm) {
 		LLVMAddTargetDependentFunctionAttr(func,
 						   "amdgpu-ps-wqm-outputs", "");
 	}
 
 	/* Compile. */
 	si_llvm_build_ret(&ctx, ret);
 	radeon_llvm_finalize_module(&ctx.radeon_bld);
 
-- 
2.7.4



More information about the mesa-dev mailing list