diff --git a/src/video_core/shader/ast.cpp b/src/video_core/shader/ast.cpp index 87c7226821..986e4cd64b 100644 --- a/src/video_core/shader/ast.cpp +++ b/src/video_core/shader/ast.cpp @@ -17,6 +17,7 @@ void ASTZipper::Init(const ASTNode new_first, const ASTNode parent) { ASSERT(new_first->manager == nullptr); first = new_first; last = new_first; + ASTNode current = first; while (current) { current->manager = this; @@ -92,7 +93,7 @@ void ASTZipper::InsertBefore(const ASTNode new_node, const ASTNode at_node) { new_node->manager = this; } -void ASTZipper::DetachTail(const ASTNode node) { +void ASTZipper::DetachTail(ASTNode node) { ASSERT(node->manager == this); if (node == first) { first.reset(); @@ -103,7 +104,8 @@ void ASTZipper::DetachTail(const ASTNode node) { last = node->previous; last->next.reset(); node->previous.reset(); - ASTNode current = node; + + ASTNode current = std::move(node); while (current) { current->manager = nullptr; current->parent.reset(); @@ -413,19 +415,19 @@ void ASTManager::InsertLabel(u32 address) { void ASTManager::InsertGoto(Expr condition, u32 address) { const u32 index = labels_map[address]; - const ASTNode goto_node = ASTBase::Make(main_node, condition, index); + const ASTNode goto_node = ASTBase::Make(main_node, std::move(condition), index); gotos.push_back(goto_node); program->nodes.PushBack(goto_node); } void ASTManager::InsertBlock(u32 start_address, u32 end_address) { - const ASTNode block = ASTBase::Make(main_node, start_address, end_address); - program->nodes.PushBack(block); + ASTNode block = ASTBase::Make(main_node, start_address, end_address); + program->nodes.PushBack(std::move(block)); } void ASTManager::InsertReturn(Expr condition, bool kills) { - const ASTNode node = ASTBase::Make(main_node, condition, kills); - program->nodes.PushBack(node); + ASTNode node = ASTBase::Make(main_node, std::move(condition), kills); + program->nodes.PushBack(std::move(node)); } // The decompile algorithm is based on @@ -539,11 +541,11 @@ bool ASTManager::IsBackwardsJump(ASTNode goto_node, ASTNode label_node) const { return false; } -bool ASTManager::IndirectlyRelated(ASTNode first, ASTNode second) { +bool ASTManager::IndirectlyRelated(const ASTNode& first, const ASTNode& second) const { return !(first->GetParent() == second->GetParent() || DirectlyRelated(first, second)); } -bool ASTManager::DirectlyRelated(ASTNode first, ASTNode second) { +bool ASTManager::DirectlyRelated(const ASTNode& first, const ASTNode& second) const { if (first->GetParent() == second->GetParent()) { return false; } diff --git a/src/video_core/shader/ast.h b/src/video_core/shader/ast.h index 39f500284b..aad35c12ea 100644 --- a/src/video_core/shader/ast.h +++ b/src/video_core/shader/ast.h @@ -71,20 +71,18 @@ public: class ASTProgram { public: - explicit ASTProgram() = default; ASTZipper nodes{}; }; class ASTIfThen { public: - explicit ASTIfThen(Expr condition) : condition(condition) {} + explicit ASTIfThen(Expr condition) : condition{std::move(condition)} {} Expr condition; ASTZipper nodes{}; }; class ASTIfElse { public: - explicit ASTIfElse() = default; ASTZipper nodes{}; }; @@ -103,7 +101,7 @@ public: class ASTVarSet { public: - explicit ASTVarSet(u32 index, Expr condition) : index{index}, condition{condition} {} + explicit ASTVarSet(u32 index, Expr condition) : index{index}, condition{std::move(condition)} {} u32 index; Expr condition; }; @@ -117,42 +115,45 @@ public: class ASTGoto { public: - explicit ASTGoto(Expr condition, u32 label) : condition{condition}, label{label} {} + explicit ASTGoto(Expr condition, u32 label) : condition{std::move(condition)}, label{label} {} Expr condition; u32 label; }; class ASTDoWhile { public: - explicit ASTDoWhile(Expr condition) : condition(condition) {} + explicit ASTDoWhile(Expr condition) : condition{std::move(condition)} {} Expr condition; ASTZipper nodes{}; }; class ASTReturn { public: - explicit ASTReturn(Expr condition, bool kills) : condition{condition}, kills{kills} {} + explicit ASTReturn(Expr condition, bool kills) + : condition{std::move(condition)}, kills{kills} {} Expr condition; bool kills; }; class ASTBreak { public: - explicit ASTBreak(Expr condition) : condition{condition} {} + explicit ASTBreak(Expr condition) : condition{std::move(condition)} {} Expr condition; }; class ASTBase { public: - explicit ASTBase(ASTNode parent, ASTData data) : parent{parent}, data{data} {} + explicit ASTBase(ASTNode parent, ASTData data) + : data{std::move(data)}, parent{std::move(parent)} {} template static ASTNode Make(ASTNode parent, Args&&... args) { - return std::make_shared(parent, ASTData(U(std::forward(args)...))); + return std::make_shared(std::move(parent), + ASTData(U(std::forward(args)...))); } void SetParent(ASTNode new_parent) { - parent = new_parent; + parent = std::move(new_parent); } ASTNode& GetParent() { @@ -247,7 +248,7 @@ public: void SetGotoCondition(Expr new_condition) { auto inner = std::get_if(&data); if (inner) { - inner->condition = new_condition; + inner->condition = std::move(new_condition); } } @@ -370,9 +371,9 @@ public: private: bool IsBackwardsJump(ASTNode goto_node, ASTNode label_node) const; - bool IndirectlyRelated(ASTNode first, ASTNode second); + bool IndirectlyRelated(const ASTNode& first, const ASTNode& second) const; - bool DirectlyRelated(ASTNode first, ASTNode second); + bool DirectlyRelated(const ASTNode& first, const ASTNode& second) const; void EncloseDoWhile(ASTNode goto_node, ASTNode label); diff --git a/src/video_core/shader/expr.cpp b/src/video_core/shader/expr.cpp index ca633ffb10..39df7a9274 100644 --- a/src/video_core/shader/expr.cpp +++ b/src/video_core/shader/expr.cpp @@ -2,14 +2,21 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#pragma once - #include #include #include "video_core/shader/expr.h" namespace VideoCommon::Shader { +namespace { +bool ExprIsBoolean(const Expr& expr) { + return std::holds_alternative(*expr); +} + +bool ExprBooleanGet(const Expr& expr) { + return std::get_if(expr.get())->value; +} +} // Anonymous namespace bool ExprAnd::operator==(const ExprAnd& b) const { return (*operand1 == *b.operand1) && (*operand2 == *b.operand2); @@ -23,19 +30,11 @@ bool ExprNot::operator==(const ExprNot& b) const { return (*operand1 == *b.operand1); } -bool ExprIsBoolean(Expr expr) { - return std::holds_alternative(*expr); -} - -bool ExprBooleanGet(Expr expr) { - return std::get_if(expr.get())->value; -} - Expr MakeExprNot(Expr first) { if (std::holds_alternative(*first)) { return std::get_if(first.get())->operand1; } - return MakeExpr(first); + return MakeExpr(std::move(first)); } Expr MakeExprAnd(Expr first, Expr second) { @@ -45,7 +44,7 @@ Expr MakeExprAnd(Expr first, Expr second) { if (ExprIsBoolean(second)) { return ExprBooleanGet(second) ? first : second; } - return MakeExpr(first, second); + return MakeExpr(std::move(first), std::move(second)); } Expr MakeExprOr(Expr first, Expr second) { @@ -55,14 +54,14 @@ Expr MakeExprOr(Expr first, Expr second) { if (ExprIsBoolean(second)) { return ExprBooleanGet(second) ? second : first; } - return MakeExpr(first, second); + return MakeExpr(std::move(first), std::move(second)); } -bool ExprAreEqual(Expr first, Expr second) { +bool ExprAreEqual(const Expr& first, const Expr& second) { return (*first) == (*second); } -bool ExprAreOpposite(Expr first, Expr second) { +bool ExprAreOpposite(const Expr& first, const Expr& second) { if (std::holds_alternative(*first)) { return ExprAreEqual(std::get_if(first.get())->operand1, second); } @@ -72,7 +71,7 @@ bool ExprAreOpposite(Expr first, Expr second) { return false; } -bool ExprIsTrue(Expr first) { +bool ExprIsTrue(const Expr& first) { if (ExprIsBoolean(first)) { return ExprBooleanGet(first); } diff --git a/src/video_core/shader/expr.h b/src/video_core/shader/expr.h index 4c399cef9c..1f1638520a 100644 --- a/src/video_core/shader/expr.h +++ b/src/video_core/shader/expr.h @@ -28,7 +28,7 @@ using Expr = std::shared_ptr; class ExprAnd final { public: - explicit ExprAnd(Expr a, Expr b) : operand1{a}, operand2{b} {} + explicit ExprAnd(Expr a, Expr b) : operand1{std::move(a)}, operand2{std::move(b)} {} bool operator==(const ExprAnd& b) const; @@ -38,7 +38,7 @@ public: class ExprOr final { public: - explicit ExprOr(Expr a, Expr b) : operand1{a}, operand2{b} {} + explicit ExprOr(Expr a, Expr b) : operand1{std::move(a)}, operand2{std::move(b)} {} bool operator==(const ExprOr& b) const; @@ -48,7 +48,7 @@ public: class ExprNot final { public: - explicit ExprNot(Expr a) : operand1{a} {} + explicit ExprNot(Expr a) : operand1{std::move(a)} {} bool operator==(const ExprNot& b) const; @@ -105,9 +105,9 @@ Expr MakeExpr(Args&&... args) { return std::make_shared(T(std::forward(args)...)); } -bool ExprAreEqual(Expr first, Expr second); +bool ExprAreEqual(const Expr& first, const Expr& second); -bool ExprAreOpposite(Expr first, Expr second); +bool ExprAreOpposite(const Expr& first, const Expr& second); Expr MakeExprNot(Expr first); @@ -115,6 +115,6 @@ Expr MakeExprAnd(Expr first, Expr second); Expr MakeExprOr(Expr first, Expr second); -bool ExprIsTrue(Expr first); +bool ExprIsTrue(const Expr& first); } // namespace VideoCommon::Shader