diff options
author | Lioncash <mathew1800@gmail.com> | 2019-10-05 14:06:44 +0200 |
---|---|---|
committer | Lioncash <mathew1800@gmail.com> | 2019-10-05 14:22:03 +0200 |
commit | 8e0c80f26914552e11144bd92dae726b66c3739d (patch) | |
tree | fc0549a8d69d138bcce209094ce914d63c4f451a /src/video_core | |
parent | Merge pull request #2888 from FernandoS27/decompiler2 (diff) | |
download | yuzu-8e0c80f26914552e11144bd92dae726b66c3739d.tar yuzu-8e0c80f26914552e11144bd92dae726b66c3739d.tar.gz yuzu-8e0c80f26914552e11144bd92dae726b66c3739d.tar.bz2 yuzu-8e0c80f26914552e11144bd92dae726b66c3739d.tar.lz yuzu-8e0c80f26914552e11144bd92dae726b66c3739d.tar.xz yuzu-8e0c80f26914552e11144bd92dae726b66c3739d.tar.zst yuzu-8e0c80f26914552e11144bd92dae726b66c3739d.zip |
Diffstat (limited to 'src/video_core')
-rw-r--r-- | src/video_core/shader/ast.cpp | 66 | ||||
-rw-r--r-- | src/video_core/shader/ast.h | 12 |
2 files changed, 41 insertions, 37 deletions
diff --git a/src/video_core/shader/ast.cpp b/src/video_core/shader/ast.cpp index 2eb065c3d..87c722682 100644 --- a/src/video_core/shader/ast.cpp +++ b/src/video_core/shader/ast.cpp @@ -185,9 +185,7 @@ void ASTZipper::Remove(const ASTNode node) { class ExprPrinter final { public: - ExprPrinter() = default; - - void operator()(ExprAnd const& expr) { + void operator()(const ExprAnd& expr) { inner += "( "; std::visit(*this, *expr.operand1); inner += " && "; @@ -195,7 +193,7 @@ public: inner += ')'; } - void operator()(ExprOr const& expr) { + void operator()(const ExprOr& expr) { inner += "( "; std::visit(*this, *expr.operand1); inner += " || "; @@ -203,29 +201,29 @@ public: inner += ')'; } - void operator()(ExprNot const& expr) { + void operator()(const ExprNot& expr) { inner += "!"; std::visit(*this, *expr.operand1); } - void operator()(ExprPredicate const& expr) { + void operator()(const ExprPredicate& expr) { inner += "P" + std::to_string(expr.predicate); } - void operator()(ExprCondCode const& expr) { + void operator()(const ExprCondCode& expr) { u32 cc = static_cast<u32>(expr.cc); inner += "CC" + std::to_string(cc); } - void operator()(ExprVar const& expr) { + void operator()(const ExprVar& expr) { inner += "V" + std::to_string(expr.var_index); } - void operator()(ExprBoolean const& expr) { + void operator()(const ExprBoolean& expr) { inner += expr.value ? "true" : "false"; } - std::string& GetResult() { + const std::string& GetResult() const { return inner; } @@ -234,9 +232,7 @@ public: class ASTPrinter { public: - ASTPrinter() = default; - - void operator()(ASTProgram& ast) { + void operator()(const ASTProgram& ast) { scope++; inner += "program {\n"; ASTNode current = ast.nodes.GetFirst(); @@ -248,7 +244,7 @@ public: scope--; } - void operator()(ASTIfThen& ast) { + void operator()(const ASTIfThen& ast) { ExprPrinter expr_parser{}; std::visit(expr_parser, *ast.condition); inner += Ident() + "if (" + expr_parser.GetResult() + ") {\n"; @@ -262,7 +258,7 @@ public: inner += Ident() + "}\n"; } - void operator()(ASTIfElse& ast) { + void operator()(const ASTIfElse& ast) { inner += Ident() + "else {\n"; scope++; ASTNode current = ast.nodes.GetFirst(); @@ -274,34 +270,34 @@ public: inner += Ident() + "}\n"; } - void operator()(ASTBlockEncoded& ast) { + void operator()(const ASTBlockEncoded& ast) { inner += Ident() + "Block(" + std::to_string(ast.start) + ", " + std::to_string(ast.end) + ");\n"; } - void operator()(ASTBlockDecoded& ast) { + void operator()(const ASTBlockDecoded& ast) { inner += Ident() + "Block;\n"; } - void operator()(ASTVarSet& ast) { + void operator()(const ASTVarSet& ast) { ExprPrinter expr_parser{}; std::visit(expr_parser, *ast.condition); inner += Ident() + "V" + std::to_string(ast.index) + " := " + expr_parser.GetResult() + ";\n"; } - void operator()(ASTLabel& ast) { + void operator()(const ASTLabel& ast) { inner += "Label_" + std::to_string(ast.index) + ":\n"; } - void operator()(ASTGoto& ast) { + void operator()(const ASTGoto& ast) { ExprPrinter expr_parser{}; std::visit(expr_parser, *ast.condition); inner += Ident() + "(" + expr_parser.GetResult() + ") -> goto Label_" + std::to_string(ast.label) + ";\n"; } - void operator()(ASTDoWhile& ast) { + void operator()(const ASTDoWhile& ast) { ExprPrinter expr_parser{}; std::visit(expr_parser, *ast.condition); inner += Ident() + "do {\n"; @@ -315,14 +311,14 @@ public: inner += Ident() + "} while (" + expr_parser.GetResult() + ");\n"; } - void operator()(ASTReturn& ast) { + void operator()(const ASTReturn& ast) { ExprPrinter expr_parser{}; std::visit(expr_parser, *ast.condition); inner += Ident() + "(" + expr_parser.GetResult() + ") -> " + (ast.kills ? "discard" : "exit") + ";\n"; } - void operator()(ASTBreak& ast) { + void operator()(const ASTBreak& ast) { ExprPrinter expr_parser{}; std::visit(expr_parser, *ast.condition); inner += Ident() + "(" + expr_parser.GetResult() + ") -> break;\n"; @@ -341,7 +337,7 @@ public: std::visit(*this, *node->GetInnerData()); } - std::string& GetResult() { + const std::string& GetResult() const { return inner; } @@ -696,7 +692,7 @@ class ASTClearer { public: ASTClearer() = default; - void operator()(ASTProgram& ast) { + void operator()(const ASTProgram& ast) { ASTNode current = ast.nodes.GetFirst(); while (current) { Visit(current); @@ -704,7 +700,7 @@ public: } } - void operator()(ASTIfThen& ast) { + void operator()(const ASTIfThen& ast) { ASTNode current = ast.nodes.GetFirst(); while (current) { Visit(current); @@ -712,7 +708,7 @@ public: } } - void operator()(ASTIfElse& ast) { + void operator()(const ASTIfElse& ast) { ASTNode current = ast.nodes.GetFirst(); while (current) { Visit(current); @@ -720,19 +716,19 @@ public: } } - void operator()(ASTBlockEncoded& ast) {} + void operator()([[maybe_unused]] const ASTBlockEncoded& ast) {} void operator()(ASTBlockDecoded& ast) { ast.nodes.clear(); } - void operator()(ASTVarSet& ast) {} + void operator()([[maybe_unused]] const ASTVarSet& ast) {} - void operator()(ASTLabel& ast) {} + void operator()([[maybe_unused]] const ASTLabel& ast) {} - void operator()(ASTGoto& ast) {} + void operator()([[maybe_unused]] const ASTGoto& ast) {} - void operator()(ASTDoWhile& ast) { + void operator()(const ASTDoWhile& ast) { ASTNode current = ast.nodes.GetFirst(); while (current) { Visit(current); @@ -740,11 +736,11 @@ public: } } - void operator()(ASTReturn& ast) {} + void operator()([[maybe_unused]] const ASTReturn& ast) {} - void operator()(ASTBreak& ast) {} + void operator()([[maybe_unused]] const ASTBreak& ast) {} - void Visit(ASTNode& node) { + void Visit(const ASTNode& node) { std::visit(*this, *node->GetInnerData()); node->Clear(); } diff --git a/src/video_core/shader/ast.h b/src/video_core/shader/ast.h index ba234138e..39f500284 100644 --- a/src/video_core/shader/ast.h +++ b/src/video_core/shader/ast.h @@ -48,11 +48,11 @@ public: void Init(ASTNode first, ASTNode parent); - ASTNode GetFirst() { + ASTNode GetFirst() const { return first; } - ASTNode GetLast() { + ASTNode GetLast() const { return last; } @@ -177,6 +177,10 @@ public: return &data; } + const ASTData* GetInnerData() const { + return &data; + } + ASTNode GetNext() const { return next; } @@ -189,6 +193,10 @@ public: return *manager; } + const ASTZipper& GetManager() const { + return *manager; + } + std::optional<u32> GetGotoLabel() const { auto inner = std::get_if<ASTGoto>(&data); if (inner) { |