Mesa (master): radeonsi: Handle TGSI_SEMANTIC_FACE.

Michel Dänzer daenzer at kemper.freedesktop.org
Fri Oct 26 13:56:25 UTC 2012


Module: Mesa
Branch: master
Commit: 97078b198d7362c465ff9d726ccbf4e072e51ae9
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=97078b198d7362c465ff9d726ccbf4e072e51ae9

Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Tue Sep 25 12:41:31 2012 +0200

radeonsi: Handle TGSI_SEMANTIC_FACE.

Fixes two piglit tests using gl_FrontFacing.

Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
Reviewed-by: Tom Stellard <thomas.stellard at amd.com>

---

 src/gallium/drivers/radeonsi/radeonsi_shader.c |   27 ++++++++++++++++++++++++
 src/gallium/drivers/radeonsi/si_state_draw.c   |    5 +++-
 2 files changed, 31 insertions(+), 1 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c
index aec5c2e..53e889c 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_shader.c
+++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c
@@ -266,6 +266,33 @@ static void declare_input_fs(
 		return;
 	}
 
+	if (decl->Semantic.Name == TGSI_SEMANTIC_FACE) {
+		LLVMValueRef face, is_face_positive;
+
+		face = build_intrinsic(gallivm->builder,
+				       "llvm.SI.fs.read.face",
+				       input_type,
+				       NULL, 0, LLVMReadNoneAttribute);
+		is_face_positive = LLVMBuildFCmp(gallivm->builder,
+						 LLVMRealUGT, face,
+						 lp_build_const_float(gallivm, 0.0f),
+						 "");
+
+		si_shader_ctx->radeon_bld.inputs[radeon_llvm_reg_index_soa(input_index, 0)] =
+			LLVMBuildSelect(gallivm->builder,
+					is_face_positive,
+					lp_build_const_float(gallivm, 1.0f),
+					lp_build_const_float(gallivm, 0.0f),
+					"");
+		si_shader_ctx->radeon_bld.inputs[radeon_llvm_reg_index_soa(input_index, 1)] =
+		si_shader_ctx->radeon_bld.inputs[radeon_llvm_reg_index_soa(input_index, 2)] =
+			lp_build_const_float(gallivm, 0.0f);
+		si_shader_ctx->radeon_bld.inputs[radeon_llvm_reg_index_soa(input_index, 3)] =
+			lp_build_const_float(gallivm, 1.0f);
+
+		return;
+	}
+
 	shader->input[input_index].param_offset = shader->ninterp++;
 	attr_number = lp_build_const_int32(gallivm,
 					   shader->input[input_index].param_offset);
diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c
index 3ac80b0..d5587c7 100644
--- a/src/gallium/drivers/radeonsi/si_state_draw.c
+++ b/src/gallium/drivers/radeonsi/si_state_draw.c
@@ -110,7 +110,8 @@ static void si_pipe_shader_ps(struct pipe_context *ctx, struct si_pipe_shader *s
 
 	db_shader_control = S_02880C_Z_ORDER(V_02880C_EARLY_Z_THEN_LATE_Z);
 	for (i = 0; i < shader->shader.ninput; i++) {
-		if (shader->shader.input[i].name == TGSI_SEMANTIC_POSITION) {
+		switch (shader->shader.input[i].name) {
+		case TGSI_SEMANTIC_POSITION:
 			if (shader->shader.input[i].centroid) {
 				/* fragcoord_interp_mode will be written to
 				 * SPI_BARYC_CNTL.POS_FLOAT_LOCATION
@@ -122,6 +123,8 @@ static void si_pipe_shader_ps(struct pipe_context *ctx, struct si_pipe_shader *s
 			 	 */
 				fragcoord_interp_mode = 1;
 			}
+			/* Fall through */
+		case TGSI_SEMANTIC_FACE:
 			continue;
 		}
 




More information about the mesa-commit mailing list