diff options
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/r600/r600_shader.c | 59 | ||||
-rw-r--r-- | 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 bf4877ae81d..0c585de8263 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 d68dd0762eb..2b8412aa80f 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; }; |