Mesa (master): r600g: frontcolor tracks its associated backcolor
Vincent Lejeune
vlj at kemper.freedesktop.org
Tue Oct 9 21:19:21 UTC 2012
Module: Mesa
Branch: master
Commit: 80663cb1859c3398804d720022eebcf9a0df1716
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=80663cb1859c3398804d720022eebcf9a0df1716
Author: Vincent Lejeune <vljn at ovi.com>
Date: Sun Sep 23 16:52:30 2012 +0200
r600g: frontcolor tracks its associated backcolor
Reviewed-by: Tom Stellard <thomas.stellard at 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;
};
More information about the mesa-commit
mailing list