On Sat, Oct 27, 2012 at 09:03:49PM +0200, Vincent Lejeune wrote: > --- > src/gallium/drivers/r600/r600_llvm.c | 62 > +++++++++++++++++++++++++++------- > src/gallium/drivers/r600/r600_shader.c | 22 ++++++++---- > 2 files changed, 64 insertions(+), 20 deletions(-) >
Reviewed-by: Tom Stellard <thomas.stell...@amd.com> > 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 c56efda..6a8e4e8 100644 > --- a/src/gallium/drivers/r600/r600_shader.c > +++ b/src/gallium/drivers/r600/r600_shader.c > @@ -192,6 +192,7 @@ struct r600_shader_ctx { > uint32_t *literals; > uint32_t nliterals; > uint32_t max_driver_temp_used; > + boolean use_llvm; > /* needed for evergreen interpolation */ > boolean input_centroid; > boolean input_linear; > @@ -759,10 +760,12 @@ static int evergreen_interp_input(struct > r600_shader_ctx *ctx, int index) > > 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 (!ctx->use_llvm) { > + if (ctx->shader->input[index].interpolate > 0) { > + r = evergreen_interp_alu(ctx, index); > + } else { > + r = evergreen_interp_flat(ctx, index); > + } > } > } > return r; > @@ -1131,7 +1134,7 @@ static int tgsi_split_literal_constant(struct > r600_shader_ctx *ctx) > return 0; > } > > -static int process_twoside_color_inputs(struct r600_shader_ctx *ctx, > unsigned use_llvm) > +static int process_twoside_color_inputs(struct r600_shader_ctx *ctx) > { > int i, r, count = ctx->shader->ninput; > > @@ -1143,7 +1146,7 @@ static int process_twoside_color_inputs(struct > r600_shader_ctx *ctx, unsigned us > return r; > } > > - if (!use_llvm) { > + if (!ctx->use_llvm) { > r = select_twoside_color(ctx, i, > back_facing_reg); > if (r) > return r; > @@ -1242,6 +1245,7 @@ static int r600_shader_from_tgsi(struct r600_screen > *rscreen, > use_llvm = 0; > } > #endif > + ctx.use_llvm = use_llvm; > > if (use_llvm) { > ctx.file_offset[TGSI_FILE_OUTPUT] = > @@ -1311,6 +1315,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 > @@ -1334,6 +1339,9 @@ 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++; > + // TGSI to LLVM needs to know the lds position > of inputs. > + // Non LLVM path computes it later (in > process_twoside_color) > + ctx.shader->input[ni].lds_pos = next_lds_loc++; > ctx.shader->input[i].potential_back_facing_reg > = ni; > } > } > @@ -1408,7 +1416,7 @@ static int r600_shader_from_tgsi(struct r600_screen > *rscreen, > } > > if (shader->two_side && ctx.colors_used) { > - if ((r = process_twoside_color_inputs(&ctx, use_llvm))) > + if ((r = process_twoside_color_inputs(&ctx))) > return r; > } > > -- > 1.7.11.7 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev