diff options
author | Timothy Arceri <[email protected]> | 2019-03-20 15:56:54 +1100 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2019-03-27 02:39:12 +0000 |
commit | d163780f819b406679bf5b86b6c4286940c00415 (patch) | |
tree | d52c19f916fe82ad02d2ddd09308a0d50ba64e24 /src/compiler/spirv/vtn_cfg.c | |
parent | e76ae39ae22ee21f83c41e80737979e9bc78cc15 (diff) |
spirv: make use of the select control support in nir
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108841
Diffstat (limited to 'src/compiler/spirv/vtn_cfg.c')
-rw-r--r-- | src/compiler/spirv/vtn_cfg.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/compiler/spirv/vtn_cfg.c b/src/compiler/spirv/vtn_cfg.c index 925b4c643e7..e95279fbd01 100644 --- a/src/compiler/spirv/vtn_cfg.c +++ b/src/compiler/spirv/vtn_cfg.c @@ -586,6 +586,8 @@ vtn_cfg_walk_blocks(struct vtn_builder *b, struct list_head *cf_list, if (block->merge && (*block->merge & SpvOpCodeMask) == SpvOpSelectionMerge) { if_stmt->control = block->merge[2]; + } else { + if_stmt->control = SpvSelectionControlMaskNone; } if_stmt->then_type = vtn_get_branch_type(b, then_block, @@ -895,6 +897,19 @@ vtn_loop_control(struct vtn_builder *b, struct vtn_loop *vtn_loop) } } +static nir_selection_control +vtn_selection_control(struct vtn_builder *b, struct vtn_if *vtn_if) +{ + if (vtn_if->control == SpvSelectionControlMaskNone) + return nir_selection_control_none; + else if (vtn_if->control & SpvSelectionControlDontFlattenMask) + return nir_selection_control_dont_flatten; + else if (vtn_if->control & SpvSelectionControlFlattenMask) + return nir_selection_control_flatten; + else + vtn_fail("Invalid selection control"); +} + static void vtn_emit_cf_list(struct vtn_builder *b, struct list_head *cf_list, nir_variable *switch_fall_var, bool *has_switch_break, @@ -946,6 +961,9 @@ vtn_emit_cf_list(struct vtn_builder *b, struct list_head *cf_list, nir_if *nif = nir_push_if(&b->nb, vtn_ssa_value(b, vtn_if->condition)->def); + + nif->control = vtn_selection_control(b, vtn_if); + if (vtn_if->then_type == vtn_branch_type_none) { vtn_emit_cf_list(b, &vtn_if->then_body, switch_fall_var, &sw_break, handler); |