mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-16 18:28:05 +02:00
r600g: take into account force_add_cf in pops
When we have two ENDIFs in a row, we shouldn't modify the pop_count
for the same alu clause twice.
Fixes https://bugs.freedesktop.org/show_bug.cgi?id=38163
Note: this is a candidate for the 7.11 branch.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 2bde0cc95d)
This commit is contained in:
parent
badd2900ea
commit
ffb0f94136
1 changed files with 23 additions and 14 deletions
|
|
@ -2935,25 +2935,34 @@ static int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
|
|||
|
||||
static int pops(struct r600_shader_ctx *ctx, int pops)
|
||||
{
|
||||
int alu_pop = 3;
|
||||
if (ctx->bc->cf_last) {
|
||||
if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU) << 3)
|
||||
alu_pop = 0;
|
||||
else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3)
|
||||
alu_pop = 1;
|
||||
unsigned force_pop = ctx->bc->force_add_cf;
|
||||
|
||||
if (!force_pop) {
|
||||
int alu_pop = 3;
|
||||
if (ctx->bc->cf_last) {
|
||||
if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU) << 3)
|
||||
alu_pop = 0;
|
||||
else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3)
|
||||
alu_pop = 1;
|
||||
}
|
||||
alu_pop += pops;
|
||||
if (alu_pop == 1) {
|
||||
ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3;
|
||||
ctx->bc->force_add_cf = 1;
|
||||
} else if (alu_pop == 2) {
|
||||
ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER) << 3;
|
||||
ctx->bc->force_add_cf = 1;
|
||||
} else {
|
||||
force_pop = 1;
|
||||
}
|
||||
}
|
||||
alu_pop += pops;
|
||||
if (alu_pop == 1) {
|
||||
ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3;
|
||||
ctx->bc->force_add_cf = 1;
|
||||
} else if (alu_pop == 2) {
|
||||
ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER) << 3;
|
||||
ctx->bc->force_add_cf = 1;
|
||||
} else {
|
||||
|
||||
if (force_pop) {
|
||||
r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
|
||||
ctx->bc->cf_last->pop_count = pops;
|
||||
ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue