diff options
| author | 2019-09-20 21:12:06 -0400 | |
|---|---|---|
| committer | 2019-10-04 18:52:52 -0400 | |
| commit | 2e9a810423ef36178ac3947f8feeb7b9a5b29bce (patch) | |
| tree | cad196eab22eafd8766a51e7086b8812e510b1c6 /src | |
| parent | vk_shader_compiler: Implement the decompiler in SPIR-V (diff) | |
| download | yuzu-2e9a810423ef36178ac3947f8feeb7b9a5b29bce.tar.gz yuzu-2e9a810423ef36178ac3947f8feeb7b9a5b29bce.tar.xz yuzu-2e9a810423ef36178ac3947f8feeb7b9a5b29bce.zip | |
Shader_IR: allow else derivation to be optional.
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | 6 | ||||
| -rw-r--r-- | src/video_core/shader/ast.cpp | 9 | ||||
| -rw-r--r-- | src/video_core/shader/ast.h | 3 | ||||
| -rw-r--r-- | src/video_core/shader/compiler_settings.h | 3 | ||||
| -rw-r--r-- | src/video_core/shader/control_flow.cpp | 3 | ||||
| -rw-r--r-- | src/video_core/shader/control_flow.h | 2 | ||||
| -rw-r--r-- | src/video_core/shader/shader_ir.cpp | 2 |
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 | ||
| 366 | ASTManager::ASTManager(bool full_decompile) : full_decompile{full_decompile} {}; | 366 | ASTManager::ASTManager(bool full_decompile, bool disable_else_derivation) |
| 367 | : full_decompile{full_decompile}, disable_else_derivation{disable_else_derivation} {}; | ||
| 367 | 368 | ||
| 368 | ASTManager::~ASTManager() { | 369 | ASTManager::~ASTManager() { |
| 369 | Clear(); | 370 | Clear(); |
| @@ -378,7 +379,8 @@ void ASTManager::Init() { | |||
| 378 | ASTManager::ASTManager(ASTManager&& other) | 379 | ASTManager::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 | ||
| 299 | class ASTManager final { | 299 | class ASTManager final { |
| 300 | public: | 300 | public: |
| 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 { | |||
| 19 | std::string CompileDepthAsString(CompileDepth cd); | 19 | std::string CompileDepthAsString(CompileDepth cd); |
| 20 | 20 | ||
| 21 | struct CompilerSettings { | 21 | struct 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; | |||
| 25 | ShaderIR::ShaderIR(const ProgramCode& program_code, u32 main_offset, const std::size_t size, | 25 | ShaderIR::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 | ||