summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_core/renderer_vulkan/vk_shader_decompiler.cpp6
-rw-r--r--src/video_core/shader/ast.cpp9
-rw-r--r--src/video_core/shader/ast.h3
-rw-r--r--src/video_core/shader/compiler_settings.h3
-rw-r--r--src/video_core/shader/control_flow.cpp3
-rw-r--r--src/video_core/shader/control_flow.h2
-rw-r--r--src/video_core/shader/shader_ir.cpp2
7 files changed, 18 insertions, 10 deletions
diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
index 505e49570..72fbc69c4 100644
--- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
+++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
@@ -1667,7 +1667,8 @@ public:
1667 } 1667 }
1668 1668
1669 void operator()(VideoCommon::Shader::ExprVar& expr) { 1669 void operator()(VideoCommon::Shader::ExprVar& expr) {
1670 current_id = decomp.Emit(decomp.OpLoad(decomp.t_bool, decomp.flow_variables.at(expr.var_index))); 1670 current_id =
1671 decomp.Emit(decomp.OpLoad(decomp.t_bool, decomp.flow_variables.at(expr.var_index)));
1671 } 1672 }
1672 1673
1673 void operator()(VideoCommon::Shader::ExprBoolean& expr) { 1674 void operator()(VideoCommon::Shader::ExprBoolean& expr) {
@@ -1749,7 +1750,8 @@ public:
1749 const Id loop_end_block = decomp.OpLabel(); 1750 const Id loop_end_block = decomp.OpLabel();
1750 current_loop_exit = endloop_label; 1751 current_loop_exit = endloop_label;
1751 decomp.Emit(loop_label); 1752 decomp.Emit(loop_label);
1752 decomp.Emit(decomp.OpLoopMerge(endloop_label, loop_end_block, spv::LoopControlMask::MaskNone)); 1753 decomp.Emit(
1754 decomp.OpLoopMerge(endloop_label, loop_end_block, spv::LoopControlMask::MaskNone));
1753 decomp.Emit(decomp.OpBranch(loop_start_block)); 1755 decomp.Emit(decomp.OpBranch(loop_start_block));
1754 decomp.Emit(loop_start_block); 1756 decomp.Emit(loop_start_block);
1755 ASTNode current = ast.nodes.GetFirst(); 1757 ASTNode current = ast.nodes.GetFirst();
diff --git a/src/video_core/shader/ast.cpp b/src/video_core/shader/ast.cpp
index 74b9a8f9a..7e5e916ab 100644
--- a/src/video_core/shader/ast.cpp
+++ b/src/video_core/shader/ast.cpp
@@ -363,7 +363,8 @@ std::string ASTManager::Print() {
363 return printer.GetResult(); 363 return printer.GetResult();
364} 364}
365 365
366ASTManager::ASTManager(bool full_decompile) : full_decompile{full_decompile} {}; 366ASTManager::ASTManager(bool full_decompile, bool disable_else_derivation)
367 : full_decompile{full_decompile}, disable_else_derivation{disable_else_derivation} {};
367 368
368ASTManager::~ASTManager() { 369ASTManager::~ASTManager() {
369 Clear(); 370 Clear();
@@ -378,7 +379,8 @@ void ASTManager::Init() {
378ASTManager::ASTManager(ASTManager&& other) 379ASTManager::ASTManager(ASTManager&& other)
379 : labels_map(std::move(other.labels_map)), labels_count{other.labels_count}, 380 : labels_map(std::move(other.labels_map)), labels_count{other.labels_count},
380 gotos(std::move(other.gotos)), labels(std::move(other.labels)), variables{other.variables}, 381 gotos(std::move(other.gotos)), labels(std::move(other.labels)), variables{other.variables},
381 program{other.program}, main_node{other.main_node}, false_condition{other.false_condition} { 382 program{other.program}, main_node{other.main_node}, false_condition{other.false_condition},
383 disable_else_derivation{other.disable_else_derivation} {
382 other.main_node.reset(); 384 other.main_node.reset();
383} 385}
384 386
@@ -392,6 +394,7 @@ ASTManager& ASTManager::operator=(ASTManager&& other) {
392 program = other.program; 394 program = other.program;
393 main_node = other.main_node; 395 main_node = other.main_node;
394 false_condition = other.false_condition; 396 false_condition = other.false_condition;
397 disable_else_derivation = other.disable_else_derivation;
395 398
396 other.main_node.reset(); 399 other.main_node.reset();
397 return *this; 400 return *this;
@@ -641,7 +644,7 @@ void ASTManager::EncloseIfThen(ASTNode goto_node, ASTNode label) {
641 ASTNode prev = goto_node->GetPrevious(); 644 ASTNode prev = goto_node->GetPrevious();
642 Expr condition = goto_node->GetGotoCondition(); 645 Expr condition = goto_node->GetGotoCondition();
643 bool do_else = false; 646 bool do_else = false;
644 if (prev->IsIfThen()) { 647 if (!disable_else_derivation && prev->IsIfThen()) {
645 Expr if_condition = prev->GetIfCondition(); 648 Expr if_condition = prev->GetIfCondition();
646 do_else = ExprAreEqual(if_condition, condition); 649 do_else = ExprAreEqual(if_condition, condition);
647 } 650 }
diff --git a/src/video_core/shader/ast.h b/src/video_core/shader/ast.h
index 12db336df..1b73f301f 100644
--- a/src/video_core/shader/ast.h
+++ b/src/video_core/shader/ast.h
@@ -298,7 +298,7 @@ private:
298 298
299class ASTManager final { 299class ASTManager final {
300public: 300public:
301 ASTManager(bool full_decompile); 301 ASTManager(bool full_decompile, bool disable_else_derivation);
302 ~ASTManager(); 302 ~ASTManager();
303 303
304 ASTManager(const ASTManager& o) = delete; 304 ASTManager(const ASTManager& o) = delete;
@@ -378,6 +378,7 @@ private:
378 } 378 }
379 379
380 bool full_decompile{}; 380 bool full_decompile{};
381 bool disable_else_derivation{};
381 std::unordered_map<u32, u32> labels_map{}; 382 std::unordered_map<u32, u32> labels_map{};
382 u32 labels_count{}; 383 u32 labels_count{};
383 std::vector<ASTNode> labels{}; 384 std::vector<ASTNode> labels{};
diff --git a/src/video_core/shader/compiler_settings.h b/src/video_core/shader/compiler_settings.h
index e1fb5bc3a..916018c01 100644
--- a/src/video_core/shader/compiler_settings.h
+++ b/src/video_core/shader/compiler_settings.h
@@ -19,7 +19,8 @@ enum class CompileDepth : u32 {
19std::string CompileDepthAsString(CompileDepth cd); 19std::string CompileDepthAsString(CompileDepth cd);
20 20
21struct CompilerSettings { 21struct CompilerSettings {
22 CompileDepth depth; 22 CompileDepth depth{CompileDepth::NoFlowStack};
23 bool disable_else_derivation{true};
23}; 24};
24 25
25} // namespace VideoCommon::Shader 26} // namespace VideoCommon::Shader
diff --git a/src/video_core/shader/control_flow.cpp b/src/video_core/shader/control_flow.cpp
index c4351969b..c2fa734e7 100644
--- a/src/video_core/shader/control_flow.cpp
+++ b/src/video_core/shader/control_flow.cpp
@@ -516,7 +516,8 @@ std::unique_ptr<ShaderCharacteristics> ScanFlow(const ProgramCode& program_code,
516 std::sort(state.block_info.begin(), state.block_info.end(), 516 std::sort(state.block_info.begin(), state.block_info.end(),
517 [](const BlockInfo& a, const BlockInfo& b) -> bool { return a.start < b.start; }); 517 [](const BlockInfo& a, const BlockInfo& b) -> bool { return a.start < b.start; });
518 if (decompiled && settings.depth != CompileDepth::NoFlowStack) { 518 if (decompiled && settings.depth != CompileDepth::NoFlowStack) {
519 ASTManager manager{settings.depth != CompileDepth::DecompileBackwards}; 519 ASTManager manager{settings.depth != CompileDepth::DecompileBackwards,
520 settings.disable_else_derivation};
520 state.manager = &manager; 521 state.manager = &manager;
521 DecompileShader(state); 522 DecompileShader(state);
522 decompiled = state.manager->IsFullyDecompiled(); 523 decompiled = state.manager->IsFullyDecompiled();
diff --git a/src/video_core/shader/control_flow.h b/src/video_core/shader/control_flow.h
index 8d0d08422..74e54a5c7 100644
--- a/src/video_core/shader/control_flow.h
+++ b/src/video_core/shader/control_flow.h
@@ -72,7 +72,7 @@ struct ShaderCharacteristics {
72 std::set<u32> labels{}; 72 std::set<u32> labels{};
73 u32 start{}; 73 u32 start{};
74 u32 end{}; 74 u32 end{};
75 ASTManager manager{true}; 75 ASTManager manager{true, true};
76 CompilerSettings settings{}; 76 CompilerSettings settings{};
77}; 77};
78 78
diff --git a/src/video_core/shader/shader_ir.cpp b/src/video_core/shader/shader_ir.cpp
index 04e364634..c1f2b88c8 100644
--- a/src/video_core/shader/shader_ir.cpp
+++ b/src/video_core/shader/shader_ir.cpp
@@ -25,7 +25,7 @@ using Tegra::Shader::Register;
25ShaderIR::ShaderIR(const ProgramCode& program_code, u32 main_offset, const std::size_t size, 25ShaderIR::ShaderIR(const ProgramCode& program_code, u32 main_offset, const std::size_t size,
26 CompilerSettings settings) 26 CompilerSettings settings)
27 : program_code{program_code}, main_offset{main_offset}, program_size{size}, basic_blocks{}, 27 : program_code{program_code}, main_offset{main_offset}, program_size{size}, basic_blocks{},
28 program_manager{true}, settings{settings} { 28 program_manager{true, true}, settings{settings} {
29 Decode(); 29 Decode();
30} 30}
31 31