summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Lejeune <vljn@ovi.com>2012-10-19 15:49:06 +0200
committerVincent Lejeune <vljn@ovi.com>2012-10-19 21:18:33 +0200
commitfbc78d0e49f595e1e22a4137fc92d689c920dd5b (patch)
tree3845adddf49bf1ba7ef5bbc73850b0991f7aa9dd
parent9a8e9d91d2a8d0d9727d6a65a001b7dafc74fc48 (diff)
r600g: tgsi-to-llvm emits right input intrinsicscayman-fix
-rw-r--r--src/gallium/drivers/r600/r600_llvm.c62
-rw-r--r--src/gallium/drivers/r600/r600_shader.c22
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 321966e016..3dec8ae253 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 2e3d8057f4..7e0bf7dfa1 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;
}
}