Просмотр исходного кода

Shader_Ir: Address Feedback and clang format.

Fernando Sahmkow 6 лет назад
Родитель
Сommit
3c09d9abe6

+ 18 - 25
src/video_core/renderer_vulkan/vk_shader_decompiler.cpp

@@ -1646,34 +1646,34 @@ private:
 
 
 class ExprDecompiler {
 class ExprDecompiler {
 public:
 public:
-    ExprDecompiler(SPIRVDecompiler& decomp) : decomp{decomp} {}
+    explicit ExprDecompiler(SPIRVDecompiler& decomp) : decomp{decomp} {}
 
 
-    void operator()(VideoCommon::Shader::ExprAnd& expr) {
+    Id operator()(VideoCommon::Shader::ExprAnd& expr) {
         const Id type_def = decomp.GetTypeDefinition(Type::Bool);
         const Id type_def = decomp.GetTypeDefinition(Type::Bool);
         const Id op1 = Visit(expr.operand1);
         const Id op1 = Visit(expr.operand1);
         const Id op2 = Visit(expr.operand2);
         const Id op2 = Visit(expr.operand2);
-        current_id = decomp.Emit(decomp.OpLogicalAnd(type_def, op1, op2));
+        return decomp.Emit(decomp.OpLogicalAnd(type_def, op1, op2));
     }
     }
 
 
-    void operator()(VideoCommon::Shader::ExprOr& expr) {
+    Id operator()(VideoCommon::Shader::ExprOr& expr) {
         const Id type_def = decomp.GetTypeDefinition(Type::Bool);
         const Id type_def = decomp.GetTypeDefinition(Type::Bool);
         const Id op1 = Visit(expr.operand1);
         const Id op1 = Visit(expr.operand1);
         const Id op2 = Visit(expr.operand2);
         const Id op2 = Visit(expr.operand2);
-        current_id = decomp.Emit(decomp.OpLogicalOr(type_def, op1, op2));
+        return decomp.Emit(decomp.OpLogicalOr(type_def, op1, op2));
     }
     }
 
 
-    void operator()(VideoCommon::Shader::ExprNot& expr) {
+    Id operator()(VideoCommon::Shader::ExprNot& expr) {
         const Id type_def = decomp.GetTypeDefinition(Type::Bool);
         const Id type_def = decomp.GetTypeDefinition(Type::Bool);
         const Id op1 = Visit(expr.operand1);
         const Id op1 = Visit(expr.operand1);
-        current_id = decomp.Emit(decomp.OpLogicalNot(type_def, op1));
+        return decomp.Emit(decomp.OpLogicalNot(type_def, op1));
     }
     }
 
 
-    void operator()(VideoCommon::Shader::ExprPredicate& expr) {
+    Id operator()(VideoCommon::Shader::ExprPredicate& expr) {
         const auto pred = static_cast<Tegra::Shader::Pred>(expr.predicate);
         const auto pred = static_cast<Tegra::Shader::Pred>(expr.predicate);
-        current_id = decomp.Emit(decomp.OpLoad(decomp.t_bool, decomp.predicates.at(pred)));
+        return decomp.Emit(decomp.OpLoad(decomp.t_bool, decomp.predicates.at(pred)));
     }
     }
 
 
-    void operator()(VideoCommon::Shader::ExprCondCode& expr) {
+    Id operator()(VideoCommon::Shader::ExprCondCode& expr) {
         const Node cc = decomp.ir.GetConditionCode(expr.cc);
         const Node cc = decomp.ir.GetConditionCode(expr.cc);
         Id target;
         Id target;
 
 
@@ -1690,35 +1690,28 @@ public:
         } else if (const auto flag = std::get_if<InternalFlagNode>(&*cc)) {
         } else if (const auto flag = std::get_if<InternalFlagNode>(&*cc)) {
             target = decomp.internal_flags.at(static_cast<u32>(flag->GetFlag()));
             target = decomp.internal_flags.at(static_cast<u32>(flag->GetFlag()));
         }
         }
-        current_id = decomp.Emit(decomp.OpLoad(decomp.t_bool, target));
+        return decomp.Emit(decomp.OpLoad(decomp.t_bool, target));
     }
     }
 
 
-    void operator()(VideoCommon::Shader::ExprVar& expr) {
-        current_id =
-            decomp.Emit(decomp.OpLoad(decomp.t_bool, decomp.flow_variables.at(expr.var_index)));
+    Id operator()(VideoCommon::Shader::ExprVar& expr) {
+        return decomp.Emit(decomp.OpLoad(decomp.t_bool, decomp.flow_variables.at(expr.var_index)));
     }
     }
 
 
-    void operator()(VideoCommon::Shader::ExprBoolean& expr) {
-        current_id = expr.value ? decomp.v_true : decomp.v_false;
-    }
-
-    Id GetResult() {
-        return current_id;
+    Id operator()(VideoCommon::Shader::ExprBoolean& expr) {
+        return expr.value ? decomp.v_true : decomp.v_false;
     }
     }
 
 
     Id Visit(VideoCommon::Shader::Expr& node) {
     Id Visit(VideoCommon::Shader::Expr& node) {
-        std::visit(*this, *node);
-        return current_id;
+        return std::visit(*this, *node);
     }
     }
 
 
 private:
 private:
-    Id current_id;
     SPIRVDecompiler& decomp;
     SPIRVDecompiler& decomp;
 };
 };
 
 
 class ASTDecompiler {
 class ASTDecompiler {
 public:
 public:
-    ASTDecompiler(SPIRVDecompiler& decomp) : decomp{decomp} {}
+    explicit ASTDecompiler(SPIRVDecompiler& decomp) : decomp{decomp} {}
 
 
     void operator()(VideoCommon::Shader::ASTProgram& ast) {
     void operator()(VideoCommon::Shader::ASTProgram& ast) {
         ASTNode current = ast.nodes.GetFirst();
         ASTNode current = ast.nodes.GetFirst();
@@ -1850,7 +1843,7 @@ public:
 
 
 private:
 private:
     SPIRVDecompiler& decomp;
     SPIRVDecompiler& decomp;
-    Id current_loop_exit;
+    Id current_loop_exit{};
 };
 };
 
 
 void SPIRVDecompiler::DecompileAST() {
 void SPIRVDecompiler::DecompileAST() {

+ 10 - 4
src/video_core/shader/ast.cpp

@@ -442,8 +442,11 @@ void ASTManager::Decompile() {
     auto it = gotos.begin();
     auto it = gotos.begin();
     while (it != gotos.end()) {
     while (it != gotos.end()) {
         const ASTNode goto_node = *it;
         const ASTNode goto_node = *it;
-        const u32 label_index = goto_node->GetGotoLabel();
-        const ASTNode label = labels[label_index];
+        const auto label_index = goto_node->GetGotoLabel();
+        if (!label_index) {
+            return;
+        }
+        const ASTNode label = labels[*label_index];
         if (!full_decompile) {
         if (!full_decompile) {
             // We only decompile backward jumps
             // We only decompile backward jumps
             if (!IsBackwardsJump(goto_node, label)) {
             if (!IsBackwardsJump(goto_node, label)) {
@@ -498,8 +501,11 @@ void ASTManager::Decompile() {
             bool can_remove = true;
             bool can_remove = true;
             ASTNode label = *it;
             ASTNode label = *it;
             for (const ASTNode goto_node : gotos) {
             for (const ASTNode goto_node : gotos) {
-                const u32 label_index = goto_node->GetGotoLabel();
-                ASTNode glabel = labels[label_index];
+                const auto label_index = goto_node->GetGotoLabel();
+                if (!label_index) {
+                    return;
+                }
+                ASTNode glabel = labels[*label_index];
                 if (glabel == label) {
                 if (glabel == label) {
                     can_remove = false;
                     can_remove = false;
                     break;
                     break;

+ 33 - 32
src/video_core/shader/ast.h

@@ -44,7 +44,7 @@ enum class ASTZipperType : u32 {
 
 
 class ASTZipper final {
 class ASTZipper final {
 public:
 public:
-    ASTZipper();
+    explicit ASTZipper();
 
 
     void Init(ASTNode first, ASTNode parent);
     void Init(ASTNode first, ASTNode parent);
 
 
@@ -71,74 +71,74 @@ public:
 
 
 class ASTProgram {
 class ASTProgram {
 public:
 public:
-    ASTProgram() : nodes{} {};
-    ASTZipper nodes;
+    explicit ASTProgram() = default;
+    ASTZipper nodes{};
 };
 };
 
 
 class ASTIfThen {
 class ASTIfThen {
 public:
 public:
-    ASTIfThen(Expr condition) : condition(condition), nodes{} {}
+    explicit ASTIfThen(Expr condition) : condition(condition) {}
     Expr condition;
     Expr condition;
-    ASTZipper nodes;
+    ASTZipper nodes{};
 };
 };
 
 
 class ASTIfElse {
 class ASTIfElse {
 public:
 public:
-    ASTIfElse() : nodes{} {}
-    ASTZipper nodes;
+    explicit ASTIfElse() = default;
+    ASTZipper nodes{};
 };
 };
 
 
 class ASTBlockEncoded {
 class ASTBlockEncoded {
 public:
 public:
-    ASTBlockEncoded(u32 start, u32 end) : start{start}, end{end} {}
+    explicit ASTBlockEncoded(u32 start, u32 end) : start{start}, end{end} {}
     u32 start;
     u32 start;
     u32 end;
     u32 end;
 };
 };
 
 
 class ASTBlockDecoded {
 class ASTBlockDecoded {
 public:
 public:
-    ASTBlockDecoded(NodeBlock& new_nodes) : nodes(std::move(new_nodes)) {}
+    explicit ASTBlockDecoded(NodeBlock& new_nodes) : nodes(std::move(new_nodes)) {}
     NodeBlock nodes;
     NodeBlock nodes;
 };
 };
 
 
 class ASTVarSet {
 class ASTVarSet {
 public:
 public:
-    ASTVarSet(u32 index, Expr condition) : index{index}, condition{condition} {}
+    explicit ASTVarSet(u32 index, Expr condition) : index{index}, condition{condition} {}
     u32 index;
     u32 index;
     Expr condition;
     Expr condition;
 };
 };
 
 
 class ASTLabel {
 class ASTLabel {
 public:
 public:
-    ASTLabel(u32 index) : index{index} {}
+    explicit ASTLabel(u32 index) : index{index} {}
     u32 index;
     u32 index;
     bool unused{};
     bool unused{};
 };
 };
 
 
 class ASTGoto {
 class ASTGoto {
 public:
 public:
-    ASTGoto(Expr condition, u32 label) : condition{condition}, label{label} {}
+    explicit ASTGoto(Expr condition, u32 label) : condition{condition}, label{label} {}
     Expr condition;
     Expr condition;
     u32 label;
     u32 label;
 };
 };
 
 
 class ASTDoWhile {
 class ASTDoWhile {
 public:
 public:
-    ASTDoWhile(Expr condition) : condition(condition), nodes{} {}
+    explicit ASTDoWhile(Expr condition) : condition(condition) {}
     Expr condition;
     Expr condition;
-    ASTZipper nodes;
+    ASTZipper nodes{};
 };
 };
 
 
 class ASTReturn {
 class ASTReturn {
 public:
 public:
-    ASTReturn(Expr condition, bool kills) : condition{condition}, kills{kills} {}
+    explicit ASTReturn(Expr condition, bool kills) : condition{condition}, kills{kills} {}
     Expr condition;
     Expr condition;
     bool kills;
     bool kills;
 };
 };
 
 
 class ASTBreak {
 class ASTBreak {
 public:
 public:
-    ASTBreak(Expr condition) : condition{condition} {}
+    explicit ASTBreak(Expr condition) : condition{condition} {}
     Expr condition;
     Expr condition;
 };
 };
 
 
@@ -177,11 +177,11 @@ public:
         return &data;
         return &data;
     }
     }
 
 
-    ASTNode GetNext() {
+    ASTNode GetNext() const {
         return next;
         return next;
     }
     }
 
 
-    ASTNode GetPrevious() {
+    ASTNode GetPrevious() const {
         return previous;
         return previous;
     }
     }
 
 
@@ -189,12 +189,12 @@ public:
         return *manager;
         return *manager;
     }
     }
 
 
-    u32 GetGotoLabel() const {
+    std::optional<u32> GetGotoLabel() const {
         auto inner = std::get_if<ASTGoto>(&data);
         auto inner = std::get_if<ASTGoto>(&data);
         if (inner) {
         if (inner) {
-            return inner->label;
+            return {inner->label};
         }
         }
-        return -1;
+        return {};
     }
     }
 
 
     Expr GetGotoCondition() const {
     Expr GetGotoCondition() const {
@@ -220,12 +220,12 @@ public:
         return true;
         return true;
     }
     }
 
 
-    u32 GetLabelIndex() const {
+    std::optional<u32> GetLabelIndex() const {
         auto inner = std::get_if<ASTLabel>(&data);
         auto inner = std::get_if<ASTLabel>(&data);
         if (inner) {
         if (inner) {
-            return inner->index;
+            return {inner->index};
         }
         }
-        return -1;
+        return {};
     }
     }
 
 
     Expr GetIfCondition() const {
     Expr GetIfCondition() const {
@@ -290,7 +290,7 @@ private:
     friend class ASTZipper;
     friend class ASTZipper;
 
 
     ASTData data;
     ASTData data;
-    ASTNode parent;
+    ASTNode parent{};
     ASTNode next{};
     ASTNode next{};
     ASTNode previous{};
     ASTNode previous{};
     ASTZipper* manager{};
     ASTZipper* manager{};
@@ -327,13 +327,18 @@ public:
 
 
     void SanityCheck();
     void SanityCheck();
 
 
+    void Clear();
+
     bool IsFullyDecompiled() const {
     bool IsFullyDecompiled() const {
         if (full_decompile) {
         if (full_decompile) {
             return gotos.size() == 0;
             return gotos.size() == 0;
         } else {
         } else {
             for (ASTNode goto_node : gotos) {
             for (ASTNode goto_node : gotos) {
-                u32 label_index = goto_node->GetGotoLabel();
-                ASTNode glabel = labels[label_index];
+                auto label_index = goto_node->GetGotoLabel();
+                if (!label_index) {
+                    return false;
+                }
+                ASTNode glabel = labels[*label_index];
                 if (IsBackwardsJump(goto_node, glabel)) {
                 if (IsBackwardsJump(goto_node, glabel)) {
                     return false;
                     return false;
                 }
                 }
@@ -346,8 +351,6 @@ public:
         return main_node;
         return main_node;
     }
     }
 
 
-    void Clear();
-
     u32 GetVariables() const {
     u32 GetVariables() const {
         return variables;
         return variables;
     }
     }
@@ -372,9 +375,7 @@ private:
     void MoveOutward(ASTNode goto_node);
     void MoveOutward(ASTNode goto_node);
 
 
     u32 NewVariable() {
     u32 NewVariable() {
-        u32 new_var = variables;
-        variables++;
-        return new_var;
+        return variables++;
     }
     }
 
 
     bool full_decompile{};
     bool full_decompile{};

+ 7 - 7
src/video_core/shader/expr.h

@@ -28,7 +28,7 @@ using Expr = std::shared_ptr<ExprData>;
 
 
 class ExprAnd final {
 class ExprAnd final {
 public:
 public:
-    ExprAnd(Expr a, Expr b) : operand1{a}, operand2{b} {}
+    explicit ExprAnd(Expr a, Expr b) : operand1{a}, operand2{b} {}
 
 
     bool operator==(const ExprAnd& b) const;
     bool operator==(const ExprAnd& b) const;
 
 
@@ -38,7 +38,7 @@ public:
 
 
 class ExprOr final {
 class ExprOr final {
 public:
 public:
-    ExprOr(Expr a, Expr b) : operand1{a}, operand2{b} {}
+    explicit ExprOr(Expr a, Expr b) : operand1{a}, operand2{b} {}
 
 
     bool operator==(const ExprOr& b) const;
     bool operator==(const ExprOr& b) const;
 
 
@@ -48,7 +48,7 @@ public:
 
 
 class ExprNot final {
 class ExprNot final {
 public:
 public:
-    ExprNot(Expr a) : operand1{a} {}
+    explicit ExprNot(Expr a) : operand1{a} {}
 
 
     bool operator==(const ExprNot& b) const;
     bool operator==(const ExprNot& b) const;
 
 
@@ -57,7 +57,7 @@ public:
 
 
 class ExprVar final {
 class ExprVar final {
 public:
 public:
-    ExprVar(u32 index) : var_index{index} {}
+    explicit ExprVar(u32 index) : var_index{index} {}
 
 
     bool operator==(const ExprVar& b) const {
     bool operator==(const ExprVar& b) const {
         return var_index == b.var_index;
         return var_index == b.var_index;
@@ -68,7 +68,7 @@ public:
 
 
 class ExprPredicate final {
 class ExprPredicate final {
 public:
 public:
-    ExprPredicate(u32 predicate) : predicate{predicate} {}
+    explicit ExprPredicate(u32 predicate) : predicate{predicate} {}
 
 
     bool operator==(const ExprPredicate& b) const {
     bool operator==(const ExprPredicate& b) const {
         return predicate == b.predicate;
         return predicate == b.predicate;
@@ -79,7 +79,7 @@ public:
 
 
 class ExprCondCode final {
 class ExprCondCode final {
 public:
 public:
-    ExprCondCode(ConditionCode cc) : cc{cc} {}
+    explicit ExprCondCode(ConditionCode cc) : cc{cc} {}
 
 
     bool operator==(const ExprCondCode& b) const {
     bool operator==(const ExprCondCode& b) const {
         return cc == b.cc;
         return cc == b.cc;
@@ -90,7 +90,7 @@ public:
 
 
 class ExprBoolean final {
 class ExprBoolean final {
 public:
 public:
-    ExprBoolean(bool val) : value{val} {}
+    explicit ExprBoolean(bool val) : value{val} {}
 
 
     bool operator==(const ExprBoolean& b) const {
     bool operator==(const ExprBoolean& b) const {
         return value == b.value;
         return value == b.value;