From cdd4fd98670ed9df3a8b17075324867a41bac23e Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 2 Dec 2017 15:13:13 +0300 Subject: [PATCH] rsx/fp: Explicitly insert global functions. - Functions such as pack/unpack ops must exist before the shared gather functions are declared --- rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp | 12 +++++++----- rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.h | 3 +++ .../Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp | 5 ++++- rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.h | 1 + rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 5 ++++- rpcs3/Emu/RSX/GL/GLFragmentProgram.h | 1 + rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 5 ++++- rpcs3/Emu/RSX/VK/VKFragmentProgram.h | 1 + 8 files changed, 25 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp index b1e2a44739..6cf799aabb 100644 --- a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp @@ -444,15 +444,17 @@ std::string FragmentProgramDecompiler::BuildCode() std::stringstream OS; insertHeader(OS); - OS << std::endl; + OS << "\n"; insertConstants(OS); - OS << std::endl; + OS << "\n"; insertIntputs(OS); - OS << std::endl; + OS << "\n"; insertOutputs(OS); - OS << std::endl; + OS << "\n"; + + //Insert global function definitions + insertGlobalFunctions(OS); - //TODO: Better organization for this std::string float2 = getFloatTypeName(2); std::string float4 = getFloatTypeName(4); diff --git a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.h b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.h index f2d502aa60..7eeffc9a50 100644 --- a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.h +++ b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.h @@ -207,6 +207,9 @@ protected: /** insert declaration of shader constants. */ virtual void insertConstants(std::stringstream &OS) = 0; + /** insert helper functin definitions. + */ + virtual void insertGlobalFunctions(std::stringstream &OS) = 0; /** insert beginning of main (signature, temporary declaration...) */ virtual void insertMainStart(std::stringstream &OS) = 0; diff --git a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp index 44187e83e1..ed60d4a517 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp @@ -176,10 +176,13 @@ namespace } } -void D3D12FragmentDecompiler::insertMainStart(std::stringstream & OS) +void D3D12FragmentDecompiler::insertGlobalFunctions(std::stringstream &OS) { insert_d3d12_legacy_function(OS, true); +} +void D3D12FragmentDecompiler::insertMainStart(std::stringstream & OS) +{ for (const ParamType &PT : m_parr.params[PF_PARAM_IN]) { for (const ParamItem &PI : PT.items) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.h b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.h index e4a58f1f09..d17d1ad3eb 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.h @@ -17,6 +17,7 @@ protected: virtual void insertIntputs(std::stringstream &OS) override; virtual void insertOutputs(std::stringstream &OS) override; virtual void insertConstants(std::stringstream &OS) override; + virtual void insertGlobalFunctions(std::stringstream &OS) override; virtual void insertMainStart(std::stringstream &OS) override; virtual void insertMainEnd(std::stringstream &OS) override; public: diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index 173c1f9c1b..d676d1f852 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -192,10 +192,13 @@ namespace } } -void GLFragmentDecompilerThread::insertMainStart(std::stringstream & OS) +void GLFragmentDecompilerThread::insertGlobalFunctions(std::stringstream &OS) { glsl::insert_glsl_legacy_function(OS, glsl::glsl_fragment_program); +} +void GLFragmentDecompilerThread::insertMainStart(std::stringstream & OS) +{ //TODO: Generate input mask during parse stage to avoid this for (const ParamType& PT : m_parr.params[PF_PARAM_IN]) { diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.h b/rpcs3/Emu/RSX/GL/GLFragmentProgram.h index f7364e46cc..dc991d8701 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.h +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.h @@ -28,6 +28,7 @@ protected: virtual void insertIntputs(std::stringstream &OS) override; virtual void insertOutputs(std::stringstream &OS) override; virtual void insertConstants(std::stringstream &OS) override; + virtual void insertGlobalFunctions(std::stringstream &OS) override; virtual void insertMainStart(std::stringstream &OS) override; virtual void insertMainEnd(std::stringstream &OS) override; }; diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index 1be65eb126..195fe479a4 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -195,10 +195,13 @@ namespace vk } } -void VKFragmentDecompilerThread::insertMainStart(std::stringstream & OS) +void VKFragmentDecompilerThread::insertGlobalFunctions(std::stringstream &OS) { glsl::insert_glsl_legacy_function(OS, glsl::glsl_fragment_program); +} +void VKFragmentDecompilerThread::insertMainStart(std::stringstream & OS) +{ //TODO: Generate input mask during parse stage to avoid this for (const ParamType& PT : m_parr.params[PF_PARAM_IN]) { diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.h b/rpcs3/Emu/RSX/VK/VKFragmentProgram.h index 2bb9c29efb..5cd521cf36 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.h +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.h @@ -32,6 +32,7 @@ protected: virtual void insertIntputs(std::stringstream &OS) override; virtual void insertOutputs(std::stringstream &OS) override; virtual void insertConstants(std::stringstream &OS) override; + virtual void insertGlobalFunctions(std::stringstream &OS) override; virtual void insertMainStart(std::stringstream &OS) override; virtual void insertMainEnd(std::stringstream &OS) override; };