From: Christoph Bumiller Date: Mon, 18 Jan 2010 15:22:59 +0000 (+0100) Subject: nv50: cannot exit shaders on a control flow instruction X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e74db4f20fdc4bd71259480f6f93436c98275cb9;p=mesa.git nv50: cannot exit shaders on a control flow instruction Fixes lockup triggered by this ingenious shader: 1: CALL :3 2: END 3: BGNSUB ... --- diff --git a/src/gallium/drivers/nv50/nv50_program.c b/src/gallium/drivers/nv50/nv50_program.c index 22fa6e6ae42..20db51070ff 100644 --- a/src/gallium/drivers/nv50/nv50_program.c +++ b/src/gallium/drivers/nv50/nv50_program.c @@ -477,6 +477,12 @@ is_join(struct nv50_program_exec *e) return FALSE; } +static INLINE boolean +is_control_flow(struct nv50_program_exec *e) +{ + return (e->inst[0] & 2); +} + static INLINE void set_pred(struct nv50_pc *pc, unsigned pred, unsigned idx, struct nv50_program_exec *e) @@ -3166,7 +3172,9 @@ nv50_program_tx_insn(struct nv50_pc *pc, if (!is_long(pc->p->exec_tail)) convert_to_long(pc, pc->p->exec_tail); else - if (is_immd(pc->p->exec_tail) || is_join(pc->p->exec_tail)) + if (is_immd(pc->p->exec_tail) || + is_join(pc->p->exec_tail) || + is_control_flow(pc->p->exec_tail)) emit_nop(pc); pc->p->exec_tail->inst[1] |= 1; /* set exit bit */