From 08036d2b49c3ede671afb61c4c230205036a7ddc Mon Sep 17 00:00:00 2001 From: Emulator-Team-2 <38318848+Emulator-Team-2@users.noreply.github.com> Date: Wed, 28 Aug 2024 18:10:23 +0200 Subject: [PATCH 1/5] added data_format=36 and num_format=9 --- src/video_core/renderer_vulkan/liverpool_to_vk.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp index 025f311d..d474cee6 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp @@ -296,6 +296,7 @@ std::span GetAllFormats() { vk::Format::eB10G11R11UfloatPack32, vk::Format::eBc1RgbaSrgbBlock, vk::Format::eBc1RgbaUnormBlock, + vk::Format::eBc2SrgbBlock, vk::Format::eBc2UnormBlock, vk::Format::eBc3SrgbBlock, vk::Format::eBc3UnormBlock, @@ -457,6 +458,9 @@ vk::Format SurfaceFormat(AmdGpu::DataFormat data_format, AmdGpu::NumberFormat nu } if (data_format == AmdGpu::DataFormat::FormatBc7 && num_format == AmdGpu::NumberFormat::Unorm) { return vk::Format::eBc7UnormBlock; + } + if (data_format == AmdGpu::DataFormat::FormatBc2 && num_format == AmdGpu::NumberFormat::Srgb) { + return vk::Format::eBc2SrgbBlock; } if (data_format == AmdGpu::DataFormat::FormatBc2 && num_format == AmdGpu::NumberFormat::Unorm) { return vk::Format::eBc2UnormBlock; From 6f938a10ce8cd6027afe61c4a9985efac5e1bfb5 Mon Sep 17 00:00:00 2001 From: Emulator-Team-2 <38318848+Emulator-Team-2@users.noreply.github.com> Date: Wed, 28 Aug 2024 18:12:59 +0200 Subject: [PATCH 2/5] added data_format=3 and num_format=4 --- src/video_core/renderer_vulkan/liverpool_to_vk.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp index d474cee6..89ee0158 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp @@ -453,6 +453,9 @@ vk::Format SurfaceFormat(AmdGpu::DataFormat data_format, AmdGpu::NumberFormat nu if (data_format == AmdGpu::DataFormat::Format8_8 && num_format == AmdGpu::NumberFormat::Unorm) { return vk::Format::eR8G8Unorm; } + if (data_format == AmdGpu::DataFormat::Format8_8 && num_format == AmdGpu::NumberFormat::Uint) { + return vk::Format::eR8G8Uint; + } if (data_format == AmdGpu::DataFormat::Format8_8 && num_format == AmdGpu::NumberFormat::Snorm) { return vk::Format::eR8G8Snorm; } From af18728962f0e9bf6a0bb7690d0b0b6479361571 Mon Sep 17 00:00:00 2001 From: Emulator-Team-2 <38318848+Emulator-Team-2@users.noreply.github.com> Date: Wed, 28 Aug 2024 18:45:32 +0200 Subject: [PATCH 3/5] clang-format fix --- src/video_core/renderer_vulkan/liverpool_to_vk.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp index 89ee0158..3ae19a82 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp @@ -462,8 +462,8 @@ vk::Format SurfaceFormat(AmdGpu::DataFormat data_format, AmdGpu::NumberFormat nu if (data_format == AmdGpu::DataFormat::FormatBc7 && num_format == AmdGpu::NumberFormat::Unorm) { return vk::Format::eBc7UnormBlock; } - if (data_format == AmdGpu::DataFormat::FormatBc2 && num_format == AmdGpu::NumberFormat::Srgb) { - return vk::Format::eBc2SrgbBlock; + if (data_format == AmdGpu::DataFormat::FormatBc2 && num_format == AmdGpu::NumberFormat::Srgb) { + return vk::Format::eBc2SrgbBlock; } if (data_format == AmdGpu::DataFormat::FormatBc2 && num_format == AmdGpu::NumberFormat::Unorm) { return vk::Format::eBc2UnormBlock; From 55be97bca3dacbf9966e6e88c5cd5a9673e47bbb Mon Sep 17 00:00:00 2001 From: CyntexMore Date: Wed, 28 Aug 2024 22:15:03 +0200 Subject: [PATCH 4/5] feat(translation): hu_HU translated --- src/qt_gui/translations/hu_HU.ts | 184 +++++++++++++++---------------- 1 file changed, 92 insertions(+), 92 deletions(-) diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index a32b2d2a..c6cc0bce 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -6,7 +6,7 @@ About shadPS4 - About shadPS4 + A shadPS4-ről @@ -16,12 +16,12 @@ shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. + A shadPS4 egy kezdetleges, open-source PlayStation 4 emulátor. This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. + Ne használja ezt a szoftvert olyan játékokkal, amelyeket nem legális módon szerzett be. @@ -29,7 +29,7 @@ Open Folder - Open Folder + Mappa megnyitása @@ -37,17 +37,17 @@ Loading game list, please wait :3 - Loading game list, please wait :3 + Játék könyvtár betöltése, kérjük várjon :3 Cancel - Cancel + Megszakítás Loading... - Loading... + Betöltés.. @@ -55,27 +55,27 @@ shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Mappa kiválasztása Directory to install games - Directory to install games + Mappa a játékok telepítésére Browse - Browse + Böngészés Error - Error + Hiba The value for location to install games is not valid. - The value for location to install games is not valid. + A játékok telepítéséhez megadott érték nem érvényes. @@ -83,67 +83,67 @@ Create Shortcut - Create Shortcut + Parancsikon Létrehozása Open Game Folder - Open Game Folder + Játék Mappa Megnyitása SFO Viewer - SFO Viewer + SFO Néző Trophy Viewer - Trophy Viewer + Trófeák Megtekintése Copy info - Copy info + Információ Másolása Copy Name - Copy Name + Név Másolása Copy Serial - Copy Serial + Széria Másolása Copy All - Copy All + Összes Másolása Shortcut creation - Shortcut creation + Parancsikon létrehozása Shortcut created successfully!\n %1 - Shortcut created successfully!\n %1 + Parancsikon sikeresen létrehozva!\n %1 Error - Error + Hiba Error creating shortcut!\n %1 - Error creating shortcut!\n %1 + Hiba a parancsikon létrehozásával!\n %1 Install PKG - Install PKG + PKG telepítése @@ -151,187 +151,187 @@ Open/Add Elf Folder - Open/Add Elf Folder + Efl Mappa Megnyitása/Hozzáadása Install Packages (PKG) - Install Packages (PKG) + PKG-k Telepítése (PKG) Boot Game - Boot Game + Játék Bootolása About shadPS4 - About shadPS4 + A shadPS4-ről Configure... - Configure... + Konfigurálás... Install application from a .pkg file - Install application from a .pkg file + Program telepítése egy .pkg fájlból Recent Games - Recent Games + Legutóbbi Játékok Exit - Exit + Kilépés Exit shadPS4 - Exit shadPS4 + Kilépés a shadPS4 Exit the application. - Exit the application. + Lépjen ki az programból. Show Game List - Show Game List + Játék Könyvtár Megjelenítése Game List Refresh - Game List Refresh + Játék Könyvtár Újratöltése Tiny - Tiny + Apró Small - Small + Kicsi Medium - Medium + Közepes Large - Large + Nagy List View - List View + Lista Nézet Grid View - Grid View + Rács Nézet Elf Viewer - Elf Viewer + Elf Néző Game Install Directory - Game Install Directory + Játék Telepítési Mappa Dump Game List - Dump Game List + Játék Lista Dumpolása PKG Viewer - PKG Viewer + PKG Néző Search... - Search... + Keresés... File - File + Fájl View - View + Megnézés Game List Icons - Game List Icons + Játék Könyvtár Ikonok Game List Mode - Game List Mode + Játék Könyvtár Mód Settings - Settings + Beállítások Utils - Utils + Segédeszközök Themes - Themes + Témák About - About + Segítség Dark - Dark + Sötét Light - Light + Világos Green - Green + Zöld Blue - Blue + Kék Violet - Violet + Ibolya toolBar - toolBar + Eszköztár @@ -339,7 +339,7 @@ Open Folder - Open Folder + Mappa Megnyitása @@ -347,7 +347,7 @@ Trophy Viewer - Trophy Viewer + Trófeák Megtekintése @@ -355,137 +355,137 @@ Settings - Settings + Beállítások General - General + Általános System - System + Rendszer Console Language - Console Language + A Konzol Nyelvezete Emulator Language - Emulator Language + Az Emulátor Nyelvezete Emulator - Emulator + Emulátor Enable Fullscreen - Enable Fullscreen + Teljesképernyő Engedélyezése Show Splash - Show Splash + Indítóképernyő Mutatása Is PS4 Pro - Is PS4 Pro + PS4 Pro Username - Username + Felhasználónév Logger - Logger + Naplózó Log Type - Log Type + Naplózási Típus Log Filter - Log Filter + Naplózási Filter Graphics - Graphics + Grafika Graphics Device - Graphics Device + Grafikai Eszköz Width - Width + Szélesség Height - Height + Magasság Vblank Divider - Vblank Divider + Vblank Elosztó Advanced - Advanced + Haladó Enable Shaders Dumping - Enable Shaders Dumping + Shader Dumpolás Engedélyezése Enable NULL GPU - Enable NULL GPU + NULL GPU Engedélyezése Enable PM4 Dumping - Enable PM4 Dumping + PM4 Dumpolás Engedélyezése Debug - Debug + Debugolás Enable Debug Dumping - Enable Debug Dumping + Debug Dumpolás Engedélyezése Enable Vulkan Validation Layers - Enable Vulkan Validation Layers + Vulkan Validációs Rétegek Engedélyezése Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation + Vulkan Szinkronizálás Validáció Enable RenderDoc Debugging - Enable RenderDoc Debugging + RenderDoc Debugolás Engedélyezése - \ No newline at end of file + From 3fbb68048e0c28b418fc4a64999cde0c528133fe Mon Sep 17 00:00:00 2001 From: psucien <168137814+psucien@users.noreply.github.com> Date: Wed, 28 Aug 2024 22:27:47 +0200 Subject: [PATCH 5/5] shader_recompiler: frontend: `SOPC` and `SOPK` handling separated; more cmp opcodes (#634) --- .../frontend/translate/scalar_alu.cpp | 238 +++++++++++------- .../frontend/translate/translate.h | 6 +- 2 files changed, 159 insertions(+), 85 deletions(-) diff --git a/src/shader_recompiler/frontend/translate/scalar_alu.cpp b/src/shader_recompiler/frontend/translate/scalar_alu.cpp index 7914726f..da74f901 100644 --- a/src/shader_recompiler/frontend/translate/scalar_alu.cpp +++ b/src/shader_recompiler/frontend/translate/scalar_alu.cpp @@ -6,98 +6,150 @@ namespace Shader::Gcn { void Translator::EmitScalarAlu(const GcnInst& inst) { + switch (inst.encoding) { + case InstEncoding::SOPC: { + EmitSOPC(inst); + break; + } + case InstEncoding::SOPK: { + EmitSOPK(inst); + break; + } + default: + switch (inst.opcode) { + case Opcode::S_MOV_B32: + return S_MOV(inst); + case Opcode::S_MUL_I32: + return S_MUL_I32(inst); + case Opcode::S_AND_SAVEEXEC_B64: + return S_AND_SAVEEXEC_B64(inst); + case Opcode::S_MOV_B64: + return S_MOV_B64(inst); + case Opcode::S_OR_B64: + return S_OR_B64(NegateMode::None, false, inst); + case Opcode::S_NOR_B64: + return S_OR_B64(NegateMode::Result, false, inst); + case Opcode::S_XOR_B64: + return S_OR_B64(NegateMode::None, true, inst); + case Opcode::S_ORN2_B64: + return S_OR_B64(NegateMode::Src1, false, inst); + case Opcode::S_AND_B64: + return S_AND_B64(NegateMode::None, inst); + case Opcode::S_NAND_B64: + return S_AND_B64(NegateMode::Result, inst); + case Opcode::S_ANDN2_B64: + return S_AND_B64(NegateMode::Src1, inst); + case Opcode::S_NOT_B64: + return S_NOT_B64(inst); + case Opcode::S_ADD_I32: + return S_ADD_I32(inst); + case Opcode::S_AND_B32: + return S_AND_B32(inst); + case Opcode::S_ASHR_I32: + return S_ASHR_I32(inst); + case Opcode::S_OR_B32: + return S_OR_B32(inst); + case Opcode::S_LSHL_B32: + return S_LSHL_B32(inst); + case Opcode::S_LSHR_B32: + return S_LSHR_B32(inst); + case Opcode::S_CSELECT_B32: + return S_CSELECT_B32(inst); + case Opcode::S_CSELECT_B64: + return S_CSELECT_B64(inst); + case Opcode::S_BFE_U32: + return S_BFE_U32(inst); + case Opcode::S_BFM_B32: + return S_BFM_B32(inst); + case Opcode::S_BREV_B32: + return S_BREV_B32(inst); + case Opcode::S_ADD_U32: + return S_ADD_U32(inst); + case Opcode::S_ADDC_U32: + return S_ADDC_U32(inst); + case Opcode::S_SUB_U32: + case Opcode::S_SUB_I32: + return S_SUB_U32(inst); + case Opcode::S_MIN_U32: + return S_MIN_U32(inst); + case Opcode::S_MAX_U32: + return S_MAX_U32(inst); + case Opcode::S_WQM_B64: + break; + default: + LogMissingOpcode(inst); + } + break; + } +} + +void Translator::EmitSOPC(const GcnInst& inst) { switch (inst.opcode) { - case Opcode::S_MOVK_I32: - return S_MOVK(inst); - case Opcode::S_MOV_B32: - return S_MOV(inst); - case Opcode::S_MUL_I32: - return S_MUL_I32(inst); - case Opcode::S_AND_SAVEEXEC_B64: - return S_AND_SAVEEXEC_B64(inst); - case Opcode::S_MOV_B64: - return S_MOV_B64(inst); - case Opcode::S_CMP_LT_U32: - return S_CMP(ConditionOp::LT, false, inst); - case Opcode::S_CMP_LE_U32: - return S_CMP(ConditionOp::LE, false, inst); - case Opcode::S_CMP_LG_U32: - return S_CMP(ConditionOp::LG, false, inst); - case Opcode::S_CMP_LT_I32: - return S_CMP(ConditionOp::LT, true, inst); + case Opcode::S_CMP_EQ_I32: + return S_CMP(ConditionOp::EQ, true, inst); case Opcode::S_CMP_LG_I32: return S_CMP(ConditionOp::LG, true, inst); case Opcode::S_CMP_GT_I32: return S_CMP(ConditionOp::GT, true, inst); - case Opcode::S_CMP_LE_I32: - return S_CMP(ConditionOp::LE, true, inst); case Opcode::S_CMP_GE_I32: return S_CMP(ConditionOp::GE, true, inst); - case Opcode::S_CMP_EQ_I32: - return S_CMP(ConditionOp::EQ, true, inst); + case Opcode::S_CMP_LT_I32: + return S_CMP(ConditionOp::LT, true, inst); + case Opcode::S_CMP_LE_I32: + return S_CMP(ConditionOp::LE, true, inst); + case Opcode::S_CMP_EQ_U32: return S_CMP(ConditionOp::EQ, false, inst); - case Opcode::S_CMP_GE_U32: - return S_CMP(ConditionOp::GE, false, inst); + case Opcode::S_CMP_LG_U32: + return S_CMP(ConditionOp::LG, false, inst); case Opcode::S_CMP_GT_U32: return S_CMP(ConditionOp::GT, false, inst); - case Opcode::S_OR_B64: - return S_OR_B64(NegateMode::None, false, inst); - case Opcode::S_NOR_B64: - return S_OR_B64(NegateMode::Result, false, inst); - case Opcode::S_XOR_B64: - return S_OR_B64(NegateMode::None, true, inst); - case Opcode::S_ORN2_B64: - return S_OR_B64(NegateMode::Src1, false, inst); - case Opcode::S_AND_B64: - return S_AND_B64(NegateMode::None, inst); - case Opcode::S_NAND_B64: - return S_AND_B64(NegateMode::Result, inst); - case Opcode::S_ANDN2_B64: - return S_AND_B64(NegateMode::Src1, inst); - case Opcode::S_NOT_B64: - return S_NOT_B64(inst); - case Opcode::S_ADD_I32: - return S_ADD_I32(inst); - case Opcode::S_AND_B32: - return S_AND_B32(inst); - case Opcode::S_ASHR_I32: - return S_ASHR_I32(inst); - case Opcode::S_OR_B32: - return S_OR_B32(inst); - case Opcode::S_LSHL_B32: - return S_LSHL_B32(inst); - case Opcode::S_LSHR_B32: - return S_LSHR_B32(inst); - case Opcode::S_CSELECT_B32: - return S_CSELECT_B32(inst); - case Opcode::S_CSELECT_B64: - return S_CSELECT_B64(inst); - case Opcode::S_BFE_U32: - return S_BFE_U32(inst); - case Opcode::S_BFM_B32: - return S_BFM_B32(inst); - case Opcode::S_BREV_B32: - return S_BREV_B32(inst); - case Opcode::S_ADD_U32: - return S_ADD_U32(inst); - case Opcode::S_ADDC_U32: - return S_ADDC_U32(inst); + case Opcode::S_CMP_GE_U32: + return S_CMP(ConditionOp::GE, false, inst); + case Opcode::S_CMP_LT_U32: + return S_CMP(ConditionOp::LT, false, inst); + case Opcode::S_CMP_LE_U32: + return S_CMP(ConditionOp::LE, false, inst); + default: + LogMissingOpcode(inst); + } +} + +void Translator::EmitSOPK(const GcnInst& inst) { + switch (inst.opcode) { + case Opcode::S_MOVK_I32: + return S_MOVK(inst); + + case Opcode::S_CMPK_EQ_I32: + return S_CMPK(ConditionOp::EQ, true, inst); + case Opcode::S_CMPK_LG_I32: + return S_CMPK(ConditionOp::LG, true, inst); + case Opcode::S_CMPK_GT_I32: + return S_CMPK(ConditionOp::GT, true, inst); + case Opcode::S_CMPK_GE_I32: + return S_CMPK(ConditionOp::GE, true, inst); + case Opcode::S_CMPK_LT_I32: + return S_CMPK(ConditionOp::LT, true, inst); + case Opcode::S_CMPK_LE_I32: + return S_CMPK(ConditionOp::LE, true, inst); + + case Opcode::S_CMPK_EQ_U32: + return S_CMPK(ConditionOp::EQ, false, inst); + case Opcode::S_CMPK_LG_U32: + return S_CMPK(ConditionOp::LG, false, inst); + case Opcode::S_CMPK_GT_U32: + return S_CMPK(ConditionOp::GT, false, inst); + case Opcode::S_CMPK_GE_U32: + return S_CMPK(ConditionOp::GE, false, inst); + case Opcode::S_CMPK_LT_U32: + return S_CMPK(ConditionOp::LT, false, inst); + case Opcode::S_CMPK_LE_U32: + return S_CMPK(ConditionOp::LE, false, inst); + case Opcode::S_ADDK_I32: return S_ADDK_I32(inst); case Opcode::S_MULK_I32: return S_MULK_I32(inst); - case Opcode::S_SUB_U32: - case Opcode::S_SUB_I32: - return S_SUB_U32(inst); - case Opcode::S_MIN_U32: - return S_MIN_U32(inst); - case Opcode::S_MAX_U32: - return S_MAX_U32(inst); - case Opcode::S_WQM_B64: - break; - case Opcode::S_CMPK_EQ_U32: - return S_CMPK_EQ_U32(inst); default: LogMissingOpcode(inst); } @@ -154,6 +206,31 @@ void Translator::S_CMP(ConditionOp cond, bool is_signed, const GcnInst& inst) { ir.SetScc(result); } +void Translator::S_CMPK(ConditionOp cond, bool is_signed, const GcnInst& inst) { + const s32 simm16 = inst.control.sopk.simm; + const IR::U32 lhs = GetSrc(inst.dst[0]); + const IR::U32 rhs = ir.Imm32(simm16); + const IR::U1 result = [&] { + switch (cond) { + case ConditionOp::EQ: + return ir.IEqual(lhs, rhs); + case ConditionOp::LG: + return ir.INotEqual(lhs, rhs); + case ConditionOp::GT: + return ir.IGreaterThan(lhs, rhs, is_signed); + case ConditionOp::GE: + return ir.IGreaterThanEqual(lhs, rhs, is_signed); + case ConditionOp::LT: + return ir.ILessThan(lhs, rhs, is_signed); + case ConditionOp::LE: + return ir.ILessThanEqual(lhs, rhs, is_signed); + default: + UNREACHABLE(); + } + }(); + ir.SetScc(result); +} + void Translator::S_AND_SAVEEXEC_B64(const GcnInst& inst) { // This instruction normally operates on 64-bit data (EXEC, VCC, SGPRs) // However here we flatten it to 1-bit EXEC and 1-bit VCC. For the destination @@ -470,11 +547,4 @@ void Translator::S_MIN_U32(const GcnInst& inst) { ir.SetScc(ir.IEqual(result, src0)); } -void Translator::S_CMPK_EQ_U32(const GcnInst& inst) { - const s32 simm16 = inst.control.sopk.simm; - const IR::U32 src0{GetSrc(inst.dst[0])}; - const IR::U32 src1{ir.Imm32(simm16)}; - ir.SetScc(ir.IEqual(src0, src1)); -} - } // namespace Shader::Gcn diff --git a/src/shader_recompiler/frontend/translate/translate.h b/src/shader_recompiler/frontend/translate/translate.h index cde9e58e..8cbf7357 100644 --- a/src/shader_recompiler/frontend/translate/translate.h +++ b/src/shader_recompiler/frontend/translate/translate.h @@ -69,6 +69,10 @@ public: void EmitScalarAlu(const GcnInst& inst); void EmitVectorAlu(const GcnInst& inst); + // Instruction encodings + void EmitSOPC(const GcnInst& inst); + void EmitSOPK(const GcnInst& inst); + // Scalar ALU void S_MOVK(const GcnInst& inst); void S_MOV(const GcnInst& inst); @@ -98,7 +102,7 @@ public: void S_ADDK_I32(const GcnInst& inst); void S_MAX_U32(const GcnInst& inst); void S_MIN_U32(const GcnInst& inst); - void S_CMPK_EQ_U32(const GcnInst& inst); + void S_CMPK(ConditionOp cond, bool is_signed, const GcnInst& inst); // Scalar Memory void S_LOAD_DWORD(int num_dwords, const GcnInst& inst);