diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2019-09-23 14:10:29 +0200 |
---|---|---|
committer | FernandoS27 <fsahmkow27@gmail.com> | 2019-10-05 00:52:54 +0200 |
commit | 5ea740beb52ee8ccbabef81397ce9458077c6a42 (patch) | |
tree | cd892d83be0f3e39f6d83a689c0f7ce2d17953b6 | |
parent | vk_shader_compiler: Don't enclose branches with if(true) to avoid crashing AMD (diff) | |
download | yuzu-5ea740beb52ee8ccbabef81397ce9458077c6a42.tar yuzu-5ea740beb52ee8ccbabef81397ce9458077c6a42.tar.gz yuzu-5ea740beb52ee8ccbabef81397ce9458077c6a42.tar.bz2 yuzu-5ea740beb52ee8ccbabef81397ce9458077c6a42.tar.lz yuzu-5ea740beb52ee8ccbabef81397ce9458077c6a42.tar.xz yuzu-5ea740beb52ee8ccbabef81397ce9458077c6a42.tar.zst yuzu-5ea740beb52ee8ccbabef81397ce9458077c6a42.zip |
-rw-r--r-- | src/video_core/shader/ast.cpp | 33 |
1 files changed, 11 insertions, 22 deletions
diff --git a/src/video_core/shader/ast.cpp b/src/video_core/shader/ast.cpp index 7c8507280..54f0240e1 100644 --- a/src/video_core/shader/ast.cpp +++ b/src/video_core/shader/ast.cpp @@ -685,34 +685,23 @@ void ASTManager::MoveOutward(ASTNode goto_node) { const ASTNode break_node = ASTBase::Make<ASTBreak>(parent, var_condition); zipper.InsertAfter(break_node, var_node); } else if (is_if || is_else) { + const u32 var_index = NewVariable(); + const Expr var_condition = MakeExpr<ExprVar>(var_index); + const ASTNode var_node = ASTBase::Make<ASTVarSet>(parent, var_index, condition); + const ASTNode var_node_init = ASTBase::Make<ASTVarSet>(parent, var_index, false_condition); + if (is_if) { + zipper2.InsertBefore(var_node_init, parent); + } else { + zipper2.InsertBefore(var_node_init, parent->GetPrevious()); + } + zipper.InsertAfter(var_node, prev); + goto_node->SetGotoCondition(var_condition); if (post) { - const u32 var_index = NewVariable(); - const Expr var_condition = MakeExpr<ExprVar>(var_index); - const ASTNode var_node = ASTBase::Make<ASTVarSet>(parent, var_index, condition); - const ASTNode var_node_init = - ASTBase::Make<ASTVarSet>(parent, var_index, false_condition); - if (is_if) { - zipper2.InsertBefore(var_node_init, parent); - } else { - zipper2.InsertBefore(var_node_init, parent->GetPrevious()); - } - zipper.InsertAfter(var_node, prev); - goto_node->SetGotoCondition(var_condition); zipper.DetachTail(post); const ASTNode if_node = ASTBase::Make<ASTIfThen>(parent, MakeExprNot(var_condition)); ASTZipper* sub_zipper = if_node->GetSubNodes(); sub_zipper->Init(post, if_node); zipper.InsertAfter(if_node, var_node); - } else { - Expr if_condition; - if (is_if) { - if_condition = parent->GetIfCondition(); - } else { - ASTNode if_node = parent->GetPrevious(); - if_condition = MakeExprNot(if_node->GetIfCondition()); - } - Expr new_condition = MakeExprAnd(if_condition, condition); - goto_node->SetGotoCondition(new_condition); } } else { UNREACHABLE(); |