diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c index e4716817f30..e3f80929b03 100644 --- a/src/gallium/drivers/r600/evergreen_state.c +++ b/src/gallium/drivers/r600/evergreen_state.c @@ -3335,9 +3335,16 @@ void evergreen_update_ps_state(struct pipe_context *ctx, struct r600_pipe_shader }; unsigned spi_baryc_cntl = 0, sid, tmp, num = 0; unsigned z_export = 0, stencil_export = 0, mask_export = 0; - unsigned sprite_coord_enable = rctx->rasterizer ? rctx->rasterizer->sprite_coord_enable : 0; uint32_t spi_ps_input_cntl[32]; + /* Pull any state we use out of rctx. Make sure that any additional + * state added to this list is also checked in the caller in + * r600_update_derived_state(). + */ + bool sprite_coord_enable = rctx->rasterizer ? rctx->rasterizer->sprite_coord_enable : 0; + bool flatshade = rctx->rasterizer ? rctx->rasterizer->flatshade : 0; + bool msaa = rctx->framebuffer.nr_samples > 1 && rctx->ps_iter_samples > 0; + if (!cb->buf) { r600_init_command_buffer(cb, 64); } else { @@ -3389,8 +3396,7 @@ void evergreen_update_ps_state(struct pipe_context *ctx, struct r600_pipe_shader if (rshader->input[i].name == TGSI_SEMANTIC_POSITION || rshader->input[i].interpolate == TGSI_INTERPOLATE_CONSTANT || - (rshader->input[i].interpolate == TGSI_INTERPOLATE_COLOR && - rctx->rasterizer && rctx->rasterizer->flatshade)) { + (rshader->input[i].interpolate == TGSI_INTERPOLATE_COLOR && flatshade)) { tmp |= S_028644_FLAT_SHADE(1); } @@ -3412,8 +3418,7 @@ void evergreen_update_ps_state(struct pipe_context *ctx, struct r600_pipe_shader z_export = 1; if (rshader->output[i].name == TGSI_SEMANTIC_STENCIL) stencil_export = 1; - if (rshader->output[i].name == TGSI_SEMANTIC_SAMPLEMASK && - rctx->framebuffer.nr_samples > 1 && rctx->ps_iter_samples > 0) + if (rshader->output[i].name == TGSI_SEMANTIC_SAMPLEMASK && msaa) mask_export = 1; } if (rshader->uses_kill) @@ -3512,8 +3517,8 @@ void evergreen_update_ps_state(struct pipe_context *ctx, struct r600_pipe_shader shader->ps_depth_export = z_export | stencil_export | mask_export; shader->sprite_coord_enable = sprite_coord_enable; - if (rctx->rasterizer) - shader->flatshade = rctx->rasterizer->flatshade; + shader->flatshade = flatshade; + shader->msaa = msaa; } void evergreen_update_es_state(struct pipe_context *ctx, struct r600_pipe_shader *shader) diff --git a/src/gallium/drivers/r600/r600_shader.h b/src/gallium/drivers/r600/r600_shader.h index 6d8f3e7cc69..25b3ca58afc 100644 --- a/src/gallium/drivers/r600/r600_shader.h +++ b/src/gallium/drivers/r600/r600_shader.h @@ -172,6 +172,7 @@ struct r600_pipe_shader { struct r600_resource *bo; unsigned sprite_coord_enable; unsigned flatshade; + unsigned msaa; unsigned pa_cl_vs_out_cntl; unsigned nr_ps_color_outputs; unsigned ps_color_export_mask; diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c index 99b195b557f..274978e5f85 100644 --- a/src/gallium/drivers/r600/r600_state.c +++ b/src/gallium/drivers/r600/r600_state.c @@ -2446,7 +2446,14 @@ void r600_update_ps_state(struct pipe_context *ctx, struct r600_pipe_shader *sha unsigned tmp, sid, ufi = 0; int need_linear = 0; unsigned z_export = 0, stencil_export = 0, mask_export = 0; - unsigned sprite_coord_enable = rctx->rasterizer ? rctx->rasterizer->sprite_coord_enable : 0; + + /* Pull any state we use out of rctx. Make sure that any additional + * state added to this list is also checked in the caller in + * r600_update_derived_state(). + */ + bool sprite_coord_enable = rctx->rasterizer ? rctx->rasterizer->sprite_coord_enable : 0; + bool flatshade = rctx->rasterizer ? rctx->rasterizer->flatshade : 0; + bool msaa = rctx->framebuffer.nr_samples > 1 && rctx->ps_iter_samples > 0; if (!cb->buf) { r600_init_command_buffer(cb, 64); @@ -2473,8 +2480,7 @@ void r600_update_ps_state(struct pipe_context *ctx, struct r600_pipe_shader *sha if (rshader->input[i].name == TGSI_SEMANTIC_POSITION || rshader->input[i].interpolate == TGSI_INTERPOLATE_CONSTANT || - (rshader->input[i].interpolate == TGSI_INTERPOLATE_COLOR && - rctx->rasterizer && rctx->rasterizer->flatshade)) + (rshader->input[i].interpolate == TGSI_INTERPOLATE_COLOR && flatshade)) tmp |= S_028644_FLAT_SHADE(1); if (rshader->input[i].name == TGSI_SEMANTIC_PCOORD || @@ -2503,8 +2509,7 @@ void r600_update_ps_state(struct pipe_context *ctx, struct r600_pipe_shader *sha z_export = 1; if (rshader->output[i].name == TGSI_SEMANTIC_STENCIL) stencil_export = 1; - if (rshader->output[i].name == TGSI_SEMANTIC_SAMPLEMASK && - rctx->framebuffer.nr_samples > 1 && rctx->ps_iter_samples > 0) + if (rshader->output[i].name == TGSI_SEMANTIC_SAMPLEMASK && msaa) mask_export = 1; } db_shader_control |= S_02880C_Z_EXPORT_ENABLE(z_export); @@ -2585,8 +2590,8 @@ void r600_update_ps_state(struct pipe_context *ctx, struct r600_pipe_shader *sha shader->ps_depth_export = z_export | stencil_export | mask_export; shader->sprite_coord_enable = sprite_coord_enable; - if (rctx->rasterizer) - shader->flatshade = rctx->rasterizer->flatshade; + shader->flatshade = flatshade; + shader->msaa = msaa; } void r600_update_vs_state(struct pipe_context *ctx, struct r600_pipe_shader *shader) diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index fe453d4cf37..4669d2d30bf 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -1909,9 +1909,11 @@ static bool r600_update_derived_state(struct r600_context *rctx) rctx->rasterizer->sprite_coord_enable != rctx->ps_shader->current->sprite_coord_enable || rctx->rasterizer->flatshade != rctx->ps_shader->current->flatshade)) { - if (unlikely(!ps_dirty && rctx->ps_shader && rctx->rasterizer && + bool msaa = rctx->framebuffer.nr_samples > 1 && rctx->ps_iter_samples > 0; + if (unlikely(rctx->ps_shader && ((rctx->rasterizer->sprite_coord_enable != rctx->ps_shader->current->sprite_coord_enable) || - (rctx->rasterizer->flatshade != rctx->ps_shader->current->flatshade)))) { + (rctx->rasterizer->flatshade != rctx->ps_shader->current->flatshade) || + (msaa != rctx->ps_shader->current->msaa)))) { if (rctx->b.chip_class >= EVERGREEN) evergreen_update_ps_state(ctx, rctx->ps_shader->current);