From 3dd6b55851978440f39487a6ad06b30b792b3b36 Mon Sep 17 00:00:00 2001
From: Fernando Sahmkow <fsahmkow27@gmail.com>
Date: Sat, 4 Jan 2020 14:40:57 -0400
Subject: [PATCH] Shader_IR: Address Feedback

---
 .../renderer_opengl/gl_shader_decompiler.cpp   | 17 ++++-------------
 .../renderer_vulkan/vk_shader_decompiler.cpp   | 18 ++++--------------
 src/video_core/shader/node.h                   | 10 +++++-----
 src/video_core/shader/shader_ir.cpp            |  4 ++--
 src/video_core/shader/shader_ir.h              |  8 ++++----
 5 files changed, 19 insertions(+), 38 deletions(-)

diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
index e1730821f..f9f7a97b5 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -751,10 +751,8 @@ private:
 
     Expression Visit(const Node& node) {
         if (const auto operation = std::get_if<OperationNode>(&*node)) {
-            auto amend_index = operation->GetAmendIndex();
-            if (amend_index) {
-                const Node& amend_node = ir.GetAmendNode(*amend_index);
-                Visit(amend_node).CheckVoid();
+            if (const auto amend_index = operation->GetAmendIndex()) {
+                Visit(ir.GetAmendNode(*amend_index)).CheckVoid();
             }
             const auto operation_index = static_cast<std::size_t>(operation->GetCode());
             if (operation_index >= operation_decompilers.size()) {
@@ -877,10 +875,8 @@ private:
         }
 
         if (const auto conditional = std::get_if<ConditionalNode>(&*node)) {
-            auto amend_index = conditional->GetAmendIndex();
-            if (amend_index) {
-                const Node& amend_node = ir.GetAmendNode(*amend_index);
-                Visit(amend_node).CheckVoid();
+            if (const auto amend_index = conditional->GetAmendIndex()) {
+                Visit(ir.GetAmendNode(*amend_index)).CheckVoid();
             }
             // It's invalid to call conditional on nested nodes, use an operation instead
             code.AddLine("if ({}) {{", Visit(conditional->GetCondition()).AsBool());
@@ -894,11 +890,6 @@ private:
         }
 
         if (const auto comment = std::get_if<CommentNode>(&*node)) {
-            auto amend_index = comment->GetAmendIndex();
-            if (amend_index) {
-                const Node& amend_node = ir.GetAmendNode(*amend_index);
-                Visit(amend_node).CheckVoid();
-            }
             code.AddLine("// " + comment->GetText());
             return {};
         }
diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
index 50feeb003..8fe852ce8 100644
--- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
+++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
@@ -954,10 +954,8 @@ private:
 
     Expression Visit(const Node& node) {
         if (const auto operation = std::get_if<OperationNode>(&*node)) {
-            auto amend_index = operation->GetAmendIndex();
-            if (amend_index) {
-                const Node& amend_node = ir.GetAmendNode(*amend_index);
-                [[maybe_unused]] const Type type = Visit(amend_node).type;
+            if (const auto amend_index = operation->GetAmendIndex()) {
+                [[maybe_unused]] const Type type = Visit(ir.GetAmendNode(*amend_index)).type;
                 ASSERT(type == Type::Void);
             }
             const auto operation_index = static_cast<std::size_t>(operation->GetCode());
@@ -1148,10 +1146,8 @@ private:
         }
 
         if (const auto conditional = std::get_if<ConditionalNode>(&*node)) {
-            auto amend_index = conditional->GetAmendIndex();
-            if (amend_index) {
-                const Node& amend_node = ir.GetAmendNode(*amend_index);
-                [[maybe_unused]] const Type type = Visit(amend_node).type;
+            if (const auto amend_index = conditional->GetAmendIndex()) {
+                [[maybe_unused]] const Type type = Visit(ir.GetAmendNode(*amend_index)).type;
                 ASSERT(type == Type::Void);
             }
             // It's invalid to call conditional on nested nodes, use an operation instead
@@ -1176,12 +1172,6 @@ private:
         }
 
         if (const auto comment = std::get_if<CommentNode>(&*node)) {
-            auto amend_index = comment->GetAmendIndex();
-            if (amend_index) {
-                const Node& amend_node = ir.GetAmendNode(*amend_index);
-                [[maybe_unused]] const Type type = Visit(amend_node).type;
-                ASSERT(type == Type::Void);
-            }
             Name(OpUndef(t_void), comment->GetText());
             return {};
         }
diff --git a/src/video_core/shader/node.h b/src/video_core/shader/node.h
index 42e82ab74..4e155542a 100644
--- a/src/video_core/shader/node.h
+++ b/src/video_core/shader/node.h
@@ -394,14 +394,14 @@ using Meta =
 
 class AmendNode {
 public:
-    std::optional<u32> GetAmendIndex() const {
+    std::optional<std::size_t> GetAmendIndex() const {
         if (amend_index == amend_null_index) {
             return std::nullopt;
         }
         return {amend_index};
     }
 
-    void SetAmendIndex(u32 index) {
+    void SetAmendIndex(std::size_t index) {
         amend_index = index;
     }
 
@@ -410,8 +410,8 @@ public:
     }
 
 private:
-    static constexpr u32 amend_null_index = 0xFFFFFFFF;
-    u32 amend_index{amend_null_index};
+    static constexpr std::size_t amend_null_index = 0xFFFFFFFFFFFFFFFFULL;
+    std::size_t amend_index{amend_null_index};
 };
 
 /// Holds any kind of operation that can be done in the IR
@@ -652,7 +652,7 @@ private:
 };
 
 /// Commentary, can be dropped
-class CommentNode final : public AmendNode {
+class CommentNode final {
 public:
     explicit CommentNode(std::string text) : text{std::move(text)} {}
 
diff --git a/src/video_core/shader/shader_ir.cpp b/src/video_core/shader/shader_ir.cpp
index 49678767c..31eecb3f4 100644
--- a/src/video_core/shader/shader_ir.cpp
+++ b/src/video_core/shader/shader_ir.cpp
@@ -446,8 +446,8 @@ Node ShaderIR::BitfieldInsert(Node base, Node insert, u32 offset, u32 bits) {
                      Immediate(bits));
 }
 
-u32 ShaderIR::DeclareAmend(Node new_amend) {
-    const u32 id = static_cast<u32>(amend_code.size());
+std::size_t ShaderIR::DeclareAmend(Node new_amend) {
+    const std::size_t id = amend_code.size();
     amend_code.push_back(new_amend);
     return id;
 }
diff --git a/src/video_core/shader/shader_ir.h b/src/video_core/shader/shader_ir.h
index 52f130e1b..aacd0a0da 100644
--- a/src/video_core/shader/shader_ir.h
+++ b/src/video_core/shader/shader_ir.h
@@ -176,7 +176,7 @@ public:
     /// Returns a condition code evaluated from internal flags
     Node GetConditionCode(Tegra::Shader::ConditionCode cc) const;
 
-    const Node& GetAmendNode(u32 index) const {
+    const Node& GetAmendNode(std::size_t index) const {
         return amend_code[index];
     }
 
@@ -396,8 +396,8 @@ private:
                                                                Tegra::Shader::Instruction instr,
                                                                bool is_write);
 
-    /// Amends
-    u32 DeclareAmend(Node new_amend);
+    /// Register new amending code and obtain the reference id.
+    std::size_t DeclareAmend(Node new_amend);
 
     const ProgramCode& program_code;
     const u32 main_offset;
@@ -413,7 +413,7 @@ private:
     std::map<u32, NodeBlock> basic_blocks;
     NodeBlock global_code;
     ASTManager program_manager{true, true};
-    NodeBlock amend_code;
+    std::vector<Node> amend_code;
 
     std::set<u32> used_registers;
     std::set<Tegra::Shader::Pred> used_predicates;