On Fri, Oct 19, 2012 at 11:19:34PM +0200, Vincent Lejeune wrote:
> ---
>  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;

I think we should just add use_llvm as a member of struct
r600_shader_ctx, rather than modifying all the function signatures.

>                       }
>               }
> @@ -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++;

Why was this line added here?

>                               ctx.shader->input[i].potential_back_facing_reg 
> = ni;
>                       }
>               }
> -- 
> 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

Reply via email to