pan/midgard: Fix recursive csel scheduling

Corner case causing invalid scheduling on shaders with nested csels,
i.e. GLSL code resembling:

   (foo ? bool1 : bool2) ? x : y

By explicitly disallowing csels this is fixed.

Fixes INSTR_INVALID_ENC on a glamor shader (noticeable with slowdown and
visual corruption when scrolling "too far" on GTK apps).

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3463>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3463>
This commit is contained in:
Alyssa Rosenzweig 2020-01-18 09:34:39 -05:00 committed by Marge Bot
parent 564a782ff7
commit 4af8d5b064

View file

@ -669,6 +669,10 @@ mir_comparison_mobile(
if (instructions[i]->type != TAG_ALU_4)
return ~0;
/* If it would itself require a condition, that's recursive */
if (OP_IS_CSEL(instructions[i]->alu.op))
return ~0;
/* We'll need to rewrite to .w but that doesn't work for vector
* ops that don't replicate (ball/bany), so bail there */