diff options
Diffstat (limited to 'src/gallium/drivers/radeonsi/si_state_draw.c')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state_draw.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c index 629ec03e2fb..3ac80b0a6e4 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.c +++ b/src/gallium/drivers/radeonsi/si_state_draw.c @@ -328,11 +328,15 @@ static void si_update_spi_map(struct r600_context *rctx) unsigned i, j, tmp; for (i = 0; i < ps->ninput; i++) { + unsigned name = ps->input[i].name; + unsigned param_offset = ps->input[i].param_offset; + +bcolor: tmp = 0; #if 0 /* XXX: Flat shading hangs the GPU */ - if (ps->input[i].name == TGSI_SEMANTIC_POSITION || + if (name == TGSI_SEMANTIC_POSITION || ps->input[i].interpolate == TGSI_INTERPOLATE_CONSTANT || (ps->input[i].interpolate == TGSI_INTERPOLATE_COLOR && rctx->rasterizer && rctx->rasterizer->flatshade)) { @@ -340,13 +344,13 @@ static void si_update_spi_map(struct r600_context *rctx) } #endif - if (ps->input[i].name == TGSI_SEMANTIC_GENERIC && + if (name == TGSI_SEMANTIC_GENERIC && rctx->sprite_coord_enable & (1 << ps->input[i].sid)) { tmp |= S_028644_PT_SPRITE_TEX(1); } for (j = 0; j < vs->noutput; j++) { - if (ps->input[i].name == vs->output[j].name && + if (name == vs->output[j].name && ps->input[i].sid == vs->output[j].sid) { tmp |= S_028644_OFFSET(vs->output[j].param_offset); break; @@ -359,8 +363,15 @@ static void si_update_spi_map(struct r600_context *rctx) } si_pm4_set_reg(pm4, - R_028644_SPI_PS_INPUT_CNTL_0 + ps->input[i].param_offset * 4, + R_028644_SPI_PS_INPUT_CNTL_0 + param_offset * 4, tmp); + + if (name == TGSI_SEMANTIC_COLOR && + rctx->ps_shader->current->key.color_two_side) { + name = TGSI_SEMANTIC_BCOLOR; + param_offset++; + goto bcolor; + } } si_pm4_set_state(rctx, spi, pm4); |