Mesa (master): radeonsi: Flesh out shader interpolation related code.

Michel Dänzer daenzer at kemper.freedesktop.org
Mon May 14 15:58:22 UTC 2012


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

Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Mon May 14 16:26:19 2012 +0200

radeonsi: Flesh out shader interpolation related code.

Handle perspective interpolation and ceontroid vs. center.

---

 src/gallium/drivers/radeon/SIInstructions.td   |   18 ++++++++++++++++++
 src/gallium/drivers/radeon/SIIntrinsics.td     |    3 +++
 src/gallium/drivers/radeonsi/radeonsi_shader.c |   21 +++++++++++++++++----
 3 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/radeon/SIInstructions.td b/src/gallium/drivers/radeon/SIInstructions.td
index 57bbc7a..313728f 100644
--- a/src/gallium/drivers/radeon/SIInstructions.td
+++ b/src/gallium/drivers/radeon/SIInstructions.td
@@ -934,6 +934,24 @@ def : Pat <
              imm:$attr, SReg_32:$params)
 >;
 
+def : Pat <
+  (int_SI_fs_interp_linear_centroid imm:$attr_chan, imm:$attr, SReg_32:$params),
+  (SI_INTERP (f32 LINEAR_CENTROID_I), (f32 LINEAR_CENTROID_J), imm:$attr_chan,
+             imm:$attr, SReg_32:$params)
+>;
+
+def : Pat <
+  (int_SI_fs_interp_persp_center imm:$attr_chan, imm:$attr, SReg_32:$params),
+  (SI_INTERP (f32 PERSP_CENTER_I), (f32 PERSP_CENTER_J), imm:$attr_chan,
+             imm:$attr, SReg_32:$params)
+>;
+
+def : Pat <
+  (int_SI_fs_interp_persp_centroid imm:$attr_chan, imm:$attr, SReg_32:$params),
+  (SI_INTERP (f32 PERSP_CENTROID_I), (f32 PERSP_CENTROID_J), imm:$attr_chan,
+             imm:$attr, SReg_32:$params)
+>;
+
 /********** ================== **********/
 /********** Intrinsic Patterns **********/
 /********** ================== **********/
diff --git a/src/gallium/drivers/radeon/SIIntrinsics.td b/src/gallium/drivers/radeon/SIIntrinsics.td
index 4d23072..4e71835 100644
--- a/src/gallium/drivers/radeon/SIIntrinsics.td
+++ b/src/gallium/drivers/radeon/SIIntrinsics.td
@@ -30,5 +30,8 @@ let TargetPrefix = "SI", isTarget = 1 in {
   class Interp : Intrinsic <[llvm_float_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
 
   def int_SI_fs_interp_linear_center : Interp;
+  def int_SI_fs_interp_linear_centroid : Interp;
+  def int_SI_fs_interp_persp_center : Interp;
+  def int_SI_fs_interp_persp_centroid : Interp;
   def int_SI_fs_interp_constant : Interp;
 }
diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c
index 0e1a97b..396b94a 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_shader.c
+++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c
@@ -201,16 +201,29 @@ static void declare_input_fs(
 	/* XXX: Handle all possible interpolation modes */
 	switch (decl->Interp.Interpolate) {
 	case TGSI_INTERPOLATE_COLOR:
-		if (si_shader_ctx->rctx->rasterizer->flatshade)
+		if (si_shader_ctx->rctx->rasterizer->flatshade) {
 			intr_name = "llvm.SI.fs.interp.constant";
-		else
-			intr_name = "llvm.SI.fs.interp.linear.center";
+		} else {
+			if (decl->Interp.Centroid)
+				intr_name = "llvm.SI.fs.interp.persp.centroid";
+			else
+				intr_name = "llvm.SI.fs.interp.persp.center";
+		}
 		break;
 	case TGSI_INTERPOLATE_CONSTANT:
 		intr_name = "llvm.SI.fs.interp.constant";
 		break;
 	case TGSI_INTERPOLATE_LINEAR:
-		intr_name = "llvm.SI.fs.interp.linear.center";
+		if (decl->Interp.Centroid)
+			intr_name = "llvm.SI.fs.interp.linear.centroid";
+		else
+			intr_name = "llvm.SI.fs.interp.linear.center";
+		break;
+	case TGSI_INTERPOLATE_PERSPECTIVE:
+		if (decl->Interp.Centroid)
+			intr_name = "llvm.SI.fs.interp.persp.centroid";
+		else
+			intr_name = "llvm.SI.fs.interp.persp.center";
 		break;
 	default:
 		fprintf(stderr, "Warning: Unhandled interpolation mode.\n");




More information about the mesa-commit mailing list