diff --git a/rpcs3/Emu/RSX/D3D12/D3D12CommonDecompiler.cpp b/rpcs3/Emu/RSX/D3D12/D3D12CommonDecompiler.cpp
new file mode 100644
index 0000000000..813f6b5f0b
--- /dev/null
+++ b/rpcs3/Emu/RSX/D3D12/D3D12CommonDecompiler.cpp
@@ -0,0 +1,71 @@
+#include "stdafx.h"
+#include "D3D12CommonDecompiler.h"
+
+std::string getFloatTypeNameImp(size_t elementCount)
+{
+ switch (elementCount)
+ {
+ default:
+ abort();
+ case 1:
+ return "float";
+ case 2:
+ return "float2";
+ case 3:
+ return "float3";
+ case 4:
+ return "float4";
+ }
+}
+
+std::string getFunctionImp(FUNCTION f)
+{
+ switch (f)
+ {
+ default:
+ abort();
+ case FUNCTION::FUNCTION_DP2:
+ return "dot($0.xy, $1.xy).xxxx";
+ case FUNCTION::FUNCTION_DP2A:
+ return "(dot($0.xy, $1.xy) + $2.x).xxxx";
+ case FUNCTION::FUNCTION_DP3:
+ return "dot($0.xyz, $1.xyz).xxxx";
+ case FUNCTION::FUNCTION_DP4:
+ return "dot($0, $1).xxxx";
+ case FUNCTION::FUNCTION_DPH:
+ return "dot(float4($0.xyz, 1.0), $1).xxxx";
+ case FUNCTION::FUNCTION_SFL:
+ return "float4(0., 0., 0., 0.)";
+ case FUNCTION::FUNCTION_STR:
+ return "float4(1., 1., 1., 1.)";
+ case FUNCTION::FUNCTION_FRACT:
+ return "frac($0)";
+ case FUNCTION::FUNCTION_TEXTURE_SAMPLE:
+ return "$t.Sample($tsampler, $0.xy)";
+ case FUNCTION::FUNCTION_DFDX:
+ return "ddx($0)";
+ case FUNCTION::FUNCTION_DFDY:
+ return "ddy($0)";
+ }
+}
+
+std::string compareFunctionImp(COMPARE f, const std::string &Op0, const std::string &Op1)
+{
+ switch (f)
+ {
+ default:
+ abort();
+ case COMPARE::FUNCTION_SEQ:
+ return "(" + Op0 + " == " + Op1 + ")";
+ case COMPARE::FUNCTION_SGE:
+ return "(" + Op0 + " >= " + Op1 + ")";
+ case COMPARE::FUNCTION_SGT:
+ return "(" + Op0 + " > " + Op1 + ")";
+ case COMPARE::FUNCTION_SLE:
+ return "(" + Op0 + " <= " + Op1 + ")";
+ case COMPARE::FUNCTION_SLT:
+ return "(" + Op0 + " < " + Op1 + ")";
+ case COMPARE::FUNCTION_SNE:
+ return "(" + Op0 + " != " + Op1 + ")";
+ }
+}
\ No newline at end of file
diff --git a/rpcs3/Emu/RSX/D3D12/D3D12CommonDecompiler.h b/rpcs3/Emu/RSX/D3D12/D3D12CommonDecompiler.h
new file mode 100644
index 0000000000..fd9cfd9589
--- /dev/null
+++ b/rpcs3/Emu/RSX/D3D12/D3D12CommonDecompiler.h
@@ -0,0 +1,6 @@
+#pragma once
+#include "../Common/ShaderParam.h"
+
+std::string getFloatTypeNameImp(size_t elementCount);
+std::string getFunctionImp(FUNCTION f);
+std::string compareFunctionImp(COMPARE f, const std::string &Op0, const std::string &Op1);
\ No newline at end of file
diff --git a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp
index d996e4ab43..f9837e0185 100644
--- a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp
+++ b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp
@@ -1,7 +1,7 @@
#include "stdafx.h"
#if defined(DX12_SUPPORT)
#include "D3D12FragmentProgramDecompiler.h"
-
+#include "D3D12CommonDecompiler.h"
#include "Utilities/Log.h"
#include "Emu/Memory/Memory.h"
#include "Emu/System.h"
@@ -14,50 +14,12 @@ D3D12FragmentDecompiler::D3D12FragmentDecompiler(u32 addr, u32& size, u32 ctrl)
std::string D3D12FragmentDecompiler::getFloatTypeName(size_t elementCount)
{
- switch (elementCount)
- {
- default:
- abort();
- case 1:
- return "float";
- case 2:
- return "float2";
- case 3:
- return "float3";
- case 4:
- return "float4";
- }
+ return getFloatTypeNameImp(elementCount);
}
std::string D3D12FragmentDecompiler::getFunction(enum class FUNCTION f)
{
- switch (f)
- {
- default:
- abort();
- case FUNCTION::FUNCTION_DP2:
- return "dot($0.xy, $1.xy).xxxx";
- case FUNCTION::FUNCTION_DP2A:
- return "(dot($0.xy, $1.xy) + $2.x).xxxx";
- case FUNCTION::FUNCTION_DP3:
- return "dot($0.xyz, $1.xyz).xxxx";
- case FUNCTION::FUNCTION_DP4:
- return "dot($0, $1).xxxx";
- case FUNCTION::FUNCTION_DPH:
- return "dot(float4($0.xyz, 1.0), $1).xxxx";
- case FUNCTION::FUNCTION_SFL:
- return "float4(0., 0., 0., 0.)";
- case FUNCTION::FUNCTION_STR:
- return "float4(1., 1., 1., 1.)";
- case FUNCTION::FUNCTION_FRACT:
- return "frac($0)";
- case FUNCTION::FUNCTION_TEXTURE_SAMPLE:
- return "$t.Sample($tsampler, $0.xy)";
- case FUNCTION::FUNCTION_DFDX:
- return "ddx($0)";
- case FUNCTION::FUNCTION_DFDY:
- return "ddy($0)";
- }
+ return getFunctionImp(f);
}
std::string D3D12FragmentDecompiler::saturate(const std::string & code)
@@ -67,23 +29,7 @@ std::string D3D12FragmentDecompiler::saturate(const std::string & code)
std::string D3D12FragmentDecompiler::compareFunction(COMPARE f, const std::string &Op0, const std::string &Op1)
{
- switch (f)
- {
- default:
- abort();
- case COMPARE::FUNCTION_SEQ:
- return "(" + Op0 + " == " + Op1 + ")";
- case COMPARE::FUNCTION_SGE:
- return "(" + Op0 + " >= " + Op1 +")";
- case COMPARE::FUNCTION_SGT:
- return "(" + Op0 + " > " + Op1 + ")";
- case COMPARE::FUNCTION_SLE:
- return "(" + Op0 + " <= " + Op1 + ")";
- case COMPARE::FUNCTION_SLT:
- return "(" + Op0 + " < " + Op1 + ")";
- case COMPARE::FUNCTION_SNE:
- return "(" + Op0 + " != " + Op1 + ")";
- }
+ return compareFunctionImp(f, Op0, Op1);
}
void D3D12FragmentDecompiler::insertHeader(std::stringstream & OS)
diff --git a/rpcs3/Emu/RSX/D3D12/D3D12VertexProgramDecompiler.cpp b/rpcs3/Emu/RSX/D3D12/D3D12VertexProgramDecompiler.cpp
index bedd8f0b9a..6129ca5611 100644
--- a/rpcs3/Emu/RSX/D3D12/D3D12VertexProgramDecompiler.cpp
+++ b/rpcs3/Emu/RSX/D3D12/D3D12VertexProgramDecompiler.cpp
@@ -1,77 +1,24 @@
#include "stdafx.h"
#if defined(DX12_SUPPORT)
#include "D3D12VertexProgramDecompiler.h"
+#include "D3D12CommonDecompiler.h"
#include "Utilities/Log.h"
#include "Emu/System.h"
std::string D3D12VertexProgramDecompiler::getFloatTypeName(size_t elementCount)
{
- switch (elementCount)
- {
- default:
- abort();
- case 1:
- return "float";
- case 2:
- return "float2";
- case 3:
- return "float3";
- case 4:
- return "float4";
- }
+ return getFloatTypeNameImp(elementCount);
}
std::string D3D12VertexProgramDecompiler::getFunction(enum class FUNCTION f)
{
- switch (f)
- {
- default:
- abort();
- case FUNCTION::FUNCTION_DP2:
- return "dot($0.xy, $1.xy).xxxx";
- case FUNCTION::FUNCTION_DP2A:
- return "(dot($0.xy, $1.xy) + $2.x).xxxx";
- case FUNCTION::FUNCTION_DP3:
- return "dot($0.xyz, $1.xyz).xxxx";
- case FUNCTION::FUNCTION_DP4:
- return "dot($0, $1).xxxx";
- case FUNCTION::FUNCTION_DPH:
- return "dot(float4($0.xyz, 1.0), $1).xxxx";
- case FUNCTION::FUNCTION_SFL:
- return "float4(0., 0., 0., 0.)";
- case FUNCTION::FUNCTION_STR:
- return "float4(1., 1., 1., 1.)";
- case FUNCTION::FUNCTION_FRACT:
- return "frac($0)";
- case FUNCTION::FUNCTION_TEXTURE_SAMPLE:
- return "$t.Sample($tsampler, $0.xy)";
- case FUNCTION::FUNCTION_DFDX:
- return "ddx($0)";
- case FUNCTION::FUNCTION_DFDY:
- return "ddy($0)";
- }
+ return getFunctionImp(f);
}
std::string D3D12VertexProgramDecompiler::compareFunction(COMPARE f, const std::string &Op0, const std::string &Op1)
{
- switch (f)
- {
- default:
- abort();
- case COMPARE::FUNCTION_SEQ:
- return "(" + Op0 + " == " + Op1 + ").xxxx";
- case COMPARE::FUNCTION_SGE:
- return "(" + Op0 + " >= " + Op1 + ").xxxx";
- case COMPARE::FUNCTION_SGT:
- return "(" + Op0 + " > " + Op1 + ").xxxx";
- case COMPARE::FUNCTION_SLE:
- return "(" + Op0 + " <= " + Op1 + ").xxxx";
- case COMPARE::FUNCTION_SLT:
- return "(" + Op0 + " < " + Op1 + ").xxxx";
- case COMPARE::FUNCTION_SNE:
- return "(" + Op0 + " != " + Op1 + ").xxxx";
- }
+ return compareFunctionImp(f, Op0, Op1);
}
void D3D12VertexProgramDecompiler::insertHeader(std::stringstream &OS)
diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj
index 049f949613..2612992e5e 100644
--- a/rpcs3/emucore.vcxproj
+++ b/rpcs3/emucore.vcxproj
@@ -48,6 +48,7 @@
+
@@ -513,6 +514,7 @@
+
diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters
index fbc8a96a59..1895f11773 100644
--- a/rpcs3/emucore.vcxproj.filters
+++ b/rpcs3/emucore.vcxproj.filters
@@ -986,6 +986,9 @@
Emu\GPU\RSX\D3D12
+
+ Emu\GPU\RSX\D3D12
+
Emu\GPU\RSX\D3D12
@@ -1870,6 +1873,9 @@
Emu\GPU\RSX\D3D12
+
+ Emu\GPU\RSX\D3D12
+
Emu\GPU\RSX\D3D12