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 +