Module: Mesa
Branch: master
Commit: 80663cb1859c3398804d720022eebcf9a0df1716
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=80663cb1859c3398804d720022eebcf9a0df1716

Author: Vincent Lejeune <v...@ovi.com>
Date:   Sun Sep 23 16:52:30 2012 +0200

r600g: frontcolor tracks its associated backcolor

Reviewed-by: Tom Stellard <thomas.stell...@amd.com>

---

 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 bf4877a..0c585de 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -1132,36 +1132,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;
                }
@@ -1323,6 +1301,37 @@ static int r600_shader_from_tgsi(struct r600_screen 
*rscreen,
                        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 d68dd07..2b8412a 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;
 };
 

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to