---
 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

Reply via email to