Compare commits

..

30 Commits
permut ... main

Author SHA1 Message Date
psucien 4182740384 Don't load `sync2` ext if `nv_checkpoints` isn't used 2024-08-31 00:10:47 +02:00
psucien ca1613258f
video_core: added support for indirect draws (#678)
* video_core: added support for indirect draws

* barriers simplified
2024-08-30 22:59:56 +02:00
georgemoralis 3d375a28eb
Merge pull request #671 from Xphalnos/main
Reorganization of includes (Part 2)
2024-08-30 22:10:49 +03:00
jnack 69d4fecdfe
Allow graphics/compute shader list for skipping (#674)
* Allow graphics/compute shader list for skipping

* nintendo ultra 64 + formatting

* indentation..

* allow empty array in ShouldSkipShader

* simpler check for skip hashes
2024-08-30 21:51:20 +03:00
Xphalnos 7886761476 Reorganization of includes (Part 2) 2024-08-30 15:48:21 +02:00
squidbus 6080066f75
vulkan: Few fixes for MoltenVK (#670)
* vulkan: Use SPIR-V 1.5 when Vulkan version is 1.2

* vulkan: Fix Format2_10_10_10 mismap
2024-08-30 16:40:39 +03:00
georgemoralis f1fe6b9f96
Merge pull request #668 from squidbus/fix-patch-stack
Initialize patch stack before thread TLS.
2024-08-30 14:58:34 +03:00
squidbus 6e552aac6a Initialize patch stack before thread TLS. 2024-08-30 04:43:11 -07:00
adjonesey 0f87d1e3d4 Remove from_compute check in texture cache invalidation (#665)
* Remove from_compute check in texture cache invalidation (hack)

* Remove from_compute parameter

---------

Co-authored-by: Adam Jones <a.c.jones@outlook.com>
2024-08-30 13:01:59 +03:00
georgemoralis 68fa5e292f
Merge pull request #666 from bigol83/patch-3
Update Italian translation
2024-08-30 12:39:30 +03:00
bigol83 bdfff5e8ea
Update it.ts 2024-08-30 11:01:48 +02:00
georgemoralis cdd193d5b1
Merge pull request #638 from squidbus/f16c
Add patches for F16C instructions under Rosetta 2.
2024-08-30 11:16:21 +03:00
georgemoralis 30ab2b7f71
Merge pull request #658 from DanielSvoboda/main
fix tr
2024-08-30 11:15:09 +03:00
DanielSvoboda f2b6843f9d fix tr 2024-08-29 23:11:20 -03:00
squidbus a17150960f Add patches for F16C instructions under Rosetta 2. 2024-08-29 17:31:25 -07:00
Grégoire Hage 1651db24fe
Implement S_XNOR_B64 (#654) 2024-08-30 02:43:12 +03:00
IndecisiveTurtle 6bf42aa985 vk_graphics_pipeline: Fix texel buffer offset 2024-08-30 01:09:39 +03:00
georgemoralis 8d41695e74
Merge pull request #651 from LeDragoX/pt-br-update-1
Update PT-BR localization
2024-08-30 01:08:07 +03:00
IndecisiveTurtle cb5190e31a vk_graphics_pipeline: Fix copy paste error 2024-08-30 00:59:12 +03:00
IndecisiveTurtle cf706f8cc7 buffer: Don't leak texel buffers, blacklist stream buffer with texel buffers 2024-08-30 00:26:08 +03:00
IndecisiveTurtle 6fbbe3d79b translator: Add missed flow instruction 2024-08-30 00:26:01 +03:00
IndecisiveTurtle fab390b860 spirv: More correct texel buffer usage 2024-08-30 00:25:56 +03:00
Plínio Larrubia 5a96ac1a4f
Update PT-BR translation
- Support DLC texts
- Fixed some errors on Cheats (Trapaças) translation
2024-08-29 18:22:36 -03:00
georgemoralis ac2fa103fa
Merge pull request #649 from f1amy/ru-translation-fixes
ru DLC translation and translation fixes
2024-08-29 23:47:47 +03:00
georgemoralis 7e7854346d
Merge pull request #650 from DanielSvoboda/main
Fix creation files.json in 'Download All Patches'
2024-08-29 23:47:25 +03:00
DanielSvoboda 751f6f9bab Fix creation files.json in 'Download ALL' 2024-08-29 17:26:06 -03:00
Flamy 1c835a1aa4
ru DLC translation and translation fixes 2024-08-29 23:59:52 +05:00
georgemoralis 07c8c28000
Merge pull request #647 from DanielSvoboda/main
fix tr cheats_patches.cpp
2024-08-29 19:44:04 +03:00
TheTurtle 66e96dd944
video_core: Account of runtime state changes when compiling shaders (#575)
* video_core: Compile shader permutations

* spirv: Only specific storage image format for atomics

* ir: Avoid cube coord patching for storage image

* spirv: Fix default attributes

* data_share: Add more instructions

* video_core: Query storage flag with runtime state

* kernel: Use std::list for semaphore

* video_core: Use texture buffers for untyped format load/store

* buffer_cache: Limit view usage

* vk_pipeline_cache: Fix invalid iterator

* image_view: Reduce log spam when alpha=1 in storage swizzle

* video_core: More features and proper spirv feature detection

* video_core: Attempt no2 for specialization

* spirv: Remove conflict

* vk_shader_cache: Small cleanup
2024-08-29 19:29:54 +03:00
DanielSvoboda aef7498c49
fix tr cheats_patches.cpp
the 2 words were not being translated
2024-08-29 13:21:58 -03:00
96 changed files with 1305 additions and 907 deletions

3
.gitmodules vendored
View File

@ -82,3 +82,6 @@
path = externals/ffmpeg-core path = externals/ffmpeg-core
url = https://github.com/shadps4-emu/ext-ffmpeg-core.git url = https://github.com/shadps4-emu/ext-ffmpeg-core.git
shallow = true shallow = true
[submodule "externals/half"]
path = externals/half
url = https://github.com/ROCm/half.git

View File

@ -644,6 +644,9 @@ if (APPLE)
# Replacement for std::chrono::time_zone # Replacement for std::chrono::time_zone
target_link_libraries(shadps4 PRIVATE date::date-tz) target_link_libraries(shadps4 PRIVATE date::date-tz)
# Half float conversions for F16C patches
target_link_libraries(shadps4 PRIVATE half)
endif() endif()
if (NOT ENABLE_QT_GUI) if (NOT ENABLE_QT_GUI)

View File

@ -142,11 +142,17 @@ if (WIN32)
target_compile_options(sirit PUBLIC "-Wno-error=unused-command-line-argument") target_compile_options(sirit PUBLIC "-Wno-error=unused-command-line-argument")
endif() endif()
# date if (APPLE)
if (APPLE AND NOT TARGET date::date-tz) # half
add_library(half INTERFACE)
target_include_directories(half INTERFACE half/include)
# date
if (NOT TARGET date::date-tz)
option(BUILD_TZ_LIB "" ON) option(BUILD_TZ_LIB "" ON)
option(USE_SYSTEM_TZ_DB "" ON) option(USE_SYSTEM_TZ_DB "" ON)
add_subdirectory(date) add_subdirectory(date)
endif()
endif() endif()
# Tracy # Tracy

2
externals/glslang vendored

@ -1 +1 @@
Subproject commit d59c84d388c805022e2bddea08aa41cbe7e43e55 Subproject commit 12cbda959b6df2af119a76a73ff906c2bed36884

1
externals/half vendored Submodule

@ -0,0 +1 @@
Subproject commit 1ddada225144cac0de8f6b5c0dd9acffd99a2e68

2
externals/robin-map vendored

@ -1 +1 @@
Subproject commit 1115dad3ffa0994e3f43b693d9b9cc99944c64c1 Subproject commit 2c48a1a50203bbaf1e3d0d64c5d726d56f8d3bb3

2
externals/sirit vendored

@ -1 +1 @@
Subproject commit 8db09231c448b913ae905d5237ce2eca46e3fe87 Subproject commit 37090c74cc6e680f2bc334cac8fd182f7634a1f6

2
externals/toml11 vendored

@ -1 +1 @@
Subproject commit cc0bee4fd46ea1f5db147d63ea545208cc9e8405 Subproject commit 4b740127230472779c4a4d71e1a75aaa3a367a2d

2
externals/xbyak vendored

@ -1 +1 @@
Subproject commit aabb091ae37068498751fd58202a9854408ecb0e Subproject commit ccdf68421bc8eb85693f573080fc0a5faad862db

View File

@ -15,6 +15,7 @@
#else #else
#include <pthread.h> #include <pthread.h>
#ifdef __APPLE__ #ifdef __APPLE__
#include <half.hpp>
#include <sys/sysctl.h> #include <sys/sysctl.h>
#endif #endif
#endif #endif
@ -30,6 +31,12 @@ static Xbyak::Reg ZydisToXbyakRegister(const ZydisRegister reg) {
if (reg >= ZYDIS_REGISTER_RAX && reg <= ZYDIS_REGISTER_R15) { if (reg >= ZYDIS_REGISTER_RAX && reg <= ZYDIS_REGISTER_R15) {
return Xbyak::Reg64(reg - ZYDIS_REGISTER_RAX + Xbyak::Operand::RAX); return Xbyak::Reg64(reg - ZYDIS_REGISTER_RAX + Xbyak::Operand::RAX);
} }
if (reg >= ZYDIS_REGISTER_XMM0 && reg <= ZYDIS_REGISTER_XMM31) {
return Xbyak::Xmm(reg - ZYDIS_REGISTER_XMM0 + xmm0.getIdx());
}
if (reg >= ZYDIS_REGISTER_YMM0 && reg <= ZYDIS_REGISTER_YMM31) {
return Xbyak::Ymm(reg - ZYDIS_REGISTER_YMM0 + ymm0.getIdx());
}
UNREACHABLE_MSG("Unsupported register: {}", static_cast<u32>(reg)); UNREACHABLE_MSG("Unsupported register: {}", static_cast<u32>(reg));
} }
@ -66,6 +73,12 @@ static Xbyak::Address ZydisToXbyakMemoryOperand(const ZydisDecodedOperand& opera
return ptr[expression]; return ptr[expression];
} }
static u64 ZydisToXbyakImmediateOperand(const ZydisDecodedOperand& operand) {
ASSERT_MSG(operand.type == ZYDIS_OPERAND_TYPE_IMMEDIATE,
"Expected immediate operand, got type: {}", static_cast<u32>(operand.type));
return operand.imm.value.u;
}
static std::unique_ptr<Xbyak::Operand> ZydisToXbyakOperand(const ZydisDecodedOperand& operand) { static std::unique_ptr<Xbyak::Operand> ZydisToXbyakOperand(const ZydisDecodedOperand& operand) {
switch (operand.type) { switch (operand.type) {
case ZYDIS_OPERAND_TYPE_REGISTER: { case ZYDIS_OPERAND_TYPE_REGISTER: {
@ -110,51 +123,135 @@ static Xbyak::Reg AllocateScratchRegister(
#ifdef __APPLE__ #ifdef __APPLE__
static constexpr u32 MaxSavedRegisters = 3; static pthread_key_t stack_pointer_slot;
static pthread_key_t register_save_slots[MaxSavedRegisters]; static pthread_key_t patch_stack_slot;
static std::once_flag register_save_init_flag; static std::once_flag patch_context_slots_init_flag;
static_assert(sizeof(void*) == sizeof(u64), static_assert(sizeof(void*) == sizeof(u64),
"Cannot fit a register inside a thread local storage slot."); "Cannot fit a register inside a thread local storage slot.");
static void InitializeRegisterSaveSlots() { static void InitializePatchContextSlots() {
for (u32 i = 0; i < MaxSavedRegisters; i++) { ASSERT_MSG(pthread_key_create(&stack_pointer_slot, nullptr) == 0,
ASSERT_MSG(pthread_key_create(&register_save_slots[i], nullptr) == 0, "Unable to allocate thread-local register for stack pointer.");
"Unable to allocate thread-local register save slot {}", i); ASSERT_MSG(pthread_key_create(&patch_stack_slot, nullptr) == 0,
"Unable to allocate thread-local register for patch stack.");
}
void InitializeThreadPatchStack() {
std::call_once(patch_context_slots_init_flag, InitializePatchContextSlots);
const auto* patch_stack = std::malloc(0x1000);
pthread_setspecific(patch_stack_slot, patch_stack);
}
void CleanupThreadPatchStack() {
std::call_once(patch_context_slots_init_flag, InitializePatchContextSlots);
auto* patch_stack = pthread_getspecific(patch_stack_slot);
if (patch_stack != nullptr) {
std::free(patch_stack);
pthread_setspecific(patch_stack_slot, nullptr);
} }
} }
static void SaveRegisters(Xbyak::CodeGenerator& c, const std::initializer_list<Xbyak::Reg> regs) { /// Saves the stack pointer to thread local storage and loads the patch stack.
ASSERT_MSG(regs.size() <= MaxSavedRegisters, "Not enough space to save {} registers.", static void SaveStack(Xbyak::CodeGenerator& c) {
regs.size()); std::call_once(patch_context_slots_init_flag, InitializePatchContextSlots);
std::call_once(register_save_init_flag, &InitializeRegisterSaveSlots);
u32 index = 0;
for (const auto& reg : regs) {
const auto offset = reinterpret_cast<void*>(register_save_slots[index++] * sizeof(void*));
// Save stack pointer and load patch stack.
c.putSeg(gs); c.putSeg(gs);
c.mov(qword[offset], reg.cvt64()); c.mov(qword[reinterpret_cast<void*>(stack_pointer_slot * sizeof(void*))], rsp);
} c.putSeg(gs);
c.mov(rsp, qword[reinterpret_cast<void*>(patch_stack_slot * sizeof(void*))]);
} }
/// Restores the stack pointer from thread local storage.
static void RestoreStack(Xbyak::CodeGenerator& c) {
std::call_once(patch_context_slots_init_flag, InitializePatchContextSlots);
// Save patch stack pointer and load original stack.
c.putSeg(gs);
c.mov(qword[reinterpret_cast<void*>(patch_stack_slot * sizeof(void*))], rsp);
c.putSeg(gs);
c.mov(rsp, qword[reinterpret_cast<void*>(stack_pointer_slot * sizeof(void*))]);
}
#else
// These utilities are not implemented as we can't save anything to thread local storage without
// temporary registers.
void InitializeThreadPatchStack() {
// No-op
}
void CleanupThreadPatchStack() {
// No-op
}
/// Saves the stack pointer to thread local storage and loads the patch stack.
static void SaveStack(Xbyak::CodeGenerator& c) {
UNIMPLEMENTED();
}
/// Restores the stack pointer from thread local storage.
static void RestoreStack(Xbyak::CodeGenerator& c) {
UNIMPLEMENTED();
}
#endif
/// Switches to the patch stack, saves registers, and restores the original stack.
static void SaveRegisters(Xbyak::CodeGenerator& c, const std::initializer_list<Xbyak::Reg> regs) {
SaveStack(c);
for (const auto& reg : regs) {
c.push(reg.cvt64());
}
RestoreStack(c);
}
/// Switches to the patch stack, restores registers, and restores the original stack.
static void RestoreRegisters(Xbyak::CodeGenerator& c, static void RestoreRegisters(Xbyak::CodeGenerator& c,
const std::initializer_list<Xbyak::Reg> regs) { const std::initializer_list<Xbyak::Reg> regs) {
ASSERT_MSG(regs.size() <= MaxSavedRegisters, "Not enough space to restore {} registers.", SaveStack(c);
regs.size());
std::call_once(register_save_init_flag, &InitializeRegisterSaveSlots);
u32 index = 0;
for (const auto& reg : regs) { for (const auto& reg : regs) {
const auto offset = reinterpret_cast<void*>(register_save_slots[index++] * sizeof(void*)); c.pop(reg.cvt64());
}
RestoreStack(c);
}
c.putSeg(gs); /// Switches to the patch stack and stores all registers.
c.mov(reg.cvt64(), qword[offset]); static void SaveContext(Xbyak::CodeGenerator& c) {
SaveStack(c);
for (int reg = Xbyak::Operand::RAX; reg <= Xbyak::Operand::R15; reg++) {
c.push(Xbyak::Reg64(reg));
}
for (int reg = 0; reg <= 7; reg++) {
c.sub(rsp, 32);
c.vmovdqu(ptr[rsp], Xbyak::Ymm(reg));
} }
} }
/// Restores all registers and restores the original stack.
/// If the destination is a register, it is not restored to preserve the output.
static void RestoreContext(Xbyak::CodeGenerator& c, const Xbyak::Operand& dst) {
for (int reg = 7; reg >= 0; reg--) {
if ((!dst.isXMM() && !dst.isYMM()) || dst.getIdx() != reg) {
c.vmovdqu(Xbyak::Ymm(reg), ptr[rsp]);
}
c.add(rsp, 32);
}
for (int reg = Xbyak::Operand::R15; reg >= Xbyak::Operand::RAX; reg--) {
if (!dst.isREG() || dst.getIdx() != reg) {
c.pop(Xbyak::Reg64(reg));
} else {
c.add(rsp, 4);
}
}
RestoreStack(c);
}
#ifdef __APPLE__
static void GenerateANDN(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) { static void GenerateANDN(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) {
const auto dst = ZydisToXbyakRegisterOperand(operands[0]); const auto dst = ZydisToXbyakRegisterOperand(operands[0]);
const auto src1 = ZydisToXbyakRegisterOperand(operands[1]); const auto src1 = ZydisToXbyakRegisterOperand(operands[1]);
@ -204,9 +301,9 @@ static void GenerateBEXTR(const ZydisDecodedOperand* operands, Xbyak::CodeGenera
c.and_(dst, scratch2); c.and_(dst, scratch2);
if (dst.getIdx() == shift.getIdx()) { if (dst.getIdx() == shift.getIdx()) {
RestoreRegisters(c, {scratch1, scratch2}); RestoreRegisters(c, {scratch2, scratch1});
} else { } else {
RestoreRegisters(c, {scratch1, scratch2, shift}); RestoreRegisters(c, {shift, scratch2, scratch1});
} }
} }
@ -258,10 +355,138 @@ static void GenerateBLSR(const ZydisDecodedOperand* operands, Xbyak::CodeGenerat
RestoreRegisters(c, {scratch}); RestoreRegisters(c, {scratch});
} }
bool FilterRosetta2Only(const ZydisDecodedOperand*) { static __attribute__((sysv_abi)) void PerformVCVTPH2PS(float* out, const half_float::half* in,
const u32 count) {
for (u32 i = 0; i < count; i++) {
out[i] = half_float::half_cast<float>(in[i]);
}
}
static void GenerateVCVTPH2PS(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) {
const auto dst = ZydisToXbyakRegisterOperand(operands[0]);
const auto src = ZydisToXbyakOperand(operands[1]);
const auto float_count = dst.getBit() / 32;
const auto byte_count = float_count * 4;
SaveContext(c);
// Allocate stack space for outputs and load into first parameter.
c.sub(rsp, byte_count);
c.mov(rdi, rsp);
if (src->isXMM()) {
// Allocate stack space for inputs and load into second parameter.
c.sub(rsp, byte_count);
c.mov(rsi, rsp);
// Move input to the allocated space.
c.movdqu(ptr[rsp], *reinterpret_cast<Xbyak::Xmm*>(src.get()));
} else {
c.lea(rsi, src->getAddress());
}
// Load float count into third parameter.
c.mov(rdx, float_count);
c.mov(rax, reinterpret_cast<u64>(PerformVCVTPH2PS));
c.call(rax);
if (src->isXMM()) {
// Clean up after inputs space.
c.add(rsp, byte_count);
}
// Load outputs into destination register and clean up space.
if (dst.isYMM()) {
c.vmovdqu(*reinterpret_cast<const Xbyak::Ymm*>(&dst), ptr[rsp]);
} else {
c.movdqu(*reinterpret_cast<const Xbyak::Xmm*>(&dst), ptr[rsp]);
}
c.add(rsp, byte_count);
RestoreContext(c, dst);
}
using SingleToHalfFloatConverter = half_float::half (*)(float);
static const SingleToHalfFloatConverter SingleToHalfFloatConverters[4] = {
half_float::half_cast<half_float::half, std::round_to_nearest, float>,
half_float::half_cast<half_float::half, std::round_toward_neg_infinity, float>,
half_float::half_cast<half_float::half, std::round_toward_infinity, float>,
half_float::half_cast<half_float::half, std::round_toward_zero, float>,
};
static __attribute__((sysv_abi)) void PerformVCVTPS2PH(half_float::half* out, const float* in,
const u32 count, const u8 rounding_mode) {
const auto conversion_func = SingleToHalfFloatConverters[rounding_mode];
for (u32 i = 0; i < count; i++) {
out[i] = conversion_func(in[i]);
}
}
static void GenerateVCVTPS2PH(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) {
const auto dst = ZydisToXbyakOperand(operands[0]);
const auto src = ZydisToXbyakRegisterOperand(operands[1]);
const auto ctrl = ZydisToXbyakImmediateOperand(operands[2]);
const auto float_count = src.getBit() / 32;
const auto byte_count = float_count * 4;
SaveContext(c);
if (dst->isXMM()) {
// Allocate stack space for outputs and load into first parameter.
c.sub(rsp, byte_count);
c.mov(rdi, rsp);
} else {
c.lea(rdi, dst->getAddress());
}
// Allocate stack space for inputs and load into second parameter.
c.sub(rsp, byte_count);
c.mov(rsi, rsp);
// Move input to the allocated space.
if (src.isYMM()) {
c.vmovdqu(ptr[rsp], *reinterpret_cast<const Xbyak::Ymm*>(&src));
} else {
c.movdqu(ptr[rsp], *reinterpret_cast<const Xbyak::Xmm*>(&src));
}
// Load float count into third parameter.
c.mov(rdx, float_count);
// Load rounding mode into fourth parameter.
if (ctrl & 4) {
// Load from MXCSR.RC.
c.stmxcsr(ptr[rsp - 4]);
c.mov(rcx, ptr[rsp - 4]);
c.shr(rcx, 13);
c.and_(rcx, 3);
} else {
c.mov(rcx, ctrl & 3);
}
c.mov(rax, reinterpret_cast<u64>(PerformVCVTPS2PH));
c.call(rax);
// Clean up after inputs space.
c.add(rsp, byte_count);
if (dst->isXMM()) {
// Load outputs into destination register and clean up space.
c.movdqu(*reinterpret_cast<Xbyak::Xmm*>(dst.get()), ptr[rsp]);
c.add(rsp, byte_count);
}
RestoreContext(c, *dst);
}
static bool FilterRosetta2Only(const ZydisDecodedOperand*) {
int ret = 0; int ret = 0;
size_t size = sizeof(ret); size_t size = sizeof(ret);
if (sysctlbyname("sysctl.proc_translated", &ret, &size, NULL, 0) != 0) { if (sysctlbyname("sysctl.proc_translated", &ret, &size, nullptr, 0) != 0) {
return false; return false;
} }
return ret; return ret;
@ -339,12 +564,16 @@ static const std::unordered_map<ZydisMnemonic, PatchInfo> Patches = {
#endif #endif
#ifdef __APPLE__ #ifdef __APPLE__
// BMI1 instructions that are not supported by Rosetta 2 on Apple Silicon. // Patches for instruction sets not supported by Rosetta 2.
// BMI1
{ZYDIS_MNEMONIC_ANDN, {FilterRosetta2Only, GenerateANDN, true}}, {ZYDIS_MNEMONIC_ANDN, {FilterRosetta2Only, GenerateANDN, true}},
{ZYDIS_MNEMONIC_BEXTR, {FilterRosetta2Only, GenerateBEXTR, true}}, {ZYDIS_MNEMONIC_BEXTR, {FilterRosetta2Only, GenerateBEXTR, true}},
{ZYDIS_MNEMONIC_BLSI, {FilterRosetta2Only, GenerateBLSI, true}}, {ZYDIS_MNEMONIC_BLSI, {FilterRosetta2Only, GenerateBLSI, true}},
{ZYDIS_MNEMONIC_BLSMSK, {FilterRosetta2Only, GenerateBLSMSK, true}}, {ZYDIS_MNEMONIC_BLSMSK, {FilterRosetta2Only, GenerateBLSMSK, true}},
{ZYDIS_MNEMONIC_BLSR, {FilterRosetta2Only, GenerateBLSR, true}}, {ZYDIS_MNEMONIC_BLSR, {FilterRosetta2Only, GenerateBLSR, true}},
// F16C
{ZYDIS_MNEMONIC_VCVTPH2PS, {FilterRosetta2Only, GenerateVCVTPH2PS, true}},
{ZYDIS_MNEMONIC_VCVTPS2PH, {FilterRosetta2Only, GenerateVCVTPS2PH, true}},
#endif #endif
}; };

View File

@ -9,6 +9,12 @@ class CodeGenerator;
namespace Core { namespace Core {
/// Initializes a stack for the current thread for use by patch implementations.
void InitializeThreadPatchStack();
/// Cleans up the patch stack for the current thread.
void CleanupThreadPatchStack();
/// Patches CPU instructions that cannot run as-is on the host. /// Patches CPU instructions that cannot run as-is on the host.
void PatchInstructions(u64 segment_addr, u64 segment_size, Xbyak::CodeGenerator& c); void PatchInstructions(u64 segment_addr, u64 segment_size, Xbyak::CodeGenerator& c);

View File

@ -1,17 +1,16 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include <cmath> #include <cmath>
#include <common/path_util.h>
#include <common/singleton.h>
#include <core/file_format/psf.h>
#include <core/file_sys/fs.h>
#include "app_content.h" #include "app_content.h"
#include "common/io_file.h" #include "common/io_file.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/path_util.h"
#include "common/singleton.h"
#include "common/string_util.h" #include "common/string_util.h"
#include "core/file_format/psf.h"
#include "core/file_sys/fs.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -2,9 +2,10 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <memory> #include <memory>
#include <common/assert.h>
#include <magic_enum.hpp> #include <magic_enum.hpp>
#include "audio_core/sdl_audio.h" #include "audio_core/sdl_audio.h"
#include "common/assert.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/audio/audioout.h" #include "core/libraries/audio/audioout.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -650,12 +650,12 @@ s32 PS4_SYSV_ABI sceGnmDrawIndexAuto(u32* cmdbuf, u32 size, u32 index_count, u32
} }
s32 PS4_SYSV_ABI sceGnmDrawIndexIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 shader_stage, s32 PS4_SYSV_ABI sceGnmDrawIndexIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 shader_stage,
u32 vertex_sgpr_offset, u32 instance_vgpr_offset, u32 vertex_sgpr_offset, u32 instance_sgpr_offset,
u32 flags) { u32 flags) {
LOG_TRACE(Lib_GnmDriver, "called"); LOG_TRACE(Lib_GnmDriver, "called");
if (cmdbuf && (size == 9) && (shader_stage < ShaderStages::Max) && if (cmdbuf && (size == 9) && (shader_stage < ShaderStages::Max) &&
(vertex_sgpr_offset < 0x10u) && (instance_vgpr_offset < 0x10u)) { (vertex_sgpr_offset < 0x10u) && (instance_sgpr_offset < 0x10u)) {
const auto predicate = flags & 1 ? PM4Predicate::PredEnable : PM4Predicate::PredDisable; const auto predicate = flags & 1 ? PM4Predicate::PredEnable : PM4Predicate::PredDisable;
cmdbuf = WriteHeader<PM4ItOpcode::DrawIndexIndirect>( cmdbuf = WriteHeader<PM4ItOpcode::DrawIndexIndirect>(
@ -665,7 +665,7 @@ s32 PS4_SYSV_ABI sceGnmDrawIndexIndirect(u32* cmdbuf, u32 size, u32 data_offset,
cmdbuf[0] = data_offset; cmdbuf[0] = data_offset;
cmdbuf[1] = vertex_sgpr_offset == 0 ? 0 : (vertex_sgpr_offset & 0xffffu) + sgpr_offset; cmdbuf[1] = vertex_sgpr_offset == 0 ? 0 : (vertex_sgpr_offset & 0xffffu) + sgpr_offset;
cmdbuf[2] = instance_vgpr_offset == 0 ? 0 : (instance_vgpr_offset & 0xffffu) + sgpr_offset; cmdbuf[2] = instance_sgpr_offset == 0 ? 0 : (instance_sgpr_offset & 0xffffu) + sgpr_offset;
cmdbuf[3] = 0; cmdbuf[3] = 0;
cmdbuf += 4; cmdbuf += 4;
@ -707,11 +707,11 @@ s32 PS4_SYSV_ABI sceGnmDrawIndexOffset(u32* cmdbuf, u32 size, u32 index_offset,
} }
s32 PS4_SYSV_ABI sceGnmDrawIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 shader_stage, s32 PS4_SYSV_ABI sceGnmDrawIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 shader_stage,
u32 vertex_sgpr_offset, u32 instance_vgpr_offset, u32 flags) { u32 vertex_sgpr_offset, u32 instance_sgpr_offset, u32 flags) {
LOG_TRACE(Lib_GnmDriver, "called"); LOG_TRACE(Lib_GnmDriver, "called");
if (cmdbuf && (size == 9) && (shader_stage < ShaderStages::Max) && if (cmdbuf && (size == 9) && (shader_stage < ShaderStages::Max) &&
(vertex_sgpr_offset < 0x10u) && (instance_vgpr_offset < 0x10u)) { (vertex_sgpr_offset < 0x10u) && (instance_sgpr_offset < 0x10u)) {
const auto predicate = flags & 1 ? PM4Predicate::PredEnable : PM4Predicate::PredDisable; const auto predicate = flags & 1 ? PM4Predicate::PredEnable : PM4Predicate::PredDisable;
cmdbuf = WriteHeader<PM4ItOpcode::DrawIndirect>(cmdbuf, 4, PM4ShaderType::ShaderGraphics, cmdbuf = WriteHeader<PM4ItOpcode::DrawIndirect>(cmdbuf, 4, PM4ShaderType::ShaderGraphics,
@ -721,7 +721,7 @@ s32 PS4_SYSV_ABI sceGnmDrawIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32
cmdbuf[0] = data_offset; cmdbuf[0] = data_offset;
cmdbuf[1] = vertex_sgpr_offset == 0 ? 0 : (vertex_sgpr_offset & 0xffffu) + sgpr_offset; cmdbuf[1] = vertex_sgpr_offset == 0 ? 0 : (vertex_sgpr_offset & 0xffffu) + sgpr_offset;
cmdbuf[2] = instance_vgpr_offset == 0 ? 0 : (instance_vgpr_offset & 0xffffu) + sgpr_offset; cmdbuf[2] = instance_sgpr_offset == 0 ? 0 : (instance_sgpr_offset & 0xffffu) + sgpr_offset;
cmdbuf[3] = 2; // auto index cmdbuf[3] = 2; // auto index
cmdbuf += 4; cmdbuf += 4;

View File

@ -45,7 +45,7 @@ s32 PS4_SYSV_ABI sceGnmDrawIndex(u32* cmdbuf, u32 size, u32 index_count, uintptr
u32 flags, u32 type); u32 flags, u32 type);
s32 PS4_SYSV_ABI sceGnmDrawIndexAuto(u32* cmdbuf, u32 size, u32 index_count, u32 flags); s32 PS4_SYSV_ABI sceGnmDrawIndexAuto(u32* cmdbuf, u32 size, u32 index_count, u32 flags);
s32 PS4_SYSV_ABI sceGnmDrawIndexIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 shader_stage, s32 PS4_SYSV_ABI sceGnmDrawIndexIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 shader_stage,
u32 vertex_sgpr_offset, u32 instance_vgpr_offset, u32 vertex_sgpr_offset, u32 instance_sgpr_offset,
u32 flags); u32 flags);
int PS4_SYSV_ABI sceGnmDrawIndexIndirectCountMulti(); int PS4_SYSV_ABI sceGnmDrawIndexIndirectCountMulti();
int PS4_SYSV_ABI sceGnmDrawIndexIndirectMulti(); int PS4_SYSV_ABI sceGnmDrawIndexIndirectMulti();
@ -53,7 +53,7 @@ int PS4_SYSV_ABI sceGnmDrawIndexMultiInstanced();
s32 PS4_SYSV_ABI sceGnmDrawIndexOffset(u32* cmdbuf, u32 size, u32 index_offset, u32 index_count, s32 PS4_SYSV_ABI sceGnmDrawIndexOffset(u32* cmdbuf, u32 size, u32 index_offset, u32 index_count,
u32 flags); u32 flags);
s32 PS4_SYSV_ABI sceGnmDrawIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 shader_stage, s32 PS4_SYSV_ABI sceGnmDrawIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 shader_stage,
u32 vertex_sgpr_offset, u32 instance_vgpr_offset, u32 flags); u32 vertex_sgpr_offset, u32 instance_sgpr_offset, u32 flags);
int PS4_SYSV_ABI sceGnmDrawIndirectCountMulti(); int PS4_SYSV_ABI sceGnmDrawIndirectCountMulti();
int PS4_SYSV_ABI sceGnmDrawIndirectMulti(); int PS4_SYSV_ABI sceGnmDrawIndirectMulti();
u32 PS4_SYSV_ABI sceGnmDrawInitDefaultHardwareState(u32* cmdbuf, u32 size); u32 PS4_SYSV_ABI sceGnmDrawInitDefaultHardwareState(u32* cmdbuf, u32 size);

View File

@ -1,7 +1,7 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <common/assert.h> #include "common/assert.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <thread> #include <thread>
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "event_flag_obj.h" #include "event_flag_obj.h"

View File

@ -2,8 +2,10 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#pragma once #pragma once
#include <condition_variable> #include <condition_variable>
#include <mutex> #include <mutex>
#include "common/types.h" #include "common/types.h"
namespace Libraries::Kernel { namespace Libraries::Kernel {

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <thread> #include <thread>
#include "common/assert.h" #include "common/assert.h"
#include "core/libraries/kernel/event_queue.h" #include "core/libraries/kernel/event_queue.h"

View File

@ -4,6 +4,7 @@
#pragma once #pragma once
#include <sys/types.h> #include <sys/types.h>
#include "common/types.h" #include "common/types.h"
namespace Core::Loader { namespace Core::Loader {

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <bit> #include <bit>
#include "common/alignment.h" #include "common/alignment.h"
#include "common/assert.h" #include "common/assert.h"
#include "common/logging/log.h" #include "common/logging/log.h"

View File

@ -4,12 +4,14 @@
#include <mutex> #include <mutex>
#include <semaphore> #include <semaphore>
#include <thread> #include <thread>
#include "common/alignment.h" #include "common/alignment.h"
#include "common/assert.h" #include "common/assert.h"
#include "common/error.h" #include "common/error.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/singleton.h" #include "common/singleton.h"
#include "common/thread.h" #include "common/thread.h"
#include "core/cpu_patches.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/kernel/libkernel.h" #include "core/libraries/kernel/libkernel.h"
#include "core/libraries/kernel/thread_management.h" #include "core/libraries/kernel/thread_management.h"
@ -985,6 +987,7 @@ static void cleanup_thread(void* arg) {
destructor(value); destructor(value);
} }
} }
Core::CleanupThreadPatchStack();
thread->is_almost_done = true; thread->is_almost_done = true;
} }
@ -992,6 +995,7 @@ static void* run_thread(void* arg) {
auto* thread = static_cast<ScePthread>(arg); auto* thread = static_cast<ScePthread>(arg);
Common::SetCurrentThreadName(thread->name.c_str()); Common::SetCurrentThreadName(thread->name.c_str());
auto* linker = Common::Singleton<Core::Linker>::Instance(); auto* linker = Common::Singleton<Core::Linker>::Instance();
Core::InitializeThreadPatchStack();
linker->InitTlsForThread(false); linker->InitTlsForThread(false);
void* ret = nullptr; void* ret = nullptr;
g_pthread_self = thread; g_pthread_self = thread;

View File

@ -10,6 +10,7 @@
#include <vector> #include <vector>
#include <pthread.h> #include <pthread.h>
#include <sched.h> #include <sched.h>
#include "common/types.h" #include "common/types.h"
namespace Core::Loader { namespace Core::Loader {

View File

@ -5,6 +5,7 @@
#include <list> #include <list>
#include <mutex> #include <mutex>
#include <pthread.h> #include <pthread.h>
#include "common/assert.h" #include "common/assert.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <thread> #include <thread>
#include "common/assert.h" #include "common/assert.h"
#include "common/debug.h" #include "common/debug.h"
#include "common/native_clock.h" #include "common/native_clock.h"

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <cmath> #include <cmath>
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -2,13 +2,18 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include "common/config.h" #include "common/config.h"
#include "core/libraries/ajm/ajm.h"
#include "core/libraries/app_content/app_content.h" #include "core/libraries/app_content/app_content.h"
#include "core/libraries/audio/audioin.h" #include "core/libraries/audio/audioin.h"
#include "core/libraries/audio/audioout.h" #include "core/libraries/audio/audioout.h"
#include "core/libraries/avplayer/avplayer.h"
#include "core/libraries/dialogs/error_dialog.h"
#include "core/libraries/dialogs/ime_dialog.h"
#include "core/libraries/disc_map/disc_map.h" #include "core/libraries/disc_map/disc_map.h"
#include "core/libraries/gnmdriver/gnmdriver.h" #include "core/libraries/gnmdriver/gnmdriver.h"
#include "core/libraries/kernel/libkernel.h" #include "core/libraries/kernel/libkernel.h"
#include "core/libraries/libc_internal/libc_internal.h" #include "core/libraries/libc_internal/libc_internal.h"
#include "core/libraries/libpng/pngdec.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"
#include "core/libraries/network/http.h" #include "core/libraries/network/http.h"
#include "core/libraries/network/net.h" #include "core/libraries/network/net.h"
@ -32,11 +37,6 @@
#include "core/libraries/system/userservice.h" #include "core/libraries/system/userservice.h"
#include "core/libraries/usbd/usbd.h" #include "core/libraries/usbd/usbd.h"
#include "core/libraries/videoout/video_out.h" #include "core/libraries/videoout/video_out.h"
#include "src/core/libraries/ajm/ajm.h"
#include "src/core/libraries/avplayer/avplayer.h"
#include "src/core/libraries/dialogs/error_dialog.h"
#include "src/core/libraries/dialogs/ime_dialog.h"
#include "src/core/libraries/libpng/pngdec.h"
namespace Libraries { namespace Libraries {

View File

@ -4,6 +4,7 @@
#pragma once #pragma once
#include <functional> #include <functional>
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/loader/elf.h" #include "core/loader/elf.h"
#include "core/loader/symbols_resolver.h" #include "core/loader/symbols_resolver.h"

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include "common/config.h" #include "common/config.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include <unordered_map> #include <unordered_map>
#include "common/logging/log.h" #include "common/logging/log.h"

View File

@ -1,11 +1,10 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator #include "common/assert.h"
#include <common/assert.h>
#include <common/singleton.h>
#include "common/config.h" #include "common/config.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/singleton.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"
#include "input/controller.h" #include "input/controller.h"

View File

@ -1,9 +1,9 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <core/file_format/playgo_chunk.h>
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/singleton.h" #include "common/singleton.h"
#include "core/file_format/playgo_chunk.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"
#include "core/libraries/system/systemservice.h" #include "core/libraries/system/systemservice.h"

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#pragma once #pragma once
#include "common/types.h" #include "common/types.h"
#include "playgo_types.h" #include "playgo_types.h"

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#pragma once #pragma once
#include "common/types.h" #include "common/types.h"
namespace Core::Loader { namespace Core::Loader {

View File

@ -1,8 +1,8 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include <chrono> #include <chrono>
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -3,12 +3,13 @@
#include <span> #include <span>
#include <vector> #include <vector>
#include <common/path_util.h>
#include <common/singleton.h>
#include <core/file_format/psf.h>
#include <core/file_sys/fs.h>
#include "common/assert.h" #include "common/assert.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/path_util.h"
#include "common/singleton.h"
#include "core/file_format/psf.h"
#include "core/file_sys/fs.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"
#include "core/libraries/save_data/savedata.h" #include "core/libraries/save_data/savedata.h"

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include "common/logging/log.h" #include "common/logging/log.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"
#include "core/libraries/libs.h" #include "core/libraries/libs.h"

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/singleton.h" #include "common/singleton.h"
#include "core/libraries/error_codes.h" #include "core/libraries/error_codes.h"

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#pragma once #pragma once
#include "common/types.h" #include "common/types.h"
namespace Core::Loader { namespace Core::Loader {

View File

@ -4,6 +4,7 @@
#pragma once #pragma once
#include <string_view> #include <string_view>
#include "common/assert.h" #include "common/assert.h"
#include "common/types.h" #include "common/types.h"

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <pthread.h> #include <pthread.h>
#include "common/assert.h" #include "common/assert.h"
#include "common/config.h" #include "common/config.h"
#include "common/debug.h" #include "common/debug.h"

View File

@ -10,6 +10,7 @@
#include "common/thread.h" #include "common/thread.h"
#include "core/aerolib/aerolib.h" #include "core/aerolib/aerolib.h"
#include "core/aerolib/stubs.h" #include "core/aerolib/stubs.h"
#include "core/cpu_patches.h"
#include "core/libraries/kernel/memory_management.h" #include "core/libraries/kernel/memory_management.h"
#include "core/libraries/kernel/thread_management.h" #include "core/libraries/kernel/thread_management.h"
#include "core/linker.h" #include "core/linker.h"
@ -85,6 +86,7 @@ void Linker::Execute() {
// Init primary thread. // Init primary thread.
Common::SetCurrentThreadName("GAME_MainThread"); Common::SetCurrentThreadName("GAME_MainThread");
Libraries::Kernel::pthreadInitSelfMainThread(); Libraries::Kernel::pthreadInitSelfMainThread();
InitializeThreadPatchStack();
InitTlsForThread(true); InitTlsForThread(true);
// Start shared library modules // Start shared library modules
@ -104,6 +106,8 @@ void Linker::Execute() {
RunMainEntry(m->GetEntryAddress(), &p, ProgramExitFunc); RunMainEntry(m->GetEntryAddress(), &p, ProgramExitFunc);
} }
} }
CleanupThreadPatchStack();
} }
s32 Linker::LoadModule(const std::filesystem::path& elf_name, bool is_dynamic) { s32 Linker::LoadModule(const std::filesystem::path& elf_name, bool is_dynamic) {

View File

@ -130,7 +130,7 @@ void CheatsPatches::setupUI() {
// Call the method to fill the list of cheat files // Call the method to fill the list of cheat files
populateFileListCheats(); populateFileListCheats();
QLabel* repositoryLabel = new QLabel("Repository:"); QLabel* repositoryLabel = new QLabel(tr("Repository:"));
repositoryLabel->setAlignment(Qt::AlignLeft); repositoryLabel->setAlignment(Qt::AlignLeft);
repositoryLabel->setAlignment(Qt::AlignVCenter); repositoryLabel->setAlignment(Qt::AlignVCenter);
@ -175,7 +175,8 @@ void CheatsPatches::setupUI() {
int ret = QMessageBox::warning( int ret = QMessageBox::warning(
this, tr("Delete File"), this, tr("Delete File"),
QString(tr("Do you want to delete the selected file?\n%1")).arg(selectedFileName), QString(tr("Do you want to delete the selected file?\\n%1").replace("\\n", "\n"))
.arg(selectedFileName),
QMessageBox::Yes | QMessageBox::No); QMessageBox::Yes | QMessageBox::No);
if (ret == QMessageBox::Yes) { if (ret == QMessageBox::Yes) {
@ -1123,7 +1124,7 @@ void CheatsPatches::addPatchesToLayout(const QString& filePath) {
void CheatsPatches::updateNoteTextEdit(const QString& patchName) { void CheatsPatches::updateNoteTextEdit(const QString& patchName) {
if (m_patchInfos.contains(patchName)) { if (m_patchInfos.contains(patchName)) {
const PatchInfo& patchInfo = m_patchInfos[patchName]; const PatchInfo& patchInfo = m_patchInfos[patchName];
QString text = QString(tr("Name:") + " %1\n" + tr("Author:") + " %2\n\n%3") QString text = QString(tr("Name:") + " %1\n" + tr("Author: ") + "%2\n\n%3")
.arg(patchInfo.name) .arg(patchInfo.name)
.arg(patchInfo.author) .arg(patchInfo.author)
.arg(patchInfo.note); .arg(patchInfo.note);

View File

@ -36,6 +36,7 @@ public:
void downloadCheats(const QString& source, const QString& m_gameSerial, void downloadCheats(const QString& source, const QString& m_gameSerial,
const QString& m_gameVersion, bool showMessageBox); const QString& m_gameVersion, bool showMessageBox);
void downloadPatches(const QString repository, const bool showMessageBox); void downloadPatches(const QString repository, const bool showMessageBox);
void createFilesJson(const QString& repository);
signals: signals:
void downloadFinished(); void downloadFinished();
@ -58,7 +59,6 @@ private:
void applyCheat(const QString& modName, bool enabled); void applyCheat(const QString& modName, bool enabled);
void applyPatch(const QString& patchName, bool enabled); void applyPatch(const QString& patchName, bool enabled);
void createFilesJson(const QString& repository);
void uncheckAllCheatCheckBoxes(); void uncheckAllCheatCheckBoxes();
void updateNoteTextEdit(const QString& patchName); void updateNoteTextEdit(const QString& patchName);

View File

@ -140,7 +140,7 @@ public:
new CheatsPatches(gameName, gameSerial, gameVersion, gameSize, gameImage); new CheatsPatches(gameName, gameSerial, gameVersion, gameSize, gameImage);
cheatsPatches->show(); cheatsPatches->show();
connect(widget->parent(), &QWidget::destroyed, cheatsPatches, connect(widget->parent(), &QWidget::destroyed, cheatsPatches,
[widget, cheatsPatches]() { cheatsPatches->deleteLater(); }); [cheatsPatches]() { cheatsPatches->deleteLater(); });
} }
if (selected == &openTrophyViewer) { if (selected == &openTrophyViewer) {

View File

@ -366,7 +366,7 @@ void MainWindow::CreateConnects() {
panelDialog->accept(); panelDialog->accept();
}); });
connect(downloadAllPatchesButton, &QPushButton::clicked, this, [this, panelDialog]() { connect(downloadAllPatchesButton, &QPushButton::clicked, [panelDialog]() {
QEventLoop eventLoop; QEventLoop eventLoop;
int pendingDownloads = 0; int pendingDownloads = 0;
@ -391,6 +391,8 @@ void MainWindow::CreateConnects() {
nullptr, tr("Download Complete"), nullptr, tr("Download Complete"),
QString(tr("Patches Downloaded Successfully!") + "\n" + QString(tr("Patches Downloaded Successfully!") + "\n" +
tr("All Patches available for all games have been downloaded."))); tr("All Patches available for all games have been downloaded.")));
cheatsPatches->createFilesJson("GoldHEN");
cheatsPatches->createFilesJson("shadPS4");
panelDialog->accept(); panelDialog->accept();
}); });
panelDialog->exec(); panelDialog->exec();
@ -640,24 +642,24 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int
double appD = game_app_version.toDouble(); double appD = game_app_version.toDouble();
double pkgD = pkg_app_version.toDouble(); double pkgD = pkg_app_version.toDouble();
if (pkgD == appD) { if (pkgD == appD) {
msgBox.setText(QString(tr("Patch detected!\nPKG and Game versions match!: " msgBox.setText(QString(tr("Patch detected!") + "\n" +
"%1\nWould you like ") + tr("PKG and Game versions match: ") + pkg_app_version +
tr("to overwrite?")) "\n" + tr("Would you like to overwrite?")));
.arg(pkg_app_version));
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No);
} else if (pkgD < appD) { } else if (pkgD < appD) {
msgBox.setText(QString(tr("Patch detected!\nPKG Version %1 is older ") + msgBox.setText(QString(tr("Patch detected!") + "\n" +
tr("than installed version!: %2\nWould you like ") + tr("PKG Version %1 is older than installed version: ")
tr("to overwrite?")) .arg(pkg_app_version) +
.arg(pkg_app_version, game_app_version)); game_app_version + "\n" +
tr("Would you like to overwrite?")));
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No);
} else { } else {
msgBox.setText( msgBox.setText(QString(tr("Patch detected!") + "\n" +
QString(tr("Patch detected!\nGame is installed: %1\nWould you like ") + tr("Game is installed: ") + game_app_version + "\n" +
tr("to install Patch: %2?")) tr("Would you like to install Patch: ") +
.arg(game_app_version, pkg_app_version)); pkg_app_version + " ?"));
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No);
} }
@ -683,9 +685,9 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int
return; return;
} }
} else { } else {
msgBox.setText( msgBox.setText(QString(tr("DLC already installed:") + "\n" +
QString("DLC already installed\n%1\nWould you like to overwrite?") QString::fromStdString(addon_extract_path.string()) +
.arg(QString::fromStdString(addon_extract_path.string()))); "\n\n" + tr("Would you like to overwrite?")));
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No);
int result = msgBox.exec(); int result = msgBox.exec();
@ -696,9 +698,9 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int
} }
} }
} else { } else {
msgBox.setText( msgBox.setText(QString(tr("Game already installed") + "\n" +
QString(tr("Game already installed\n%1\nWould you like to overwrite?")) QString::fromStdString(extract_path.string()) + "\n" +
.arg(QString::fromStdString(extract_path.string()))); tr("Would you like to overwrite?")));
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No);
int result = msgBox.exec(); int result = msgBox.exec();

View File

@ -566,44 +566,34 @@
<translation>PKG-udtrækning</translation> <translation>PKG-udtrækning</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Patch opdaget!\nPKG- og spilversioner stemmer overens!: %1\nVil du </translation> <translation>Opdatering detekteret!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>overskrive?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Patch opdaget!\nPKG-version %1 er ældre </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>end installeret version!: %2\nVil du </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>overskrive?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Patch opdaget!\nSpillet er installeret: %1\nVil du </translation> <translation>PKG og spilversioner matcher: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>installere patch: %2?</translation> <translation>Vil du overskrive?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Spil allerede installeret\n%1\nVil du overskrive?</translation> <translation>PKG Version %1 er ældre end den installerede version: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Spillet er installeret: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Vil du installere opdateringen: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
@ -613,7 +603,17 @@
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>Vil du installere DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC allerede installeret:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Spillet er allerede installeret</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -566,54 +566,54 @@
<translation>PKG-Extraktion</translation> <translation>PKG-Extraktion</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Patch erkannt!\nPKG- und Spielversion stimmen überein!: %1\nMöchten Sie </translation> <translation>Patch erkannt!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>überschreiben?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Patch erkannt!\nPKG-Version %1 ist älter </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>als die installierte Version!: %2\nMöchten Sie </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>überschreiben?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Patch erkannt!\nSpiel ist installiert: %1\nMöchten Sie </translation> <translation>PKG- und Spielversionen stimmen überein: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>Patch installieren: %2?</translation> <translation>Würden Sie gerne überschreiben?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Spiel bereits installiert\n%1\nMöchten Sie überschreiben?</translation> <translation>PKG-Version %1 ist älter als die installierte Version: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Spiel ist installiert: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Möchten Sie den Patch installieren: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>DLC-Installation</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>Würden Sie gerne DLC installieren: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC bereits installiert:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Spiel bereits installiert</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -566,54 +566,54 @@
<translation>Εξαγωγή PKG</translation> <translation>Εξαγωγή PKG</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Ανίχνευση Patch!\nΟι εκδόσεις PKG και παιχνιδιού ταιριάζουν!: %1\nΘέλετε </translation> <translation>Αναγνώριση ενημέρωσης!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>να αντικαταστήσετε;</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Ανίχνευση Patch!\nΗ έκδοση PKG %1 είναι παλαιότερη </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>από την εγκατεστημένη έκδοση!: %2\nΘέλετε </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>να αντικαταστήσετε;</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Ανίχνευση Patch!\nΤο παιχνίδι είναι εγκατεστημένο: %1\nΘέλετε </translation> <translation>Οι εκδόσεις PKG και παιχνιδιού ταιριάζουν: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>να εγκαταστήσετε το Patch: %2;</translation> <translation>Θέλετε να αντικαταστήσετε;</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Το παιχνίδι είναι ήδη εγκατεστημένο\n%1\nΘέλετε να αντικαταστήσετε;</translation> <translation>Η έκδοση PKG %1 είναι παλαιότερη από την εγκατεστημένη έκδοση: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Το παιχνίδι είναι εγκατεστημένο: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Θέλετε να εγκαταστήσετε την ενημέρωση: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>Εγκατάσταση DLC</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>Θέλετε να εγκαταστήσετε το DLC: %1;</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC ήδη εγκατεστημένο:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Παιχνίδι ήδη εγκατεστημένο</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -566,44 +566,34 @@
<translation>PKG Extraction</translation> <translation>PKG Extraction</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Patch detected!\nPKG and Game versions match!: %1\nWould you like </translation> <translation>Patch detected!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>to overwrite?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Patch detected!\nPKG Version %1 is older </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>than installed version!: %2\nWould you like </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>to overwrite?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Patch detected!\nGame is installed: %1\nWould you like </translation> <translation>PKG and Game versions match: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>to install Patch: %2?</translation> <translation>Would you like to overwrite?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Game already installed\n%1\nWould you like to overwrite?</translation> <translation>PKG Version %1 is older than installed version: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Game is installed: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Would you like to install Patch: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
@ -615,6 +605,16 @@
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>Would you like to install DLC: %1?</translation>
</message> </message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC already installed:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Game already installed</translation>
</message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source> <source>PKG is a patch, please install the game first!</source>

View File

@ -566,54 +566,54 @@
<translation>Extracción de PKG</translation> <translation>Extracción de PKG</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>¡Parche detectado!\n¡La versión de PKG y del juego coinciden!: %1\n¿Te gustaría </translation> <translation>¡Actualización detectada!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>¿sobrescribir?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>¡Parche detectado!\nLa versión de PKG %1 es más antigua </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>que la versión instalada!: %2\n¿Te gustaría </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>¿sobrescribir?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>¡Parche detectado!\nJuego está instalado: %1\n¿Te gustaría </translation> <translation>Las versiones de PKG y del juego coinciden: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>¿instalar el parche: %2?</translation> <translation>¿Desea sobrescribir?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Juego ya instalado\n%1\n¿Te gustaría sobrescribirlo?</translation> <translation>La versión de PKG %1 es más antigua que la versión instalada: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>El juego está instalado: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>¿Desea instalar la actualización: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>Instalación de DLC</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>¿Desea instalar el DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC ya instalado:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Juego ya instalado</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -566,54 +566,54 @@
<translation>PKG:n purku</translation> <translation>PKG:n purku</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Korjaus havaittu!\nPKG:n ja pelin versiot vastaavat!: %1\nHaluatko </translation> <translation>Päivitys havaittu!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>korvata?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Korjaus havaittu!\nPKG Version %1 on vanhempi </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>kuin asennettu versio!: %2\nHaluatko </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>korvata?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Korjaus havaittu!\nPeli on asennettu: %1\nHaluatko </translation> <translation>PKG- ja peliversiot vastaavat: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>asentaa korjaus: %2?</translation> <translation>Haluatko korvata?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Peli on jo asennettu\n%1\nHaluatko korvata sen?</translation> <translation>PKG-versio %1 on vanhempi kuin asennettu versio: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Peli on asennettu: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Haluatko asentaa päivityksen: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>DLC-asennus</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>Haluatko asentaa DLC:n: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC on jo asennettu:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Peli on jo asennettu</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -566,54 +566,54 @@
<translation>Extraction du PKG</translation> <translation>Extraction du PKG</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Patch détecté !\nLa version du PKG et du jeu correspondent : %1\nSouhaitez-vous </translation> <translation>Patch détecté !</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>écraser ?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Patch détecté !\nVersion PKG %1 est plus ancienne </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>que la version installée ! : %2\nSouhaitez-vous </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>écraser ?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Patch détecté !\nJeu est installé : %1\nSouhaitez-vous </translation> <translation>Les versions PKG et jeu correspondent : </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>installer le patch : %2 ?</translation> <translation>Souhaitez-vous remplacer ?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Jeu déjà installé\n%1\nSouhaitez-vous écraser ?</translation> <translation>La version PKG %1 est plus ancienne que la version installée : </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Jeu installé : </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Souhaitez-vous installer le patch : </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>Installation du DLC</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>Souhaitez-vous installer le DLC : %1 ?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC déjà installé :</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Jeu déjà installé</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -566,54 +566,54 @@
<translation>PKG kicsomagolás</translation> <translation>PKG kicsomagolás</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Javítás észlelve!\nA PKG és a játék verziók egyeznek: %1\nSzeretnéd </translation> <translation>Frissítés észlelve!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>felülírni?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Javítás észlelve!\nA PKG verzió %1 régebbi </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>mint a telepített verzió: %2\nSzeretnéd </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>felülírni?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Javítás észlelve!\nA játék telepítve van: %1\nSzeretnéd </translation> <translation>A PKG és a játék verziói egyeznek: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>a javítást telepíteni: %2?</translation> <translation>Szeretné felülírni?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>A játék már telepítve van\n%1\nSzeretnéd felülírni?</translation> <translation>A %1-es PKG verzió régebbi, mint a telepített verzió: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>A játék telepítve van: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Szeretné telepíteni a frissítést: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>DLC Telepítés</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>Szeretné telepíteni a DLC-t: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC már telepítve:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>A játék már telepítve van</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -566,54 +566,54 @@
<translation>Ekstraksi PKG</translation> <translation>Ekstraksi PKG</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Patch terdeteksi!\nVersi PKG dan Game cocok!: %1\nApakah Anda ingin </translation> <translation>Patch terdeteksi!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>menimpa?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Patch terdeteksi!\nVersi PKG %1 lebih lama </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>daripada versi yang terpasang!: %2\nApakah Anda ingin </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>menimpa?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Patch terdeteksi!\nGame terpasang: %1\nApakah Anda ingin </translation> <translation>Versi PKG dan Game cocok: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>memasang Patch: %2?</translation> <translation>Apakah Anda ingin menimpa?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Game sudah terpasang\n%1\nApakah Anda ingin menimpa?</translation> <translation>Versi PKG %1 lebih lama dari versi yang terpasang: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Game telah terpasang: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Apakah Anda ingin menginstal patch: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>Instalasi DLC</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>Apakah Anda ingin menginstal DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC sudah terpasang:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Game sudah terpasang</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -181,7 +181,7 @@
<message> <message>
<location filename="../main_window_ui.h" line="318"/> <location filename="../main_window_ui.h" line="318"/>
<source>Install application from a .pkg file</source> <source>Install application from a .pkg file</source>
<translation>Installa applicazione da un file .pkg file</translation> <translation>Installa applicazione da un file .pkg</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="320"/> <location filename="../main_window_ui.h" line="320"/>
@ -236,7 +236,7 @@
<message> <message>
<location filename="../main_window_ui.h" line="338"/> <location filename="../main_window_ui.h" line="338"/>
<source>List View</source> <source>List View</source>
<translation>Visualizzazione lista</translation> <translation>Visualizzazione Lista</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="340"/> <location filename="../main_window_ui.h" line="340"/>
@ -341,7 +341,7 @@
<message> <message>
<location filename="../main_window_ui.h" line="364"/> <location filename="../main_window_ui.h" line="364"/>
<source>toolBar</source> <source>toolBar</source>
<translation>barra strumenti</translation> <translation>Barra strumenti</translation>
</message> </message>
</context> </context>
<context> <context>
@ -566,44 +566,34 @@
<translation>Estrazione file PKG</translation> <translation>Estrazione file PKG</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Patch rilevata! Il\nPKG e la versione del gioco coincidono!: %1\nVuoi </translation> <translation>Patch rilevata!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>sovrascrivere?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Patch rilevata! La \nPKG Versione %1 è più vecchia </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>della versione installata!: %2\nVuoi </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>sovrascrivere?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Patch rilevata!\nGioco installato: %1\Vuoi </translation> <translation>Le versioni di PKG e del gioco corrispondono: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>installare la Patch: %2?</translation> <translation>Vuoi sovrascrivere?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Gioco già installato\n%1\nVuoi sovrascrivere??</translation> <translation>La versione PKG %1 è più vecchia rispetto alla versione installata: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Gioco installato: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Vuoi installare la patch: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
@ -615,6 +605,16 @@
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Vuoi installare il DLC: %1?</translation> <translation>Vuoi installare il DLC: %1?</translation>
</message> </message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC già installato:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Gioco già installato</translation>
</message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source> <source>PKG is a patch, please install the game first!</source>
@ -651,12 +651,12 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="44"/> <location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source> <source>Cheats / Patches</source>
<translation>Cheat / Patch</translation> <translation>Trucchi / Patch</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="50"/> <location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source> <source>defaultTextEdit_MSG</source>
<translation>I cheats/patches sono sperimentali.\nUtilizzali con cautela.\n\nScarica i cheats singolarmente selezionando il repository e cliccando sul pulsante di download.\nNella scheda Patches, puoi scaricare tutti i patch in una volta sola, scegliere quali vuoi utilizzare e salvare la tua selezione.\n\nPoiché non sviluppiamo i Cheats/Patches,\nper favore segnala i problemi all'autore del cheat.\n\nHai creato un nuovo cheat? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats</translation> <translation>I trucchi e le patch sono sperimentali.\nUtilizzali con cautela.\n\nScarica i trucchi singolarmente selezionando l'archivio e cliccando sul pulsante di download.\nNella scheda Patch, puoi scaricare tutte le patch in una volta sola, scegliere quali vuoi utilizzare e salvare la tua selezione.\n\nPoiché non sviluppiamo i trucchi e le patch,\nper favore segnala i problemi all'autore dei trucchi.\n\nHai creato un nuovo trucco? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="69"/> <location filename="../cheats_patches.cpp" line="69"/>

View File

@ -566,54 +566,54 @@
<translation>PKG抽出</translation> <translation>PKG抽出</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>\nPKGとゲームバージョンが一致しています: %1\n上書きしますか</translation> <translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>\nPKGバージョン %1 </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>: %2\n上書きしますか</translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation></translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>\nゲームがインストールされています: %1\nインストールしますか</translation> <translation>PKGとゲームのバージョンが一致しています: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>: %2?</translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>\n%1\n上書きしますか</translation> <translation>PKGバージョン %1 : </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>DLCのインストール</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>DLCをインストールしてもよろしいですか: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLCはすでにインストールされています:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation></translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -566,44 +566,34 @@
<translation>PKG Extraction</translation> <translation>PKG Extraction</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Patch detected!\nPKG and Game versions match!: %1\nWould you like </translation> <translation>Patch detected!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>to overwrite?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Patch detected!\nPKG Version %1 is older </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>than installed version!: %2\nWould you like </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>to overwrite?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Patch detected!\nGame is installed: %1\nWould you like </translation> <translation>PKG and Game versions match: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>to install Patch: %2?</translation> <translation>Would you like to overwrite?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Game already installed\n%1\nWould you like to overwrite?</translation> <translation>PKG Version %1 is older than installed version: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Game is installed: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Would you like to install Patch: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
@ -615,6 +605,16 @@
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>Would you like to install DLC: %1?</translation>
</message> </message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC already installed:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Game already installed</translation>
</message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source> <source>PKG is a patch, please install the game first!</source>

View File

@ -566,54 +566,54 @@
<translation>PKG ištraukimas</translation> <translation>PKG ištraukimas</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Pataisa aptikta!\nPKG ir žaidimo versijos atitinka!: %1\nAr norėtumėte </translation> <translation>Rasta atnaujinimą!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>perrašyti?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Pataisa aptikta!\nPKG versija %1 yra senesnė </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>nei įdiegta versija!: %2\nAr norėtumėte </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>perrašyti?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Pataisa aptikta!\nŽaidimas įdiegtas: %1\nAr norėtumėte </translation> <translation>PKG ir žaidimo versijos sutampa: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>įdiegti pataisą: %2?</translation> <translation>Ar norite perrašyti?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Žaidimas jau įdiegtas\n%1\nAr norėtumėte perrašyti?</translation> <translation>PKG versija %1 yra senesnė nei įdiegta versija: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Žaidimas įdiegtas: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Ar norite įdiegti atnaujinimą: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>DLC diegimas</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>Ar norite įdiegti DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC jau įdiegtas:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Žaidimas jau įdiegtas</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -566,54 +566,54 @@
<translation>PKG-ekstraksjon</translation> <translation>PKG-ekstraksjon</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Oppdatering oppdaget!\nPKG og spillversjoner stemmer!: %1\nØnsker du å </translation> <translation>Oppdatering oppdaget!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>overskrive?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Oppdatering oppdaget!\nPKG-versjon %1 er eldre </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>enn installert versjon!: %2\nØnsker du å </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>overskrive?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Oppdatering oppdaget!\nSpillet er installert: %1\nØnsker du å </translation> <translation>PKG- og spillversjoner stemmer overens: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>installere oppdateringen: %2?</translation> <translation>Ønsker du å overskrive?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Spill allerede installert\n%1\nØnsker du å overskrive?</translation> <translation>PKG-versjon %1 er eldre enn installert versjon: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Spillet er installert: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Ønsker du å installere oppdateringen: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>DLC-installasjon</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>Ønsker du å installere DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC allerede installert:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Spillet er allerede installert</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -566,54 +566,54 @@
<translation>PKG-extractie</translation> <translation>PKG-extractie</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Patch gedetecteerd!\nPKG en spelversies komen overeen!: %1\nWil je </translation> <translation>Patch gedetecteerd!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>overschrijven?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Patch gedetecteerd!\nPKG-versie %1 is ouder </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>dan de geïnstalleerde versie!: %2\nWil je </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>overschrijven?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Patch gedetecteerd!\nSpel is geïnstalleerd: %1\nWil je </translation> <translation>PKG- en gameversies komen overeen: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>de patch installeren: %2?</translation> <translation>Wilt u overschrijven?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Spel al geïnstalleerd\n%1\nWil je het overschrijven?</translation> <translation>PKG-versie %1 is ouder dan de geïnstalleerde versie: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Game is geïnstalleerd: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Wilt u de patch installeren: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>DLC-installatie</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>Wilt u DLC installeren: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC al geïnstalleerd:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Game al geïnstalleerd</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -566,54 +566,54 @@
<translation>Ekstrakcja PKG</translation> <translation>Ekstrakcja PKG</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Wykryto poprawkę!\nWersje PKG i gry pasują do siebie!: %1\nCzy chcesz </translation> <translation>Wykryto łatkę!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>nadpisać?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Wykryto poprawkę!\nWersja PKG %1 jest starsza </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>niż zainstalowana wersja!: %2\nCzy chcesz </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>nadpisać?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Wykryto poprawkę!\nGra jest zainstalowana: %1\nCzy chcesz </translation> <translation>Wersje PKG i gry zgodne: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>zainstalować poprawkę: %2?</translation> <translation>Czy chcesz nadpisać?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Gra już zainstalowana\n%1\nCzy chcesz nadpisać?</translation> <translation>Wersja PKG %1 jest starsza niż zainstalowana wersja: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Gra jest zainstalowana: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Czy chcesz zainstalować łatkę: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>Instalacja dodadkowej zawartości (DLC)</translation> <translation>Instalacja DLC</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Czy na pewno chcesz zainstalować dodatkową zawartość (DLC): %1?</translation> <translation>Czy chcesz zainstalować DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC już zainstalowane:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Gra już zainstalowana</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -37,7 +37,7 @@
<message> <message>
<location filename="../game_info.cpp" line="26"/> <location filename="../game_info.cpp" line="26"/>
<source>Loading game list, please wait :3</source> <source>Loading game list, please wait :3</source>
<translation>Carregando lista de jogos, por favor aguarde :3</translation> <translation>Carregando a lista de jogos, por favor aguarde :3</translation>
</message> </message>
<message> <message>
<location filename="../game_info.cpp" line="26"/> <location filename="../game_info.cpp" line="26"/>
@ -256,7 +256,7 @@
<message> <message>
<location filename="../main_window_ui.h" line="343"/> <location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source> <source>Download Cheats/Patches</source>
<translation>Baixar Trapaças / Patches</translation> <translation>Baixar Cheats/Patches</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
@ -291,7 +291,7 @@
<message> <message>
<location filename="../main_window_ui.h" line="354"/> <location filename="../main_window_ui.h" line="354"/>
<source>Game List Mode</source> <source>Game List Mode</source>
<translation>Modo de Lista de Jogos</translation> <translation>Modo da Lista de Jogos</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="355"/> <location filename="../main_window_ui.h" line="355"/>
@ -425,7 +425,7 @@
<message> <message>
<location filename="../settings_dialog.ui" line="235"/> <location filename="../settings_dialog.ui" line="235"/>
<source>Log Filter</source> <source>Log Filter</source>
<translation>Filtro</translation> <translation>Filtro do Registro</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
@ -508,12 +508,12 @@
<message> <message>
<location filename="../main_window.cpp" line="326"/> <location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source> <source>Download Cheats For All Installed Games</source>
<translation>Baixar Trapaças para todos os jogos instalados</translation> <translation>Baixar Cheats para Todos os Jogos Instalados</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="328"/> <location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source> <source>Download Patches For All Games</source>
<translation>Baixar Patches para todos os jogos</translation> <translation>Baixar Patches para Todos os Jogos</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="363"/> <location filename="../main_window.cpp" line="363"/>
@ -523,7 +523,7 @@
<message> <message>
<location filename="../main_window.cpp" line="364"/> <location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source> <source>You have downloaded cheats for all the games you have installed.</source>
<translation>Você baixou trapaças para todos os jogos que instalou.</translation> <translation>Você baixou cheats para todos os jogos que instalou.</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="391"/> <location filename="../main_window.cpp" line="391"/>
@ -566,64 +566,64 @@
<translation>Extração de PKG</translation> <translation>Extração de PKG</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Patch detectado!\nVersões PKG e do Jogo correspondem!: %1\nGostaria de </translation> <translation>Atualização detectada!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>substituir?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Patch detectado!\nVersão PKG %1 é mais antiga </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>do que a versão instalada!: %2\nGostaria de </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>substituir?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Patch detectado!\nJogo está instalado: %1\nGostaria de </translation> <translation>As versões do PKG e do Jogo são igual: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>instalar o Patch: %2?</translation> <translation>Gostaria de substituir?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Jogo instalado\n%1\nGostaria de substituir?</translation> <translation>Versão do PKG %1 é mais antiga do que a versão instalada: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Jogo instalado: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Você gostaria de instalar a atualização: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>Instalação de DLC</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>Você gostaria de instalar o DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC instalada:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>O jogo está instalado:</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source> <source>PKG is a patch, please install the game first!</source>
<translation>PKG é um patch, por favor, instale o jogo primeiro!</translation> <translation>O PKG é um patch, por favor, instale o jogo primeiro!</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="681"/> <location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source> <source>PKG ERROR</source>
<translation>ERRO PKG</translation> <translation>ERRO de PKG</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="693"/> <location filename="../main_window.cpp" line="693"/>
@ -651,12 +651,12 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="44"/> <location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source> <source>Cheats / Patches</source>
<translation>Trapaças / Patches</translation> <translation>Cheats / Patches</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="50"/> <location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source> <source>defaultTextEdit_MSG</source>
<translation>Trapaças/Patches são experimentais.\nUse com cautela.\n\nBaixe as trapaças individualmente selecionando o repositório e clicando no botão de download.\nNa aba Patches, você pode baixar todos os Patches de uma vez, escolher qual deseja usar e salvar a opção.\n\nComo não desenvolvemos as Trapaças/Patches,\npor favor, reporte problemas relacionados ao autor da trapaça.\n\nCriou uma nova trapaça? Visite:\nhttps://github.com/shadps4-emu/ps4_cheats</translation> <translation>Cheats/Patches são experimentais.\nUse com cautela.\n\nBaixe os cheats individualmente selecionando o repositório e clicando no botão de download.\nNa aba Patches, você pode baixar todos os Patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos os Cheats/Patches,\npor favor, reporte problemas relacionados ao autor do cheat.\n\nCriou um novo cheat? Visite:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="69"/> <location filename="../cheats_patches.cpp" line="69"/>
@ -666,7 +666,7 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="79"/> <location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source> <source>Serial: </source>
<translation>Série: </translation> <translation>Serial: </translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="83"/> <location filename="../cheats_patches.cpp" line="83"/>
@ -681,7 +681,7 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="126"/> <location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source> <source>Select Cheat File:</source>
<translation>Selecione o Arquivo de Trapaça:</translation> <translation>Selecione o Arquivo de Cheat:</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="133"/> <location filename="../cheats_patches.cpp" line="133"/>
@ -691,7 +691,7 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="149"/> <location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source> <source>Download Cheats</source>
<translation>Baixar Trapaças</translation> <translation>Baixar Cheats</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="155"/> <location filename="../cheats_patches.cpp" line="155"/>
@ -706,7 +706,7 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="170"/> <location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source> <source>You can delete the cheats you don't want after downloading them.</source>
<translation>Você pode excluir as trapaças que não deseja após baixá-las.</translation> <translation>Você pode excluir os cheats que não deseja após baixá-las.</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="178"/> <location filename="../cheats_patches.cpp" line="178"/>
@ -731,7 +731,7 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="256"/> <location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source> <source>Cheats</source>
<translation>Trapaças</translation> <translation>Cheats</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="257"/> <location filename="../cheats_patches.cpp" line="257"/>
@ -756,7 +756,7 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="316"/> <location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source> <source>No patch file found for the current serial.</source>
<translation>Nenhum arquivo de patch encontrado para a série atual.</translation> <translation>Nenhum arquivo de patch encontrado para o serial atual.</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="323"/> <location filename="../cheats_patches.cpp" line="323"/>
@ -816,22 +816,22 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="556"/> <location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source> <source>Cheats Not Found</source>
<translation>Trapaças Não Encontradas</translation> <translation>Cheats Não Encontrados</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="556"/> <location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source> <source>CheatsNotFound_MSG</source>
<translation>Nenhuma trapaça encontrada para este jogo nesta versão do repositório selecionado, tente outro repositório ou uma versão diferente do jogo.</translation> <translation>Nenhum cheat encontrado para este jogo nesta versão do repositório selecionado, tente outro repositório ou uma versão diferente do jogo.</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="593"/> <location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source> <source>Cheats Downloaded Successfully</source>
<translation>Trapaças Baixadas com Sucesso</translation> <translation>Cheats Baixados com Sucesso</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="594"/> <location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source> <source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Você baixou as trapaças com sucesso. Para esta versão do jogo a partir do repositório selecionado.Você pode tentar baixar de outro repositório, se estiver disponível, também será possível usá-lo selecionando o arquivo da lista.</translation> <translation>Você baixou os cheats com sucesso. Para esta versão do jogo a partir do repositório selecionado. Você pode tentar baixar de outro repositório, se estiver disponível, também será possível usá-lo selecionando o arquivo da lista.</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="747"/> <location filename="../cheats_patches.cpp" line="747"/>
@ -851,7 +851,7 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="763"/> <location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source> <source>DownloadComplete_MSG</source>
<translation>Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece com as Trapaças.</translation> <translation>Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece com os Cheats.</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="773"/> <location filename="../cheats_patches.cpp" line="773"/>
@ -871,7 +871,7 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="819"/> <location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source> <source>XML ERROR:</source>
<translation>ERRO XML:</translation> <translation>ERRO de XML:</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="826"/> <location filename="../cheats_patches.cpp" line="826"/>
@ -886,7 +886,7 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="997"/> <location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source> <source>Directory does not exist:</source>
<translation>Diretório não existe:</translation> <translation>O Diretório não existe:</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="1006"/> <location filename="../cheats_patches.cpp" line="1006"/>

View File

@ -566,54 +566,54 @@
<translation>Extracție PKG</translation> <translation>Extracție PKG</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Patch detectat!\nVersiunile PKG și Joc se potrivesc!: %1\nAi dori </translation> <translation>Patch detectat!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation> suprascrii?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Patch detectat!\nVersiunea PKG %1 este mai veche </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>decât versiunea instalată!: %2\nAi dori </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation> suprascrii?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Patch detectat!\nJocul este instalat: %1\nAi dori </translation> <translation>Versiunile PKG și ale jocului sunt compatibile: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation> instalezi Patch-ul: %2?</translation> <translation>Doriți suprascrieți?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Jocul este deja instalat\n%1\nAi dori suprascrii?</translation> <translation>Versiunea PKG %1 este mai veche decât versiunea instalată: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Jocul este instalat: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Doriți instalați patch-ul: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>Instalare DLC</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>Doriți instalați DLC-ul: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC deja instalat:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Jocul deja instalat</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -93,7 +93,7 @@
<message> <message>
<location filename="../gui_context_menus.h" line="48"/> <location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source> <source>Cheats / Patches</source>
<translation>Читы / Патчи</translation> <translation>Читы и патчи</translation>
</message> </message>
<message> <message>
<location filename="../gui_context_menus.h" line="49"/> <location filename="../gui_context_menus.h" line="49"/>
@ -256,7 +256,7 @@
<message> <message>
<location filename="../main_window_ui.h" line="343"/> <location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source> <source>Download Cheats/Patches</source>
<translation>Скачать Читы / Патчи</translation> <translation>Скачать читы или патчи</translation>
</message> </message>
<message> <message>
<location filename="../main_window_ui.h" line="345"/> <location filename="../main_window_ui.h" line="345"/>
@ -566,54 +566,54 @@
<translation>Извлечение PKG</translation> <translation>Извлечение PKG</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Обнаружен патч!\nВерсии PKG и игры совпадают!: %1\nХотите </translation> <translation>Обнаружен патч!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>перезаписать?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Обнаружен патч!\nВерсия PKG %1 устарела </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>по сравнению с установленной версией!: %2\nХотите </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>перезаписать?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Обнаружен патч!\гра установлена: %1\nХотите </translation> <translation>Версии PKG и игры совпадают: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>установить патч: %2?</translation> <translation>Хотите перезаписать?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Игра уже установлена\n%1\nХотите перезаписать?</translation> <translation>Версия PKG %1 старее установленной версии: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Игра установлена: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Хотите установить патч: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>Установка DLC</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>Вы хотите установить DLC: %1??</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC уже установлен:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Игра уже установлена</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
@ -638,7 +638,7 @@
<message> <message>
<location filename="../main_window.cpp" line="704"/> <location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source> <source>Game successfully installed at %1</source>
<translation>Игра успешно установлена по адресу %1</translation> <translation>Игра успешно установлена в %1</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="725"/> <location filename="../main_window.cpp" line="725"/>
@ -651,12 +651,12 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="44"/> <location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source> <source>Cheats / Patches</source>
<translation>Читы / Патчи</translation> <translation>Читы и патчи</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="50"/> <location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source> <source>defaultTextEdit_MSG</source>
<translation>Cheats/Patches sunt experimentale.\nUtilizați cu prudență.\n\nDescărcați cheats individual prin selectarea depozitului și făcând clic pe butonul de descărcare.\nÎn fila Patches, puteți descărca toate patch-urile deodată, alege pe cele pe care doriți le utilizați și salvați selecția.\n\nDeoarece nu dezvoltăm Cheats/Patches,\nte rugăm raportezi problemele autorului cheat-ului.\n\nAi creat un nou cheat? Vizitează:\nhttps://github.com/shadps4-emu/ps4_cheats</translation> <translation>Читы и патчи экспериментальны.\спользуйте с осторожностью.\n\nСкачивайте читы, выбрав репозиторий и нажав на кнопку загрузки.\nВо вкладке "Патчи" вы можете скачать все патчи сразу, выбирать какие вы хотите использовать, и сохранять выбор.\n\оскольку мы не разрабатываем читы/патчи,\nпожалуйста сообщайте о проблемах автору чита/патча.\n\nСоздали новый чит? Посетите:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="69"/> <location filename="../cheats_patches.cpp" line="69"/>

View File

@ -566,54 +566,54 @@
<translation>PKG Çıkartma</translation> <translation>PKG Çıkartma</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Yama tespit edildi!\nPKG ve Oyun sürümleri uyuyor!: %1\nÜzerine yazmak ister misiniz?</translation> <translation>Yamanın tespit edildi!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>üzerine yazmak?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Yama tespit edildi!\nPKG Sürümü %1 daha eski </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>yüklü sürümden!: %2\nÜzerine yazmak ister misiniz?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>üzerine yazmak?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Yama tespit edildi!\nOyun yüklü: %1\nÜzerine yazmak ister misiniz?</translation> <translation>PKG ve oyun sürümleri uyumlu: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>Yamayı kurmak ister misiniz: %2?</translation> <translation>Üzerine yazmak ister misiniz?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Oyun zaten yüklü\n%1\nÜzerine yazmak ister misiniz?</translation> <translation>PKG Sürümü %1, kurulu sürümden daha eski: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Oyun yüklendi: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Yamanın yüklenmesini ister misiniz: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>DLC Yükleme</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>DLC'yi yüklemek ister misiniz: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC zaten yüklü:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Oyun zaten yüklü</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -566,54 +566,54 @@
<translation>Giải nén PKG</translation> <translation>Giải nén PKG</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>Đã phát hiện bản !\nPhiên bản PKG trò chơi khớp!: %1\nBạn muốn </translation> <translation>Đã phát hiện bản !</translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation>ghi đè không?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>Đã phát hiện bản !\nPhiên bản PKG %1 hơn </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>so với phiên bản đã cài đt!: %2\nBạn muốn </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation>ghi đè không?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>Đã phát hiện bản !\nTrò chơi đã đưc cài đt: %1\nBạn muốn </translation> <translation>Các phiên bản PKG trò chơi khớp nhau: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>cài đt bản : %2?</translation> <translation>Bạn muốn ghi đè không?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>Trò chơi đã đưc cài đt\n%1\nBạn muốn ghi đè không?</translation> <translation>Phiên bản PKG %1 hơn phiên bản đã cài đt: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>Trò chơi đã đưc cài đt: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>Bạn muốn cài đt bản : </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>Cài đt DLC</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation>Bạn muốn cài đt DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC đã đưc cài đt:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>Trò chơi đã đưc cài đt</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -566,54 +566,54 @@
<translation>PKG </translation> <translation>PKG </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>\nPKG %1\n您想要 </translation> <translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>\nPKG %1 </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>%2\n您想要 </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation></translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>\n游戏已安装%1\n您想要 </translation> <translation>PKG : </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>%2</translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>\n%1\n您想要覆盖吗</translation> <translation>PKG %1 : </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>DLC </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation> DLC: %1 </translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC :</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation></translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -566,54 +566,54 @@
<translation>PKG </translation> <translation>PKG </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="633"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nPKG and Game versions match!: %1\nWould you like </source> <source>Patch detected!</source>
<translation>\nPKG : %1\n您是否希望 </translation> <translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="634"/>
<source>to overwrite?</source>
<translation></translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>Patch detected!\nPKG Version %1 is older </source>
<translation>\nPKG %1 </translation>
</message>
<message>
<location filename="../main_window.cpp" line="640"/>
<source>than installed version!: %2\nWould you like </source>
<translation>: %2\n您是否希望 </translation>
</message>
<message>
<location filename="../main_window.cpp" line="641"/>
<source>to overwrite?</source>
<translation></translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>Patch detected!\nGame is installed: %1\nWould you like </source> <source>PKG and Game versions match: </source>
<translation>\n遊戲已安裝: %1\n您是否希望 </translation> <translation>PKG : </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
<source>to install Patch: %2?</source> <source>Would you like to overwrite?</source>
<translation>: %2</translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="659"/> <location filename="../main_window.cpp" line="639"/>
<source>Game already installed\n%1\nWould you like to overwrite?</source> <source>PKG Version %1 is older than installed version: </source>
<translation>\n%1\n您是否希望覆蓋</translation> <translation>PKG %1 : </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source>
<translation>: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source>
<translation>: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source> <source>DLC Installation</source>
<translation>DLC Installation</translation> <translation>DLC </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Would you like to install DLC: %1?</translation> <translation> DLC: %1 </translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation>DLC :</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation></translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>

View File

@ -187,6 +187,7 @@ void DefineEntryPoint(const IR::Program& program, EmitContext& ctx, Id main) {
ctx.AddCapability(spv::Capability::Int64); ctx.AddCapability(spv::Capability::Int64);
if (info.has_storage_images || info.has_image_buffers) { if (info.has_storage_images || info.has_image_buffers) {
ctx.AddCapability(spv::Capability::StorageImageExtendedFormats); ctx.AddCapability(spv::Capability::StorageImageExtendedFormats);
ctx.AddCapability(spv::Capability::StorageImageReadWithoutFormat);
ctx.AddCapability(spv::Capability::StorageImageWriteWithoutFormat); ctx.AddCapability(spv::Capability::StorageImageWriteWithoutFormat);
} }
if (info.has_texel_buffers) { if (info.has_texel_buffers) {

View File

@ -266,7 +266,8 @@ Id EmitLoadBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id addr
const auto& buffer = ctx.texture_buffers[handle]; const auto& buffer = ctx.texture_buffers[handle];
const Id tex_buffer = ctx.OpLoad(buffer.image_type, buffer.id); const Id tex_buffer = ctx.OpLoad(buffer.image_type, buffer.id);
const Id coord = ctx.OpIAdd(ctx.U32[1], address, buffer.coord_offset); const Id coord = ctx.OpIAdd(ctx.U32[1], address, buffer.coord_offset);
Id texel = ctx.OpImageFetch(buffer.result_type, tex_buffer, coord); Id texel = buffer.is_storage ? ctx.OpImageRead(buffer.result_type, tex_buffer, coord)
: ctx.OpImageFetch(buffer.result_type, tex_buffer, coord);
if (buffer.is_integer) { if (buffer.is_integer) {
texel = ctx.OpBitcast(ctx.F32[4], texel); texel = ctx.OpBitcast(ctx.F32[4], texel);
} }

View File

@ -406,6 +406,7 @@ void EmitContext::DefineTextureBuffers() {
.image_type = image_type, .image_type = image_type,
.result_type = sampled_type[4], .result_type = sampled_type[4],
.is_integer = is_integer, .is_integer = is_integer,
.is_storage = desc.is_written,
}); });
interfaces.push_back(id); interfaces.push_back(id);
} }

View File

@ -215,6 +215,7 @@ public:
Id image_type; Id image_type;
Id result_type; Id result_type;
bool is_integer; bool is_integer;
bool is_storage;
}; };
u32& binding; u32& binding;

View File

@ -31,6 +31,8 @@ void Translator::EmitScalarAlu(const GcnInst& inst) {
return S_OR_B64(NegateMode::Result, false, inst); return S_OR_B64(NegateMode::Result, false, inst);
case Opcode::S_XOR_B64: case Opcode::S_XOR_B64:
return S_OR_B64(NegateMode::None, true, inst); return S_OR_B64(NegateMode::None, true, inst);
case Opcode::S_XNOR_B64:
return S_OR_B64(NegateMode::Result, true, inst);
case Opcode::S_ORN2_B64: case Opcode::S_ORN2_B64:
return S_OR_B64(NegateMode::Src1, false, inst); return S_OR_B64(NegateMode::Src1, false, inst);
case Opcode::S_AND_B64: case Opcode::S_AND_B64:

View File

@ -436,6 +436,7 @@ void Translator::EmitFlowControl(u32 pc, const GcnInst& inst) {
case Opcode::S_CBRANCH_SCC1: case Opcode::S_CBRANCH_SCC1:
case Opcode::S_CBRANCH_VCCNZ: case Opcode::S_CBRANCH_VCCNZ:
case Opcode::S_CBRANCH_VCCZ: case Opcode::S_CBRANCH_VCCZ:
case Opcode::S_CBRANCH_EXECNZ:
case Opcode::S_BRANCH: case Opcode::S_BRANCH:
return; return;
default: default:

View File

@ -368,6 +368,36 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
} }
break; break;
} }
case PM4ItOpcode::DrawIndirect: {
const auto* draw_indirect = reinterpret_cast<const PM4CmdDrawIndirect*>(header);
const auto offset = draw_indirect->data_offset;
const auto ib_address = mapped_queues[GfxQueueId].indirect_args_addr;
const auto size = sizeof(PM4CmdDrawIndirect::DrawInstancedArgs);
if (rasterizer) {
const auto cmd_address = reinterpret_cast<const void*>(header);
rasterizer->ScopeMarkerBegin(fmt::format("dcb:{}:DrawIndirect", cmd_address));
rasterizer->Breadcrumb(u64(cmd_address));
rasterizer->DrawIndirect(false, ib_address, offset, size);
rasterizer->ScopeMarkerEnd();
}
break;
}
case PM4ItOpcode::DrawIndexIndirect: {
const auto* draw_index_indirect =
reinterpret_cast<const PM4CmdDrawIndexIndirect*>(header);
const auto offset = draw_index_indirect->data_offset;
const auto ib_address = mapped_queues[GfxQueueId].indirect_args_addr;
const auto size = sizeof(PM4CmdDrawIndexIndirect::DrawIndexInstancedArgs);
if (rasterizer) {
const auto cmd_address = reinterpret_cast<const void*>(header);
rasterizer->ScopeMarkerBegin(
fmt::format("dcb:{}:DrawIndexIndirect", cmd_address));
rasterizer->Breadcrumb(u64(cmd_address));
rasterizer->DrawIndirect(true, ib_address, offset, size);
rasterizer->ScopeMarkerEnd();
}
break;
}
case PM4ItOpcode::DispatchDirect: { case PM4ItOpcode::DispatchDirect: {
const auto* dispatch_direct = reinterpret_cast<const PM4CmdDispatchDirect*>(header); const auto* dispatch_direct = reinterpret_cast<const PM4CmdDispatchDirect*>(header);
regs.cs_program.dim_x = dispatch_direct->dim_x; regs.cs_program.dim_x = dispatch_direct->dim_x;
@ -488,6 +518,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
break; break;
} }
case PM4ItOpcode::PfpSyncMe: { case PM4ItOpcode::PfpSyncMe: {
rasterizer->CpSync();
break; break;
} }
default: default:

View File

@ -253,20 +253,6 @@ struct PM4CmdDrawIndexAuto {
u32 draw_initiator; u32 draw_initiator;
}; };
struct PM4CmdDrawIndirect {
PM4Type3Header header; ///< header
u32 data_offset; ///< DWORD aligned offset
union {
u32 dw2;
BitField<0, 16, u32> base_vtx_loc; ///< base vertex location
};
union {
u32 dw3;
BitField<0, 16, u32> start_inst_loc; ///< start instance location
};
u32 draw_initiator; ///< Draw Initiator Register
};
enum class DataSelect : u32 { enum class DataSelect : u32 {
None = 0, None = 0,
Data32Low = 1, Data32Low = 1,
@ -740,4 +726,51 @@ struct PM4CmdDispatchIndirect {
u32 dispatch_initiator; ///< Dispatch Initiator Register u32 dispatch_initiator; ///< Dispatch Initiator Register
}; };
struct PM4CmdDrawIndirect {
struct DrawInstancedArgs {
u32 vertex_count_per_instance;
u32 instance_count;
u32 start_vertex_location;
u32 start_instance_location;
};
PM4Type3Header header; ///< header
u32 data_offset; ///< Byte aligned offset where the required data structure starts
union {
u32 dw2;
BitField<0, 16, u32> base_vtx_loc; ///< Offset where the CP will write the
///< BaseVertexLocation it fetched from memory
};
union {
u32 dw3;
BitField<0, 16, u32> start_inst_loc; ///< Offset where the CP will write the
///< StartInstanceLocation it fetched from memory
};
u32 draw_initiator; ///< Draw Initiator Register
};
struct PM4CmdDrawIndexIndirect {
struct DrawIndexInstancedArgs {
u32 index_count_per_instance;
u32 instance_count;
u32 start_index_location;
u32 base_vertex_location;
u32 start_instance_location;
};
PM4Type3Header header; ///< header
u32 data_offset; ///< Byte aligned offset where the required data structure starts
union {
u32 dw2;
BitField<0, 16, u32> base_vtx_loc; ///< Offset where the CP will write the
///< BaseVertexLocation it fetched from memory
};
union { // NOTE: this one is undocumented in AMD spec, but Gnm driver writes this field
u32 dw3;
BitField<0, 16, u32> start_inst_loc; ///< Offset where the CP will write the
///< StartInstanceLocation it fetched from memory
};
u32 draw_initiator; ///< Draw Initiator Register
};
} // namespace AmdGpu } // namespace AmdGpu

View File

@ -119,7 +119,7 @@ vk::BufferView Buffer::View(u32 offset, u32 size, bool is_written, AmdGpu::DataF
dfmt == view.dfmt && nfmt == view.nfmt; dfmt == view.dfmt && nfmt == view.nfmt;
})}; })};
if (it != views.end()) { if (it != views.end()) {
return it->handle; return *it->handle;
} }
const vk::BufferUsageFlags2CreateInfoKHR usage_flags = { const vk::BufferUsageFlags2CreateInfoKHR usage_flags = {
.usage = is_written ? vk::BufferUsageFlagBits2KHR::eStorageTexelBuffer .usage = is_written ? vk::BufferUsageFlagBits2KHR::eStorageTexelBuffer
@ -138,9 +138,9 @@ vk::BufferView Buffer::View(u32 offset, u32 size, bool is_written, AmdGpu::DataF
.is_written = is_written, .is_written = is_written,
.dfmt = dfmt, .dfmt = dfmt,
.nfmt = nfmt, .nfmt = nfmt,
.handle = instance->GetDevice().createBufferView(view_ci), .handle = instance->GetDevice().createBufferViewUnique(view_ci),
}); });
return views.back().handle; return *views.back().handle;
} }
constexpr u64 WATCHES_INITIAL_RESERVE = 0x4000; constexpr u64 WATCHES_INITIAL_RESERVE = 0x4000;

View File

@ -134,7 +134,7 @@ public:
bool is_written; bool is_written;
AmdGpu::DataFormat dfmt; AmdGpu::DataFormat dfmt;
AmdGpu::NumberFormat nfmt; AmdGpu::NumberFormat nfmt;
vk::BufferView handle; vk::UniqueBufferView handle;
}; };
std::vector<BufferView> views; std::vector<BufferView> views;
}; };

View File

@ -228,11 +228,12 @@ u32 BufferCache::BindIndexBuffer(bool& is_indexed, u32 index_offset) {
return regs.num_indices; return regs.num_indices;
} }
std::pair<Buffer*, u32> BufferCache::ObtainBuffer(VAddr device_addr, u32 size, bool is_written) { std::pair<Buffer*, u32> BufferCache::ObtainBuffer(VAddr device_addr, u32 size, bool is_written,
bool is_texel_buffer) {
std::scoped_lock lk{mutex}; std::scoped_lock lk{mutex};
static constexpr u64 StreamThreshold = CACHING_PAGESIZE; static constexpr u64 StreamThreshold = CACHING_PAGESIZE;
const bool is_gpu_dirty = memory_tracker.IsRegionGpuModified(device_addr, size); const bool is_gpu_dirty = memory_tracker.IsRegionGpuModified(device_addr, size);
if (!is_written && size < StreamThreshold && !is_gpu_dirty) { if (!is_written && !is_texel_buffer && size <= StreamThreshold && !is_gpu_dirty) {
// For small uniform buffers that have not been modified by gpu // For small uniform buffers that have not been modified by gpu
// use device local stream buffer to reduce renderpass breaks. // use device local stream buffer to reduce renderpass breaks.
const u64 offset = stream_buffer.Copy(device_addr, size, instance.UniformMinAlignment()); const u64 offset = stream_buffer.Copy(device_addr, size, instance.UniformMinAlignment());

View File

@ -66,7 +66,8 @@ public:
u32 BindIndexBuffer(bool& is_indexed, u32 index_offset); u32 BindIndexBuffer(bool& is_indexed, u32 index_offset);
/// Obtains a buffer for the specified region. /// Obtains a buffer for the specified region.
[[nodiscard]] std::pair<Buffer*, u32> ObtainBuffer(VAddr gpu_addr, u32 size, bool is_written); [[nodiscard]] std::pair<Buffer*, u32> ObtainBuffer(VAddr gpu_addr, u32 size, bool is_written,
bool is_texel_buffer = false);
/// Obtains a temporary buffer for usage in texture cache. /// Obtains a temporary buffer for usage in texture cache.
[[nodiscard]] std::pair<const Buffer*, u32> ObtainTempBuffer(VAddr gpu_addr, u32 size); [[nodiscard]] std::pair<const Buffer*, u32> ObtainTempBuffer(VAddr gpu_addr, u32 size);

View File

@ -287,8 +287,8 @@ vk::BorderColor BorderColor(AmdGpu::BorderColor color) {
std::span<const vk::Format> GetAllFormats() { std::span<const vk::Format> GetAllFormats() {
static constexpr std::array formats{ static constexpr std::array formats{
vk::Format::eA2B10G10R10SnormPack32,
vk::Format::eA2B10G10R10UnormPack32, vk::Format::eA2B10G10R10UnormPack32,
vk::Format::eA2R10G10B10SnormPack32,
vk::Format::eA2R10G10B10UnormPack32, vk::Format::eA2R10G10B10UnormPack32,
vk::Format::eB5G6R5UnormPack16, vk::Format::eB5G6R5UnormPack16,
vk::Format::eB8G8R8A8Srgb, vk::Format::eB8G8R8A8Srgb,
@ -424,6 +424,10 @@ vk::Format SurfaceFormat(AmdGpu::DataFormat data_format, AmdGpu::NumberFormat nu
num_format == AmdGpu::NumberFormat::Unorm) { num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eA2B10G10R10UnormPack32; return vk::Format::eA2B10G10R10UnormPack32;
} }
if (data_format == AmdGpu::DataFormat::Format2_10_10_10 &&
num_format == AmdGpu::NumberFormat::Snorm) {
return vk::Format::eA2B10G10R10SnormPack32;
}
if (data_format == AmdGpu::DataFormat::FormatBc7 && num_format == AmdGpu::NumberFormat::Srgb) { if (data_format == AmdGpu::DataFormat::FormatBc7 && num_format == AmdGpu::NumberFormat::Srgb) {
return vk::Format::eBc7SrgbBlock; return vk::Format::eBc7SrgbBlock;
} }
@ -472,14 +476,6 @@ vk::Format SurfaceFormat(AmdGpu::DataFormat data_format, AmdGpu::NumberFormat nu
num_format == AmdGpu::NumberFormat::Snorm) { num_format == AmdGpu::NumberFormat::Snorm) {
return vk::Format::eR16G16Snorm; return vk::Format::eR16G16Snorm;
} }
if (data_format == AmdGpu::DataFormat::Format2_10_10_10 &&
num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eA2R10G10B10UnormPack32;
}
if (data_format == AmdGpu::DataFormat::Format2_10_10_10 &&
num_format == AmdGpu::NumberFormat::Snorm) {
return vk::Format::eA2R10G10B10SnormPack32;
}
if (data_format == AmdGpu::DataFormat::Format10_11_11 && if (data_format == AmdGpu::DataFormat::Format10_11_11 &&
num_format == AmdGpu::NumberFormat::Float) { num_format == AmdGpu::NumberFormat::Float) {
return vk::Format::eB10G11R11UfloatPack32; return vk::Format::eB10G11R11UfloatPack32;

View File

@ -127,7 +127,7 @@ bool ComputePipeline::BindResources(VideoCore::BufferCache& buffer_cache,
} }
const u32 size = vsharp.GetSize(); const u32 size = vsharp.GetSize();
if (desc.is_written) { if (desc.is_written) {
texture_cache.InvalidateMemory(address, size, true); texture_cache.InvalidateMemory(address, size);
} }
const u32 alignment = const u32 alignment =
is_storage ? instance.StorageMinAlignment() : instance.UniformMinAlignment(); is_storage ? instance.StorageMinAlignment() : instance.UniformMinAlignment();
@ -167,11 +167,11 @@ bool ComputePipeline::BindResources(VideoCore::BufferCache& buffer_cache,
} }
} }
if (desc.is_written) { if (desc.is_written) {
texture_cache.InvalidateMemory(address, size, true); texture_cache.InvalidateMemory(address, size);
} }
const u32 alignment = instance.TexelBufferMinAlignment(); const u32 alignment = instance.TexelBufferMinAlignment();
const auto [vk_buffer, offset] = const auto [vk_buffer, offset] =
buffer_cache.ObtainBuffer(address, size, desc.is_written); buffer_cache.ObtainBuffer(address, size, desc.is_written, true);
const u32 fmt_stride = AmdGpu::NumBits(vsharp.GetDataFmt()) >> 3; const u32 fmt_stride = AmdGpu::NumBits(vsharp.GetDataFmt()) >> 3;
ASSERT_MSG(fmt_stride == vsharp.GetStride(), ASSERT_MSG(fmt_stride == vsharp.GetStride(),
"Texel buffer stride must match format stride"); "Texel buffer stride must match format stride");

View File

@ -322,7 +322,7 @@ void GraphicsPipeline::BuildDescSetLayout() {
.descriptorType = tex_buffer.is_written ? vk::DescriptorType::eStorageTexelBuffer .descriptorType = tex_buffer.is_written ? vk::DescriptorType::eStorageTexelBuffer
: vk::DescriptorType::eUniformTexelBuffer, : vk::DescriptorType::eUniformTexelBuffer,
.descriptorCount = 1, .descriptorCount = 1,
.stageFlags = vk::ShaderStageFlagBits::eCompute, .stageFlags = vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment,
}); });
} }
for (const auto& image : stage->images) { for (const auto& image : stage->images) {
@ -412,7 +412,7 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs,
const u32 size = vsharp.GetSize(); const u32 size = vsharp.GetSize();
const u32 alignment = instance.TexelBufferMinAlignment(); const u32 alignment = instance.TexelBufferMinAlignment();
const auto [vk_buffer, offset] = const auto [vk_buffer, offset] =
buffer_cache.ObtainBuffer(address, size, tex_buffer.is_written); buffer_cache.ObtainBuffer(address, size, tex_buffer.is_written, true);
const u32 fmt_stride = AmdGpu::NumBits(vsharp.GetDataFmt()) >> 3; const u32 fmt_stride = AmdGpu::NumBits(vsharp.GetDataFmt()) >> 3;
ASSERT_MSG(fmt_stride == vsharp.GetStride(), ASSERT_MSG(fmt_stride == vsharp.GetStride(),
"Texel buffer stride must match format stride"); "Texel buffer stride must match format stride");
@ -422,7 +422,7 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs,
ASSERT(adjust % fmt_stride == 0); ASSERT(adjust % fmt_stride == 0);
push_data.AddOffset(binding, adjust / fmt_stride); push_data.AddOffset(binding, adjust / fmt_stride);
} }
buffer_view = vk_buffer->View(offset, size + adjust, tex_buffer.is_written, buffer_view = vk_buffer->View(offset_aligned, size + adjust, tex_buffer.is_written,
vsharp.GetDataFmt(), vsharp.GetNumberFmt()); vsharp.GetDataFmt(), vsharp.GetNumberFmt());
} }
set_writes.push_back({ set_writes.push_back({

View File

@ -220,12 +220,12 @@ bool Instance::CreateDevice() {
const bool maintenance5 = add_extension(VK_KHR_MAINTENANCE_5_EXTENSION_NAME); const bool maintenance5 = add_extension(VK_KHR_MAINTENANCE_5_EXTENSION_NAME);
add_extension(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME); add_extension(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
add_extension(VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME); add_extension(VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME);
const bool has_sync2 = add_extension(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
if (Config::isMarkersEnabled()) {
const bool has_sync2 = add_extension(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
if (has_sync2) { if (has_sync2) {
has_nv_checkpoints = Config::isMarkersEnabled() has_nv_checkpoints = add_extension(VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME);
? add_extension(VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME) }
: false;
} }
#ifdef __APPLE__ #ifdef __APPLE__

View File

@ -38,7 +38,9 @@ const GraphicsPipeline* PipelineCache::GetGraphicsPipeline() {
LOG_TRACE(Render_Vulkan, "FMask decompression pass skipped"); LOG_TRACE(Render_Vulkan, "FMask decompression pass skipped");
return nullptr; return nullptr;
} }
RefreshGraphicsKey(); if (!RefreshGraphicsKey()) {
return nullptr;
}
const auto [it, is_new] = graphics_pipelines.try_emplace(graphics_key); const auto [it, is_new] = graphics_pipelines.try_emplace(graphics_key);
if (is_new) { if (is_new) {
it.value() = std::make_unique<GraphicsPipeline>(instance, scheduler, graphics_key, it.value() = std::make_unique<GraphicsPipeline>(instance, scheduler, graphics_key,
@ -49,7 +51,9 @@ const GraphicsPipeline* PipelineCache::GetGraphicsPipeline() {
} }
const ComputePipeline* PipelineCache::GetComputePipeline() { const ComputePipeline* PipelineCache::GetComputePipeline() {
RefreshComputeKey(); if (!RefreshComputeKey()) {
return nullptr;
}
const auto [it, is_new] = compute_pipelines.try_emplace(compute_key); const auto [it, is_new] = compute_pipelines.try_emplace(compute_key);
if (is_new) { if (is_new) {
it.value() = std::make_unique<ComputePipeline>(instance, scheduler, *pipeline_cache, it.value() = std::make_unique<ComputePipeline>(instance, scheduler, *pipeline_cache,
@ -59,7 +63,16 @@ const ComputePipeline* PipelineCache::GetComputePipeline() {
return pipeline; return pipeline;
} }
void PipelineCache::RefreshGraphicsKey() { bool ShouldSkipShader(u64 shader_hash, const char* shader_type) {
static constexpr std::array<u64, 0> skip_hashes = {};
if (std::ranges::contains(skip_hashes, shader_hash)) {
LOG_WARNING(Render_Vulkan, "Skipped {} shader hash {:#x}.", shader_type, shader_hash);
return true;
}
return false;
}
bool PipelineCache::RefreshGraphicsKey() {
auto& regs = liverpool->regs; auto& regs = liverpool->regs;
auto& key = graphics_key; auto& key = graphics_key;
@ -160,18 +173,26 @@ void PipelineCache::RefreshGraphicsKey() {
infos[i] = nullptr; infos[i] = nullptr;
continue; continue;
} }
if (ShouldSkipShader(bininfo->shader_hash, "graphics")) {
return false;
}
const auto stage = Shader::Stage{i}; const auto stage = Shader::Stage{i};
const GuestProgram guest_pgm{pgm, stage}; const GuestProgram guest_pgm{pgm, stage};
std::tie(infos[i], modules[i], key.stage_hashes[i]) = std::tie(infos[i], modules[i], key.stage_hashes[i]) =
shader_cache->GetProgram(guest_pgm, binding); shader_cache->GetProgram(guest_pgm, binding);
} }
return true;
} }
void PipelineCache::RefreshComputeKey() { bool PipelineCache::RefreshComputeKey() {
u32 binding{}; u32 binding{};
const auto* cs_pgm = &liverpool->regs.cs_program; const auto* cs_pgm = &liverpool->regs.cs_program;
const GuestProgram guest_pgm{cs_pgm, Shader::Stage::Compute}; const GuestProgram guest_pgm{cs_pgm, Shader::Stage::Compute};
if (ShouldSkipShader(guest_pgm.hash, "compute")) {
return false;
}
std::tie(infos[0], modules[0], compute_key) = shader_cache->GetProgram(guest_pgm, binding); std::tie(infos[0], modules[0], compute_key) = shader_cache->GetProgram(guest_pgm, binding);
return true;
} }
} // namespace Vulkan } // namespace Vulkan

View File

@ -30,8 +30,8 @@ public:
const ComputePipeline* GetComputePipeline(); const ComputePipeline* GetComputePipeline();
private: private:
void RefreshGraphicsKey(); bool RefreshGraphicsKey();
void RefreshComputeKey(); bool RefreshComputeKey();
private: private:
const Instance& instance; const Instance& instance;

View File

@ -29,6 +29,19 @@ Rasterizer::Rasterizer(const Instance& instance_, Scheduler& scheduler_,
Rasterizer::~Rasterizer() = default; Rasterizer::~Rasterizer() = default;
void Rasterizer::CpSync() {
scheduler.EndRendering();
auto cmdbuf = scheduler.CommandBuffer();
const vk::MemoryBarrier ib_barrier{
.srcAccessMask = vk::AccessFlagBits::eShaderWrite,
.dstAccessMask = vk::AccessFlagBits::eIndirectCommandRead,
};
cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eComputeShader,
vk::PipelineStageFlagBits::eDrawIndirect,
vk::DependencyFlagBits::eByRegion, ib_barrier, {}, {});
}
void Rasterizer::Draw(bool is_indexed, u32 index_offset) { void Rasterizer::Draw(bool is_indexed, u32 index_offset) {
RENDERER_TRACE; RENDERER_TRACE;
@ -66,6 +79,45 @@ void Rasterizer::Draw(bool is_indexed, u32 index_offset) {
} }
} }
void Rasterizer::DrawIndirect(bool is_indexed, VAddr address, u32 offset, u32 size) {
RENDERER_TRACE;
const auto cmdbuf = scheduler.CommandBuffer();
const auto& regs = liverpool->regs;
const GraphicsPipeline* pipeline = pipeline_cache.GetGraphicsPipeline();
if (!pipeline) {
return;
}
ASSERT_MSG(regs.primitive_type != AmdGpu::Liverpool::PrimitiveType::RectList,
"Unsupported primitive type for indirect draw");
try {
pipeline->BindResources(regs, buffer_cache, texture_cache);
} catch (...) {
UNREACHABLE();
}
const auto& vs_info = pipeline->GetStage(Shader::Stage::Vertex);
buffer_cache.BindVertexBuffers(vs_info);
const u32 num_indices = buffer_cache.BindIndexBuffer(is_indexed, 0);
BeginRendering();
UpdateDynamicState(*pipeline);
const auto [buffer, base] = buffer_cache.ObtainBuffer(address, size, true);
const auto total_offset = base + offset;
// We can safely ignore both SGPR UD indices and results of fetch shader parsing, as vertex and
// instance offsets will be automatically applied by Vulkan from indirect args buffer.
if (is_indexed) {
cmdbuf.drawIndexedIndirect(buffer->Handle(), total_offset, 1, 0);
} else {
cmdbuf.drawIndirect(buffer->Handle(), total_offset, 1, 0);
}
}
void Rasterizer::DispatchDirect() { void Rasterizer::DispatchDirect() {
RENDERER_TRACE; RENDERER_TRACE;
@ -113,19 +165,6 @@ void Rasterizer::DispatchIndirect(VAddr address, u32 offset, u32 size) {
cmdbuf.bindPipeline(vk::PipelineBindPoint::eCompute, pipeline->Handle()); cmdbuf.bindPipeline(vk::PipelineBindPoint::eCompute, pipeline->Handle());
const auto [buffer, base] = buffer_cache.ObtainBuffer(address, size, true); const auto [buffer, base] = buffer_cache.ObtainBuffer(address, size, true);
const auto total_offset = base + offset; const auto total_offset = base + offset;
// Emulate PFP-to-ME sync packet
const vk::BufferMemoryBarrier ib_barrier{
.srcAccessMask = vk::AccessFlagBits::eShaderWrite,
.dstAccessMask = vk::AccessFlagBits::eIndirectCommandRead,
.buffer = buffer->Handle(),
.offset = total_offset,
.size = size,
};
cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eComputeShader,
vk::PipelineStageFlagBits::eDrawIndirect,
vk::DependencyFlagBits::eByRegion, {}, ib_barrier, {});
cmdbuf.dispatchIndirect(buffer->Handle(), total_offset); cmdbuf.dispatchIndirect(buffer->Handle(), total_offset);
} }

View File

@ -32,6 +32,7 @@ public:
} }
void Draw(bool is_indexed, u32 index_offset = 0); void Draw(bool is_indexed, u32 index_offset = 0);
void DrawIndirect(bool is_indexed, VAddr address, u32 offset, u32 size);
void DispatchDirect(); void DispatchDirect();
void DispatchIndirect(VAddr address, u32 offset, u32 size); void DispatchIndirect(VAddr address, u32 offset, u32 size);
@ -45,6 +46,7 @@ public:
void MapMemory(VAddr addr, u64 size); void MapMemory(VAddr addr, u64 size);
void UnmapMemory(VAddr addr, u64 size); void UnmapMemory(VAddr addr, u64 size);
void CpSync();
u64 Flush(); u64 Flush();
private: private:

View File

@ -107,7 +107,7 @@ Shader::Info MakeShaderInfo(const GuestProgram& pgm, const AmdGpu::Liverpool::Re
ShaderCache::ShaderCache(const Instance& instance_, AmdGpu::Liverpool* liverpool_) ShaderCache::ShaderCache(const Instance& instance_, AmdGpu::Liverpool* liverpool_)
: instance{instance_}, liverpool{liverpool_}, inst_pool{8192}, block_pool{512} { : instance{instance_}, liverpool{liverpool_}, inst_pool{8192}, block_pool{512} {
profile = Shader::Profile{ profile = Shader::Profile{
.supported_spirv = 0x00010600U, .supported_spirv = instance.ApiVersion() >= VK_API_VERSION_1_3 ? 0x00010600U : 0x00010500U,
.subgroup_size = instance.SubgroupSize(), .subgroup_size = instance.SubgroupSize(),
.support_explicit_workgroup_layout = true, .support_explicit_workgroup_layout = true,
}; };

View File

@ -34,10 +34,10 @@ TextureCache::TextureCache(const Vulkan::Instance& instance_, Vulkan::Scheduler&
TextureCache::~TextureCache() = default; TextureCache::~TextureCache() = default;
void TextureCache::InvalidateMemory(VAddr address, size_t size, bool from_compute) { void TextureCache::InvalidateMemory(VAddr address, size_t size) {
std::unique_lock lock{mutex}; std::unique_lock lock{mutex};
ForEachImageInRegion(address, size, [&](ImageId image_id, Image& image) { ForEachImageInRegion(address, size, [&](ImageId image_id, Image& image) {
if (from_compute && !image.Overlaps(address, size)) { if (!image.Overlaps(address, size)) {
return; return;
} }
// Ensure image is reuploaded when accessed again. // Ensure image is reuploaded when accessed again.

View File

@ -38,7 +38,7 @@ public:
~TextureCache(); ~TextureCache();
/// Invalidates any image in the logical page range. /// Invalidates any image in the logical page range.
void InvalidateMemory(VAddr address, size_t size, bool from_compute = false); void InvalidateMemory(VAddr address, size_t size);
/// Evicts any images that overlap the unmapped range. /// Evicts any images that overlap the unmapped range.
void UnmapMemory(VAddr cpu_addr, size_t size); void UnmapMemory(VAddr cpu_addr, size_t size);