diff options
author | Vincent Lejeune <vljn@ovi.com> | 2012-10-19 15:49:06 +0200 |
---|---|---|
committer | Vincent Lejeune <vljn@ovi.com> | 2012-10-19 21:18:33 +0200 |
commit | fbc78d0e49f595e1e22a4137fc92d689c920dd5b (patch) | |
tree | 3845adddf49bf1ba7ef5bbc73850b0991f7aa9dd | |
parent | 9a8e9d91d2a8d0d9727d6a65a001b7dafc74fc48 (diff) |
r600g: tgsi-to-llvm emits right input intrinsicscayman-fix
-rw-r--r-- | src/gallium/drivers/r600/r600_llvm.c | 62 | ||||
-rw-r--r-- | 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 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; } } |