mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-04-21 20:14:45 +00:00
Merge branch 'shadps4-emu:main' into libSceRtc
This commit is contained in:
commit
0ce38285d7
57 changed files with 2055 additions and 123 deletions
1
.github/workflows/macos-qt.yml
vendored
1
.github/workflows/macos-qt.yml
vendored
|
@ -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 .
|
||||
|
||||
|
|
1
.github/workflows/windows-qt.yml
vendored
1
.github/workflows/windows-qt.yml
vendored
|
@ -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
|
||||
|
|
|
@ -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
2
externals/glslang
vendored
|
@ -1 +1 @@
|
|||
Subproject commit d59c84d388c805022e2bddea08aa41cbe7e43e55
|
||||
Subproject commit 12cbda959b6df2af119a76a73ff906c2bed36884
|
2
externals/robin-map
vendored
2
externals/robin-map
vendored
|
@ -1 +1 @@
|
|||
Subproject commit 1115dad3ffa0994e3f43b693d9b9cc99944c64c1
|
||||
Subproject commit 2c48a1a50203bbaf1e3d0d64c5d726d56f8d3bb3
|
2
externals/sirit
vendored
2
externals/sirit
vendored
|
@ -1 +1 @@
|
|||
Subproject commit 8db09231c448b913ae905d5237ce2eca46e3fe87
|
||||
Subproject commit 37090c74cc6e680f2bc334cac8fd182f7634a1f6
|
2
externals/toml11
vendored
2
externals/toml11
vendored
|
@ -1 +1 @@
|
|||
Subproject commit cc0bee4fd46ea1f5db147d63ea545208cc9e8405
|
||||
Subproject commit 4b740127230472779c4a4d71e1a75aaa3a367a2d
|
2
externals/xbyak
vendored
2
externals/xbyak
vendored
|
@ -1 +1 @@
|
|||
Subproject commit aabb091ae37068498751fd58202a9854408ecb0e
|
||||
Subproject commit ccdf68421bc8eb85693f573080fc0a5faad862db
|
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "common/types.h"
|
||||
|
||||
namespace Core::Loader {
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <vector>
|
||||
#include <pthread.h>
|
||||
#include <sched.h>
|
||||
|
||||
#include "common/types.h"
|
||||
|
||||
namespace Core::Loader {
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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 {
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <functional>
|
||||
|
||||
#include "common/logging/log.h"
|
||||
#include "core/loader/elf.h"
|
||||
#include "core/loader/symbols_resolver.h"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "common/types.h"
|
||||
#include "playgo_types.h"
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "common/types.h"
|
||||
|
||||
namespace Core::Loader {
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "common/types.h"
|
||||
|
||||
namespace Core::Loader {
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <string_view>
|
||||
|
||||
#include "common/assert.h"
|
||||
#include "common/types.h"
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
915
src/qt_gui/translations/ar.ts
Normal file
915
src/qt_gui/translations/ar.ts
Normal 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>
|
899
src/qt_gui/translations/fa_IR.ts
Normal file
899
src/qt_gui/translations/fa_IR.ts
Normal 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'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'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>
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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__
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -30,8 +30,8 @@ public:
|
|||
const ComputePipeline* GetComputePipeline();
|
||||
|
||||
private:
|
||||
void RefreshGraphicsKey();
|
||||
void RefreshComputeKey();
|
||||
bool RefreshGraphicsKey();
|
||||
bool RefreshComputeKey();
|
||||
|
||||
private:
|
||||
const Instance& instance;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue