mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-31 11:20:26 +01:00
r300/compiler: Clear loop registers in vertex shaders w/o loops
The loop registers weren't being cleared, so any shader that was
executed after a shader containing loops was at risk of having a loop
randomly inserted into it.
This fixes over one hundred piglit tests, although these test
only failed during full piglit runs and would pass if
run individually. The exact number of piglit tests that this patch
fixes will vary depending on the version of piglit and the order the
tests are run.
(cherry-picked from commit 4a269a8dc0)
This commit is contained in:
parent
f36e638c76
commit
649a8952df
2 changed files with 13 additions and 16 deletions
|
|
@ -1030,20 +1030,18 @@ void r300_emit_vs_state(struct r300_context* r300, unsigned size, void* state)
|
|||
R300_PVS_VF_MAX_VTX_NUM(12) |
|
||||
(r300screen->caps.is_r500 ? R500_TCL_STATE_OPTIMIZATION : 0));
|
||||
|
||||
/* Emit flow control instructions. */
|
||||
if (code->num_fc_ops) {
|
||||
|
||||
OUT_CS_REG(R300_VAP_PVS_FLOW_CNTL_OPC, code->fc_ops);
|
||||
if (r300screen->caps.is_r500) {
|
||||
OUT_CS_REG_SEQ(R500_VAP_PVS_FLOW_CNTL_ADDRS_LW_0, code->num_fc_ops * 2);
|
||||
OUT_CS_TABLE(code->fc_op_addrs.r500, code->num_fc_ops * 2);
|
||||
} else {
|
||||
OUT_CS_REG_SEQ(R300_VAP_PVS_FLOW_CNTL_ADDRS_0, code->num_fc_ops);
|
||||
OUT_CS_TABLE(code->fc_op_addrs.r300, code->num_fc_ops);
|
||||
}
|
||||
OUT_CS_REG_SEQ(R300_VAP_PVS_FLOW_CNTL_LOOP_INDEX_0, code->num_fc_ops);
|
||||
OUT_CS_TABLE(code->fc_loop_index, code->num_fc_ops);
|
||||
/* Emit flow control instructions. Even if there are no fc instructions,
|
||||
* we still need to write the registers to make sure they are cleared. */
|
||||
OUT_CS_REG(R300_VAP_PVS_FLOW_CNTL_OPC, code->fc_ops);
|
||||
if (r300screen->caps.is_r500) {
|
||||
OUT_CS_REG_SEQ(R500_VAP_PVS_FLOW_CNTL_ADDRS_LW_0, R300_VS_MAX_FC_OPS * 2);
|
||||
OUT_CS_TABLE(code->fc_op_addrs.r500, R300_VS_MAX_FC_OPS * 2);
|
||||
} else {
|
||||
OUT_CS_REG_SEQ(R300_VAP_PVS_FLOW_CNTL_ADDRS_0, R300_VS_MAX_FC_OPS);
|
||||
OUT_CS_TABLE(code->fc_op_addrs.r300, R300_VS_MAX_FC_OPS);
|
||||
}
|
||||
OUT_CS_REG_SEQ(R300_VAP_PVS_FLOW_CNTL_LOOP_INDEX_0, R300_VS_MAX_FC_OPS);
|
||||
OUT_CS_TABLE(code->fc_loop_index, R300_VS_MAX_FC_OPS);
|
||||
|
||||
END_CS;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1802,9 +1802,8 @@ static void r300_bind_vs_state(struct pipe_context* pipe, void* shader)
|
|||
if (r300->screen->caps.has_tcl) {
|
||||
unsigned fc_op_dwords = r300->screen->caps.is_r500 ? 3 : 2;
|
||||
r300_mark_atom_dirty(r300, &r300->vs_state);
|
||||
r300->vs_state.size =
|
||||
vs->code.length + 9 +
|
||||
(vs->code.num_fc_ops ? vs->code.num_fc_ops * fc_op_dwords + 4 : 0);
|
||||
r300->vs_state.size = vs->code.length + 9 +
|
||||
(R300_VS_MAX_FC_OPS * fc_op_dwords + 4);
|
||||
|
||||
r300_mark_atom_dirty(r300, &r300->vs_constants);
|
||||
r300->vs_constants.size =
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue