Merge branch 'shadps4-emu:main' into libSceRtc

This commit is contained in:
CrazyBloo 2024-08-31 18:26:24 -04:00 committed by GitHub
commit 0ce38285d7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
57 changed files with 2055 additions and 123 deletions

View file

@ -50,7 +50,6 @@ jobs:
run: |
mkdir upload
mv ${{github.workspace}}/build/shadps4.app upload
mv ${{github.workspace}}/build/translations upload
macdeployqt upload/shadps4.app
tar cf shadps4-macos-qt.tar.gz -C upload .

View file

@ -40,7 +40,6 @@ jobs:
run: |
mkdir upload
move build/Release/shadPS4.exe upload
move build/translations upload
windeployqt --dir upload upload/shadPS4.exe
- name: Upload executable

View file

@ -636,7 +636,7 @@ target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAlloca
if (APPLE)
# Reserve system-managed memory space.
target_link_options(shadps4 PRIVATE -Wl,-no_pie,-no_fixup_chains,-no_huge,-pagezero_size,0x400000,-segaddr,GUEST_SYSTEM,0x400000,-image_base,0x10000000000)
target_link_options(shadps4 PRIVATE -Wl,-no_pie,-no_fixup_chains,-no_huge,-pagezero_size,0x400000,-segaddr,GUEST_SYSTEM,0x400000,-image_base,0x20000000000)
# Link MoltenVK for Vulkan support
find_library(MOLTENVK MoltenVK REQUIRED)

2
externals/glslang vendored

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

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

@ -126,39 +126,35 @@ static Xbyak::Reg AllocateScratchRegister(
static pthread_key_t stack_pointer_slot;
static pthread_key_t patch_stack_slot;
static std::once_flag patch_context_slots_init_flag;
static constexpr u32 patch_stack_size = 0x1000;
static_assert(sizeof(void*) == sizeof(u64),
"Cannot fit a register inside a thread local storage slot.");
static void FreePatchStack(void* patch_stack) {
// Subtract back to the bottom of the stack for free.
std::free(static_cast<u8*>(patch_stack) - patch_stack_size);
}
static void InitializePatchContextSlots() {
ASSERT_MSG(pthread_key_create(&stack_pointer_slot, nullptr) == 0,
"Unable to allocate thread-local register for stack pointer.");
ASSERT_MSG(pthread_key_create(&patch_stack_slot, nullptr) == 0,
ASSERT_MSG(pthread_key_create(&patch_stack_slot, FreePatchStack) == 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);
}
pthread_setspecific(patch_stack_slot,
static_cast<u8*>(std::malloc(patch_stack_size)) + patch_stack_size);
}
/// Saves the stack pointer to thread local storage and loads the patch stack.
static void SaveStack(Xbyak::CodeGenerator& c) {
std::call_once(patch_context_slots_init_flag, InitializePatchContextSlots);
// Save stack pointer and load patch stack.
// Save original stack pointer and load patch stack.
c.putSeg(gs);
c.mov(qword[reinterpret_cast<void*>(stack_pointer_slot * sizeof(void*))], rsp);
c.putSeg(gs);
@ -184,10 +180,6 @@ 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();
@ -244,7 +236,7 @@ static void RestoreContext(Xbyak::CodeGenerator& c, const Xbyak::Operand& dst) {
if (!dst.isREG() || dst.getIdx() != reg) {
c.pop(Xbyak::Reg64(reg));
} else {
c.add(rsp, 4);
c.add(rsp, 8);
}
}
RestoreStack(c);

View file

@ -1,17 +1,16 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#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 "common/io_file.h"
#include "common/logging/log.h"
#include "common/path_util.h"
#include "common/singleton.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/libs.h"

View file

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

View file

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

View file

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

View file

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
// Generated By moduleGenerator
#include "common/logging/log.h"
#include "core/libraries/error_codes.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,
u32 vertex_sgpr_offset, u32 instance_vgpr_offset,
u32 vertex_sgpr_offset, u32 instance_sgpr_offset,
u32 flags) {
LOG_TRACE(Lib_GnmDriver, "called");
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;
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[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 += 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,
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");
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;
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[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 += 4;
@ -2346,9 +2346,9 @@ s32 PS4_SYSV_ABI sceGnmUpdateVsShader(u32* cmdbuf, u32 size, const u32* vs_regs,
return ORBIS_OK;
}
int PS4_SYSV_ABI sceGnmValidateCommandBuffers() {
LOG_ERROR(Lib_GnmDriver, "(STUBBED) called");
return ORBIS_OK;
s32 PS4_SYSV_ABI sceGnmValidateCommandBuffers() {
LOG_TRACE(Lib_GnmDriver, "called");
return ORBIS_GNM_ERROR_VALIDATION_NOT_ENABLED; // not available in retail FW;
}
int PS4_SYSV_ABI sceGnmValidateDisableDiagnostics() {

View file

@ -45,7 +45,7 @@ s32 PS4_SYSV_ABI sceGnmDrawIndex(u32* cmdbuf, u32 size, u32 index_count, uintptr
u32 flags, u32 type);
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,
u32 vertex_sgpr_offset, u32 instance_vgpr_offset,
u32 vertex_sgpr_offset, u32 instance_sgpr_offset,
u32 flags);
int PS4_SYSV_ABI sceGnmDrawIndexIndirectCountMulti();
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,
u32 flags);
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 sceGnmDrawIndirectMulti();
u32 PS4_SYSV_ABI sceGnmDrawInitDefaultHardwareState(u32* cmdbuf, u32 size);
@ -223,7 +223,7 @@ s32 PS4_SYSV_ABI sceGnmUpdatePsShader(u32* cmdbuf, u32 size, const u32* ps_regs)
s32 PS4_SYSV_ABI sceGnmUpdatePsShader350(u32* cmdbuf, u32 size, const u32* ps_regs);
s32 PS4_SYSV_ABI sceGnmUpdateVsShader(u32* cmdbuf, u32 size, const u32* vs_regs,
u32 shader_modifier);
int PS4_SYSV_ABI sceGnmValidateCommandBuffers();
s32 PS4_SYSV_ABI sceGnmValidateCommandBuffers();
int PS4_SYSV_ABI sceGnmValidateDisableDiagnostics();
int PS4_SYSV_ABI sceGnmValidateDisableDiagnostics2();
int PS4_SYSV_ABI sceGnmValidateDispatchCommandBuffers();

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -4,6 +4,7 @@
#include <mutex>
#include <semaphore>
#include <thread>
#include "common/alignment.h"
#include "common/assert.h"
#include "common/error.h"
@ -986,16 +987,15 @@ static void cleanup_thread(void* arg) {
destructor(value);
}
}
Core::CleanupThreadPatchStack();
thread->is_almost_done = true;
}
static void* run_thread(void* arg) {
auto* thread = static_cast<ScePthread>(arg);
Common::SetCurrentThreadName(thread->name.c_str());
Core::InitializeThreadPatchStack();
auto* linker = Common::Singleton<Core::Linker>::Instance();
linker->InitTlsForThread(false);
Core::InitializeThreadPatchStack();
void* ret = nullptr;
g_pthread_self = thread;
pthread_cleanup_push(cleanup_thread, thread);

View file

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

View file

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

View file

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

View file

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

View file

@ -2,13 +2,18 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include "common/config.h"
#include "core/libraries/ajm/ajm.h"
#include "core/libraries/app_content/app_content.h"
#include "core/libraries/audio/audioin.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/gnmdriver/gnmdriver.h"
#include "core/libraries/kernel/libkernel.h"
#include "core/libraries/libc_internal/libc_internal.h"
#include "core/libraries/libpng/pngdec.h"
#include "core/libraries/libs.h"
#include "core/libraries/network/http.h"
#include "core/libraries/network/net.h"
@ -32,11 +37,6 @@
#include "core/libraries/system/userservice.h"
#include "core/libraries/usbd/usbd.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 {

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -3,12 +3,13 @@
#include <span>
#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/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/libs.h"
#include "core/libraries/save_data/savedata.h"

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -85,9 +85,9 @@ void Linker::Execute() {
// Init primary thread.
Common::SetCurrentThreadName("GAME_MainThread");
InitializeThreadPatchStack();
Libraries::Kernel::pthreadInitSelfMainThread();
InitTlsForThread(true);
InitializeThreadPatchStack();
// Start shared library modules
for (auto& m : m_modules) {
@ -106,8 +106,6 @@ void Linker::Execute() {
RunMainEntry(m->GetEntryAddress(), &p, ProgramExitFunc);
}
}
CleanupThreadPatchStack();
}
s32 Linker::LoadModule(const std::filesystem::path& elf_name, bool is_dynamic) {

View file

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

View file

@ -366,7 +366,7 @@ void MainWindow::CreateConnects() {
panelDialog->accept();
});
connect(downloadAllPatchesButton, &QPushButton::clicked, this, [this, panelDialog]() {
connect(downloadAllPatchesButton, &QPushButton::clicked, [panelDialog]() {
QEventLoop eventLoop;
int pendingDownloads = 0;

View file

@ -0,0 +1,915 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ar_AR">
<!-- SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
SPDX-License-Identifier: GPL-2.0-or-later -->
<context>
<name>AboutDialog</name>
<message>
<location filename="../about_dialog.ui" line="16"/>
<source>About shadPS4</source>
<translation>حول shadPS4</translation>
</message>
<message>
<location filename="../about_dialog.ui" line="60"/>
<source>shadPS4</source>
<translation>shadPS4</translation>
</message>
<message>
<location filename="../about_dialog.ui" line="78"/>
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
<translation>shadPS4 هو محاكي تجريبي مفتوح المصدر لجهاز PlayStation 4.</translation>
</message>
<message>
<location filename="../about_dialog.ui" line="99"/>
<source>This software should not be used to play games you have not legally obtained.</source>
<translation>يجب عدم استخدام هذا البرنامج لتشغيل الألعاب التي لم تحصل عليها بشكل قانوني.</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
<message>
<location filename="../elf_viewer.cpp" line="45"/>
<source>Open Folder</source>
<translation>فتح المجلد</translation>
</message>
</context>
<context>
<name>GameInfoClass</name>
<message>
<location filename="../game_info.cpp" line="26"/>
<source>Loading game list, please wait :3</source>
<translation>جارٍ تحميل قائمة الألعاب، يرجى الانتظار :3</translation>
</message>
<message>
<location filename="../game_info.cpp" line="26"/>
<source>Cancel</source>
<translation>إلغاء</translation>
</message>
<message>
<location filename="../game_info.cpp" line="27"/>
<source>Loading...</source>
<translation>...جارٍ التحميل</translation>
</message>
</context>
<context>
<name>GameInstallDialog</name>
<message>
<location filename="../game_install_dialog.cpp" line="24"/>
<source>shadPS4 - Choose directory</source>
<translation>shadPS4 - اختر المجلد</translation>
</message>
<message>
<location filename="../game_install_dialog.cpp" line="31"/>
<source>Directory to install games</source>
<translation>مجلد تثبيت الألعاب</translation>
</message>
<message>
<location filename="../game_install_dialog.cpp" line="50"/>
<source>Browse</source>
<translation>تصفح</translation>
</message>
<message>
<location filename="../game_install_dialog.cpp" line="74"/>
<source>Error</source>
<translation>خطأ</translation>
</message>
<message>
<location filename="../game_install_dialog.cpp" line="75"/>
<source>The value for location to install games is not valid.</source>
<translation>قيمة موقع تثبيت الألعاب غير صالحة.</translation>
</message>
</context>
<context>
<name>GuiContextMenus</name>
<message>
<location filename="../gui_context_menus.h" line="46"/>
<source>Create Shortcut</source>
<translation>إنشاء اختصار</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="47"/>
<source>Open Game Folder</source>
<translation>فتح مجلد اللعبة</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>الغش / التصحيحات</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source>
<translation>عارض SFO</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source>
<translation>عارض الجوائز</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="59"/>
<source>Copy info</source>
<translation>نسخ المعلومات</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source>
<translation>نسخ الاسم</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source>
<translation>نسخ الرقم التسلسلي</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source>
<translation>نسخ الكل</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
<translation>إنشاء اختصار</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>تم إنشاء الاختصار بنجاح!\n %1</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
<source>Error</source>
<translation>خطأ</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>!\n %1 خطأ في إنشاء الاختصار</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
<source>Install PKG</source>
<translation>PKG تثبيت</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window_ui.h" line="310"/>
<source>Open/Add Elf Folder</source>
<translation>Elf فتح/إضافة مجلد</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="312"/>
<source>Install Packages (PKG)</source>
<translation>(PKG) تثبيت الحزم</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="313"/>
<source>Boot Game</source>
<translation>تشغيل اللعبة</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
<translation>shadPS4 حول</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="315"/>
<source>Configure...</source>
<translation>...تكوين</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="318"/>
<source>Install application from a .pkg file</source>
<translation>.pkg تثبيت التطبيق من ملف</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="320"/>
<source>Recent Games</source>
<translation>الألعاب الأخيرة</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="321"/>
<source>Exit</source>
<translation>خروج</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="323"/>
<source>Exit shadPS4</source>
<translation>الخروج من shadPS4</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="327"/>
<source>Exit the application.</source>
<translation>الخروج من التطبيق.</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="330"/>
<source>Show Game List</source>
<translation>إظهار قائمة الألعاب</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="332"/>
<source>Game List Refresh</source>
<translation>تحديث قائمة الألعاب</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="333"/>
<source>Tiny</source>
<translation>صغير جدًا</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="334"/>
<source>Small</source>
<translation>صغير</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="335"/>
<source>Medium</source>
<translation>متوسط</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="336"/>
<source>Large</source>
<translation>كبير</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="338"/>
<source>List View</source>
<translation>عرض القائمة</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="340"/>
<source>Grid View</source>
<translation>عرض الشبكة</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="341"/>
<source>Elf Viewer</source>
<translation>عارض Elf</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Game Install Directory</source>
<translation>دليل تثبيت اللعبة</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>تنزيل الغش/التصحيحات</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source>
<translation>تفريغ قائمة الألعاب</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="346"/>
<source>PKG Viewer</source>
<translation>عارض PKG</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="348"/>
<source>Search...</source>
<translation>...بحث</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="349"/>
<source>File</source>
<translation>ملف</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="350"/>
<source>View</source>
<translation>عرض</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="352"/>
<source>Game List Icons</source>
<translation>أيقونات قائمة الألعاب</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="354"/>
<source>Game List Mode</source>
<translation>وضع قائمة الألعاب</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="355"/>
<source>Settings</source>
<translation>الإعدادات</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="356"/>
<source>Utils</source>
<translation>الأدوات</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="357"/>
<source>Themes</source>
<translation>السمات</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>حول</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
<source>Dark</source>
<translation>داكن</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="360"/>
<source>Light</source>
<translation>فاتح</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="361"/>
<source>Green</source>
<translation>أخضر</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="362"/>
<source>Blue</source>
<translation>أزرق</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="363"/>
<source>Violet</source>
<translation>بنفسجي</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="364"/>
<source>toolBar</source>
<translation>شريط الأدوات</translation>
</message>
</context>
<context>
<name>PKGViewer</name>
<message>
<location filename="../pkg_viewer.cpp" line="32"/>
<source>Open Folder</source>
<translation>فتح المجلد</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
<message>
<location filename="../trophy_viewer.cpp" line="8"/>
<source>Trophy Viewer</source>
<translation>عارض الجوائز</translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<location filename="../settings_dialog.ui" line="29"/>
<source>Settings</source>
<translation>الإعدادات</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="67"/>
<source>General</source>
<translation>عام</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="77"/>
<source>System</source>
<translation>النظام</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="83"/>
<source>Console Language</source>
<translation>لغة وحدة التحكم</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="95"/>
<source>Emulator Language</source>
<translation>لغة المحاكي</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="114"/>
<source>Emulator</source>
<translation>المحاكي</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="122"/>
<source>Enable Fullscreen</source>
<translation>تمكين ملء الشاشة</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="129"/>
<source>Show Splash</source>
<translation>إظهار شاشة البداية</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="136"/>
<source>Is PS4 Pro</source>
<translation>PS4 Pro هل هو</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="155"/>
<source>Username</source>
<translation>اسم المستخدم</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="178"/>
<source>Logger</source>
<translation>المسجل</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="199"/>
<source>Log Type</source>
<translation>نوع السجل</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="235"/>
<source>Log Filter</source>
<translation>مرشح السجل</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source>
<translation>الرسومات</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="282"/>
<source>Graphics Device</source>
<translation>جهاز الرسومات</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="326"/>
<source>Width</source>
<translation>العرض</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="357"/>
<source>Height</source>
<translation>الارتفاع</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="405"/>
<source>Vblank Divider</source>
<translation>Vblank مقسم</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="453"/>
<source>Advanced</source>
<translation>متقدم</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="462"/>
<source>Enable Shaders Dumping</source>
<translation>تمكين تفريغ الشيدرات</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="469"/>
<source>Enable NULL GPU</source>
<translation>تمكين وحدة معالجة الرسومات الفارغة</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="476"/>
<source>Enable PM4 Dumping</source>
<translation>PM4 تمكين تفريغ</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source>
<translation>تصحيح الأخطاء</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="537"/>
<source>Enable Debug Dumping</source>
<translation>تمكين تفريغ التصحيح</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="560"/>
<source>Enable Vulkan Validation Layers</source>
<translation>Vulkan تمكين طبقات التحقق من</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="567"/>
<source>Enable Vulkan Synchronization Validation</source>
<translation>Vulkan تمكين التحقق من تزامن</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="574"/>
<source>Enable RenderDoc Debugging</source>
<translation>RenderDoc تمكين تصحيح أخطاء</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation> * إصدار Vulkan غير مدعوم</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>تنزيل الغش لجميع الألعاب المثبتة</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>تنزيل التصحيحات لجميع الألعاب</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>اكتمل التنزيل</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>لقد قمت بتنزيل الغش لجميع الألعاب التي قمت بتثبيتها.</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>!تم تنزيل التصحيحات بنجاح</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>.تم تنزيل جميع التصحيحات المتاحة لجميع الألعاب</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation> :الألعاب</translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>PKG (*.PKG) ملف</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>ELF (*.bin *.elf *.oelf) ملفات</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>تشغيل اللعبة</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>!يمكن تحديد ملف واحد فقط</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>PKG استخراج</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>تم اكتشاف تصحيح!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation> :واللعبة تتطابق إصدارات PKG</translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>هل ترغب في الكتابة فوق الملف الموجود؟</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<translation> :أقدم من الإصدار المثبت PKG Version %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>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>تثبيت المحتوى القابل للتنزيل</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>هل ترغب في تثبيت المحتوى القابل للتنزيل: 1%؟</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source>
<translation> :المحتوى القابل للتنزيل مثبت بالفعل</translation>
</message>
<message>
<location filename="../main_window.cpp" line="701"/>
<source>Game already installed</source>
<translation>اللعبة مثبتة بالفعل</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>!PKG هو تصحيح، يرجى تثبيت اللعبة أولاً</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>PKG خطأ في</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>PKG %1/%2 جاري استخراج</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>اكتمل الاستخراج</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>تم تثبيت اللعبة بنجاح في %1</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn't appear to be a valid PKG file</source>
<translation>يبدو أن الملف ليس ملف PKG صالحًا</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>الغش / التصحيحات</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>الغش والتصحيحات هي ميزات تجريبية.
استخدمها بحذر.
قم بتنزيل الغش بشكل فردي عن طريق اختيار المستودع والنقر على زر التنزيل.
في علامة تبويب التصحيحات، يمكنك تنزيل جميع التصحيحات دفعة واحدة، واختيار ما تريد استخدامه، وحفظ اختياراتك.
نظرًا لأننا لا نقوم بتطوير الغش/التصحيحات،
يرجى الإبلاغ عن أي مشاكل إلى مؤلف الغش.
هل قمت بإنشاء غش جديد؟ قم بزيارة:
https://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>لا تتوفر صورة</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>الرقم التسلسلي: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>الإصدار: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>الحجم: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>اختر ملف الغش:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>المستودع:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>تنزيل الغش</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>حذف الملف</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>لم يتم اختيار أي ملفات.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>يمكنك حذف الغش الذي لا تريده بعد تنزيله.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>هل تريد حذف الملف المحدد؟
%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>اختر ملف التصحيح:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>تنزيل التصحيحات</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>حفظ</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>الغش</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>التصحيحات</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>خطأ</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>لم يتم اختيار أي تصحيح.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>تعذر فتح files.json للقراءة.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>لم يتم العثور على ملف تصحيح للرقم التسلسلي الحالي.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>تعذر فتح الملف للقراءة.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>تعذر فتح الملف للكتابة.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation> :فشل في تحليل XML</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>نجاح</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation>تم حفظ الخيارات بنجاح.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>مصدر غير صالح</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>المصدر المحدد غير صالح.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>الملف موجود</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>الملف موجود بالفعل. هل تريد استبداله؟</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>:فشل في حفظ الملف</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>:فشل في تنزيل الملف</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>لم يتم العثور على الغش</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>لم يتم العثور على غش لهذه اللعبة في هذا الإصدار من المستودع المحدد. حاول استخدام مستودع آخر أو إصدار آخر من اللعبة.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>تم تنزيل الغش بنجاح</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>لقد نجحت في تنزيل الغش لهذا الإصدار من اللعبة من المستودع المحدد. يمكنك محاولة التنزيل من مستودع آخر. إذا كان متاحًا، يمكنك اختياره عن طريق تحديد الملف من القائمة.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>:فشل في الحفظ</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>:فشل في التنزيل</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>اكتمل التنزيل</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>تم تنزيل التصحيحات بنجاح! تم تنزيل جميع التصحيحات لجميع الألعاب، ولا داعي لتنزيلها بشكل فردي لكل لعبة كما هو الحال مع الغش.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>فشل في تحليل بيانات JSON من HTML.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>.HTML فشل في استرجاع صفحة</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation> :فشل في فتح الملف</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation> :خطأ في XML</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>فشل في فتح files.json للكتابة</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation> :المؤلف</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation> :المجلد غير موجود</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>فشل في فتح files.json للقراءة.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>:الاسم</translation>
</message>
</context>
</TS>

View file

@ -0,0 +1,899 @@
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE TS><TS version="2.1" language="fa_IR">
<!-- SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
SPDX-License-Identifier: GPL-2.0-or-later -->
<context>
<name>AboutDialog</name>
<message>
<location filename="../about_dialog.ui" line="16"/>
<source>About shadPS4</source>
<translation>درباره ShadPS4</translation>
</message>
<message>
<location filename="../about_dialog.ui" line="60"/>
<source>shadPS4</source>
<translation>ShadPS4</translation>
</message>
<message>
<location filename="../about_dialog.ui" line="78"/>
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
<translation>یک شبیه ساز متن باز برای پلی استیشن 4 است. </translation>
</message>
<message>
<location filename="../about_dialog.ui" line="99"/>
<source>This software should not be used to play games you have not legally obtained.</source>
<translation>این برنامه نباید برای بازی هایی که شما به صورت غیرقانونی به دست آوردید استفاده شود.</translation>
</message>
</context>
<context>
<name>ElfViewer</name>
<message>
<location filename="../elf_viewer.cpp" line="45"/>
<source>Open Folder</source>
<translation>فولدر را بازکن</translation>
</message>
</context>
<context>
<name>GameInfoClass</name>
<message>
<location filename="../game_info.cpp" line="26"/>
<source>Loading game list, please wait :3</source>
<translation>درحال بارگیری لیست بازی ها,لطفا کمی صبرکنید :3</translation>
</message>
<message>
<location filename="../game_info.cpp" line="26"/>
<source>Cancel</source>
<translation>لغو</translation>
</message>
<message>
<location filename="../game_info.cpp" line="27"/>
<source>Loading...</source>
<translation>...درحال بارگیری</translation>
</message>
</context>
<context>
<name>GameInstallDialog</name>
<message>
<location filename="../game_install_dialog.cpp" line="24"/>
<source>shadPS4 - Choose directory</source>
<translation>ShadPS4 - انتخاب محل نصب بازی</translation>
</message>
<message>
<location filename="../game_install_dialog.cpp" line="31"/>
<source>Directory to install games</source>
<translation>محل نصب بازی ها</translation>
</message>
<message>
<location filename="../game_install_dialog.cpp" line="50"/>
<source>Browse</source>
<translation>انتخاب دستی</translation>
</message>
<message>
<location filename="../game_install_dialog.cpp" line="74"/>
<source>Error</source>
<translation>ارور</translation>
</message>
<message>
<location filename="../game_install_dialog.cpp" line="75"/>
<source>The value for location to install games is not valid.</source>
<translation>.مکان داده شده برای نصب بازی درست نمی باشد</translation>
</message>
</context>
<context>
<name>GuiContextMenus</name>
<message>
<location filename="../gui_context_menus.h" line="39"/>
<source>Create Shortcut</source>
<translation>ساخت شورتکات</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="40"/>
<source>Open Game Folder</source>
<translation>بازکردن محل نصب بازی</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="48"/>
<source>Cheats / Patches</source>
<translation>چیت/پچ ها</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="41"/>
<source>SFO Viewer</source>
<translation>SFO مشاهده</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="42"/>
<source>Trophy Viewer</source>
<translation>مشاهده تروفی ها</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="50"/>
<source>Copy info</source>
<translation>کپی کردن اطلاعات</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="51"/>
<source>Copy Name</source>
<translation>کپی کردن نام</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="52"/>
<source>Copy Serial</source>
<translation>کپی کردن سریال</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="53"/>
<source>Copy All</source>
<translation>کپی کردن تمامی مقادیر</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="173"/>
<source>Shortcut creation</source>
<translation>سازنده شورتکات</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="174"/>
<source>Shortcut created successfully!\n %1</source>
<translation>شورتکات با موفقیت ساخته شد! \n %1</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="177"/>
<source>Error</source>
<translation>ارور</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="178"/>
<source>Error creating shortcut!\n %1</source>
<translation>مشکلی در هنگام ساخت شورتکات بوجود آمد!\n %1</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="253"/>
<source>Install PKG</source>
<translation>نصب PKG</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window_ui.h" line="310"/>
<source>Open/Add Elf Folder</source>
<translation>ELF بازکردن/ساختن پوشه</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="312"/>
<source>Install Packages (PKG)</source>
<translation>نصب بسته (PKG)</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="313"/>
<source>Boot Game</source>
<translation>اجرای بازی</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
<translation>ShadPS4 درباره</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="315"/>
<source>Configure...</source>
<translation>...تنظیمات</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="318"/>
<source>Install application from a .pkg file</source>
<translation>.PKG نصب بازی از فایل</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="320"/>
<source>Recent Games</source>
<translation>بازی های اخیر</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="321"/>
<source>Exit</source>
<translation>خروج</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="323"/>
<source>Exit shadPS4</source>
<translation>ShadPS4 بستن</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="327"/>
<source>Exit the application.</source>
<translation>بستن برنامه</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="330"/>
<source>Show Game List</source>
<translation>نشان دادن بازی ها</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="332"/>
<source>Game List Refresh</source>
<translation>رفرش لیست بازی ها</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="333"/>
<source>Tiny</source>
<translation>کوچک ترین</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="334"/>
<source>Small</source>
<translation>کوچک</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="335"/>
<source>Medium</source>
<translation>متوسط</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="336"/>
<source>Large</source>
<translation>بزرگ</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="338"/>
<source>List View</source>
<translation>لیستی</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="340"/>
<source>Grid View</source>
<translation>شبکه ای (چهارخونه)</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="341"/>
<source>Elf Viewer</source>
<translation>Elf Viewer</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Game Install Directory</source>
<translation>محل نصب بازی</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>دانلود چیت/پچ</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source>
<translation>استخراج لیست بازی ها</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="346"/>
<source>PKG Viewer</source>
<translation>PKG مشاهده گر</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="348"/>
<source>Search...</source>
<translation>جست و جو...</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="349"/>
<source>File</source>
<translation>فایل</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="350"/>
<source>View</source>
<translation>شخصی سازی</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="352"/>
<source>Game List Icons</source>
<translation>آیکون ها</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="354"/>
<source>Game List Mode</source>
<translation>حالت نمایش لیست بازی ها</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="355"/>
<source>Settings</source>
<translation>تنظیمات</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="356"/>
<source>Utils</source>
<translation>ابزارها</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="357"/>
<source>Themes</source>
<translation>تم ها</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>درباره ما</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
<source>Dark</source>
<translation>تیره</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="360"/>
<source>Light</source>
<translation>روشن</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="361"/>
<source>Green</source>
<translation>سبز</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="362"/>
<source>Blue</source>
<translation>آبی</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="363"/>
<source>Violet</source>
<translation>بنفش</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="364"/>
<source>toolBar</source>
<translation>نوار ابزار</translation>
</message>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation>شما پشتیبانی نمیشود Vulkan ورژن*</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
<source>Download Cheats For All Installed Games</source>
<translation>دانلود چیت برای همه بازی ها</translation>
</message>
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>دانلود پچ برای همه بازی ها</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
<source>Download Complete</source>
<translation>دانلود کامل شد</translation>
</message>
<message>
<location filename="../main_window.cpp" line="364"/>
<source>You have downloaded cheats for all the games you have installed.</source>
<translation>چیت برای همه بازی های شما دانلودشد</translation>
</message>
<message>
<location filename="../main_window.cpp" line="391"/>
<source>Patches Downloaded Successfully!</source>
<translation>پچ ها با موفقیت دانلود شد</translation>
</message>
<message>
<location filename="../main_window.cpp" line="392"/>
<source>All Patches available for all games have been downloaded.</source>
<translation>تمام پچ های موجود برای همه بازی های شما دانلود شد</translation>
</message>
<message>
<location filename="../main_window.cpp" line="549"/>
<source>Games: </source>
<translation>بازی ها:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="575"/>
<source>PKG File (*.PKG)</source>
<translation>PKG فایل (*.PKG)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>ELF فایل های (*.bin *.elf *.oelf) </translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Game Boot</source>
<translation>اجرای بازی</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
<source>Only one file can be selected!</source>
<translation>فقط یک فایل انتخاب کنید!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>PKG استخراج فایل</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>Patch detected!</source>
<translation>پچ شناسایی شد!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>و نسخه بازی همخوانی دارد PKG فایل:</translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
<source>Would you like to overwrite?</source>
<translation>آیا مایل به جایگزینی فایل هستید؟</translation>
</message>
<message>
<location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source>
<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>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>نصب DLC</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<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>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>فایل انتخاب شده یک پچ است, لطفا اول بازی را نصب کنید</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
<source>PKG ERROR</source>
<translation>PKG ارور فایل</translation>
</message>
<message>
<location filename="../main_window.cpp" line="693"/>
<source>Extracting PKG %1/%2</source>
<translation>درحال استخراج PKG %1/%2</translation>
</message>
<message>
<location filename="../main_window.cpp" line="703"/>
<source>Extraction Finished</source>
<translation>استخراج به پایان رسید</translation>
</message>
<message>
<location filename="../main_window.cpp" line="704"/>
<source>Game successfully installed at %1</source>
<translation>بازی با موفقیت در %1 نصب شد</translation>
</message>
<message>
<location filename="../main_window.cpp" line="725"/>
<source>File doesn&apos;t appear to be a valid PKG file</source>
<translation> این فایل یک PKG درست به نظر نمی آید</translation>
</message>
</context>
<context>
<name>PKGViewer</name>
<message>
<location filename="../pkg_viewer.cpp" line="32"/>
<source>Open Folder</source>
<translation>بازکردن پوشه</translation>
</message>
</context>
<context>
<name>TrophyViewer</name>
<message>
<location filename="../trophy_viewer.cpp" line="8"/>
<source>Trophy Viewer</source>
<translation>تروفی ها</translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<location filename="../settings_dialog.ui" line="29"/>
<source>Settings</source>
<translation>تنظیمات</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="67"/>
<source>General</source>
<translation>عمومی</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="77"/>
<source>System</source>
<translation>سیستم</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="83"/>
<source>Console Language</source>
<translation>زبان کنسول</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="95"/>
<source>Emulator Language</source>
<translation>زبان شبیه ساز</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="114"/>
<source>Emulator</source>
<translation>شبیه ساز</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="122"/>
<source>Enable Fullscreen</source>
<translation>تمام صفحه</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="129"/>
<source>Show Splash</source>
<translation>Splash نمایش</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="136"/>
<source>Is PS4 Pro</source>
<translation>PS4 Pro حالت</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="155"/>
<source>Username</source>
<translation>نام کاربری</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="178"/>
<source>Logger</source>
<translation>Logger</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="199"/>
<source>Log Type</source>
<translation>Log نوع</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="235"/>
<source>Log Filter</source>
<translation>Log فیلتر</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source>
<translation>گرافیک</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="282"/>
<source>Graphics Device</source>
<translation>کارت گرافیک مورداستفاده</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="326"/>
<source>Width</source>
<translation>عرض</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="357"/>
<source>Height</source>
<translation>طول</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="405"/>
<source>Vblank Divider</source>
<translation>Vblank Divider</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="453"/>
<source>Advanced</source>
<translation>...بیشتر</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="462"/>
<source>Enable Shaders Dumping</source>
<translation>Shaders Dumping فعال کردن</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="469"/>
<source>Enable NULL GPU</source>
<translation>NULL GPU فعال کردن</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="476"/>
<source>Enable PM4 Dumping</source>
<translation>PM4 Dumping فعال کردن</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source>
<translation>Debug</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="537"/>
<source>Enable Debug Dumping</source>
<translation>Debug Dumping</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="560"/>
<source>Enable Vulkan Validation Layers</source>
<translation>Vulkan Validation Layers</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="567"/>
<source>Enable Vulkan Synchronization Validation</source>
<translation>Vulkan Synchronization Validation</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="574"/>
<source>Enable RenderDoc Debugging</source>
<translation>RenderDoc Debugging</translation>
</message>
</context>
<context>
<name>CheatsPatches</name>
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches</source>
<translation>چیت / پچ ها</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>defaultTextEdit_MSG</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
<source>No Image Available</source>
<translation>تصویری موجود نمی باشد</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source>
<translation>سریال: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>ورژن: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source>
<translation>حجم: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source>
<translation>فایل چیت را انتخاب کنید:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source>
<translation>:منبع</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="149"/>
<source>Download Cheats</source>
<translation>دانلود چیت ها</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>پاک کردن فایل</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>فایلی انتخاب نشده.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don&apos;t want after downloading them.</source>
<translation>شما میتوانید بعد از دانلود چیت هایی که نمیخواهید را پاک کنید</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>آیا میخواهید فایل های انتخاب شده را پاک کنید؟ \n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source>
<translation>فایل پچ را انتخاب کنید</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>دانلود کردن پچ ها</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
<source>Save</source>
<translation>ذخیره</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>چیت ها</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
<source>Patches</source>
<translation>پچ ها</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>Error</source>
<translation>ارور</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="278"/>
<source>No patch selected.</source>
<translation>هیچ پچ انتخاب نشده</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="292"/>
<source>Unable to open files.json for reading.</source>
<translation>.json مشکل در خواندن فایل</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="316"/>
<source>No patch file found for the current serial.</source>
<translation>هیچ فایل پچ برای سریال بازی شما پیدا نشد.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="323"/>
<source>Unable to open the file for reading.</source>
<translation>خطا در خواندن فایل</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="422"/>
<source>Unable to open the file for writing.</source>
<translation>خطا در نوشتن فایل</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source>
<translation>انجام نشد XML تجزیه فایل:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Success</source>
<translation>عملیات موفق بود</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="434"/>
<source>Options saved successfully.</source>
<translation >تغییرات با موفقیت ذخیره شد</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>منبع نامعتبر</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
<source>The selected source is invalid.</source>
<translation>منبع انتخاب شده نامعتبر است</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>فایل وجود دارد</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
<source>File already exists. Do you want to replace it?</source>
<translation>فایل از قبل وجود دارد. آیا می خواهید آن را جایگزین کنید؟</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source>
<translation>ذخیره فایل موفقیت آمیز نبود:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source>
<translation>خطا در دانلود فایل:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>چیت یافت نشد</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>CheatsNotFound_MSG</source>
<translation>متاسفانه هیچ چیتی از منبع انتخاب شده پیدا نشد! شما میتوانید منابع دیگری را برای دانلود انتخاب و یا چیت های خود را به صورت دستی واردکنید.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>دانلود چیت ها موفقیت آمیز بود</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>تمامی چیت های موجود برای این بازی از منبع انتخاب شده دانلود شد! شما همچنان میتوانید چیت های دیگری را ازمنابع مختلف دانلود کنید و درصورت موجود بودن از آنها استفاده کنید.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source>
<translation>خطا در ذخیره اطلاعات:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source>
<translation>خطا در دانلود</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="762"/>
<source>Download Complete</source>
<translation>دانلود موفقیت آمیز بود</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>دانلود با موفقیت به اتمام رسید</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
<source>Failed to parse JSON data from HTML.</source>
<translation>HTML از JSON خطا در تجزیه اطلاعات.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="778"/>
<source>Failed to retrieve HTML page.</source>
<translation>HTML خطا دربازیابی صفحه</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source>
<translation>خطا در اجرای فایل:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source>
<translation>XML ERROR:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="826"/>
<source>Failed to open files.json for writing</source>
<translation>.json خطا در نوشتن فایل</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source>
<translation>تولید کننده: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source>
<translation>پوشه وجود ندارد:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Failed to open files.json for reading.</source>
<translation>.json خطا در خواندن فایل</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>نام:</translation>
</message>
</context>
</TS>

View file

@ -368,6 +368,36 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
}
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: {
const auto* dispatch_direct = reinterpret_cast<const PM4CmdDispatchDirect*>(header);
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;
}
case PM4ItOpcode::PfpSyncMe: {
rasterizer->CpSync();
break;
}
default:

View file

@ -253,20 +253,6 @@ struct PM4CmdDrawIndexAuto {
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 {
None = 0,
Data32Low = 1,
@ -740,4 +726,51 @@ struct PM4CmdDispatchIndirect {
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

View file

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

View file

@ -220,12 +220,12 @@ bool Instance::CreateDevice() {
const bool maintenance5 = add_extension(VK_KHR_MAINTENANCE_5_EXTENSION_NAME);
add_extension(VK_KHR_DYNAMIC_RENDERING_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 (has_sync2) {
has_nv_checkpoints = Config::isMarkersEnabled()
? add_extension(VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME)
: false;
if (Config::isMarkersEnabled()) {
const bool has_sync2 = add_extension(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
if (has_sync2) {
has_nv_checkpoints = add_extension(VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME);
}
}
#ifdef __APPLE__

View file

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

View file

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

View file

@ -29,6 +29,19 @@ Rasterizer::Rasterizer(const Instance& instance_, Scheduler& scheduler_,
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) {
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() {
RENDERER_TRACE;
@ -113,19 +165,6 @@ void Rasterizer::DispatchIndirect(VAddr address, u32 offset, u32 size) {
cmdbuf.bindPipeline(vk::PipelineBindPoint::eCompute, pipeline->Handle());
const auto [buffer, base] = buffer_cache.ObtainBuffer(address, size, true);
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);
}

View file

@ -32,6 +32,7 @@ public:
}
void Draw(bool is_indexed, u32 index_offset = 0);
void DrawIndirect(bool is_indexed, VAddr address, u32 offset, u32 size);
void DispatchDirect();
void DispatchIndirect(VAddr address, u32 offset, u32 size);
@ -45,6 +46,7 @@ public:
void MapMemory(VAddr addr, u64 size);
void UnmapMemory(VAddr addr, u64 size);
void CpSync();
u64 Flush();
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_)
: instance{instance_}, liverpool{liverpool_}, inst_pool{8192}, block_pool{512} {
profile = Shader::Profile{
.supported_spirv = 0x00010600U,
.supported_spirv = instance.ApiVersion() >= VK_API_VERSION_1_3 ? 0x00010600U : 0x00010500U,
.subgroup_size = instance.SubgroupSize(),
.support_explicit_workgroup_layout = true,
};