diff options
author | Timothy Arceri <[email protected]> | 2019-03-20 13:51:47 +1100 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2019-03-27 02:39:12 +0000 |
commit | 24037ff22820efe23946dae5a9f8afb419a9c1eb (patch) | |
tree | 86371761a27a748632d2447b8b5e935f0fad14a1 /src/compiler/spirv/vtn_cfg.c | |
parent | b56451f82c112600621db985b4a7759f864a54af (diff) |
spirv: make use of the loop 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 | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/compiler/spirv/vtn_cfg.c b/src/compiler/spirv/vtn_cfg.c index 7868eeb60bc..925b4c643e7 100644 --- a/src/compiler/spirv/vtn_cfg.c +++ b/src/compiler/spirv/vtn_cfg.c @@ -877,6 +877,24 @@ vtn_switch_case_condition(struct vtn_builder *b, struct vtn_switch *swtch, } } +static nir_loop_control +vtn_loop_control(struct vtn_builder *b, struct vtn_loop *vtn_loop) +{ + if (vtn_loop->control == SpvLoopControlMaskNone) + return nir_loop_control_none; + else if (vtn_loop->control & SpvLoopControlDontUnrollMask) + return nir_loop_control_dont_unroll; + else if (vtn_loop->control & SpvLoopControlUnrollMask) + return nir_loop_control_unroll; + else if (vtn_loop->control & SpvLoopControlDependencyInfiniteMask || + vtn_loop->control & SpvLoopControlDependencyLengthMask) { + /* We do not do anything special with these yet. */ + return nir_loop_control_none; + } else { + vtn_fail("Invalid loop 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, @@ -962,6 +980,8 @@ vtn_emit_cf_list(struct vtn_builder *b, struct list_head *cf_list, struct vtn_loop *vtn_loop = (struct vtn_loop *)node; nir_loop *loop = nir_push_loop(&b->nb); + loop->control = vtn_loop_control(b, vtn_loop); + vtn_emit_cf_list(b, &vtn_loop->body, NULL, NULL, handler); if (!list_empty(&vtn_loop->cont_body)) { |