[Mesa-dev] [PATCH 3/3] r600g: tgsi-to-llvm emits right input intrinsics

Vincent Lejeune vljn at ovi.com
Fri Oct 19 14:19:34 PDT 2012


---
 src/gallium/drivers/r600/r600_llvm.c   | 62 +++++++++++++++++++++++++++-------
 src/gallium/drivers/r600/r600_shader.c | 22 +++++++-----
 2 files changed, 62 insertions(+), 22 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_llvm.c b/src/gallium/drivers/r600/r600_llvm.c
index 321966e..3dec8ae 100644
--- a/src/gallium/drivers/r600/r600_llvm.c
+++ b/src/gallium/drivers/r600/r600_llvm.c
@@ -90,11 +90,11 @@ llvm_face_select_helper(
 
 	LLVMValueRef backcolor = llvm_load_input_helper(
 		ctx,
-		"llvm.R600.load.input",
+		intrinsic,
 		backcolor_regiser);
 	LLVMValueRef front_color = llvm_load_input_helper(
 		ctx,
-		"llvm.R600.load.input",
+		intrinsic,
 		frontcolor_register);
 	LLVMValueRef face = llvm_load_input_helper(
 		ctx,
@@ -120,6 +120,29 @@ static void llvm_load_input(
 {
 	unsigned chan;
 
+	const char *intrinsics = "llvm.R600.load.input";
+	unsigned offset = 4 * ctx->reserved_reg_count;
+
+	if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->chip_class >= EVERGREEN) {
+		switch (decl->Interp.Interpolate) {
+		case TGSI_INTERPOLATE_COLOR:
+		case TGSI_INTERPOLATE_PERSPECTIVE:
+			offset = 0;
+			intrinsics = "llvm.R600.load.input.perspective";
+			break;
+		case TGSI_INTERPOLATE_LINEAR:
+			offset = 0;
+			intrinsics = "llvm.R600.load.input.linear";
+			break;
+		case TGSI_INTERPOLATE_CONSTANT:
+			offset = 0;
+			intrinsics = "llvm.R600.load.input.constant";
+			break;
+		default:
+			assert(0 && "Unknow Interpolate mode");
+		}
+	}
+
 	for (chan = 0; chan < 4; chan++) {
 		unsigned soa_index = radeon_llvm_reg_index_soa(input_index,
 								chan);
@@ -145,24 +168,37 @@ static void llvm_load_input(
 			break;
 		case TGSI_SEMANTIC_COLOR:
 			if (ctx->two_side) {
+				unsigned front_location, back_location;
 				unsigned back_reg = ctx->r600_inputs[input_index]
 					.potential_back_facing_reg;
-				unsigned back_soa_index = radeon_llvm_reg_index_soa(
-					ctx->r600_inputs[back_reg].gpr,
-					chan);
+				if (ctx->chip_class >= EVERGREEN) {
+					front_location = 4 * ctx->r600_inputs[input_index].lds_pos + chan;
+					back_location = 4 * ctx->r600_inputs[back_reg].lds_pos + chan;
+				} else {
+					front_location = soa_index + 4 * ctx->reserved_reg_count;
+					back_location = radeon_llvm_reg_index_soa(
+						ctx->r600_inputs[back_reg].gpr,
+						chan);
+				}
 				ctx->inputs[soa_index] = llvm_face_select_helper(ctx,
-				"llvm.R600.load.input",
-					4 * ctx->face_input,
-					soa_index + 4 * ctx->reserved_reg_count,
-					back_soa_index);
+					intrinsics,
+					4 * ctx->face_input, front_location, back_location);
 				break;
 			}
 		default:
-			/* The * 4 is assuming that we are in soa mode. */
-			ctx->inputs[soa_index] = llvm_load_input_helper(ctx,
-				"llvm.R600.load.input",
-				soa_index + (ctx->reserved_reg_count * 4));
+			{
+				unsigned location;
+				if (ctx->chip_class >= EVERGREEN) {
+					location = 4 * ctx->r600_inputs[input_index].lds_pos + chan;
+				} else {
+					location = soa_index + 4 * ctx->reserved_reg_count;
+				}
+				/* The * 4 is assuming that we are in soa mode. */
+				ctx->inputs[soa_index] = llvm_load_input_helper(ctx,
+					intrinsics, location);
+					
 			break;
+			}
 		}
 	}
 }
diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
index 2e3d805..7e0bf7d 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -751,16 +751,18 @@ static int r600_spi_sid(struct r600_shader_io * io)
 };
 
 /* turn input into interpolate on EG */
-static int evergreen_interp_input(struct r600_shader_ctx *ctx, int index)
+static int evergreen_interp_input(struct r600_shader_ctx *ctx, int index, unsigned use_llvm)
 {
 	int r = 0;
 
 	if (ctx->shader->input[index].spi_sid) {
 		ctx->shader->input[index].lds_pos = ctx->shader->nlds++;
-		if (ctx->shader->input[index].interpolate > 0) {
-			r = evergreen_interp_alu(ctx, index);
-		} else {
-			r = evergreen_interp_flat(ctx, index);
+		if (!use_llvm) {
+			if (ctx->shader->input[index].interpolate > 0) {
+				r = evergreen_interp_alu(ctx, index);
+			} else {
+				r = evergreen_interp_flat(ctx, index);
+			}
 		}
 	}
 	return r;
@@ -795,7 +797,7 @@ static int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back
 	return 0;
 }
 
-static int tgsi_declaration(struct r600_shader_ctx *ctx)
+static int tgsi_declaration(struct r600_shader_ctx *ctx, unsigned use_llvm)
 {
 	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
 	unsigned i;
@@ -823,7 +825,7 @@ static int tgsi_declaration(struct r600_shader_ctx *ctx)
 				break;
 			}
 			if (ctx->bc->chip_class >= EVERGREEN) {
-				if ((r = evergreen_interp_input(ctx, i)))
+				if ((r = evergreen_interp_input(ctx, i, use_llvm)))
 					return r;
 			}
 		}
@@ -1137,7 +1139,7 @@ static int process_twoside_color_inputs(struct r600_shader_ctx *ctx, unsigned us
 		if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) {
 			unsigned back_facing_reg = ctx->shader->input[i].potential_back_facing_reg;
 			if (ctx->bc->chip_class >= EVERGREEN) {
-				if ((r = evergreen_interp_input(ctx, back_facing_reg)))
+				if ((r = evergreen_interp_input(ctx, back_facing_reg, use_llvm)))
 					return r;
 			}
 			
@@ -1281,7 +1283,7 @@ static int r600_shader_from_tgsi(struct r600_screen *rscreen,
 			ctx.nliterals++;
 			break;
 		case TGSI_TOKEN_TYPE_DECLARATION:
-			r = tgsi_declaration(&ctx);
+			r = tgsi_declaration(&ctx, use_llvm);
 			if (r)
 				goto out_err;
 			break;
@@ -1309,6 +1311,7 @@ static int r600_shader_from_tgsi(struct r600_screen *rscreen,
 	/* Process two side if needed */
 	if (shader->two_side && ctx.colors_used) {
 		int i, count = ctx.shader->ninput;
+		unsigned next_lds_loc = ctx.shader->nlds;
 
 		/* additional inputs will be allocated right after the existing inputs,
 		 * we won't need them after the color selection, so we don't need to
@@ -1332,6 +1335,7 @@ static int r600_shader_from_tgsi(struct r600_screen *rscreen,
 				ctx.shader->input[ni].name = TGSI_SEMANTIC_BCOLOR;
 				ctx.shader->input[ni].spi_sid = r600_spi_sid(&ctx.shader->input[ni]);
 				ctx.shader->input[ni].gpr = gpr++;
+				ctx.shader->input[ni].lds_pos = next_lds_loc++;
 				ctx.shader->input[i].potential_back_facing_reg = ni;
 			}
 		}
-- 
1.7.11.7



More information about the mesa-dev mailing list