diff --git a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp index c75b9ddfff..38f1c88e8e 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp @@ -6,27 +6,44 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" -static std::string typeName[] = -{ - "float", - "float2", - "float3", - "float4" -}; - -static std::string functionName[] = -{ - "saturate", - "float4(dot($0.xy, $1.xy), dot($0.xy, $1.xy), dot($0.xy, $1.xy), dot($0.xy, $1.xy))", - "frac($0)", -}; - D3D12FragmentDecompiler::D3D12FragmentDecompiler(u32 addr, u32& size, u32 ctrl) : FragmentProgramDecompiler(addr, size, 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"; + } +} + +std::string D3D12FragmentDecompiler::getFunction(enum class FUNCTION f) +{ + switch (f) + { + default: + abort(); + case FUNCTION::FUNCTION_SATURATE: + return "saturate"; + case FUNCTION::FUNCTION_DP2: + return "dot($0.xy, $1.xy).xxxx"; + case FUNCTION::FUNCTION_FRACT: + return "frac($0)"; + } +} + void D3D12FragmentDecompiler::insertHeader(std::stringstream & OS) { OS << "// Header" << std::endl; @@ -69,8 +86,8 @@ void D3D12FragmentDecompiler::insertOutputs(std::stringstream & OS) for (int i = 0; i < sizeof(table) / sizeof(*table); ++i) { - if (m_parr.HasParam(PF_PARAM_NONE, typeName[3], table[i].second)) - OS << " " << typeName[3] << " " << table[i].first << " : SV_TARGET" << i << ";" << std::endl; + if (m_parr.HasParam(PF_PARAM_NONE, "float4", table[i].second)) + OS << " " << "float4" << " " << table[i].first << " : SV_TARGET" << i << ";" << std::endl; } OS << "};" << std::endl; } @@ -131,7 +148,7 @@ void D3D12FragmentDecompiler::insertMainEnd(std::stringstream & OS) OS << " PixelOutput Out;" << std::endl; for (int i = 0; i < sizeof(table) / sizeof(*table); ++i) { - if (m_parr.HasParam(PF_PARAM_NONE, typeName[3], table[i].second)) + if (m_parr.HasParam(PF_PARAM_NONE, "float4", table[i].second)) OS << " Out." << table[i].first << " = " << table[i].second << ";" << std::endl; } OS << " return Out;" << std::endl; diff --git a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.h b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.h index 94d0985d9e..a32a2654f2 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.h @@ -8,6 +8,9 @@ class D3D12FragmentDecompiler : public FragmentProgramDecompiler { protected: + virtual std::string getFloatTypeName(size_t elementCount) override; + virtual std::string getFunction(enum class FUNCTION) override; + virtual void insertHeader(std::stringstream &OS) override; virtual void insertIntputs(std::stringstream &OS) override; virtual void insertOutputs(std::stringstream &OS) override;