On Mon, Sep 24, 2012 at 12:43:16AM +0200, Vincent Lejeune wrote:
> ---

I'm not too familiar with this code, but this patch looks good to me.
Just make sure there are no regressions with the TGSI compiler.

Reviewed-by: Tom Stellard <[email protected]>

>  src/gallium/drivers/r600/r600_shader.c | 59 
> ++++++++++++++++++++--------------
>  src/gallium/drivers/r600/r600_shader.h |  1 +
>  2 files changed, 35 insertions(+), 25 deletions(-)
> 
> diff --git a/src/gallium/drivers/r600/r600_shader.c 
> b/src/gallium/drivers/r600/r600_shader.c
> index 14c1763..310ab62 100644
> --- a/src/gallium/drivers/r600/r600_shader.c
> +++ b/src/gallium/drivers/r600/r600_shader.c
> @@ -1123,36 +1123,14 @@ static int process_twoside_color_inputs(struct 
> r600_shader_ctx *ctx)
>  {
>       int i, r, count = ctx->shader->ninput;
>  
> -     /* 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
> -      * reserve these gprs for the rest of the shader code and to adjust
> -      * output offsets etc. */
> -     int gpr = ctx->file_offset[TGSI_FILE_INPUT] +
> -                     ctx->info.file_max[TGSI_FILE_INPUT] + 1;
> -
> -     if (ctx->face_gpr == -1) {
> -             i = ctx->shader->ninput++;
> -             ctx->shader->input[i].name = TGSI_SEMANTIC_FACE;
> -             ctx->shader->input[i].spi_sid = 0;
> -             ctx->shader->input[i].gpr = gpr++;
> -             ctx->face_gpr = ctx->shader->input[i].gpr;
> -     }
> -
>       for (i = 0; i < count; i++) {
>               if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) {
> -                     int ni = ctx->shader->ninput++;
> -                     memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], 
> sizeof(struct r600_shader_io));
> -                     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++;
> -
> +                     unsigned back_facing_reg = 
> ctx->shader->input[i].potential_back_facing_reg;
>                       if (ctx->bc->chip_class >= EVERGREEN) {
> -                             r = evergreen_interp_input(ctx, ni);
> -                             if (r)
> +                             if ((r = evergreen_interp_input(ctx, 
> back_facing_reg)))
>                                       return r;
>                       }
> -
> -                     r = select_twoside_color(ctx, i, ni);
> +                     r = select_twoside_color(ctx, i, back_facing_reg);
>                       if (r)
>                               return r;
>               }
> @@ -1313,6 +1291,37 @@ static int r600_shader_from_tgsi(struct r600_context * 
> rctx, struct r600_pipe_sh
>                       goto out_err;
>               }
>       }
> +     
> +     /* Process two side if needed */
> +     if (shader->two_side && ctx.colors_used) {
> +             int i, count = ctx.shader->ninput;
> +
> +             /* 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
> +              * reserve these gprs for the rest of the shader code and to 
> adjust
> +              * output offsets etc. */
> +             int gpr = ctx.file_offset[TGSI_FILE_INPUT] +
> +                             ctx.info.file_max[TGSI_FILE_INPUT] + 1;
> +
> +             if (ctx.face_gpr == -1) {
> +                     i = ctx.shader->ninput++;
> +                     ctx.shader->input[i].name = TGSI_SEMANTIC_FACE;
> +                     ctx.shader->input[i].spi_sid = 0;
> +                     ctx.shader->input[i].gpr = gpr++;
> +                     ctx.face_gpr = ctx.shader->input[i].gpr;
> +             }
> +
> +             for (i = 0; i < count; i++) {
> +                     if (ctx.shader->input[i].name == TGSI_SEMANTIC_COLOR) {
> +                             int ni = ctx.shader->ninput++;
> +                             
> memcpy(&ctx.shader->input[ni],&ctx.shader->input[i], sizeof(struct 
> r600_shader_io));
> +                             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[i].potential_back_facing_reg 
> = ni;
> +                     }
> +             }
> +     }
>  
>  /* LLVM backend setup */
>  #ifdef R600_USE_LLVM
> diff --git a/src/gallium/drivers/r600/r600_shader.h 
> b/src/gallium/drivers/r600/r600_shader.h
> index eb0bbf6..e8a8cec 100644
> --- a/src/gallium/drivers/r600/r600_shader.h
> +++ b/src/gallium/drivers/r600/r600_shader.h
> @@ -34,6 +34,7 @@ struct r600_shader_io {
>       unsigned                interpolate;
>       boolean                 centroid;
>       unsigned                lds_pos; /* for evergreen */
> +     unsigned                potential_back_facing_reg;
>       unsigned                write_mask;
>  };
>  
> -- 
> 1.7.11.4
> 
> _______________________________________________
> mesa-dev mailing list
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to