nir/spirv: Allow loop breaks in a switch body.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sun, 1 Oct 2017 22:23:42 +0000 (00:23 +0200)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Mon, 2 Oct 2017 18:33:04 +0000 (20:33 +0200)
commitef61d09d5bd58e5ad1b317d674f8436de754d3cb
treeea3fc13babb4c2a2fc7a6ae75484b312b8a25ce0
parent7f3eab03fe041bc28900a02f7ae503920753ea6b
nir/spirv: Allow loop breaks in a switch body.

Per the SPIR-V spec 2.11 Structured Control Flow:

"The only blocks in a construct that can branch outside the construct are

...
- a break block for the innermost loop it is inside of.
..."

With

"Break block: A block containing a branch to the Merge Block of a loop header's merge instruction."

Note that it puts no restriction on not being in an if or switch within the innermost loop.

This passes the loop_break block to the switch body so it can properly detect loop breaks.

CC: <mesa-stable@lists.freedesktop.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/spirv/vtn_cfg.c