diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt
index 39e145900a..d556b3ebdc 100644
--- a/rpcs3/Emu/CMakeLists.txt
+++ b/rpcs3/Emu/CMakeLists.txt
@@ -517,6 +517,8 @@ target_sources(rpcs3_emu PRIVATE
RSX/Overlays/Shaders/shader_loading_dialog.cpp
RSX/Overlays/Shaders/shader_loading_dialog_native.cpp
RSX/Program/Assembler/FPToCFG.cpp
+ RSX/Program/Assembler/Passes/RegisterAnnotationPass.cpp
+ RSX/Program/Assembler/Passes/RegisterDependencyPass.cpp
RSX/Program/CgBinaryProgram.cpp
RSX/Program/CgBinaryFragmentProgram.cpp
RSX/Program/CgBinaryVertexProgram.cpp
diff --git a/rpcs3/Emu/RSX/Program/Assembler/CFG.h b/rpcs3/Emu/RSX/Program/Assembler/CFG.h
index 9bc44a22d1..818bc2a018 100644
--- a/rpcs3/Emu/RSX/Program/Assembler/CFG.h
+++ b/rpcs3/Emu/RSX/Program/Assembler/CFG.h
@@ -34,6 +34,11 @@ namespace rsx::assembler
}
};
+ struct CFGPass
+ {
+ virtual void run(FlowGraph& graph) = 0;
+ };
+
FlowGraph deconstruct_fragment_program(const RSXFragmentProgram& prog);
}
diff --git a/rpcs3/Emu/RSX/Program/Assembler/Passes/RegisterAnnotationPass.cpp b/rpcs3/Emu/RSX/Program/Assembler/Passes/RegisterAnnotationPass.cpp
new file mode 100644
index 0000000000..8d23080daa
--- /dev/null
+++ b/rpcs3/Emu/RSX/Program/Assembler/Passes/RegisterAnnotationPass.cpp
@@ -0,0 +1,10 @@
+#include "stdafx.h"
+#include "RegisterAnnotationPass.h"
+
+namespace rsx::assembler
+{
+ void RegisterAnnotationPass::run(FlowGraph& graph)
+ {
+ // TODO
+ }
+}
diff --git a/rpcs3/Emu/RSX/Program/Assembler/Passes/RegisterAnnotationPass.h b/rpcs3/Emu/RSX/Program/Assembler/Passes/RegisterAnnotationPass.h
new file mode 100644
index 0000000000..f08f0d6e8e
--- /dev/null
+++ b/rpcs3/Emu/RSX/Program/Assembler/Passes/RegisterAnnotationPass.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "../CFG.h"
+
+namespace rsx::assembler
+{
+ // The annotation pass annotates each basic block with 2 pieces of information:
+ // 1. The "input" register list for a block.
+ // 2. The "output" register list for a block (clobber list).
+ // The information can be used by other passes to set up prologue/epilogue on each block.
+ class RegisterAnnotationPass : public CFGPass
+ {
+ public:
+ void run(FlowGraph& graph) override;
+ };
+}
diff --git a/rpcs3/Emu/RSX/Program/Assembler/Passes/RegisterDependencyPass.cpp b/rpcs3/Emu/RSX/Program/Assembler/Passes/RegisterDependencyPass.cpp
new file mode 100644
index 0000000000..290f1a4022
--- /dev/null
+++ b/rpcs3/Emu/RSX/Program/Assembler/Passes/RegisterDependencyPass.cpp
@@ -0,0 +1,10 @@
+#include "stdafx.h"
+#include "RegisterDependencyPass.h"
+
+namespace rsx::assembler
+{
+ void RegisterDependencyPass::run(FlowGraph& graph)
+ {
+ // TODO
+ }
+}
diff --git a/rpcs3/Emu/RSX/Program/Assembler/Passes/RegisterDependencyPass.h b/rpcs3/Emu/RSX/Program/Assembler/Passes/RegisterDependencyPass.h
new file mode 100644
index 0000000000..b7af86761b
--- /dev/null
+++ b/rpcs3/Emu/RSX/Program/Assembler/Passes/RegisterDependencyPass.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "../CFG.h"
+
+namespace rsx::assembler
+{
+ // The register dependency pass identifies data hazards for each basic block and injects barrier instructions.
+ // Real PS3 does not have explicit barriers, but does instead often use delay slots or fence instructions to stall until a specific hardware unit clears the fence to advance.
+ // For decompiled shaders, we have the problem that aliasing is not real and is instead simulated. We do not have access to unions on the GPU without really nasty tricks.
+ class RegisterDependencyPass : public CFGPass
+ {
+ public:
+ void run(FlowGraph& graph) override;
+ };
+}
diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj
index 1b5716f01b..5e8971fab2 100644
--- a/rpcs3/emucore.vcxproj
+++ b/rpcs3/emucore.vcxproj
@@ -157,6 +157,8 @@
+
+
@@ -702,6 +704,8 @@
+
+
diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters
index 23b7ef174d..d0b2a25233 100644
--- a/rpcs3/emucore.vcxproj.filters
+++ b/rpcs3/emucore.vcxproj.filters
@@ -136,6 +136,9 @@
{d99df916-8a99-428b-869a-9f14ac0ab411}
+
+ {d13db076-47e4-45b9-bb8a-6b711ea40622}
+
@@ -1378,6 +1381,12 @@
Emu\GPU\RSX\Program\Assembler
+
+ Emu\GPU\RSX\Program\Assembler\Passes
+
+
+ Emu\GPU\RSX\Program\Assembler\Passes
+
@@ -2776,6 +2785,12 @@
Emu\GPU\RSX\Program\Assembler
+
+ Emu\GPU\RSX\Program\Assembler\Passes
+
+
+ Emu\GPU\RSX\Program\Assembler\Passes
+