diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c index 7c57f4c2f3e..704f859efd7 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_shader.c +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c @@ -301,14 +301,8 @@ static void declare_input_fs( /* XXX: Handle all possible interpolation modes */ switch (decl->Interp.Interpolate) { case TGSI_INTERPOLATE_COLOR: - /* XXX: Flat shading hangs the GPU */ - if (si_shader_ctx->rctx->queued.named.rasterizer && - si_shader_ctx->rctx->queued.named.rasterizer->flatshade) { -#if 0 + if (si_shader_ctx->key.flatshade) { intr_name = "llvm.SI.fs.interp.constant"; -#else - intr_name = "llvm.SI.fs.interp.linear.center"; -#endif } else { if (decl->Interp.Centroid) intr_name = "llvm.SI.fs.interp.persp.centroid"; @@ -317,11 +311,8 @@ static void declare_input_fs( } break; case TGSI_INTERPOLATE_CONSTANT: - /* XXX: Flat shading hangs the GPU */ -#if 0 intr_name = "llvm.SI.fs.interp.constant"; break; -#endif case TGSI_INTERPOLATE_LINEAR: if (decl->Interp.Centroid) intr_name = "llvm.SI.fs.interp.linear.centroid"; diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.h b/src/gallium/drivers/radeonsi/radeonsi_shader.h index 07b2f9fc3e6..f54f67c4988 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_shader.h +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.h @@ -82,6 +82,7 @@ struct si_shader_key { unsigned nr_cbufs:4; unsigned color_two_side:1; unsigned alpha_func:3; + unsigned flatshade:1; float alpha_ref; }; diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 81452ebc231..bb1bacdafbd 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -421,8 +421,7 @@ static void *si_create_rs_state(struct pipe_context *ctx, rs->offset_units = state->offset_units; rs->offset_scale = state->offset_scale * 12.0f; - /* XXX: Flat shading hangs the GPU */ - tmp = S_0286D4_FLAT_SHADE_ENA(0); + tmp = S_0286D4_FLAT_SHADE_ENA(1); if (state->sprite_coord_enable) { tmp |= S_0286D4_PNT_SPRITE_ENA(1) | S_0286D4_PNT_SPRITE_OVRD_X(V_0286D4_SPI_PNT_SPRITE_SEL_S) | @@ -1885,7 +1884,7 @@ static INLINE struct si_shader_key si_shader_selector_key(struct pipe_context *c key.export_16bpc = rctx->export_16bpc; if (rctx->queued.named.rasterizer) { key.color_two_side = rctx->queued.named.rasterizer->two_side; - /*key.flatshade = rctx->queued.named.rasterizer->flatshade;*/ + key.flatshade = rctx->queued.named.rasterizer->flatshade; } if (rctx->queued.named.dsa) { key.alpha_func = rctx->queued.named.dsa->alpha_func; diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c index 3704410c9bf..61dea74ac12 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.c +++ b/src/gallium/drivers/radeonsi/si_state_draw.c @@ -128,11 +128,6 @@ static void si_pipe_shader_ps(struct pipe_context *ctx, struct si_pipe_shader *s continue; } - /* XXX: Flat shading hangs the GPU */ - if (shader->shader.input[i].interpolate == TGSI_INTERPOLATE_CONSTANT || - (shader->shader.input[i].interpolate == TGSI_INTERPOLATE_COLOR && - rctx->queued.named.rasterizer->flatshade)) - have_linear = TRUE; if (shader->shader.input[i].interpolate == TGSI_INTERPOLATE_LINEAR) have_linear = TRUE; if (shader->shader.input[i].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) @@ -327,15 +322,12 @@ static void si_update_spi_map(struct r600_context *rctx) bcolor: tmp = 0; -#if 0 - /* XXX: Flat shading hangs the GPU */ if (name == TGSI_SEMANTIC_POSITION || ps->input[i].interpolate == TGSI_INTERPOLATE_CONSTANT || (ps->input[i].interpolate == TGSI_INTERPOLATE_COLOR && - rctx->rasterizer && rctx->rasterizer->flatshade)) { + rctx->ps_shader->current->key.flatshade)) { tmp |= S_028644_FLAT_SHADE(1); } -#endif if (name == TGSI_SEMANTIC_GENERIC && rctx->sprite_coord_enable & (1 << ps->input[i].sid)) {