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