r600g: frontcolor tracks its associated backcolor
authorVincent Lejeune <vljn@ovi.com>
Sun, 23 Sep 2012 14:52:30 +0000 (16:52 +0200)
committerVincent Lejeune <vljn@ovi.com>
Tue, 9 Oct 2012 21:19:09 +0000 (23:19 +0200)
Reviewed-by: Tom Stellard <thomas.stellard@amd.com>
src/gallium/drivers/r600/r600_shader.c
src/gallium/drivers/r600/r600_shader.h

index bf4877ae81d7f6a1aba8243f1dbf2912fcd8e6cf..0c585de8263ca9a1a63bf8e92458b85e0f11b0d2 100644 (file)
@@ -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
index d68dd0762eb55064d4588be4a3b77da48b575739..2b8412aa80fc832ced17e95bb69028e4430642b0 100644 (file)
@@ -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;
 };