struct r600_pipe_blend {
struct r600_pipe_state rstate;
unsigned cb_target_mask;
+ unsigned cb_color_control;
};
struct r600_pipe_dsa {
struct r600_pipe_resource_state fs_resource[PIPE_MAX_ATTRIBS];
struct pipe_framebuffer_state framebuffer;
unsigned cb_target_mask;
+ unsigned cb_color_control;
/* for saving when using blitter */
struct pipe_stencil_ref stencil_ref;
struct pipe_viewport_state viewport;
}
}
blend->cb_target_mask = target_mask;
- /* MULTIWRITE_ENABLE is controlled by r600_pipe_shader_ps(). */
- r600_pipe_state_add_reg(rstate, R_028808_CB_COLOR_CONTROL,
- color_control, 0xFFFFFFFD, NULL, 0);
+ blend->cb_color_control = color_control;
for (int i = 0; i < 8; i++) {
/* state->rt entries > 0 only written if independent blending */
r600_pipe_state_add_reg(rstate,
R_0288CC_SQ_PGM_CF_OFFSET_PS,
0x00000000, 0xFFFFFFFF, NULL, 0);
- r600_pipe_state_add_reg(rstate, R_028808_CB_COLOR_CONTROL,
- S_028808_MULTIWRITE_ENABLE(!!rshader->fs_write_all),
- S_028808_MULTIWRITE_ENABLE(1),
- NULL, 0);
/* only set some bits here, the other bits are set in the dsa state */
r600_pipe_state_add_reg(rstate, R_02880C_DB_SHADER_CONTROL,
db_shader_control,
rstate = &blend->rstate;
rctx->states[rstate->id] = rstate;
rctx->cb_target_mask = blend->cb_target_mask;
+
+ /* Replace every bit except MULTIWRITE_ENABLE. */
+ rctx->cb_color_control &= ~C_028808_MULTIWRITE_ENABLE;
+ rctx->cb_color_control |= blend->cb_color_control & C_028808_MULTIWRITE_ENABLE;
+
r600_context_pipe_state_set(&rctx->ctx, rstate);
}
rctx->ps_shader = (struct r600_pipe_shader *)state;
if (state) {
r600_context_pipe_state_set(&rctx->ctx, &rctx->ps_shader->rstate);
+
+ rctx->cb_color_control &= C_028808_MULTIWRITE_ENABLE;
+ rctx->cb_color_control |= S_028808_MULTIWRITE_ENABLE(!!rctx->ps_shader->shader.fs_write_all);
}
if (rctx->ps_shader && rctx->vs_shader) {
r600_adjust_gprs(rctx);
r600_pipe_state_add_reg(&rctx->vgt, R_028814_PA_SU_SC_MODE_CNTL,
0,
S_028814_PROVOKING_VTX_LAST(1), NULL, 0);
+ if (rctx->chip_class <= R700)
+ r600_pipe_state_add_reg(&rctx->vgt, R_028808_CB_COLOR_CONTROL, rctx->cb_color_control, 0xFFFFFFFF, NULL, 0);
}
rctx->vgt.nregs = 0;
if (info.mode == PIPE_PRIM_QUADS || info.mode == PIPE_PRIM_QUAD_STRIP || info.mode == PIPE_PRIM_POLYGON) {
r600_pipe_state_mod_reg(&rctx->vgt, S_028814_PROVOKING_VTX_LAST(1));
+ } else {
+ r600_pipe_state_mod_reg(&rctx->vgt, 0);
}
+ if (rctx->chip_class <= R700)
+ r600_pipe_state_mod_reg(&rctx->vgt, rctx->cb_color_control);
r600_context_pipe_state_set(&rctx->ctx, &rctx->vgt);