From 5da166b26bc2358da5264a1b60a15fed23a0a751 Mon Sep 17 00:00:00 2001 From: vlj Date: Thu, 14 May 2015 20:13:47 +0200 Subject: [PATCH] d3d12: Move/clean code --- rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp | 1 - .../RSX/D3D12/D3D12ProgramDisassembler.cpp | 268 ------------------ .../Emu/RSX/D3D12/D3D12ProgramDisassembler.h | 6 - rpcs3/Emu/RSX/D3D12/ShaderParam.cpp | 6 + rpcs3/Emu/RSX/D3D12/ShaderParam.h | 194 +++++++++++++ rpcs3/Emu/RSX/D3D12/VertexProgramDecompiler.h | 190 +------------ rpcs3/emucore.vcxproj | 9 + rpcs3/emucore.vcxproj.filters | 15 + 8 files changed, 225 insertions(+), 464 deletions(-) delete mode 100644 rpcs3/Emu/RSX/D3D12/D3D12ProgramDisassembler.cpp delete mode 100644 rpcs3/Emu/RSX/D3D12/D3D12ProgramDisassembler.h create mode 100644 rpcs3/Emu/RSX/D3D12/ShaderParam.cpp create mode 100644 rpcs3/Emu/RSX/D3D12/ShaderParam.h diff --git a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp index 1bc7f2d827..550eb01dc5 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp @@ -2,7 +2,6 @@ #if defined (DX12_SUPPORT) #include "D3D12PipelineState.h" -#include "D3D12ProgramDisassembler.h" #include "Emu/Memory/vm.h" #include "Utilities/Log.h" #include diff --git a/rpcs3/Emu/RSX/D3D12/D3D12ProgramDisassembler.cpp b/rpcs3/Emu/RSX/D3D12/D3D12ProgramDisassembler.cpp deleted file mode 100644 index af3451cbfc..0000000000 --- a/rpcs3/Emu/RSX/D3D12/D3D12ProgramDisassembler.cpp +++ /dev/null @@ -1,268 +0,0 @@ -#include "stdafx.h" -#if defined (DX12_SUPPORT) -#include "D3D12ProgramDisassembler.h" -#include "Emu/Memory/vm.h" -#include "Utilities/Log.h" - -static u32 GetData(const u32 d) { return d << 16 | d >> 16; } - -void Decompile(RSXFragmentProgram& prog) -{ - auto data = vm::ptr::make(prog.addr); - size_t m_size = 0; - size_t m_location = 0; - size_t m_loop_count = 0; - size_t m_code_level = 1; - - enum - { - FORCE_NONE, - FORCE_SCT, - FORCE_SCB, - }; - - int forced_unit = FORCE_NONE; - - OPDEST operandDST; - - while (true) - { - operandDST.HEX = GetData(data[0]); -/* for (auto finded = std::find(m_end_offsets.begin(), m_end_offsets.end(), m_size); - finded != m_end_offsets.end(); - finded = std::find(m_end_offsets.begin(), m_end_offsets.end(), m_size)) - { - m_end_offsets.erase(finded); - m_code_level--; - AddCode("}"); - m_loop_count--; - }*/ - -/* for (auto finded = std::find(m_else_offsets.begin(), m_else_offsets.end(), m_size); - finded != m_else_offsets.end(); - finded = std::find(m_else_offsets.begin(), m_else_offsets.end(), m_size)) - { - m_else_offsets.erase(finded); - m_code_level--; - AddCode("}"); - AddCode("else"); - AddCode("{"); - m_code_level++; - } - - dst.HEX = GetData(data[0]); - src0.HEX = GetData(data[1]); - src1.HEX = GetData(data[2]); - src2.HEX = GetData(data[3]); - - m_offset = 4 * sizeof(u32); - - const u32 opcode = dst.opcode | (src1.opcode_is_branch << 6); - - auto SCT = [&]() - { - switch (opcode) - { - case RSX_FP_OPCODE_ADD: SetDst("($0 + $1)"); break; - case RSX_FP_OPCODE_DIV: SetDst("($0 / $1)"); break; - case RSX_FP_OPCODE_DIVSQ: SetDst("($0 / sqrt($1))"); break; - case RSX_FP_OPCODE_DP2: SetDst("vec4(dot($0.xy, $1.xy))"); break; - case RSX_FP_OPCODE_DP3: SetDst("vec4(dot($0.xyz, $1.xyz))"); break; - case RSX_FP_OPCODE_DP4: SetDst("vec4(dot($0, $1))"); break; - case RSX_FP_OPCODE_DP2A: SetDst("vec4($0.x * $1.x + $0.y * $1.y + $2.x)"); break; - case RSX_FP_OPCODE_MAD: SetDst("($0 * $1 + $2)"); break; - case RSX_FP_OPCODE_MAX: SetDst("max($0, $1)"); break; - case RSX_FP_OPCODE_MIN: SetDst("min($0, $1)"); break; - case RSX_FP_OPCODE_MOV: SetDst("$0"); break; - case RSX_FP_OPCODE_MUL: SetDst("($0 * $1)"); break; - case RSX_FP_OPCODE_RCP: SetDst("1 / $0"); break; - case RSX_FP_OPCODE_RSQ: SetDst("inversesqrt(abs($0))"); break; - case RSX_FP_OPCODE_SEQ: SetDst("vec4(equal($0, $1))"); break; - case RSX_FP_OPCODE_SFL: SetDst("vec4(0.0)"); break; - case RSX_FP_OPCODE_SGE: SetDst("vec4(greaterThanEqual($0, $1))"); break; - case RSX_FP_OPCODE_SGT: SetDst("vec4(greaterThan($0, $1))"); break; - case RSX_FP_OPCODE_SLE: SetDst("vec4(lessThanEqual($0, $1))"); break; - case RSX_FP_OPCODE_SLT: SetDst("vec4(lessThan($0, $1))"); break; - case RSX_FP_OPCODE_SNE: SetDst("vec4(notEqual($0, $1))"); break; - case RSX_FP_OPCODE_STR: SetDst("vec4(1.0)"); break; - - default: - return false; - } - - return true; - }; - - auto SCB = [&]() - { - switch (opcode) - { - case RSX_FP_OPCODE_ADD: SetDst("($0 + $1)"); break; - case RSX_FP_OPCODE_COS: SetDst("cos($0)"); break; - case RSX_FP_OPCODE_DP2: SetDst("vec4(dot($0.xy, $1.xy))"); break; - case RSX_FP_OPCODE_DP3: SetDst("vec4(dot($0.xyz, $1.xyz))"); break; - case RSX_FP_OPCODE_DP4: SetDst("vec4(dot($0, $1))"); break; - case RSX_FP_OPCODE_DP2A: SetDst("vec4($0.x * $1.x + $0.y * $1.y + $2.x)"); break; - case RSX_FP_OPCODE_DST: SetDst("vec4(distance($0, $1))"); break; - case RSX_FP_OPCODE_REFL: LOG_ERROR(RSX, "Unimplemented SCB instruction: REFL"); break; // TODO: Is this in the right category? - case RSX_FP_OPCODE_EX2: SetDst("exp2($0)"); break; - case RSX_FP_OPCODE_FLR: SetDst("floor($0)"); break; - case RSX_FP_OPCODE_FRC: SetDst("fract($0)"); break; - case RSX_FP_OPCODE_LIT: SetDst("vec4(1.0, $0.x, ($0.x > 0.0 ? exp($0.w * log2($0.y)) : 0.0), 1.0)"); break; - case RSX_FP_OPCODE_LIF: SetDst("vec4(1.0, $0.y, ($0.y > 0 ? pow(2.0, $0.w) : 0.0), 1.0)"); break; - case RSX_FP_OPCODE_LRP: LOG_ERROR(RSX, "Unimplemented SCB instruction: LRP"); break; // TODO: Is this in the right category? - case RSX_FP_OPCODE_LG2: SetDst("log2($0)"); break; - case RSX_FP_OPCODE_MAD: SetDst("($0 * $1 + $2)"); break; - case RSX_FP_OPCODE_MAX: SetDst("max($0, $1)"); break; - case RSX_FP_OPCODE_MIN: SetDst("min($0, $1)"); break; - case RSX_FP_OPCODE_MOV: SetDst("$0"); break; - case RSX_FP_OPCODE_MUL: SetDst("($0 * $1)"); break; - case RSX_FP_OPCODE_PK2: SetDst("packSnorm2x16($0)"); break; // TODO: More testing (Sonic The Hedgehog (NPUB-30442/NPEB-00478)) - case RSX_FP_OPCODE_PK4: SetDst("packSnorm4x8($0)"); break; // TODO: More testing (Sonic The Hedgehog (NPUB-30442/NPEB-00478)) - case RSX_FP_OPCODE_PK16: LOG_ERROR(RSX, "Unimplemented SCB instruction: PK16"); break; - case RSX_FP_OPCODE_PKB: LOG_ERROR(RSX, "Unimplemented SCB instruction: PKB"); break; - case RSX_FP_OPCODE_PKG: LOG_ERROR(RSX, "Unimplemented SCB instruction: PKG"); break; - case RSX_FP_OPCODE_SEQ: SetDst("vec4(equal($0, $1))"); break; - case RSX_FP_OPCODE_SFL: SetDst("vec4(0.0)"); break; - case RSX_FP_OPCODE_SGE: SetDst("vec4(greaterThanEqual($0, $1))"); break; - case RSX_FP_OPCODE_SGT: SetDst("vec4(greaterThan($0, $1))"); break; - case RSX_FP_OPCODE_SIN: SetDst("sin($0)"); break; - case RSX_FP_OPCODE_SLE: SetDst("vec4(lessThanEqual($0, $1))"); break; - case RSX_FP_OPCODE_SLT: SetDst("vec4(lessThan($0, $1))"); break; - case RSX_FP_OPCODE_SNE: SetDst("vec4(notEqual($0, $1))"); break; - case RSX_FP_OPCODE_STR: SetDst("vec4(1.0)"); break; - - default: - return false; - } - - return true; - }; - - auto TEX_SRB = [&]() - { - switch (opcode) - { - case RSX_FP_OPCODE_DDX: SetDst("dFdx($0)"); break; - case RSX_FP_OPCODE_DDY: SetDst("dFdy($0)"); break; - case RSX_FP_OPCODE_NRM: SetDst("normalize($0)"); break; - case RSX_FP_OPCODE_BEM: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: BEM"); break; - case RSX_FP_OPCODE_TEX: SetDst("texture($t, $0.xy)"); break; - case RSX_FP_OPCODE_TEXBEM: SetDst("texture($t, $0.xy, $1.x)"); break; - case RSX_FP_OPCODE_TXP: SetDst("textureProj($t, $0.xyz, $1.x)"); break; //TODO: More testing (Sonic The Hedgehog (NPUB-30442/NPEB-00478) and The Simpsons Arcade Game (NPUB30563)) - case RSX_FP_OPCODE_TXPBEM: SetDst("textureProj($t, $0.xyz, $1.x)"); break; - case RSX_FP_OPCODE_TXD: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: TXD"); break; - case RSX_FP_OPCODE_TXB: SetDst("texture($t, $0.xy, $1.x)"); break; - case RSX_FP_OPCODE_TXL: SetDst("textureLod($t, $0.xy, $1.x)"); break; - case RSX_FP_OPCODE_UP2: SetDst("unpackSnorm2x16($0)"); break; // TODO: More testing (Sonic The Hedgehog (NPUB-30442/NPEB-00478)) - case RSX_FP_OPCODE_UP4: SetDst("unpackSnorm4x8($0)"); break; // TODO: More testing (Sonic The Hedgehog (NPUB-30442/NPEB-00478)) - case RSX_FP_OPCODE_UP16: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UP16"); break; - case RSX_FP_OPCODE_UPB: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UPB"); break; - case RSX_FP_OPCODE_UPG: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UPG"); break; - - default: - return false; - } - - return true; - }; - - auto SIP = [&]() - { - switch (opcode) - { - case RSX_FP_OPCODE_BRK: SetDst("break"); break; - case RSX_FP_OPCODE_CAL: LOG_ERROR(RSX, "Unimplemented SIP instruction: CAL"); break; - case RSX_FP_OPCODE_FENCT: forced_unit = FORCE_SCT; break; - case RSX_FP_OPCODE_FENCB: forced_unit = FORCE_SCB; break; - case RSX_FP_OPCODE_IFE: - AddCode("if($cond)"); - m_else_offsets.push_back(src1.else_offset << 2); - m_end_offsets.push_back(src2.end_offset << 2); - AddCode("{"); - m_code_level++; - break; - case RSX_FP_OPCODE_LOOP: - if (!src0.exec_if_eq && !src0.exec_if_gr && !src0.exec_if_lt) - { - AddCode(fmt::Format("$ifcond for(int i%u = %u; i%u < %u; i%u += %u) {} //-> %u //LOOP", - m_loop_count, src1.init_counter, m_loop_count, src1.end_counter, m_loop_count, src1.increment, src2.end_offset)); - } - else - { - AddCode(fmt::Format("$ifcond for(int i%u = %u; i%u < %u; i%u += %u) //LOOP", - m_loop_count, src1.init_counter, m_loop_count, src1.end_counter, m_loop_count, src1.increment)); - m_loop_count++; - m_end_offsets.push_back(src2.end_offset << 2); - AddCode("{"); - m_code_level++; - } - break; - case RSX_FP_OPCODE_REP: - if (!src0.exec_if_eq && !src0.exec_if_gr && !src0.exec_if_lt) - { - AddCode(fmt::Format("$ifcond for(int i%u = %u; i%u < %u; i%u += %u) {} //-> %u //REP", - m_loop_count, src1.init_counter, m_loop_count, src1.end_counter, m_loop_count, src1.increment, src2.end_offset)); - } - else - { - AddCode(fmt::Format("if($cond) for(int i%u = %u; i%u < %u; i%u += %u) //REP", - m_loop_count, src1.init_counter, m_loop_count, src1.end_counter, m_loop_count, src1.increment)); - m_loop_count++; - m_end_offsets.push_back(src2.end_offset << 2); - AddCode("{"); - m_code_level++; - } - break; - case RSX_FP_OPCODE_RET: SetDst("return"); break; - - default: - return false; - } - - return true; - }; - - switch (opcode) - { - case RSX_FP_OPCODE_NOP: break; - case RSX_FP_OPCODE_KIL: SetDst("discard", false); break; - - default: - if (forced_unit == FORCE_NONE) - { - if (SIP()) break; - if (SCT()) break; - if (TEX_SRB()) break; - if (SCB()) break; - } - else if (forced_unit == FORCE_SCT) - { - forced_unit = FORCE_NONE; - if (SCT()) break; - } - else if (forced_unit == FORCE_SCB) - { - forced_unit = FORCE_NONE; - if (SCB()) break; - } - - LOG_ERROR(RSX, "Unknown/illegal instruction: 0x%x (forced unit %d)", opcode, forced_unit); - break; - } - - m_size += m_offset;*/ - - if (operandDST.end) break; - -// assert(m_offset % sizeof(u32) == 0); - data += 4 / sizeof(u32); - } - - // flush m_code_level - m_code_level = 1; -/* m_shader = BuildCode(); - main.clear(); - m_parr.params.clear();*/ -} -#endif \ No newline at end of file diff --git a/rpcs3/Emu/RSX/D3D12/D3D12ProgramDisassembler.h b/rpcs3/Emu/RSX/D3D12/D3D12ProgramDisassembler.h deleted file mode 100644 index 011cef292e..0000000000 --- a/rpcs3/Emu/RSX/D3D12/D3D12ProgramDisassembler.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once -#if defined (DX12_SUPPORT) -#include "Emu/RSX/RSXFragmentProgram.h" - -void Decompile(RSXFragmentProgram& prog); -#endif \ No newline at end of file diff --git a/rpcs3/Emu/RSX/D3D12/ShaderParam.cpp b/rpcs3/Emu/RSX/D3D12/ShaderParam.cpp new file mode 100644 index 0000000000..a28d9bf21b --- /dev/null +++ b/rpcs3/Emu/RSX/D3D12/ShaderParam.cpp @@ -0,0 +1,6 @@ +#include "stdafx.h" +#if defined(DX12_SUPPORT) +#include "ShaderParam.h" + + +#endif \ No newline at end of file diff --git a/rpcs3/Emu/RSX/D3D12/ShaderParam.h b/rpcs3/Emu/RSX/D3D12/ShaderParam.h new file mode 100644 index 0000000000..5ef5d3e3d3 --- /dev/null +++ b/rpcs3/Emu/RSX/D3D12/ShaderParam.h @@ -0,0 +1,194 @@ +#pragma once +#if defined(DX12_SUPPORT) +#include +#include + +enum ParamFlag +{ + PARAM_IN, + PARAM_OUT, + PARAM_UNIFORM, + PARAM_CONST, + PARAM_NONE, + PARAM_COUNT, +}; + +struct ParamItem +{ + std::string name; + std::string value; + int location; + + ParamItem(const std::string& _name, int _location, const std::string& _value = "") + : name(_name) + , value(_value), + location(_location) + { } +}; + +struct ParamType +{ + const ParamFlag flag; + std::string type; + std::vector items; + + ParamType(const ParamFlag _flag, const std::string& _type) + : flag(_flag) + , type(_type) + { + } + + bool SearchName(const std::string& name) + { + for (u32 i = 0; i params[PARAM_COUNT]; + + ParamType* SearchParam(const ParamFlag &flag, const std::string& type) + { + for (u32 i = 0; iSearchName(name); + } + + std::string AddParam(const ParamFlag flag, std::string type, const std::string& name, const std::string& value) + { + ParamType* t = SearchParam(flag, type); + + if (t) + { + if (!t->SearchName(name)) t->items.emplace_back(name, -1, value); + } + else + { + params[flag].emplace_back(flag, type); + params[flag].back().items.emplace_back(name, -1, value); + } + + return name; + } + + std::string AddParam(const ParamFlag flag, std::string type, const std::string& name, int location = -1) + { + ParamType* t = SearchParam(flag, type); + + if (t) + { + if (!t->SearchName(name)) t->items.emplace_back(name, location); + } + else + { + params[flag].emplace_back(flag, type); + params[flag].back().items.emplace_back(name, location); + } + + return name; + } +}; + +class ShaderVar +{ +public: + std::string name; + std::vector swizzles; + + ShaderVar() = default; + ShaderVar(const std::string& var) + { + auto var_blocks = fmt::split(var, { "." }); + + if (var_blocks.size() == 0) + { + assert(0); + } + + name = var_blocks[0]; + + if (var_blocks.size() == 1) + { + swizzles.push_back("xyzw"); + } + else + { + swizzles = std::vector(var_blocks.begin() + 1, var_blocks.end()); + } + } + + size_t get_vector_size() const + { + return swizzles[swizzles.size() - 1].length(); + } + + ShaderVar& symplify() + { + std::unordered_map swizzle; + + static std::unordered_map pos_to_swizzle = + { + { 0, 'x' }, + { 1, 'y' }, + { 2, 'z' }, + { 3, 'w' } + }; + + for (auto &i : pos_to_swizzle) + { + swizzle[i.second] = swizzles[0].length() > i.first ? swizzles[0][i.first] : 0; + } + + for (int i = 1; i < swizzles.size(); ++i) + { + std::unordered_map new_swizzle; + + for (auto &sw : pos_to_swizzle) + { + new_swizzle[sw.second] = swizzle[swizzles[i].length() <= sw.first ? '\0' : swizzles[i][sw.first]]; + } + + swizzle = new_swizzle; + } + + swizzles.clear(); + std::string new_swizzle; + + for (auto &i : pos_to_swizzle) + { + if (swizzle[i.second] != '\0') + new_swizzle += swizzle[i.second]; + } + + swizzles.push_back(new_swizzle); + + return *this; + } + + std::string get() const + { + if (swizzles.size() == 1 && swizzles[0] == "xyzw") + { + return name; + } + + return name + "." + fmt::merge({ swizzles }, "."); + } +}; +#endif \ No newline at end of file diff --git a/rpcs3/Emu/RSX/D3D12/VertexProgramDecompiler.h b/rpcs3/Emu/RSX/D3D12/VertexProgramDecompiler.h index f141effdd0..7fcbc97a30 100644 --- a/rpcs3/Emu/RSX/D3D12/VertexProgramDecompiler.h +++ b/rpcs3/Emu/RSX/D3D12/VertexProgramDecompiler.h @@ -3,195 +3,7 @@ #include "Emu/RSX/RSXVertexProgram.h" #include #include - -enum ParamFlag -{ - PARAM_IN, - PARAM_OUT, - PARAM_UNIFORM, - PARAM_CONST, - PARAM_NONE, - PARAM_COUNT, -}; - -struct ParamItem -{ - std::string name; - std::string value; - int location; - - ParamItem(const std::string& _name, int _location, const std::string& _value = "") - : name(_name) - , value(_value), - location(_location) - { } -}; - -struct ParamType -{ - const ParamFlag flag; - std::string type; - std::vector items; - - ParamType(const ParamFlag _flag, const std::string& _type) - : flag(_flag) - , type(_type) - { - } - - bool SearchName(const std::string& name) - { - for (u32 i = 0; i params[PARAM_COUNT]; - - ParamType* SearchParam(const ParamFlag &flag, const std::string& type) - { - for (u32 i = 0; iSearchName(name); - } - - std::string AddParam(const ParamFlag flag, std::string type, const std::string& name, const std::string& value) - { - ParamType* t = SearchParam(flag, type); - - if (t) - { - if (!t->SearchName(name)) t->items.emplace_back(name, -1, value); - } - else - { - params[flag].emplace_back(flag, type); - params[flag].back().items.emplace_back(name, -1, value); - } - - return name; - } - - std::string AddParam(const ParamFlag flag, std::string type, const std::string& name, int location = -1) - { - ParamType* t = SearchParam(flag, type); - - if (t) - { - if (!t->SearchName(name)) t->items.emplace_back(name, location); - } - else - { - params[flag].emplace_back(flag, type); - params[flag].back().items.emplace_back(name, location); - } - - return name; - } -}; - -class ShaderVar -{ -public: - std::string name; - std::vector swizzles; - - ShaderVar() = default; - ShaderVar(const std::string& var) - { - auto var_blocks = fmt::split(var, { "." }); - - if (var_blocks.size() == 0) - { - assert(0); - } - - name = var_blocks[0]; - - if (var_blocks.size() == 1) - { - swizzles.push_back("xyzw"); - } - else - { - swizzles = std::vector(var_blocks.begin() + 1, var_blocks.end()); - } - } - - size_t get_vector_size() const - { - return swizzles[swizzles.size() - 1].length(); - } - - ShaderVar& symplify() - { - std::unordered_map swizzle; - - static std::unordered_map pos_to_swizzle = - { - { 0, 'x' }, - { 1, 'y' }, - { 2, 'z' }, - { 3, 'w' } - }; - - for (auto &i : pos_to_swizzle) - { - swizzle[i.second] = swizzles[0].length() > i.first ? swizzles[0][i.first] : 0; - } - - for (int i = 1; i < swizzles.size(); ++i) - { - std::unordered_map new_swizzle; - - for (auto &sw : pos_to_swizzle) - { - new_swizzle[sw.second] = swizzle[swizzles[i].length() <= sw.first ? '\0' : swizzles[i][sw.first]]; - } - - swizzle = new_swizzle; - } - - swizzles.clear(); - std::string new_swizzle; - - for (auto &i : pos_to_swizzle) - { - if (swizzle[i.second] != '\0') - new_swizzle += swizzle[i.second]; - } - - swizzles.push_back(new_swizzle); - - return *this; - } - - std::string get() const - { - if (swizzles.size() == 1 && swizzles[0] == "xyzw") - { - return name; - } - - return name + "." + fmt::merge({ swizzles }, "."); - } -}; +#include "ShaderParam.h" struct VertexDecompiler { diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 4d595b4823..232b4bd521 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -41,7 +41,12 @@ + + + + + @@ -499,8 +504,12 @@ + + + + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 5674643b14..f30d1fdaee 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -974,6 +974,15 @@ Emu\GPU\RSX\D3D12 + + Emu\GPU\RSX\D3D12 + + + Emu\GPU\RSX\D3D12 + + + Emu\GPU\RSX\D3D12 + Emu\GPU\RSX\D3D12 @@ -1849,6 +1858,12 @@ Emu\GPU\RSX\D3D12 + + Emu\GPU\RSX\D3D12 + + + Emu\GPU\RSX\D3D12 + Emu\GPU\RSX\D3D12