diff --git a/.github/linux-appimage-qt.sh b/.github/linux-appimage-qt.sh
index 87017245..203d214e 100755
--- a/.github/linux-appimage-qt.sh
+++ b/.github/linux-appimage-qt.sh
@@ -19,8 +19,12 @@ chmod a+x linuxdeploy-x86_64.AppImage
chmod a+x linuxdeploy-plugin-qt-x86_64.AppImage
chmod a+x linuxdeploy-plugin-checkrt-x86_64.sh
+
# Build AppImage
./linuxdeploy-x86_64.AppImage --appdir AppDir
./linuxdeploy-plugin-checkrt-x86_64.sh --appdir AppDir
+
+cp -a "$GITHUB_WORKSPACE/build/translations" AppDir/usr/bin
+
./linuxdeploy-x86_64.AppImage --appdir AppDir -d "$GITHUB_WORKSPACE"/.github/shadps4.desktop -e "$GITHUB_WORKSPACE"/build/shadps4 -i "$GITHUB_WORKSPACE"/.github/shadps4.png --plugin qt --output appimage
mv Shadps4-x86_64.AppImage Shadps4-qt.AppImage
diff --git a/.github/workflows/linux-qt.yml b/.github/workflows/linux-qt.yml
index 5611ae50..26b80d68 100644
--- a/.github/workflows/linux-qt.yml
+++ b/.github/workflows/linux-qt.yml
@@ -23,7 +23,7 @@ jobs:
- name: Install misc packages
run: >
- sudo apt-get update && sudo apt install libx11-dev libxext-dev libwayland-dev libfuse2 clang build-essential qt6-base-dev
+ sudo apt-get update && sudo apt install libx11-dev libxext-dev libwayland-dev libfuse2 clang build-essential qt6-base-dev qt6-tools-dev
- name: Configure CMake
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DENABLE_QT_GUI=ON
diff --git a/.github/workflows/macos-qt.yml b/.github/workflows/macos-qt.yml
index 4b3672df..def98ea3 100644
--- a/.github/workflows/macos-qt.yml
+++ b/.github/workflows/macos-qt.yml
@@ -38,7 +38,7 @@ jobs:
host: mac
target: desktop
arch: clang_64
- archives: qtbase
+ archives: qtbase qttools
- name: Configure CMake
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_OSX_ARCHITECTURES=x86_64 -DENABLE_QT_GUI=ON
@@ -50,6 +50,7 @@ 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 .
diff --git a/.github/workflows/windows-qt.yml b/.github/workflows/windows-qt.yml
index 06a16eb5..70c33ebe 100644
--- a/.github/workflows/windows-qt.yml
+++ b/.github/workflows/windows-qt.yml
@@ -28,7 +28,7 @@ jobs:
host: windows
target: desktop
arch: win64_msvc2019_64
- archives: qtbase
+ archives: qtbase qttools
- name: Configure CMake
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -T ClangCL -DENABLE_QT_GUI=ON
@@ -40,6 +40,7 @@ jobs:
run: |
mkdir upload
move build/Release/shadPS4.exe upload
+ move build/translations upload
windeployqt --dir upload upload/shadPS4.exe
- name: Upload executable
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 805d3370..63bfd8d1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -66,9 +66,8 @@ git_branch_name(GIT_BRANCH)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/common/scm_rev.cpp.in" "${CMAKE_CURRENT_SOURCE_DIR}/src/common/scm_rev.cpp" @ONLY)
find_package(Boost 1.84.0 CONFIG)
-find_package(cryptopp 8.9.0 MODULE)
find_package(FFmpeg 5.1.2 MODULE)
-find_package(fmt 10.2.1 CONFIG)
+find_package(fmt 10.2.0 CONFIG)
find_package(glslang 14.2.0 CONFIG)
find_package(magic_enum 0.9.6 CONFIG)
find_package(RenderDoc 1.6.0 MODULE)
@@ -79,8 +78,12 @@ find_package(VulkanHeaders 1.3.289 CONFIG)
find_package(VulkanMemoryAllocator 3.1.0 CONFIG)
find_package(xbyak 7.07 CONFIG)
find_package(xxHash 0.8.2 MODULE)
-find_package(zlib-ng 2.2.0 MODULE)
-find_package(Zydis 4.1.0 CONFIG)
+find_package(zlib-ng 2.1.7 MODULE)
+find_package(Zydis 5.0.0 CONFIG)
+
+if (NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR NOT MSVC)
+ find_package(cryptopp 8.9.0 MODULE)
+endif()
if (APPLE)
find_package(date 3.0.1 CONFIG)
@@ -110,11 +113,27 @@ add_subdirectory(externals)
include_directories(src)
if(ENABLE_QT_GUI)
- find_package(Qt6 REQUIRED COMPONENTS Widgets Concurrent Network)
+ find_package(Qt6 REQUIRED COMPONENTS Widgets Concurrent LinguistTools Network)
qt_standard_project_setup()
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
+
+ set(QT_TRANSLATIONS "${PROJECT_SOURCE_DIR}/src/qt_gui/translations")
+ file(GLOB_RECURSE TRANSLATIONS_TS ${QT_TRANSLATIONS}/*.ts)
+
+ set_source_files_properties(${TRANSLATIONS_TS} PROPERTIES OUTPUT_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/translations")
+ qt_add_translation(TRANSLATIONS_QM ${TRANSLATIONS_TS})
+
+ set(TRANSLATIONS_QRC ${CMAKE_CURRENT_BINARY_DIR}/translations/translations.qrc)
+ file(WRITE ${TRANSLATIONS_QRC} "\n")
+ foreach (QM ${TRANSLATIONS_QM})
+ get_filename_component(QM_FILE ${QM} NAME)
+ file(APPEND ${TRANSLATIONS_QRC} "${QM_FILE}\n")
+ endforeach (QM)
+ file(APPEND ${TRANSLATIONS_QRC} "")
+
+ qt_add_resources(TRANSLATIONS ${TRANSLATIONS_QRC})
endif()
set(AUDIO_CORE src/audio_core/sdl_audio.cpp
@@ -433,7 +452,7 @@ set(SHADER_RECOMPILER src/shader_recompiler/exception.h
src/shader_recompiler/frontend/opcodes.h
src/shader_recompiler/frontend/structured_control_flow.cpp
src/shader_recompiler/frontend/structured_control_flow.h
- src/shader_recompiler/ir/passes/constant_propogation_pass.cpp
+ src/shader_recompiler/ir/passes/constant_propagation_pass.cpp
src/shader_recompiler/ir/passes/dead_code_elimination_pass.cpp
src/shader_recompiler/ir/passes/identity_removal_pass.cpp
src/shader_recompiler/ir/passes/ir_passes.h
@@ -471,6 +490,7 @@ set(VIDEO_CORE src/video_core/amdgpu/liverpool.cpp
src/video_core/amdgpu/pm4_cmds.h
src/video_core/amdgpu/pm4_opcodes.h
src/video_core/amdgpu/resource.h
+ src/video_core/amdgpu/default_context.cpp
src/video_core/buffer_cache/buffer.cpp
src/video_core/buffer_cache/buffer.h
src/video_core/buffer_cache/buffer_cache.cpp
@@ -577,6 +597,7 @@ set(QT_GUI src/qt_gui/about_dialog.cpp
src/qt_gui/main.cpp
${EMULATOR}
${RESOURCE_FILES}
+ ${TRANSLATIONS}
)
endif()
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index a428598c..cdda7c8c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -69,7 +69,7 @@ enum class SomeEnum {
* Note that the asterisks are indented by one space to align to the first line.
*/
struct Position {
- // Always intitialize member variables!
+ // Always initialize member variables!
int x{};
int y{};
};
diff --git a/README.md b/README.md
index 542acca9..c99142c7 100644
--- a/README.md
+++ b/README.md
@@ -32,27 +32,30 @@ SPDX-License-Identifier: GPL-2.0-or-later
-# shadPS4
+# General information
-shadPS4 is an early **PlayStation 4** emulator for **Windows**, **Linux** and **macOS** written in C++
+shadPS4 is an early **PlayStation 4** emulator for **Windows**, **Linux** and **macOS** written in C++.
If you encounter problems or have doubts, do not hesitate to look at the [**Quickstart**](https://github.com/shadps4-emu/shadPS4/blob/main/documents/Quickstart/Quickstart.md).
To verify that a game works, you can look at [**shadPS4 Game Compatibility**](https://github.com/shadps4-emu/shadps4-game-compatibility).
-To discuss shadPS4 development or suggest ideas, join the [**Discord server**](https://discord.gg/MyZRaBngxA).
+To discuss shadPS4 development, suggest ideas or to ask for help, join our [**Discord server**](https://discord.gg/MyZRaBngxA).
-To get the latest news, go to our [**X (twitter)**](https://x.com/shadps4) or our [**website**](https://shadps4.net/).
+To get the latest news, go to our [**X (Twitter)**](https://x.com/shadps4) or our [**website**](https://shadps4.net/).
# Status
-In development, small games are working like [**Sonic Mania**](https://www.youtube.com/watch?v=AAHoNzhHyCU), [**Undertale**](https://youtu.be/5zIvdy65Ro4), [**Dysmantle**](https://youtu.be/b9xzhLBdESE) and others...
+> [!IMPORTANT]
+> shadPS4 is early in developement, don't expect a flawless experience.
+
+Currently, the emulator successfully runs small games like [**Sonic Mania**](https://www.youtube.com/watch?v=AAHoNzhHyCU), [**Undertale**](https://youtu.be/5zIvdy65Ro4) and it can even *somewhat* run [**Bloodborne**](https://www.youtube.com/watch?v=wC6s0avpQRE).
# Why
-The project started as a fun project. Due to limited free time, it will probably take a while before shadPS4 is able to run anything decent, but we're trying to make small, regular commits.
+This project began as a fun project. Given our limited free time, it may take some time before shadPS4 can run more complex games, but we're committed to making small, regular updates.
-# Build
+# Building
## Windows
@@ -62,7 +65,7 @@ Check the build instructions for [**Windows**](https://github.com/shadps4-emu/sh
Check the build instructions for [**Linux**](https://github.com/shadps4-emu/shadPS4/blob/main/documents/building-linux.md).
-## Build status
+## Building status
Windows
@@ -95,9 +98,12 @@ Check the build instructions for [**Linux**](https://github.com/shadps4-emu/shad
For more information on how to test, debug and report issues with the emulator or games, read the [Debugging documentation](https://github.com/shadps4-emu/shadPS4/blob/main/documents/Debugging/Debugging.md).
-# Keyboard Mapping
+# Keyboard mapping
-| Controller button | Keyboard |
+> [!NOTE]
+> Xbox and DualShock controllers work out of the box.
+
+| Controller button | Keyboard equivelant |
|-------------|-------------|
LEFT AXIS UP | W |
LEFT AXIS DOWN | S |
@@ -154,4 +160,4 @@ Open a PR and we'll check it :)
# License
-- [**GPL-2.0 license**](https://github.com/shadps4-emu/shadPS4/blob/main/LICENSE)
\ No newline at end of file
+- [**GPL-2.0 license**](https://github.com/shadps4-emu/shadPS4/blob/main/LICENSE)
diff --git a/scripts/aerolib.inl b/scripts/aerolib.inl
index a87c3cc4..64ee32ea 100644
--- a/scripts/aerolib.inl
+++ b/scripts/aerolib.inl
@@ -114108,7 +114108,7 @@ STUB(
_ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124RequestCompetitiveResultEE7add_refEv)
STUB("efPahl2FufA",
_ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V35Error8fromJsonERKNS_4Json5ValueE)
-STUB("efX3lrPwdKA", sceAppContentAddcontMountByEntitlemetId)
+STUB("efX3lrPwdKA", sceAppContentAddcontMountByEntitlementId)
STUB("efXnxYFN5oE", _ZNSt11range_errorD0Ev)
STUB("efcwuDLsAM0", _ZThn120_NK7WebCore16HTMLMediaElement5mutedEv)
STUB("efhGArzWdxE", _ZN7bmalloc6IsoTLS15s_didInitializeE)
@@ -129493,7 +129493,7 @@ STUB(
STUB("kJlYH5uMAWI", sceNetResolverDestroy)
STUB("kJmdxo4uM+8",
_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo)
-STUB("kJmjt81mXKQ", sceAppContentAddcontEnqueueDownloadByEntitlemetId)
+STUB("kJmjt81mXKQ", sceAppContentAddcontEnqueueDownloadByEntitlementId)
STUB(
"kJoY9lMIFzY",
_ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_21AdvancedPlayerProfile2V138MatchCompletionRateDisconnectedMetricsEEEEmmEi)
diff --git a/scripts/ps4_names.txt b/scripts/ps4_names.txt
index caad2b4d..6f95cc73 100644
--- a/scripts/ps4_names.txt
+++ b/scripts/ps4_names.txt
@@ -80897,10 +80897,10 @@ sceAppCheckerExecute
sceAppCheckerExecuteEx
sceAppContentAddcontDelete
sceAppContentAddcontEnqueueDownload
-sceAppContentAddcontEnqueueDownloadByEntitlemetId
+sceAppContentAddcontEnqueueDownloadByEntitlementId
sceAppContentAddcontEnqueueDownloadSp
sceAppContentAddcontMount
-sceAppContentAddcontMountByEntitlemetId
+sceAppContentAddcontMountByEntitlementId
sceAppContentAddcontShrink
sceAppContentAddcontUnmount
sceAppContentAppParamGetInt
diff --git a/src/audio_core/sdl_audio.h b/src/audio_core/sdl_audio.h
index 7844bd61..07e82145 100644
--- a/src/audio_core/sdl_audio.h
+++ b/src/audio_core/sdl_audio.h
@@ -22,15 +22,15 @@ public:
private:
struct PortOut {
- bool isOpen = false;
- int type = 0;
+ SDL_AudioStream* stream = nullptr;
u32 samples_num = 0;
- u8 sample_size = 0;
u32 freq = 0;
u32 format = -1;
+ int type = 0;
int channels_num = 0;
int volume[8] = {};
- SDL_AudioStream* stream = nullptr;
+ u8 sample_size = 0;
+ bool isOpen = false;
};
std::shared_mutex m_mutex;
std::array portsOut; // main up to 8 ports , BGM 1 port , voice up to 4 ports ,
diff --git a/src/common/config.cpp b/src/common/config.cpp
index ddd1d325..9f55cbd4 100644
--- a/src/common/config.cpp
+++ b/src/common/config.cpp
@@ -45,6 +45,7 @@ u32 m_window_size_H = 720;
std::vector m_pkg_viewer;
std::vector m_elf_viewer;
std::vector m_recent_files;
+std::string emulator_language = "en";
// Settings
u32 m_language = 1; // english
@@ -214,10 +215,10 @@ void setIconSize(u32 size) {
void setIconSizeGrid(u32 size) {
m_icon_size_grid = size;
}
-void setSliderPositon(u32 pos) {
+void setSliderPosition(u32 pos) {
m_slider_pos = pos;
}
-void setSliderPositonGrid(u32 pos) {
+void setSliderPositionGrid(u32 pos) {
m_slider_pos_grid = pos;
}
void setTableMode(u32 mode) {
@@ -242,6 +243,10 @@ void setRecentFiles(const std::vector& recentFiles) {
m_recent_files = recentFiles;
}
+void setEmulatorLanguage(std::string language) {
+ emulator_language = language;
+}
+
u32 getMainWindowGeometryX() {
return main_window_geometry_x;
}
@@ -266,10 +271,10 @@ u32 getIconSize() {
u32 getIconSizeGrid() {
return m_icon_size_grid;
}
-u32 getSliderPositon() {
+u32 getSliderPosition() {
return m_slider_pos;
}
-u32 getSliderPositonGrid() {
+u32 getSliderPositionGrid() {
return m_slider_pos_grid;
}
u32 getTableMode() {
@@ -291,6 +296,10 @@ std::vector getRecentFiles() {
return m_recent_files;
}
+std::string getEmulatorLanguage() {
+ return emulator_language;
+}
+
u32 GetLanguage() {
return m_language;
}
@@ -368,6 +377,7 @@ void load(const std::filesystem::path& path) {
m_elf_viewer = toml::find_or>(gui, "elfDirs", {});
m_recent_files = toml::find_or>(gui, "recentFiles", {});
m_table_mode = toml::find_or(gui, "gameTableMode", 0);
+ emulator_language = toml::find_or(gui, "emulatorLanguage", "en");
}
if (data.contains("Settings")) {
@@ -430,6 +440,7 @@ void save(const std::filesystem::path& path) {
data["GUI"]["pkgDirs"] = m_pkg_viewer;
data["GUI"]["elfDirs"] = m_elf_viewer;
data["GUI"]["recentFiles"] = m_recent_files;
+ data["GUI"]["emulatorLanguage"] = emulator_language;
data["Settings"]["consoleLanguage"] = m_language;
@@ -454,6 +465,7 @@ void setDefaultValues() {
vblankDivider = 1;
vkValidation = false;
rdocEnable = false;
+ emulator_language = "en";
m_language = 1;
gpuId = -1;
}
diff --git a/src/common/config.h b/src/common/config.h
index 9bf91e69..554515a4 100644
--- a/src/common/config.h
+++ b/src/common/config.h
@@ -61,14 +61,15 @@ void setGameInstallDir(const std::string& dir);
void setMainWindowTheme(u32 theme);
void setIconSize(u32 size);
void setIconSizeGrid(u32 size);
-void setSliderPositon(u32 pos);
-void setSliderPositonGrid(u32 pos);
+void setSliderPosition(u32 pos);
+void setSliderPositionGrid(u32 pos);
void setTableMode(u32 mode);
void setMainWindowWidth(u32 width);
void setMainWindowHeight(u32 height);
void setPkgViewer(const std::vector& pkgList);
void setElfViewer(const std::vector& elfList);
void setRecentFiles(const std::vector& recentFiles);
+void setEmulatorLanguage(std::string language);
u32 getMainWindowGeometryX();
u32 getMainWindowGeometryY();
@@ -78,14 +79,15 @@ std::string getGameInstallDir();
u32 getMainWindowTheme();
u32 getIconSize();
u32 getIconSizeGrid();
-u32 getSliderPositon();
-u32 getSliderPositonGrid();
+u32 getSliderPosition();
+u32 getSliderPositionGrid();
u32 getTableMode();
u32 getMainWindowWidth();
u32 getMainWindowHeight();
std::vector getPkgViewer();
std::vector getElfViewer();
std::vector getRecentFiles();
+std::string getEmulatorLanguage();
void setDefaultValues();
diff --git a/src/common/debug.h b/src/common/debug.h
index 50022a15..596ad7b8 100644
--- a/src/common/debug.h
+++ b/src/common/debug.h
@@ -29,7 +29,7 @@ static inline bool IsProfilerConnected() {
#define TRACK_ALLOC(ptr, size, pool) TracyAllocN(std::bit_cast(ptr), (size), (pool))
#define TRACK_FREE(ptr, pool) TracyFreeN(std::bit_cast(ptr), (pool))
-enum MarkersPallete : int {
+enum MarkersPalette : int {
EmulatorMarkerColor = 0x264653,
RendererMarkerColor = 0x2a9d8f,
HleMarkerColor = 0xe9c46a,
diff --git a/src/common/native_clock.cpp b/src/common/native_clock.cpp
index 20d0737a..c3fa637a 100644
--- a/src/common/native_clock.cpp
+++ b/src/common/native_clock.cpp
@@ -18,16 +18,16 @@ NativeClock::NativeClock()
us_rdtsc_factor{GetFixedPoint64Factor(std::micro::den, rdtsc_frequency)},
ms_rdtsc_factor{GetFixedPoint64Factor(std::milli::den, rdtsc_frequency)} {}
-u64 NativeClock::GetTimeNS() const {
- return MultiplyHigh(GetUptime(), ns_rdtsc_factor);
+u64 NativeClock::GetTimeNS(u64 base_ptc /*= 0*/) const {
+ return MultiplyHigh(GetUptime() - base_ptc, ns_rdtsc_factor);
}
-u64 NativeClock::GetTimeUS() const {
- return MultiplyHigh(GetUptime(), us_rdtsc_factor);
+u64 NativeClock::GetTimeUS(u64 base_ptc /*= 0*/) const {
+ return MultiplyHigh(GetUptime() - base_ptc, us_rdtsc_factor);
}
-u64 NativeClock::GetTimeMS() const {
- return MultiplyHigh(GetUptime(), ms_rdtsc_factor);
+u64 NativeClock::GetTimeMS(u64 base_ptc /*= 0*/) const {
+ return MultiplyHigh(GetUptime() - base_ptc, ms_rdtsc_factor);
}
u64 NativeClock::GetUptime() const {
diff --git a/src/common/native_clock.h b/src/common/native_clock.h
index 227c8d1a..b5e38945 100644
--- a/src/common/native_clock.h
+++ b/src/common/native_clock.h
@@ -16,9 +16,9 @@ public:
return rdtsc_frequency;
}
- u64 GetTimeNS() const;
- u64 GetTimeUS() const;
- u64 GetTimeMS() const;
+ u64 GetTimeNS(u64 base_ptc = 0) const;
+ u64 GetTimeUS(u64 base_ptc = 0) const;
+ u64 GetTimeMS(u64 base_ptc = 0) const;
u64 GetUptime() const;
u64 GetProcessTimeUS() const;
diff --git a/src/common/slot_vector.h b/src/common/slot_vector.h
index f0982e29..36e64797 100644
--- a/src/common/slot_vector.h
+++ b/src/common/slot_vector.h
@@ -28,9 +28,13 @@ struct SlotId {
template
class SlotVector {
- constexpr static std::size_t InitialCapacity = 1024;
+ constexpr static std::size_t InitialCapacity = 2048;
public:
+ SlotVector() {
+ Reserve(InitialCapacity);
+ }
+
~SlotVector() noexcept {
std::size_t index = 0;
for (u64 bits : stored_bitset) {
@@ -67,19 +71,6 @@ public:
return SlotId{index};
}
- template
- [[nodiscard]] SlotId swap_and_insert(SlotId existing_id, Args&&... args) noexcept {
- const u32 index = FreeValueIndex();
- T& existing_value = values[existing_id.index].object;
-
- new (&values[index].object) T(std::move(existing_value));
- existing_value.~T();
- new (&values[existing_id.index].object) T(std::forward(args)...);
- SetStorageBit(index);
-
- return SlotId{index};
- }
-
void erase(SlotId id) noexcept {
values[id.index].object.~T();
free_list.push_back(id.index);
@@ -151,7 +142,8 @@ private:
const std::size_t old_free_size = free_list.size();
free_list.resize(old_free_size + (new_capacity - values_capacity));
- std::iota(free_list.begin() + old_free_size, free_list.end(),
+ const std::size_t new_free_size = free_list.size();
+ std::iota(free_list.rbegin(), free_list.rbegin() + new_free_size - old_free_size,
static_cast(values_capacity));
delete[] values;
diff --git a/src/core/aerolib/aerolib.inl b/src/core/aerolib/aerolib.inl
index a87c3cc4..64ee32ea 100644
--- a/src/core/aerolib/aerolib.inl
+++ b/src/core/aerolib/aerolib.inl
@@ -114108,7 +114108,7 @@ STUB(
_ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124RequestCompetitiveResultEE7add_refEv)
STUB("efPahl2FufA",
_ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V35Error8fromJsonERKNS_4Json5ValueE)
-STUB("efX3lrPwdKA", sceAppContentAddcontMountByEntitlemetId)
+STUB("efX3lrPwdKA", sceAppContentAddcontMountByEntitlementId)
STUB("efXnxYFN5oE", _ZNSt11range_errorD0Ev)
STUB("efcwuDLsAM0", _ZThn120_NK7WebCore16HTMLMediaElement5mutedEv)
STUB("efhGArzWdxE", _ZN7bmalloc6IsoTLS15s_didInitializeE)
@@ -129493,7 +129493,7 @@ STUB(
STUB("kJlYH5uMAWI", sceNetResolverDestroy)
STUB("kJmdxo4uM+8",
_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo)
-STUB("kJmjt81mXKQ", sceAppContentAddcontEnqueueDownloadByEntitlemetId)
+STUB("kJmjt81mXKQ", sceAppContentAddcontEnqueueDownloadByEntitlementId)
STUB(
"kJoY9lMIFzY",
_ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_21AdvancedPlayerProfile2V138MatchCompletionRateDisconnectedMetricsEEEEmmEi)
diff --git a/src/core/aerolib/stubs.cpp b/src/core/aerolib/stubs.cpp
index 5e2d55cd..2634fc46 100644
--- a/src/core/aerolib/stubs.cpp
+++ b/src/core/aerolib/stubs.cpp
@@ -13,7 +13,7 @@ namespace Core::AeroLib {
// on lookup, setting up the nid_entry they are matched with
//
// If it runs out of stubs with name information, it will return
-// a default implemetnation without function name details
+// a default implementation without function name details
// Up to 512, larger values lead to more resolve stub slots
// and to longer compile / CI times
diff --git a/src/core/crypto/crypto.cpp b/src/core/crypto/crypto.cpp
index 630faa34..fc64edc2 100644
--- a/src/core/crypto/crypto.cpp
+++ b/src/core/crypto/crypto.cpp
@@ -51,8 +51,8 @@ CryptoPP::RSA::PrivateKey Crypto::DebugRifKeyset_init() {
params.SetPrime2(
CryptoPP::Integer(DebugRifKeyset_keyset.Prime2, sizeof(DebugRifKeyset_keyset.Prime2)));
- params.SetPublicExponent(CryptoPP::Integer(DebugRifKeyset_keyset.PrivateExponent,
- sizeof(DebugRifKeyset_keyset.PrivateExponent)));
+ params.SetPublicExponent(CryptoPP::Integer(DebugRifKeyset_keyset.PublicExponent,
+ sizeof(DebugRifKeyset_keyset.PublicExponent)));
params.SetPrivateExponent(CryptoPP::Integer(DebugRifKeyset_keyset.PrivateExponent,
sizeof(DebugRifKeyset_keyset.PrivateExponent)));
diff --git a/src/core/file_format/pkg.cpp b/src/core/file_format/pkg.cpp
index 336d8101..fe3c3454 100644
--- a/src/core/file_format/pkg.cpp
+++ b/src/core/file_format/pkg.cpp
@@ -279,8 +279,8 @@ bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem::
}
}
- // let's deal with the root/uroot enteries here.
- // Sometimes it's more than 2 enteries (Tomb Raider Remastered)
+ // let's deal with the root/uroot entries here.
+ // Sometimes it's more than 2 entries (Tomb Raider Remastered)
const std::string_view flat_path_table(&decompressedData[0x10], 15);
if (flat_path_table == "flat_path_table") {
uroot_reached = true;
diff --git a/src/core/file_sys/fs.cpp b/src/core/file_sys/fs.cpp
index 40d8212b..199e42a0 100644
--- a/src/core/file_sys/fs.cpp
+++ b/src/core/file_sys/fs.cpp
@@ -48,7 +48,7 @@ std::filesystem::path MntPoints::GetHostPath(std::string_view guest_directory) {
pos = mount->mount.size() + 1;
const auto rel_path = std::string_view(corrected_path).substr(pos);
const auto host_path = mount->host_path / rel_path;
- if (!NeedsCaseInsensiveSearch) {
+ if (!NeedsCaseInsensitiveSearch) {
return host_path;
}
diff --git a/src/core/file_sys/fs.h b/src/core/file_sys/fs.h
index b0fb6324..2c55b051 100644
--- a/src/core/file_sys/fs.h
+++ b/src/core/file_sys/fs.h
@@ -14,9 +14,9 @@ namespace Core::FileSys {
class MntPoints {
#ifdef _WIN64
- static constexpr bool NeedsCaseInsensiveSearch = false;
+ static constexpr bool NeedsCaseInsensitiveSearch = false;
#else
- static constexpr bool NeedsCaseInsensiveSearch = true;
+ static constexpr bool NeedsCaseInsensitiveSearch = true;
#endif
public:
struct MntPair {
diff --git a/src/core/libraries/app_content/app_content.cpp b/src/core/libraries/app_content/app_content.cpp
index 882f99e4..ab3c901a 100644
--- a/src/core/libraries/app_content/app_content.cpp
+++ b/src/core/libraries/app_content/app_content.cpp
@@ -221,12 +221,12 @@ int PS4_SYSV_ABI Func_C59A36FF8D7C59DA() {
return ORBIS_OK;
}
-int PS4_SYSV_ABI sceAppContentAddcontEnqueueDownloadByEntitlemetId() {
+int PS4_SYSV_ABI sceAppContentAddcontEnqueueDownloadByEntitlementId() {
LOG_ERROR(Lib_AppContent, "(STUBBED) called");
return ORBIS_OK;
}
-int PS4_SYSV_ABI sceAppContentAddcontMountByEntitlemetId() {
+int PS4_SYSV_ABI sceAppContentAddcontMountByEntitlementId() {
LOG_ERROR(Lib_AppContent, "(STUBBED) called");
return ORBIS_OK;
}
@@ -313,9 +313,9 @@ void RegisterlibSceAppContent(Core::Loader::SymbolsResolver* sym) {
LIB_FUNCTION("xZo2-418Wdo", "libSceAppContentBundle", 1, "libSceAppContent", 1, 1,
Func_C59A36FF8D7C59DA);
LIB_FUNCTION("kJmjt81mXKQ", "libSceAppContentIro", 1, "libSceAppContent", 1, 1,
- sceAppContentAddcontEnqueueDownloadByEntitlemetId);
+ sceAppContentAddcontEnqueueDownloadByEntitlementId);
LIB_FUNCTION("efX3lrPwdKA", "libSceAppContentIro", 1, "libSceAppContent", 1, 1,
- sceAppContentAddcontMountByEntitlemetId);
+ sceAppContentAddcontMountByEntitlementId);
LIB_FUNCTION("z9hgjLd1SGA", "libSceAppContentIro", 1, "libSceAppContent", 1, 1,
sceAppContentGetAddcontInfoByEntitlementId);
LIB_FUNCTION("3wUaDTGmjcQ", "libSceAppContentIro", 1, "libSceAppContent", 1, 1,
diff --git a/src/core/libraries/app_content/app_content.h b/src/core/libraries/app_content/app_content.h
index ecf69199..3e6f9b54 100644
--- a/src/core/libraries/app_content/app_content.h
+++ b/src/core/libraries/app_content/app_content.h
@@ -92,8 +92,8 @@ int PS4_SYSV_ABI sceAppContentTemporaryDataMount2(OrbisAppContentTemporaryDataOp
int PS4_SYSV_ABI sceAppContentTemporaryDataUnmount();
int PS4_SYSV_ABI sceAppContentGetPftFlag();
int PS4_SYSV_ABI Func_C59A36FF8D7C59DA();
-int PS4_SYSV_ABI sceAppContentAddcontEnqueueDownloadByEntitlemetId();
-int PS4_SYSV_ABI sceAppContentAddcontMountByEntitlemetId();
+int PS4_SYSV_ABI sceAppContentAddcontEnqueueDownloadByEntitlementId();
+int PS4_SYSV_ABI sceAppContentAddcontMountByEntitlementId();
int PS4_SYSV_ABI sceAppContentGetAddcontInfoByEntitlementId();
int PS4_SYSV_ABI sceAppContentGetAddcontInfoListByIroTag();
int PS4_SYSV_ABI sceAppContentGetDownloadedStoreCountry();
diff --git a/src/core/libraries/avplayer/avplayer.cpp b/src/core/libraries/avplayer/avplayer.cpp
index bd1f6b50..406583a8 100644
--- a/src/core/libraries/avplayer/avplayer.cpp
+++ b/src/core/libraries/avplayer/avplayer.cpp
@@ -40,9 +40,11 @@ int PS4_SYSV_ABI sceAvPlayerChangeStream() {
s32 PS4_SYSV_ABI sceAvPlayerClose(SceAvPlayerHandle handle) {
LOG_TRACE(Lib_AvPlayer, "called");
if (handle == nullptr) {
+ LOG_TRACE(Lib_AvPlayer, "returning ORBIS_AVPLAYER_ERROR_INVALID_PARAMS");
return ORBIS_AVPLAYER_ERROR_INVALID_PARAMS;
}
delete handle;
+ LOG_TRACE(Lib_AvPlayer, "returning ORBIS_OK");
return ORBIS_OK;
}
@@ -257,6 +259,7 @@ s32 PS4_SYSV_ABI sceAvPlayerStart(SceAvPlayerHandle handle) {
s32 PS4_SYSV_ABI sceAvPlayerStop(SceAvPlayerHandle handle) {
LOG_TRACE(Lib_AvPlayer, "called");
if (handle == nullptr) {
+ LOG_TRACE(Lib_AvPlayer, "returning ORBIS_AVPLAYER_ERROR_INVALID_PARAMS");
return ORBIS_AVPLAYER_ERROR_INVALID_PARAMS;
}
const auto res = handle->Stop();
diff --git a/src/core/libraries/avplayer/avplayer_source.cpp b/src/core/libraries/avplayer/avplayer_source.cpp
index 2fc360a0..2e4ea8aa 100644
--- a/src/core/libraries/avplayer/avplayer_source.cpp
+++ b/src/core/libraries/avplayer/avplayer_source.cpp
@@ -5,6 +5,7 @@
#include "avplayer_file_streamer.h"
+#include "common/alignment.h"
#include "common/singleton.h"
#include "core/file_sys/fs.h"
#include "core/libraries/kernel/time_management.h"
@@ -111,8 +112,8 @@ s32 AvPlayerSource::GetStreamInfo(u32 stream_index, SceAvPlayerStreamInfo& info)
LOG_INFO(Lib_AvPlayer, "Stream {} is a video stream.", stream_index);
info.details.video.aspect_ratio =
f32(p_stream->codecpar->width) / p_stream->codecpar->height;
- info.details.video.width = p_stream->codecpar->width;
- info.details.video.height = p_stream->codecpar->height;
+ info.details.video.width = Common::AlignUp(u32(p_stream->codecpar->width), 16);
+ info.details.video.height = Common::AlignUp(u32(p_stream->codecpar->height), 16);
if (p_lang_node != nullptr) {
std::memcpy(info.details.video.language_code, p_lang_node->value,
std::min(strlen(p_lang_node->value), size_t(3)));
@@ -167,8 +168,9 @@ bool AvPlayerSource::EnableStream(u32 stream_index) {
LOG_ERROR(Lib_AvPlayer, "Could not open avcodec for video stream {}.", stream_index);
return false;
}
- const auto width = m_video_codec_context->width;
- const auto size = (width * m_video_codec_context->height * 3) / 2;
+ const auto width = Common::AlignUp(u32(m_video_codec_context->width), 16);
+ const auto height = Common::AlignUp(u32(m_video_codec_context->height), 16);
+ const auto size = (width * height * 3) / 2;
for (u64 index = 0; index < m_num_output_video_framebuffers; ++index) {
m_video_buffers.Push(FrameBuffer(m_memory_replacement, 0x100, size));
}
@@ -284,11 +286,6 @@ bool AvPlayerSource::GetVideoData(SceAvPlayerFrameInfo& video_info) {
return true;
}
-static void CopyNV12Data(u8* dst, const AVFrame& src) {
- std::memcpy(dst, src.data[0], src.width * src.height);
- std::memcpy(dst + src.width * src.height, src.data[1], (src.width * src.height) / 2);
-}
-
bool AvPlayerSource::GetVideoData(SceAvPlayerFrameInfoEx& video_info) {
if (!IsActive()) {
return false;
@@ -493,13 +490,17 @@ AvPlayerSource::AVFramePtr AvPlayerSource::ConvertVideoFrame(const AVFrame& fram
nv12_frame->width = frame.width;
nv12_frame->height = frame.height;
nv12_frame->sample_aspect_ratio = frame.sample_aspect_ratio;
+ nv12_frame->crop_top = frame.crop_top;
+ nv12_frame->crop_bottom = frame.crop_bottom;
+ nv12_frame->crop_left = frame.crop_left;
+ nv12_frame->crop_right = frame.crop_right;
av_frame_get_buffer(nv12_frame.get(), 0);
if (m_sws_context == nullptr) {
m_sws_context =
SWSContextPtr(sws_getContext(frame.width, frame.height, AVPixelFormat(frame.format),
- frame.width, frame.height, AV_PIX_FMT_NV12,
+ nv12_frame->width, nv12_frame->height, AV_PIX_FMT_NV12,
SWS_FAST_BILINEAR, nullptr, nullptr, nullptr),
&ReleaseSWSContext);
}
@@ -512,6 +513,26 @@ AvPlayerSource::AVFramePtr AvPlayerSource::ConvertVideoFrame(const AVFrame& fram
return nv12_frame;
}
+static void CopyNV12Data(u8* dst, const AVFrame& src) {
+ const auto width = Common::AlignUp(u32(src.width), 16);
+ const auto height = Common::AlignUp(u32(src.height), 16);
+
+ if (src.width == width) {
+ std::memcpy(dst, src.data[0], src.width * src.height);
+ std::memcpy(dst + src.width * height, src.data[1], (src.width * src.height) / 2);
+ } else {
+ const auto luma_dst = dst;
+ for (u32 y = 0; y < src.height; ++y) {
+ std::memcpy(luma_dst + y * width, src.data[0] + y * src.width, src.width);
+ }
+ const auto chroma_dst = dst + width * height;
+ for (u32 y = 0; y < src.height / 2; ++y) {
+ std::memcpy(chroma_dst + y * (width / 2), src.data[0] + y * (src.width / 2),
+ src.width / 2);
+ }
+ }
+}
+
Frame AvPlayerSource::PrepareVideoFrame(FrameBuffer buffer, const AVFrame& frame) {
ASSERT(frame.format == AV_PIX_FMT_NV12);
@@ -525,6 +546,9 @@ Frame AvPlayerSource::PrepareVideoFrame(FrameBuffer buffer, const AVFrame& frame
const auto num = time_base.num;
const auto timestamp = (num != 0 && den > 1) ? (pkt_dts * num) / den : pkt_dts;
+ const auto width = Common::AlignUp(u32(frame.width), 16);
+ const auto height = Common::AlignUp(u32(frame.height), 16);
+
return Frame{
.buffer = std::move(buffer),
.info =
@@ -535,9 +559,14 @@ Frame AvPlayerSource::PrepareVideoFrame(FrameBuffer buffer, const AVFrame& frame
{
.video =
{
- .width = u32(frame.width),
- .height = u32(frame.height),
+ .width = u32(width),
+ .height = u32(height),
.aspect_ratio = AVRationalToF32(frame.sample_aspect_ratio),
+ .crop_left_offset = u32(frame.crop_left),
+ .crop_right_offset = u32(frame.crop_right + (width - frame.width)),
+ .crop_top_offset = u32(frame.crop_top),
+ .crop_bottom_offset =
+ u32(frame.crop_bottom + (height - frame.height)),
.pitch = u32(frame.linesize[0]),
.luma_bit_depth = 8,
.chroma_bit_depth = 8,
diff --git a/src/core/libraries/avplayer/avplayer_state.cpp b/src/core/libraries/avplayer/avplayer_state.cpp
index 884cd940..cb3be2f5 100644
--- a/src/core/libraries/avplayer/avplayer_state.cpp
+++ b/src/core/libraries/avplayer/avplayer_state.cpp
@@ -222,8 +222,11 @@ bool AvPlayerState::Stop() {
if (!SetState(AvState::Stop)) {
return false;
}
+ if (!m_up_source->Stop()) {
+ return false;
+ }
OnPlaybackStateChanged(AvState::Stop);
- return m_up_source->Stop();
+ return true;
}
bool AvPlayerState::GetVideoData(SceAvPlayerFrameInfo& video_info) {
diff --git a/src/core/libraries/gnmdriver/gnmdriver.cpp b/src/core/libraries/gnmdriver/gnmdriver.cpp
index c2ee6d59..95821a03 100644
--- a/src/core/libraries/gnmdriver/gnmdriver.cpp
+++ b/src/core/libraries/gnmdriver/gnmdriver.cpp
@@ -55,6 +55,10 @@ static constexpr auto HwInitPacketSize = 0x100u;
// clang-format off
static constexpr std::array InitSequence{
+ // A fake preamble to mimic context reset sent by FW
+ 0xc0001200u, 0u, // IT_CLEAR_STATE
+
+ // Actual init state sequence
0xc0017600u, 0x216u, 0xffffffffu,
0xc0017600u, 0x217u, 0xffffffffu,
0xc0017600u, 0x215u, 0u,
@@ -94,9 +98,13 @@ static constexpr std::array InitSequence{
0xc0036900u, 0x295u, 0x100u, 0x100u, 4u,
0xc0017900u, 0x200u, 0xe0000000u,
};
-static_assert(InitSequence.size() == 0x73);
+static_assert(InitSequence.size() == 0x73 + 2);
static constexpr std::array InitSequence175{
+ // A fake preamble to mimic context reset sent by FW
+ 0xc0001200u, 0u, // IT_CLEAR_STATE
+
+ // Actual init state sequence
0xc0017600u, 0x216u, 0xffffffffu,
0xc0017600u, 0x217u, 0xffffffffu,
0xc0017600u, 0x215u, 0u,
@@ -136,9 +144,13 @@ static constexpr std::array InitSequence175{
0xc0036900u, 0x295u, 0x100u, 0x100u, 4u,
0xc0017900u, 0x200u, 0xe0000000u,
};
-static_assert(InitSequence175.size() == 0x73);
+static_assert(InitSequence175.size() == 0x73 + 2);
static constexpr std::array InitSequence200{
+ // A fake preamble to mimic context reset sent by FW
+ 0xc0001200u, 0u, // IT_CLEAR_STATE
+
+ // Actual init state sequence
0xc0017600u, 0x216u, 0xffffffffu,
0xc0017600u, 0x217u, 0xffffffffu,
0xc0017600u, 0x215u, 0u,
@@ -179,9 +191,13 @@ static constexpr std::array InitSequence200{
0xc0036900u, 0x295u, 0x100u, 0x100u, 4u,
0xc0017900u, 0x200u, 0xe0000000u,
};
-static_assert(InitSequence200.size() == 0x76);
+static_assert(InitSequence200.size() == 0x76 + 2);
static constexpr std::array InitSequence350{
+ // A fake preamble to mimic context reset sent by FW
+ 0xc0001200u, 0u, // IT_CLEAR_STATE
+
+ // Actual init state sequence
0xc0017600u, 0x216u, 0xffffffffu,
0xc0017600u, 0x217u, 0xffffffffu,
0xc0017600u, 0x215u, 0u,
@@ -224,7 +240,7 @@ static constexpr std::array InitSequence350{
0xc0017900u, 0x200u, 0xe0000000u,
0xc0016900u, 0x2aau, 0xffu,
};
-static_assert(InitSequence350.size() == 0x7c);
+static_assert(InitSequence350.size() == 0x7c + 2);
static constexpr std::array CtxInitSequence{
0xc0012800u, 0x80000000u, 0x80000000u,
@@ -735,11 +751,11 @@ u32 PS4_SYSV_ABI sceGnmDrawInitDefaultHardwareState(u32* cmdbuf, u32 size) {
cmdbuf = ClearContextState(cmdbuf);
}
- std::memcpy(cmdbuf, InitSequence.data(), InitSequence.size() * 4);
- cmdbuf += InitSequence.size();
+ std::memcpy(cmdbuf, &InitSequence[2], (InitSequence.size() - 2) * 4);
+ cmdbuf += InitSequence.size() - 2;
const auto cmdbuf_left =
- HwInitPacketSize - InitSequence.size() - (clear_state ? 0xc : 0) - 1;
+ HwInitPacketSize - (InitSequence.size() - 2) - (clear_state ? 0xc : 0) - 1;
cmdbuf = WriteHeader(cmdbuf, cmdbuf_left);
cmdbuf = WriteBody(cmdbuf, 0u);
@@ -757,10 +773,10 @@ u32 PS4_SYSV_ABI sceGnmDrawInitDefaultHardwareState175(u32* cmdbuf, u32 size) {
}
cmdbuf = ClearContextState(cmdbuf);
- std::memcpy(cmdbuf, InitSequence175.data(), InitSequence175.size() * 4);
- cmdbuf += InitSequence175.size();
+ std::memcpy(cmdbuf, &InitSequence175[2], (InitSequence175.size() - 2) * 4);
+ cmdbuf += InitSequence175.size() - 2;
- constexpr auto cmdbuf_left = HwInitPacketSize - InitSequence175.size() - 0xc - 1;
+ constexpr auto cmdbuf_left = HwInitPacketSize - (InitSequence175.size() - 2) - 0xc - 1;
WriteTrailingNop(cmdbuf);
return HwInitPacketSize;
@@ -778,11 +794,11 @@ u32 PS4_SYSV_ABI sceGnmDrawInitDefaultHardwareState200(u32* cmdbuf, u32 size) {
cmdbuf = ClearContextState(cmdbuf);
}
- std::memcpy(cmdbuf, InitSequence200.data(), InitSequence200.size() * 4);
- cmdbuf += InitSequence200.size();
+ std::memcpy(cmdbuf, &InitSequence200[2], (InitSequence200.size() - 2) * 4);
+ cmdbuf += InitSequence200.size() - 2;
const auto cmdbuf_left =
- HwInitPacketSize - InitSequence200.size() - (clear_state ? 0xc : 0) - 1;
+ HwInitPacketSize - (InitSequence200.size() - 2) - (clear_state ? 0xc : 0) - 1;
cmdbuf = WriteHeader(cmdbuf, cmdbuf_left);
cmdbuf = WriteBody(cmdbuf, 0u);
@@ -804,11 +820,11 @@ u32 PS4_SYSV_ABI sceGnmDrawInitDefaultHardwareState350(u32* cmdbuf, u32 size) {
cmdbuf = ClearContextState(cmdbuf);
}
- std::memcpy(cmdbuf, InitSequence350.data(), InitSequence350.size() * 4);
- cmdbuf += InitSequence350.size();
+ std::memcpy(cmdbuf, &InitSequence350[2], (InitSequence350.size() - 2) * 4);
+ cmdbuf += InitSequence350.size() - 2;
const auto cmdbuf_left =
- HwInitPacketSize - InitSequence350.size() - (clear_state ? 0xc : 0) - 1;
+ HwInitPacketSize - (InitSequence350.size() - 2) - (clear_state ? 0xc : 0) - 1;
cmdbuf = WriteHeader(cmdbuf, cmdbuf_left);
cmdbuf = WriteBody(cmdbuf, 0u);
@@ -1743,7 +1759,7 @@ s32 PS4_SYSV_ABI sceGnmSetVsShader(u32* cmdbuf, u32 size, const u32* vs_regs, u3
return -1;
}
- const u32 var = shader_modifier == 0 ? vs_regs[2] : (vs_regs[2] & 0xfcfffc3f | shader_modifier);
+ const u32 var = shader_modifier == 0 ? vs_regs[2] : (vs_regs[2] & 0xfcfffc3f) | shader_modifier;
cmdbuf = PM4CmdSetData::SetShReg(cmdbuf, 0x48u, vs_regs[0], 0u); // SPI_SHADER_PGM_LO_VS
cmdbuf = PM4CmdSetData::SetShReg(cmdbuf, 0x4au, var, vs_regs[3]); // SPI_SHADER_PGM_RSRC1_VS
cmdbuf = PM4CmdSetData::SetContextReg(cmdbuf, 0x207u, vs_regs[6]); // PA_CL_VS_OUT_CNTL
diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp
index 990b11d6..f7f58df5 100644
--- a/src/core/libraries/kernel/file_system.cpp
+++ b/src/core/libraries/kernel/file_system.cpp
@@ -538,7 +538,7 @@ void fileSystemSymbolsRegister(Core::Loader::SymbolsResolver* sym) {
// openOrbis (to check if it is valid out of OpenOrbis
LIB_FUNCTION("6c3rCVE-fTU", "libkernel", 1, "libkernel", 1, 1,
- posix_open); // _open shoudld be equal to open function
+ posix_open); // _open should be equal to open function
}
} // namespace Libraries::Kernel
diff --git a/src/core/libraries/kernel/memory_management.cpp b/src/core/libraries/kernel/memory_management.cpp
index 826d4797..fbc45795 100644
--- a/src/core/libraries/kernel/memory_management.cpp
+++ b/src/core/libraries/kernel/memory_management.cpp
@@ -75,19 +75,28 @@ s32 PS4_SYSV_ABI sceKernelAvailableDirectMemorySize(u64 searchStart, u64 searchE
LOG_WARNING(Kernel_Vmm, "called searchStart = {:#x}, searchEnd = {:#x}, alignment = {:#x}",
searchStart, searchEnd, alignment);
- if (searchEnd <= searchStart) {
+ if (physAddrOut == nullptr || sizeOut == nullptr) {
return ORBIS_KERNEL_ERROR_EINVAL;
}
if (searchEnd > SCE_KERNEL_MAIN_DMEM_SIZE) {
return ORBIS_KERNEL_ERROR_EINVAL;
}
+ if (searchEnd <= searchStart) {
+ return ORBIS_KERNEL_ERROR_ENOMEM;
+ }
auto* memory = Core::Memory::Instance();
- PAddr physAddr;
- s32 result =
- memory->DirectQueryAvailable(searchStart, searchEnd, alignment, &physAddr, sizeOut);
+ PAddr physAddr{};
+ size_t size{};
+ s32 result = memory->DirectQueryAvailable(searchStart, searchEnd, alignment, &physAddr, &size);
+
+ if (size == 0) {
+ return ORBIS_KERNEL_ERROR_ENOMEM;
+ }
+
*physAddrOut = static_cast(physAddr);
+ *sizeOut = size;
return result;
}
diff --git a/src/core/libraries/kernel/memory_management.h b/src/core/libraries/kernel/memory_management.h
index 378449cc..c9dd86e1 100644
--- a/src/core/libraries/kernel/memory_management.h
+++ b/src/core/libraries/kernel/memory_management.h
@@ -6,7 +6,7 @@
#include "common/bit_field.h"
#include "common/types.h"
-constexpr u64 SCE_KERNEL_MAIN_DMEM_SIZE = 6_GB; // ~ 6GB
+constexpr u64 SCE_KERNEL_MAIN_DMEM_SIZE = 4608_MB; // ~ 4.5GB
namespace Libraries::Kernel {
diff --git a/src/core/libraries/kernel/thread_management.cpp b/src/core/libraries/kernel/thread_management.cpp
index 68953269..567fff18 100644
--- a/src/core/libraries/kernel/thread_management.cpp
+++ b/src/core/libraries/kernel/thread_management.cpp
@@ -1123,7 +1123,6 @@ int PS4_SYSV_ABI posix_pthread_join(ScePthread thread, void** res) {
}
int PS4_SYSV_ABI scePthreadDetach(ScePthread thread) {
- LOG_INFO(Kernel_Pthread, "thread create name = {}", thread->name);
thread->is_detached = true;
return ORBIS_OK;
}
diff --git a/src/core/libraries/kernel/time_management.cpp b/src/core/libraries/kernel/time_management.cpp
index 214f039b..d01b0c83 100644
--- a/src/core/libraries/kernel/time_management.cpp
+++ b/src/core/libraries/kernel/time_management.cpp
@@ -3,6 +3,7 @@
#include
#include "common/assert.h"
+#include "common/debug.h"
#include "common/native_clock.h"
#include "core/libraries/error_codes.h"
#include "core/libraries/kernel/time_management.h"
@@ -30,7 +31,8 @@ u64 PS4_SYSV_ABI sceKernelGetTscFrequency() {
}
u64 PS4_SYSV_ABI sceKernelGetProcessTime() {
- return clock->GetProcessTimeUS();
+ // TODO: this timer should support suspends, so initial ptc needs to be updated on wake up
+ return clock->GetTimeUS(initial_ptc);
}
u64 PS4_SYSV_ABI sceKernelGetProcessTimeCounter() {
diff --git a/src/core/libraries/save_data/savedata.cpp b/src/core/libraries/save_data/savedata.cpp
index 20496d76..d62e39f8 100644
--- a/src/core/libraries/save_data/savedata.cpp
+++ b/src/core/libraries/save_data/savedata.cpp
@@ -516,9 +516,12 @@ s32 saveDataMount(u32 user_id, char* dir_name, u32 mount_mode,
mount_result->mount_status = 1;
}
} break;
+ case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE2:
case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE2 | ORBIS_SAVE_DATA_MOUNT_MODE_RDWR:
case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE2 | ORBIS_SAVE_DATA_MOUNT_MODE_RDWR |
- ORBIS_SAVE_DATA_MOUNT_MODE_COPY_ICON: {
+ ORBIS_SAVE_DATA_MOUNT_MODE_COPY_ICON:
+ case ORBIS_SAVE_DATA_MOUNT_MODE_CREATE2 | ORBIS_SAVE_DATA_MOUNT_MODE_RDWR |
+ ORBIS_SAVE_DATA_MOUNT_MODE_DESTRUCT_OFF | ORBIS_SAVE_DATA_MOUNT_MODE_COPY_ICON: {
if (!std::filesystem::exists(mount_dir)) {
std::filesystem::create_directories(mount_dir);
}
diff --git a/src/core/libraries/videoout/driver.cpp b/src/core/libraries/videoout/driver.cpp
index 25de48a4..09e9cef5 100644
--- a/src/core/libraries/videoout/driver.cpp
+++ b/src/core/libraries/videoout/driver.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
+// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include
@@ -96,7 +96,7 @@ int VideoOutDriver::RegisterBuffers(VideoOutPort* port, s32 startIndex, void* co
}
if (attribute->reserved0 != 0 || attribute->reserved1 != 0) {
- LOG_ERROR(Lib_VideoOut, "Invalid reserved memebers");
+ LOG_ERROR(Lib_VideoOut, "Invalid reserved members");
return ORBIS_VIDEO_OUT_ERROR_INVALID_VALUE;
}
if (attribute->aspect_ratio != 0) {
@@ -252,8 +252,8 @@ void VideoOutDriver::SubmitFlipInternal(VideoOutPort* port, s32 index, s64 flip_
requests.push({
.frame = frame,
.port = port,
- .index = index,
.flip_arg = flip_arg,
+ .index = index,
.eop = is_eop,
});
}
diff --git a/src/core/libraries/videoout/driver.h b/src/core/libraries/videoout/driver.h
index bee80060..6fc74e01 100644
--- a/src/core/libraries/videoout/driver.h
+++ b/src/core/libraries/videoout/driver.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
+// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
@@ -92,8 +92,8 @@ private:
struct Request {
Vulkan::Frame* frame;
VideoOutPort* port;
- s32 index;
s64 flip_arg;
+ s32 index;
bool eop;
operator bool() const noexcept {
diff --git a/src/core/libraries/videoout/video_out.cpp b/src/core/libraries/videoout/video_out.cpp
index d13062cd..a6c1a762 100644
--- a/src/core/libraries/videoout/video_out.cpp
+++ b/src/core/libraries/videoout/video_out.cpp
@@ -185,14 +185,16 @@ s32 PS4_SYSV_ABI sceVideoOutGetFlipStatus(s32 handle, FlipStatus* status) {
return ORBIS_VIDEO_OUT_ERROR_INVALID_HANDLE;
}
- std::unique_lock lock{port->port_mutex};
- *status = port->flip_status;
+ {
+ std::unique_lock lock{port->port_mutex};
+ *status = port->flip_status;
+ }
- LOG_INFO(Lib_VideoOut,
- "count = {}, processTime = {}, tsc = {}, submitTsc = {}, flipArg = {}, gcQueueNum = "
- "{}, flipPendingNum = {}, currentBuffer = {}",
- status->count, status->processTime, status->tsc, status->submitTsc, status->flipArg,
- status->gcQueueNum, status->flipPendingNum, status->currentBuffer);
+ LOG_TRACE(Lib_VideoOut,
+ "count = {}, processTime = {}, tsc = {}, submitTsc = {}, flipArg = {}, gcQueueNum = "
+ "{}, flipPendingNum = {}, currentBuffer = {}",
+ status->count, status->processTime, status->tsc, status->submitTsc, status->flipArg,
+ status->gcQueueNum, status->flipPendingNum, status->currentBuffer);
return ORBIS_OK;
}
diff --git a/src/core/linker.cpp b/src/core/linker.cpp
index d4a15825..6f46fdbe 100644
--- a/src/core/linker.cpp
+++ b/src/core/linker.cpp
@@ -168,7 +168,7 @@ void Linker::Relocate(Module* module) {
auto sym_bind = sym.GetBind();
auto sym_type = sym.GetType();
auto sym_visibility = sym.GetVisibility();
- u64 symbol_vitrual_addr = 0;
+ u64 symbol_virtual_addr = 0;
Loader::SymbolRecord symrec{};
switch (sym_type) {
case STT_FUN:
@@ -185,12 +185,12 @@ void Linker::Relocate(Module* module) {
}
if (sym_visibility != 0) {
- LOG_INFO(Core_Linker, "symbol visilibity !=0");
+ LOG_INFO(Core_Linker, "symbol visibility !=0");
}
switch (sym_bind) {
case STB_LOCAL:
- symbol_vitrual_addr = rel_base_virtual_addr + sym.st_value;
+ symbol_virtual_addr = rel_base_virtual_addr + sym.st_value;
module->SetRelaBit(bit_idx);
break;
case STB_GLOBAL:
@@ -200,14 +200,14 @@ void Linker::Relocate(Module* module) {
// Only set the rela bit if the symbol was actually resolved and not stubbed.
module->SetRelaBit(bit_idx);
}
- symbol_vitrual_addr = symrec.virtual_address;
+ symbol_virtual_addr = symrec.virtual_address;
break;
}
default:
ASSERT_MSG(0, "unknown bind type {}", sym_bind);
}
- rel_is_resolved = (symbol_vitrual_addr != 0);
- rel_value = (rel_is_resolved ? symbol_vitrual_addr + addend : 0);
+ rel_is_resolved = (symbol_virtual_addr != 0);
+ rel_value = (rel_is_resolved ? symbol_virtual_addr + addend : 0);
rel_name = symrec.name;
break;
}
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index 552c4039..0feef260 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -328,6 +328,11 @@ int MemoryManager::DirectQueryAvailable(PAddr search_start, PAddr search_end, si
PAddr paddr{};
size_t max_size{};
while (dmem_area != dmem_map.end() && dmem_area->second.GetEnd() <= search_end) {
+ if (!dmem_area->second.is_free) {
+ dmem_area++;
+ continue;
+ }
+
if (dmem_area->second.size > max_size) {
paddr = dmem_area->second.base;
max_size = dmem_area->second.size;
@@ -344,7 +349,7 @@ void MemoryManager::NameVirtualRange(VAddr virtual_addr, size_t size, std::strin
auto it = FindVMA(virtual_addr);
ASSERT_MSG(it->second.Contains(virtual_addr, size),
- "Range provided is not fully containted in vma");
+ "Range provided is not fully contained in vma");
it->second.name = name;
}
VAddr MemoryManager::SearchFree(VAddr virtual_addr, size_t size, u32 alignment) {
diff --git a/src/qt_gui/elf_viewer.cpp b/src/qt_gui/elf_viewer.cpp
index 72861d15..e80fa25c 100644
--- a/src/qt_gui/elf_viewer.cpp
+++ b/src/qt_gui/elf_viewer.cpp
@@ -1,8 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
-#include
-
#include "elf_viewer.h"
ElfViewer::ElfViewer(QWidget* parent) : QTableWidget(parent) {
diff --git a/src/qt_gui/elf_viewer.h b/src/qt_gui/elf_viewer.h
index a3b85223..1a65d70d 100644
--- a/src/qt_gui/elf_viewer.h
+++ b/src/qt_gui/elf_viewer.h
@@ -3,17 +3,7 @@
#pragma once
-#include
-#include
#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
#include "core/loader/elf.h"
#include "game_list_frame.h"
diff --git a/src/qt_gui/game_grid_frame.h b/src/qt_gui/game_grid_frame.h
index ce775315..50b53a58 100644
--- a/src/qt_gui/game_grid_frame.h
+++ b/src/qt_gui/game_grid_frame.h
@@ -3,17 +3,7 @@
#pragma once
-#include
-#include
-#include
-#include
-#include
#include
-#include
-#include
-#include
-#include
-#include
#include "common/config.h"
#include "game_info.h"
diff --git a/src/qt_gui/game_info.cpp b/src/qt_gui/game_info.cpp
index 0a472eae..2821a032 100644
--- a/src/qt_gui/game_info.cpp
+++ b/src/qt_gui/game_info.cpp
@@ -1,10 +1,7 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
-#include
-#include
#include
-#include
#include "game_info.h"
@@ -26,8 +23,8 @@ void GameInfoClass::GetGameInfo(QWidget* parent) {
}).results();
// Progress bar, please be patient :)
- QProgressDialog dialog("Loading game list, please wait :3", "Cancel", 0, 0, parent);
- dialog.setWindowTitle("Loading...");
+ QProgressDialog dialog(tr("Loading game list, please wait :3"), tr("Cancel"), 0, 0, parent);
+ dialog.setWindowTitle(tr("Loading..."));
QFutureWatcher futureWatcher;
GameListUtils game_util;
diff --git a/src/qt_gui/game_info.h b/src/qt_gui/game_info.h
index b2b102e0..ae02114a 100644
--- a/src/qt_gui/game_info.h
+++ b/src/qt_gui/game_info.h
@@ -3,10 +3,8 @@
#pragma once
-#include
-#include
-#include
-#include
+#include
+#include
#include "common/config.h"
#include "core/file_format/psf.h"
diff --git a/src/qt_gui/game_install_dialog.cpp b/src/qt_gui/game_install_dialog.cpp
index 4b2b8528..5f031bde 100644
--- a/src/qt_gui/game_install_dialog.cpp
+++ b/src/qt_gui/game_install_dialog.cpp
@@ -21,14 +21,14 @@ GameInstallDialog::GameInstallDialog() : m_gamesDirectory(nullptr) {
layout->addStretch();
layout->addWidget(SetupDialogActions());
- setWindowTitle("shadPS4 - Choose directory");
+ setWindowTitle(tr("shadPS4 - Choose directory"));
setWindowIcon(QIcon(":images/shadps4.ico"));
}
GameInstallDialog::~GameInstallDialog() {}
void GameInstallDialog::Browse() {
- auto path = QFileDialog::getExistingDirectory(this, "Directory to install games");
+ auto path = QFileDialog::getExistingDirectory(this, tr("Directory to install games"));
if (!path.isEmpty()) {
m_gamesDirectory->setText(QDir::toNativeSeparators(path));
@@ -36,7 +36,7 @@ void GameInstallDialog::Browse() {
}
QWidget* GameInstallDialog::SetupGamesDirectory() {
- auto group = new QGroupBox("Directory to install games");
+ auto group = new QGroupBox(tr("Directory to install games"));
auto layout = new QHBoxLayout(group);
// Input.
@@ -47,7 +47,7 @@ QWidget* GameInstallDialog::SetupGamesDirectory() {
layout->addWidget(m_gamesDirectory);
// Browse button.
- auto browse = new QPushButton("Browse");
+ auto browse = new QPushButton(tr("Browse"));
connect(browse, &QPushButton::clicked, this, &GameInstallDialog::Browse);
@@ -71,7 +71,7 @@ void GameInstallDialog::Save() {
if (gamesDirectory.isEmpty() || !QDir(gamesDirectory).exists() ||
!QDir::isAbsolutePath(gamesDirectory)) {
- QMessageBox::critical(this, "Error",
+ QMessageBox::critical(this, tr("Error"),
"The value for location to install games is not valid.");
return;
}
diff --git a/src/qt_gui/game_list_frame.h b/src/qt_gui/game_list_frame.h
index d8bccf46..ab70e6f6 100644
--- a/src/qt_gui/game_list_frame.h
+++ b/src/qt_gui/game_list_frame.h
@@ -3,19 +3,7 @@
#pragma once
-#include
-#include
-#include
-#include
-#include
-#include
#include
-#include
-#include
-#include
-#include
-#include
-#include
#include "game_info.h"
#include "game_list_utils.h"
diff --git a/src/qt_gui/game_list_utils.h b/src/qt_gui/game_list_utils.h
index 2e25f122..7911ce46 100644
--- a/src/qt_gui/game_list_utils.h
+++ b/src/qt_gui/game_list_utils.h
@@ -3,13 +3,8 @@
#pragma once
-#include
-#include
-#include
-#include
-
struct GameInfo {
- std::string path; // root path of game directory (normaly directory that contains eboot.bin)
+ std::string path; // root path of game directory (normally directory that contains eboot.bin)
std::string icon_path; // path of icon0.png
std::string pic_path; // path of pic1.png
QImage icon;
diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h
index 757643ca..65af0fbe 100644
--- a/src/qt_gui/gui_context_menus.h
+++ b/src/qt_gui/gui_context_menus.h
@@ -4,17 +4,9 @@
#pragma once
#include
-#include
#include
-#include
-#include
-#include
#include
#include
-#include
-#include
-#include
-#include
#include
#include
@@ -51,11 +43,11 @@ public:
// Setup menu.
QMenu menu(widget);
- QAction createShortcut("Create Shortcut", widget);
- QAction openFolder("Open Game Folder", widget);
- QAction openCheats("Cheats/Patches", widget);
- QAction openSfoViewer("SFO Viewer", widget);
- QAction openTrophyViewer("Trophy Viewer", widget);
+ QAction createShortcut(tr("Create Shortcut"), widget);
+ QAction openFolder(tr("Open Game Folder"), widget);
+ QAction openCheats(tr("Cheats/Patches"), widget);
+ QAction openSfoViewer(tr("SFO Viewer"), widget);
+ QAction openTrophyViewer(tr("Trophy Viewer"), widget);
menu.addAction(&openFolder);
menu.addAction(&createShortcut);
@@ -64,10 +56,10 @@ public:
menu.addAction(&openTrophyViewer);
// "Copy" submenu.
- QMenu* copyMenu = new QMenu("Copy info", widget);
- QAction* copyName = new QAction("Copy Name", widget);
- QAction* copySerial = new QAction("Copy Serial", widget);
- QAction* copyNameAll = new QAction("Copy All", widget);
+ QMenu* copyMenu = new QMenu(tr("Copy info"), widget);
+ QAction* copyName = new QAction(tr("Copy Name"), widget);
+ QAction* copySerial = new QAction(tr("Copy Serial"), widget);
+ QAction* copyNameAll = new QAction(tr("Copy All"), widget);
copyMenu->addAction(copyName);
copyMenu->addAction(copySerial);
@@ -93,7 +85,7 @@ public:
QTableWidget* tableWidget = new QTableWidget(rows, 2);
tableWidget->setAttribute(Qt::WA_DeleteOnClose);
connect(widget->parent(), &QWidget::destroyed, tableWidget,
- [widget, tableWidget]() { tableWidget->deleteLater(); });
+ [tableWidget]() { tableWidget->deleteLater(); });
tableWidget->verticalHeader()->setVisible(false); // Hide vertical header
int row = 0;
@@ -133,7 +125,7 @@ public:
tableWidget->horizontalHeader()->setVisible(false);
tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
- tableWidget->setWindowTitle("SFO Viewer");
+ tableWidget->setWindowTitle(tr("SFO Viewer"));
tableWidget->show();
}
}
@@ -157,7 +149,7 @@ public:
TrophyViewer* trophyViewer = new TrophyViewer(trophyPath, gameTrpPath);
trophyViewer->show();
connect(widget->parent(), &QWidget::destroyed, trophyViewer,
- [widget, trophyViewer]() { trophyViewer->deleteLater(); });
+ [trophyViewer]() { trophyViewer->deleteLater(); });
}
if (selected == &createShortcut) {
@@ -200,15 +192,15 @@ public:
if (createShortcutLinux(linkPath, ebootPath, iconPath)) {
#endif
QMessageBox::information(
- nullptr, "Shortcut creation",
- QString("Shortcut created successfully!\n %1").arg(linkPath));
+ nullptr, tr("Shortcut creation"),
+ QString(tr("Shortcut created successfully!\n %1")).arg(linkPath));
} else {
QMessageBox::critical(
- nullptr, "Error",
- QString("Error creating shortcut!\n %1").arg(linkPath));
+ nullptr, tr("Error"),
+ QString(tr("Error creating shortcut!\n %1")).arg(linkPath));
}
} else {
- QMessageBox::critical(nullptr, "Error", "Failed to convert icon.");
+ QMessageBox::critical(nullptr, tr("Error"), tr("Failed to convert icon."));
}
} else {
// If the icon is already in ICO format, we just create the shortcut
@@ -218,11 +210,12 @@ public:
if (createShortcutLinux(linkPath, ebootPath, iconPath)) {
#endif
QMessageBox::information(
- nullptr, "Shortcut creation",
- QString("Shortcut created successfully!\n %1").arg(linkPath));
+ nullptr, tr("Shortcut creation"),
+ QString(tr("Shortcut created successfully!\n %1")).arg(linkPath));
} else {
- QMessageBox::critical(nullptr, "Error",
- QString("Error creating shortcut!\n %1").arg(linkPath));
+ QMessageBox::critical(
+ nullptr, tr("Error"),
+ QString(tr("Error creating shortcut!\n %1")).arg(linkPath));
}
}
}
@@ -279,7 +272,7 @@ public:
int itemIndex = GetRowIndex(treeWidget, currentItem); // row
QMenu menu(treeWidget);
- QAction installPackage("Install PKG", treeWidget);
+ QAction installPackage(tr("Install PKG"), treeWidget);
menu.addAction(&installPackage);
diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp
index cff01cc2..02957c6d 100644
--- a/src/qt_gui/main.cpp
+++ b/src/qt_gui/main.cpp
@@ -1,14 +1,11 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
-#include
-#include
-
#include "common/config.h"
#include "core/file_sys/fs.h"
#include "emulator.h"
-#include "qt_gui/game_install_dialog.h"
-#include "qt_gui/main_window.h"
+#include "game_install_dialog.h"
+#include "main_window.h"
// Custom message handler to ignore Qt logs
void customMessageHandler(QtMsgType, const QMessageLogContext&, const QString&) {}
diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp
index f392097c..d62f6f12 100644
--- a/src/qt_gui/main_window.cpp
+++ b/src/qt_gui/main_window.cpp
@@ -1,13 +1,8 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
-#include
#include
-#include
-#include
#include
-#include
-#include
#include "about_dialog.h"
#include "cheats_patches.h"
@@ -43,6 +38,7 @@ bool MainWindow::Init() {
SetLastUsedTheme();
SetLastIconSizeBullet();
GetPhysicalDevices();
+ LoadTranslation();
// show ui
setMinimumSize(350, minimumSizeHint().height());
setWindowTitle(QString::fromStdString("shadPS4 v" + std::string(Common::VERSION)));
@@ -121,7 +117,7 @@ void MainWindow::CreateDockWindows() {
m_elf_viewer->hide();
m_game_list_frame->show();
m_dock_widget->setWidget(m_game_list_frame.data());
- slider_pos = Config::getSliderPositon();
+ slider_pos = Config::getSliderPosition();
ui->sizeSlider->setSliderPosition(slider_pos); // set slider pos at start;
isTableList = true;
} else if (table_mode == 1) { // Grid
@@ -129,7 +125,7 @@ void MainWindow::CreateDockWindows() {
m_elf_viewer->hide();
m_game_grid_frame->show();
m_dock_widget->setWidget(m_game_grid_frame.data());
- slider_pos = Config::getSliderPositonGrid();
+ slider_pos = Config::getSliderPositionGrid();
ui->sizeSlider->setSliderPosition(slider_pos); // set slider pos at start;
isTableList = false;
} else {
@@ -189,12 +185,12 @@ void MainWindow::CreateConnects() {
36 + value; // 36 is the minimum icon size to use due to text disappearing.
m_game_list_frame->ResizeIcons(36 + value);
Config::setIconSize(36 + value);
- Config::setSliderPositon(value);
+ Config::setSliderPosition(value);
} else {
m_game_grid_frame->icon_size = 69 + value;
m_game_grid_frame->PopulateGameGrid(m_game_info->m_games, false);
Config::setIconSizeGrid(69 + value);
- Config::setSliderPositonGrid(value);
+ Config::setSliderPositionGrid(value);
}
});
@@ -206,11 +202,19 @@ void MainWindow::CreateConnects() {
connect(ui->configureAct, &QAction::triggered, this, [this]() {
auto settingsDialog = new SettingsDialog(m_physical_devices, this);
+
+ connect(settingsDialog, &SettingsDialog::LanguageChanged, this,
+ &MainWindow::OnLanguageChanged);
+
settingsDialog->exec();
});
connect(ui->settingsButton, &QPushButton::clicked, this, [this]() {
auto settingsDialog = new SettingsDialog(m_physical_devices, this);
+
+ connect(settingsDialog, &SettingsDialog::LanguageChanged, this,
+ &MainWindow::OnLanguageChanged);
+
settingsDialog->exec();
});
@@ -225,11 +229,11 @@ void MainWindow::CreateConnects() {
36; // 36 is the minimum icon size to use due to text disappearing.
ui->sizeSlider->setValue(0); // icone_size - 36
Config::setIconSize(36);
- Config::setSliderPositon(0);
+ Config::setSliderPosition(0);
} else {
ui->sizeSlider->setValue(0); // icone_size - 36
Config::setIconSizeGrid(69);
- Config::setSliderPositonGrid(0);
+ Config::setSliderPositionGrid(0);
}
});
@@ -238,11 +242,11 @@ void MainWindow::CreateConnects() {
m_game_list_frame->icon_size = 64;
ui->sizeSlider->setValue(28);
Config::setIconSize(64);
- Config::setSliderPositon(28);
+ Config::setSliderPosition(28);
} else {
ui->sizeSlider->setValue(28);
Config::setIconSizeGrid(97);
- Config::setSliderPositonGrid(28);
+ Config::setSliderPositionGrid(28);
}
});
@@ -251,11 +255,11 @@ void MainWindow::CreateConnects() {
m_game_list_frame->icon_size = 128;
ui->sizeSlider->setValue(92);
Config::setIconSize(128);
- Config::setSliderPositon(92);
+ Config::setSliderPosition(92);
} else {
ui->sizeSlider->setValue(92);
Config::setIconSizeGrid(160);
- Config::setSliderPositonGrid(91);
+ Config::setSliderPositionGrid(91);
}
});
@@ -264,11 +268,11 @@ void MainWindow::CreateConnects() {
m_game_list_frame->icon_size = 256;
ui->sizeSlider->setValue(220);
Config::setIconSize(256);
- Config::setSliderPositon(220);
+ Config::setSliderPosition(220);
} else {
ui->sizeSlider->setValue(220);
Config::setIconSizeGrid(256);
- Config::setSliderPositonGrid(220);
+ Config::setSliderPositionGrid(220);
}
});
// List
@@ -283,7 +287,7 @@ void MainWindow::CreateConnects() {
}
isTableList = true;
Config::setTableMode(0);
- int slider_pos = Config::getSliderPositon();
+ int slider_pos = Config::getSliderPosition();
ui->sizeSlider->setEnabled(true);
ui->sizeSlider->setSliderPosition(slider_pos);
});
@@ -299,7 +303,7 @@ void MainWindow::CreateConnects() {
}
isTableList = false;
Config::setTableMode(1);
- int slider_pos_grid = Config::getSliderPositonGrid();
+ int slider_pos_grid = Config::getSliderPositionGrid();
ui->sizeSlider->setEnabled(true);
ui->sizeSlider->setSliderPosition(slider_pos_grid);
});
@@ -802,3 +806,35 @@ void MainWindow::CreateRecentGameActions() {
emulator.Run(gamePath.toUtf8().constData());
});
}
+
+void MainWindow::LoadTranslation() {
+ auto language = QString::fromStdString(Config::getEmulatorLanguage());
+
+ const QString base_dir = QStringLiteral(":/translations");
+ QString base_path = QStringLiteral("%1/%2.qm").arg(base_dir).arg(language);
+
+ if (QFile::exists(base_path)) {
+ if (translator != nullptr) {
+ qApp->removeTranslator(translator);
+ }
+
+ translator = new QTranslator(qApp);
+ if (!translator->load(base_path)) {
+ QMessageBox::warning(
+ nullptr, QStringLiteral("Translation Error"),
+ QStringLiteral("Failed to find load translation file for '%1':\n%2")
+ .arg(language)
+ .arg(base_path));
+ delete translator;
+ } else {
+ qApp->installTranslator(translator);
+ ui->retranslateUi(this);
+ }
+ }
+}
+
+void MainWindow::OnLanguageChanged(const std::string& locale) {
+ Config::setEmulatorLanguage(locale);
+
+ LoadTranslation();
+}
\ No newline at end of file
diff --git a/src/qt_gui/main_window.h b/src/qt_gui/main_window.h
index 5c9d30a7..39cc7c01 100644
--- a/src/qt_gui/main_window.h
+++ b/src/qt_gui/main_window.h
@@ -3,13 +3,9 @@
#pragma once
-#include
#include
#include
-#include
-#include
-#include
-#include
+#include
#include "cheats_patches_management.h"
#include "common/config.h"
@@ -49,6 +45,7 @@ private Q_SLOTS:
void ShowGameList();
void RefreshGameTable();
void HandleResize(QResizeEvent* event);
+ void OnLanguageChanged(const std::string& locale);
private:
Ui_MainWindow* ui;
@@ -65,6 +62,7 @@ private:
void InstallPkg();
void BootGame();
void AddRecentFiles(QString filePath);
+ void LoadTranslation();
QIcon RecolorIcon(const QIcon& icon, bool isWhite);
bool isIconBlack = false;
bool isTableList = true;
@@ -92,6 +90,8 @@ private:
// Cheats/Patches Management.
QVBoxLayout* patchesRightLayout;
+ QTranslator* translator;
+
protected:
void dragEnterEvent(QDragEnterEvent* event1) override {
if (event1->mimeData()->hasUrls()) {
diff --git a/src/qt_gui/main_window_ui.h b/src/qt_gui/main_window_ui.h
index c1d9e9b9..684a79f6 100644
--- a/src/qt_gui/main_window_ui.h
+++ b/src/qt_gui/main_window_ui.h
@@ -1,29 +1,11 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
-/********************************************************************************
-** Form generated from reading UI file 'main_window.ui'
-**
-** Created by: Qt User Interface Compiler version 6.6.1
-**
-** WARNING! All changes made in this file will be lost when recompiling UI file!
-********************************************************************************/
+#pragma once
-#ifndef MAIN_WINDOW_UI_H
-#define MAIN_WINDOW_UI_H
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
+#include
+#include
+#include
QT_BEGIN_NAMESPACE
@@ -374,6 +356,4 @@ namespace Ui {
class MainWindow : public Ui_MainWindow {};
} // namespace Ui
-QT_END_NAMESPACE
-
-#endif // MAIN_WINDOW_UI_H
+QT_END_NAMESPACE
\ No newline at end of file
diff --git a/src/qt_gui/pkg_viewer.cpp b/src/qt_gui/pkg_viewer.cpp
index cd2ce2b6..49005c72 100644
--- a/src/qt_gui/pkg_viewer.cpp
+++ b/src/qt_gui/pkg_viewer.cpp
@@ -1,9 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
-#include
-#include
-
#include "pkg_viewer.h"
PKGViewer::PKGViewer(std::shared_ptr game_info_get, QWidget* parent,
@@ -54,7 +51,7 @@ PKGViewer::PKGViewer(std::shared_ptr game_info_get, QWidget* pare
InstallDragDropPkg);
});
- connect(parent, &QWidget::destroyed, this, [parent, this]() { this->deleteLater(); });
+ connect(parent, &QWidget::destroyed, this, [this]() { this->deleteLater(); });
}
PKGViewer::~PKGViewer() {}
diff --git a/src/qt_gui/pkg_viewer.h b/src/qt_gui/pkg_viewer.h
index e040d595..9598328a 100644
--- a/src/qt_gui/pkg_viewer.h
+++ b/src/qt_gui/pkg_viewer.h
@@ -3,18 +3,9 @@
#pragma once
-#include
-#include
-#include
-#include
#include
-#include
-#include
#include
#include
-#include
-#include
-#include
#include "common/io_file.h"
#include "core/file_format/pkg.h"
diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp
index aa2c7338..d572915c 100644
--- a/src/qt_gui/settings_dialog.cpp
+++ b/src/qt_gui/settings_dialog.cpp
@@ -2,6 +2,9 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include
+#include
+
+#include "main_window.h"
#include "settings_dialog.h"
#include "ui_settings_dialog.h"
@@ -59,6 +62,7 @@ SettingsDialog::SettingsDialog(std::span physical_devices, QWidge
completer->setCaseSensitivity(Qt::CaseInsensitive);
ui->consoleLanguageComboBox->setCompleter(completer);
+ InitializeEmulatorLanguages();
LoadValuesFromConfig();
connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QWidget::close);
@@ -86,7 +90,7 @@ SettingsDialog::SettingsDialog(std::span physical_devices, QWidge
[](const QString& text) { Config::setUserName(text.toStdString()); });
connect(ui->consoleLanguageComboBox, QOverload::of(&QComboBox::currentIndexChanged),
- this, [this](int index) {
+ this, [](int index) {
if (index >= 0 && index < languageIndexes.size()) {
int languageCode = languageIndexes[index];
Config::setLanguage(languageCode);
@@ -157,6 +161,7 @@ void SettingsDialog::LoadValuesFromConfig() {
languageIndexes.begin(),
std::find(languageIndexes.begin(), languageIndexes.end(), Config::GetLanguage())) %
languageIndexes.size());
+ ui->emulatorLanguageComboBox->setCurrentIndex(languages[Config::getEmulatorLanguage()]);
ui->graphicsAdapterBox->setCurrentIndex(Config::getGpuId() + 1);
ui->widthSpinBox->setValue(Config::getScreenWidth());
ui->heightSpinBox->setValue(Config::getScreenHeight());
@@ -178,6 +183,35 @@ void SettingsDialog::LoadValuesFromConfig() {
ui->rdocCheckBox->setChecked(Config::isRdocEnabled());
}
+void SettingsDialog::InitializeEmulatorLanguages() {
+ QDirIterator it(QStringLiteral(":/translations"), QDirIterator::NoIteratorFlags);
+
+ int idx = 0;
+ while (it.hasNext()) {
+ QString locale = it.next();
+ locale.truncate(locale.lastIndexOf(QLatin1Char{'.'}));
+ locale.remove(0, locale.lastIndexOf(QLatin1Char{'/'}) + 1);
+ const QString lang = QLocale::languageToString(QLocale(locale).language());
+ const QString country = QLocale::territoryToString(QLocale(locale).territory());
+ ui->emulatorLanguageComboBox->addItem(QStringLiteral("%1 (%2)").arg(lang, country), locale);
+
+ languages[locale.toStdString()] = idx;
+ idx++;
+ }
+
+ connect(ui->emulatorLanguageComboBox, qOverload(&QComboBox::currentIndexChanged), this,
+ &SettingsDialog::OnLanguageChanged);
+}
+
+void SettingsDialog::OnLanguageChanged(int index) {
+ if (index == -1)
+ return;
+
+ ui->retranslateUi(this);
+
+ emit LanguageChanged(ui->emulatorLanguageComboBox->itemData(index).toString().toStdString());
+}
+
int SettingsDialog::exec() {
return QDialog::exec();
}
diff --git a/src/qt_gui/settings_dialog.h b/src/qt_gui/settings_dialog.h
index 7d870109..ddae7daa 100644
--- a/src/qt_gui/settings_dialog.h
+++ b/src/qt_gui/settings_dialog.h
@@ -22,8 +22,15 @@ public:
int exec() override;
+signals:
+ void LanguageChanged(const std::string& locale);
+
private:
void LoadValuesFromConfig();
+ void InitializeEmulatorLanguages();
+ void OnLanguageChanged(int index);
std::unique_ptr ui;
+
+ std::map languages;
};
diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui
index d11f177d..1ecd1249 100644
--- a/src/qt_gui/settings_dialog.ui
+++ b/src/qt_gui/settings_dialog.ui
@@ -79,32 +79,6 @@
System
- -
-
-
- 6
-
-
- 0
-
-
-
-
-
-
-
-
- Username
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -117,6 +91,18 @@
+ -
+
+
+ Emulator Language
+
+
+
-
+
+
+
+
+
@@ -156,17 +142,30 @@
-
-
-
- Qt::Orientation::Horizontal
+
+
+ 6
-
-
- 40
- 20
-
+
+ 0
-
+
-
+
+
-
+
+
+ Username
+
+
+
-
+
+
+
+
+
+
+
+
diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts
new file mode 100644
index 00000000..0f4489ee
--- /dev/null
+++ b/src/qt_gui/translations/da_DK.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ This software should not be used to play games you have not legally obtained.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Loading game list, please wait :3
+
+
+
+ Cancel
+ Cancel
+
+
+
+ Loading...
+ Loading...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Choose directory
+
+
+
+ Directory to install games
+ Directory to install games
+
+
+
+ Browse
+ Browse
+
+
+
+ Error
+ Error
+
+
+
+ The value for location to install games is not valid.
+ The value for location to install games is not valid.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Create Shortcut
+
+
+
+ Open Game Folder
+ Open Game Folder
+
+
+
+ SFO Viewer
+ SFO Viewer
+
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ Copy info
+ Copy info
+
+
+
+ Copy Name
+ Copy Name
+
+
+
+ Copy Serial
+ Copy Serial
+
+
+
+ Copy All
+ Copy All
+
+
+
+ Shortcut creation
+ Shortcut creation
+
+
+
+ Shortcut created successfully!\n %1
+ Shortcut created successfully!\n %1
+
+
+
+ Error
+ Error
+
+
+
+ Error creating shortcut!\n %1
+ Error creating shortcut!\n %1
+
+
+
+ Install PKG
+ Install PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Open/Add Elf Folder
+
+
+
+ Install Packages (PKG)
+ Install Packages (PKG)
+
+
+
+ Boot Game
+ Boot Game
+
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ Configure...
+ Configure...
+
+
+
+ Install application from a .pkg file
+ Install application from a .pkg file
+
+
+
+ Recent Games
+ Recent Games
+
+
+
+ Exit
+ Exit
+
+
+
+ Exit shadPS4
+ Exit shadPS4
+
+
+
+ Exit the application.
+ Exit the application.
+
+
+
+ Show Game List
+ Show Game List
+
+
+
+ Game List Refresh
+ Game List Refresh
+
+
+
+ Tiny
+ Tiny
+
+
+
+ Small
+ Small
+
+
+
+ Medium
+ Medium
+
+
+
+ Large
+ Large
+
+
+
+ List View
+ List View
+
+
+
+ Grid View
+ Grid View
+
+
+
+ Elf Viewer
+ Elf Viewer
+
+
+
+ Game Install Directory
+ Game Install Directory
+
+
+
+ Dump Game List
+ Dump Game List
+
+
+
+ PKG Viewer
+ PKG Viewer
+
+
+
+ Search...
+ Search...
+
+
+
+ File
+ File
+
+
+
+ View
+ View
+
+
+
+ Game List Icons
+ Game List Icons
+
+
+
+ Game List Mode
+ Game List Mode
+
+
+
+ Settings
+ Settings
+
+
+
+ Utils
+ Utils
+
+
+
+ Themes
+ Themes
+
+
+
+ About
+ About
+
+
+
+ Dark
+ Dark
+
+
+
+ Light
+ Light
+
+
+
+ Green
+ Green
+
+
+
+ Blue
+ Blue
+
+
+
+ Violet
+ Violet
+
+
+
+ toolBar
+ toolBar
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Settings
+
+
+
+ General
+ General
+
+
+
+ System
+ System
+
+
+
+ Console Language
+ Console Language
+
+
+
+ Emulator Language
+ Emulator Language
+
+
+
+ Emulator
+ Emulator
+
+
+
+ Enable Fullscreen
+ Enable Fullscreen
+
+
+
+ Show Splash
+ Show Splash
+
+
+
+ Is PS4 Pro
+ Is PS4 Pro
+
+
+
+ Username
+ Username
+
+
+
+ Logger
+ Logger
+
+
+
+ Log Type
+ Log Type
+
+
+
+ Log Filter
+ Log Filter
+
+
+
+ Graphics
+ Graphics
+
+
+
+ Graphics Device
+ Graphics Device
+
+
+
+ Width
+ Width
+
+
+
+ Height
+ Height
+
+
+
+ Vblank Divider
+ Vblank Divider
+
+
+
+ Advanced
+ Advanced
+
+
+
+ Enable Shaders Dumping
+ Enable Shaders Dumping
+
+
+
+ Enable NULL GPU
+ Enable NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Enable PM4 Dumping
+
+
+
+ Debug
+ Debug
+
+
+
+ Enable Debug Dumping
+ Enable Debug Dumping
+
+
+
+ Enable Vulkan Validation Layers
+ Enable Vulkan Validation Layers
+
+
+
+ Enable Vulkan Synchronization Validation
+ Enable Vulkan Synchronization Validation
+
+
+
+ Enable RenderDoc Debugging
+ Enable RenderDoc Debugging
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/de.ts b/src/qt_gui/translations/de.ts
new file mode 100644
index 00000000..1ff204df
--- /dev/null
+++ b/src/qt_gui/translations/de.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ This software should not be used to play games you have not legally obtained.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Loading game list, please wait :3
+
+
+
+ Cancel
+ Cancel
+
+
+
+ Loading...
+ Loading...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Choose directory
+
+
+
+ Directory to install games
+ Directory to install games
+
+
+
+ Browse
+ Browse
+
+
+
+ Error
+ Error
+
+
+
+ The value for location to install games is not valid.
+ The value for location to install games is not valid.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Create Shortcut
+
+
+
+ Open Game Folder
+ Open Game Folder
+
+
+
+ SFO Viewer
+ SFO Viewer
+
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ Copy info
+ Copy info
+
+
+
+ Copy Name
+ Copy Name
+
+
+
+ Copy Serial
+ Copy Serial
+
+
+
+ Copy All
+ Copy All
+
+
+
+ Shortcut creation
+ Shortcut creation
+
+
+
+ Shortcut created successfully!\n %1
+ Shortcut created successfully!\n %1
+
+
+
+ Error
+ Error
+
+
+
+ Error creating shortcut!\n %1
+ Error creating shortcut!\n %1
+
+
+
+ Install PKG
+ Install PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Open/Add Elf Folder
+
+
+
+ Install Packages (PKG)
+ Install Packages (PKG)
+
+
+
+ Boot Game
+ Boot Game
+
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ Configure...
+ Configure...
+
+
+
+ Install application from a .pkg file
+ Install application from a .pkg file
+
+
+
+ Recent Games
+ Recent Games
+
+
+
+ Exit
+ Exit
+
+
+
+ Exit shadPS4
+ Exit shadPS4
+
+
+
+ Exit the application.
+ Exit the application.
+
+
+
+ Show Game List
+ Show Game List
+
+
+
+ Game List Refresh
+ Game List Refresh
+
+
+
+ Tiny
+ Tiny
+
+
+
+ Small
+ Small
+
+
+
+ Medium
+ Medium
+
+
+
+ Large
+ Large
+
+
+
+ List View
+ List View
+
+
+
+ Grid View
+ Grid View
+
+
+
+ Elf Viewer
+ Elf Viewer
+
+
+
+ Game Install Directory
+ Game Install Directory
+
+
+
+ Dump Game List
+ Dump Game List
+
+
+
+ PKG Viewer
+ PKG Viewer
+
+
+
+ Search...
+ Search...
+
+
+
+ File
+ File
+
+
+
+ View
+ View
+
+
+
+ Game List Icons
+ Game List Icons
+
+
+
+ Game List Mode
+ Game List Mode
+
+
+
+ Settings
+ Settings
+
+
+
+ Utils
+ Utils
+
+
+
+ Themes
+ Themes
+
+
+
+ About
+ About
+
+
+
+ Dark
+ Dark
+
+
+
+ Light
+ Light
+
+
+
+ Green
+ Green
+
+
+
+ Blue
+ Blue
+
+
+
+ Violet
+ Violet
+
+
+
+ toolBar
+ toolBar
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Settings
+
+
+
+ General
+ General
+
+
+
+ System
+ System
+
+
+
+ Console Language
+ Console Language
+
+
+
+ Emulator Language
+ Emulator Language
+
+
+
+ Emulator
+ Emulator
+
+
+
+ Enable Fullscreen
+ Enable Fullscreen
+
+
+
+ Show Splash
+ Show Splash
+
+
+
+ Is PS4 Pro
+ Is PS4 Pro
+
+
+
+ Username
+ Username
+
+
+
+ Logger
+ Logger
+
+
+
+ Log Type
+ Log Type
+
+
+
+ Log Filter
+ Log Filter
+
+
+
+ Graphics
+ Graphics
+
+
+
+ Graphics Device
+ Graphics Device
+
+
+
+ Width
+ Width
+
+
+
+ Height
+ Height
+
+
+
+ Vblank Divider
+ Vblank Divider
+
+
+
+ Advanced
+ Advanced
+
+
+
+ Enable Shaders Dumping
+ Enable Shaders Dumping
+
+
+
+ Enable NULL GPU
+ Enable NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Enable PM4 Dumping
+
+
+
+ Debug
+ Debug
+
+
+
+ Enable Debug Dumping
+ Enable Debug Dumping
+
+
+
+ Enable Vulkan Validation Layers
+ Enable Vulkan Validation Layers
+
+
+
+ Enable Vulkan Synchronization Validation
+ Enable Vulkan Synchronization Validation
+
+
+
+ Enable RenderDoc Debugging
+ Enable RenderDoc Debugging
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/el.ts b/src/qt_gui/translations/el.ts
new file mode 100644
index 00000000..b015954e
--- /dev/null
+++ b/src/qt_gui/translations/el.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ This software should not be used to play games you have not legally obtained.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Loading game list, please wait :3
+
+
+
+ Cancel
+ Cancel
+
+
+
+ Loading...
+ Loading...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Choose directory
+
+
+
+ Directory to install games
+ Directory to install games
+
+
+
+ Browse
+ Browse
+
+
+
+ Error
+ Error
+
+
+
+ The value for location to install games is not valid.
+ The value for location to install games is not valid.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Create Shortcut
+
+
+
+ Open Game Folder
+ Open Game Folder
+
+
+
+ SFO Viewer
+ SFO Viewer
+
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ Copy info
+ Copy info
+
+
+
+ Copy Name
+ Copy Name
+
+
+
+ Copy Serial
+ Copy Serial
+
+
+
+ Copy All
+ Copy All
+
+
+
+ Shortcut creation
+ Shortcut creation
+
+
+
+ Shortcut created successfully!\n %1
+ Shortcut created successfully!\n %1
+
+
+
+ Error
+ Error
+
+
+
+ Error creating shortcut!\n %1
+ Error creating shortcut!\n %1
+
+
+
+ Install PKG
+ Install PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Open/Add Elf Folder
+
+
+
+ Install Packages (PKG)
+ Install Packages (PKG)
+
+
+
+ Boot Game
+ Boot Game
+
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ Configure...
+ Configure...
+
+
+
+ Install application from a .pkg file
+ Install application from a .pkg file
+
+
+
+ Recent Games
+ Recent Games
+
+
+
+ Exit
+ Exit
+
+
+
+ Exit shadPS4
+ Exit shadPS4
+
+
+
+ Exit the application.
+ Exit the application.
+
+
+
+ Show Game List
+ Show Game List
+
+
+
+ Game List Refresh
+ Game List Refresh
+
+
+
+ Tiny
+ Tiny
+
+
+
+ Small
+ Small
+
+
+
+ Medium
+ Medium
+
+
+
+ Large
+ Large
+
+
+
+ List View
+ List View
+
+
+
+ Grid View
+ Grid View
+
+
+
+ Elf Viewer
+ Elf Viewer
+
+
+
+ Game Install Directory
+ Game Install Directory
+
+
+
+ Dump Game List
+ Dump Game List
+
+
+
+ PKG Viewer
+ PKG Viewer
+
+
+
+ Search...
+ Search...
+
+
+
+ File
+ File
+
+
+
+ View
+ View
+
+
+
+ Game List Icons
+ Game List Icons
+
+
+
+ Game List Mode
+ Game List Mode
+
+
+
+ Settings
+ Settings
+
+
+
+ Utils
+ Utils
+
+
+
+ Themes
+ Themes
+
+
+
+ About
+ About
+
+
+
+ Dark
+ Dark
+
+
+
+ Light
+ Light
+
+
+
+ Green
+ Green
+
+
+
+ Blue
+ Blue
+
+
+
+ Violet
+ Violet
+
+
+
+ toolBar
+ toolBar
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Settings
+
+
+
+ General
+ General
+
+
+
+ System
+ System
+
+
+
+ Console Language
+ Console Language
+
+
+
+ Emulator Language
+ Emulator Language
+
+
+
+ Emulator
+ Emulator
+
+
+
+ Enable Fullscreen
+ Enable Fullscreen
+
+
+
+ Show Splash
+ Show Splash
+
+
+
+ Is PS4 Pro
+ Is PS4 Pro
+
+
+
+ Username
+ Username
+
+
+
+ Logger
+ Logger
+
+
+
+ Log Type
+ Log Type
+
+
+
+ Log Filter
+ Log Filter
+
+
+
+ Graphics
+ Graphics
+
+
+
+ Graphics Device
+ Graphics Device
+
+
+
+ Width
+ Width
+
+
+
+ Height
+ Height
+
+
+
+ Vblank Divider
+ Vblank Divider
+
+
+
+ Advanced
+ Advanced
+
+
+
+ Enable Shaders Dumping
+ Enable Shaders Dumping
+
+
+
+ Enable NULL GPU
+ Enable NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Enable PM4 Dumping
+
+
+
+ Debug
+ Debug
+
+
+
+ Enable Debug Dumping
+ Enable Debug Dumping
+
+
+
+ Enable Vulkan Validation Layers
+ Enable Vulkan Validation Layers
+
+
+
+ Enable Vulkan Synchronization Validation
+ Enable Vulkan Synchronization Validation
+
+
+
+ Enable RenderDoc Debugging
+ Enable RenderDoc Debugging
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts
new file mode 100644
index 00000000..5ceb1188
--- /dev/null
+++ b/src/qt_gui/translations/en.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ This software should not be used to play games you have not legally obtained.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Loading game list, please wait :3
+
+
+
+ Cancel
+ Cancel
+
+
+
+ Loading...
+ Loading...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Choose directory
+
+
+
+ Directory to install games
+ Directory to install games
+
+
+
+ Browse
+ Browse
+
+
+
+ Error
+ Error
+
+
+
+ The value for location to install games is not valid.
+ The value for location to install games is not valid.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Create Shortcut
+
+
+
+ Open Game Folder
+ Open Game Folder
+
+
+
+ SFO Viewer
+ SFO Viewer
+
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ Copy info
+ Copy info
+
+
+
+ Copy Name
+ Copy Name
+
+
+
+ Copy Serial
+ Copy Serial
+
+
+
+ Copy All
+ Copy All
+
+
+
+ Shortcut creation
+ Shortcut creation
+
+
+
+ Shortcut created successfully!\n %1
+ Shortcut created successfully!\n %1
+
+
+
+ Error
+ Error
+
+
+
+ Error creating shortcut!\n %1
+ Error creating shortcut!\n %1
+
+
+
+ Install PKG
+ Install PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Open/Add Elf Folder
+
+
+
+ Install Packages (PKG)
+ Install Packages (PKG)
+
+
+
+ Boot Game
+ Boot Game
+
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ Configure...
+ Configure...
+
+
+
+ Install application from a .pkg file
+ Install application from a .pkg file
+
+
+
+ Recent Games
+ Recent Games
+
+
+
+ Exit
+ Exit
+
+
+
+ Exit shadPS4
+ Exit shadPS4
+
+
+
+ Exit the application.
+ Exit the application.
+
+
+
+ Show Game List
+ Show Game List
+
+
+
+ Game List Refresh
+ Game List Refresh
+
+
+
+ Tiny
+ Tiny
+
+
+
+ Small
+ Small
+
+
+
+ Medium
+ Medium
+
+
+
+ Large
+ Large
+
+
+
+ List View
+ List View
+
+
+
+ Grid View
+ Grid View
+
+
+
+ Elf Viewer
+ Elf Viewer
+
+
+
+ Game Install Directory
+ Game Install Directory
+
+
+
+ Dump Game List
+ Dump Game List
+
+
+
+ PKG Viewer
+ PKG Viewer
+
+
+
+ Search...
+ Search...
+
+
+
+ File
+ File
+
+
+
+ View
+ View
+
+
+
+ Game List Icons
+ Game List Icons
+
+
+
+ Game List Mode
+ Game List Mode
+
+
+
+ Settings
+ Settings
+
+
+
+ Utils
+ Utils
+
+
+
+ Themes
+ Themes
+
+
+
+ About
+ About
+
+
+
+ Dark
+ Dark
+
+
+
+ Light
+ Light
+
+
+
+ Green
+ Green
+
+
+
+ Blue
+ Blue
+
+
+
+ Violet
+ Violet
+
+
+
+ toolBar
+ toolBar
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Settings
+
+
+
+ General
+ General
+
+
+
+ System
+ System
+
+
+
+ Console Language
+ Console Language
+
+
+
+ Emulator Language
+ Emulator Language
+
+
+
+ Emulator
+ Emulator
+
+
+
+ Enable Fullscreen
+ Enable Fullscreen
+
+
+
+ Show Splash
+ Show Splash
+
+
+
+ Is PS4 Pro
+ Is PS4 Pro
+
+
+
+ Username
+ Username
+
+
+
+ Logger
+ Logger
+
+
+
+ Log Type
+ Log Type
+
+
+
+ Log Filter
+ Log Filter
+
+
+
+ Graphics
+ Graphics
+
+
+
+ Graphics Device
+ Graphics Device
+
+
+
+ Width
+ Width
+
+
+
+ Height
+ Height
+
+
+
+ Vblank Divider
+ Vblank Divider
+
+
+
+ Advanced
+ Advanced
+
+
+
+ Enable Shaders Dumping
+ Enable Shaders Dumping
+
+
+
+ Enable NULL GPU
+ Enable NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Enable PM4 Dumping
+
+
+
+ Debug
+ Debug
+
+
+
+ Enable Debug Dumping
+ Enable Debug Dumping
+
+
+
+ Enable Vulkan Validation Layers
+ Enable Vulkan Validation Layers
+
+
+
+ Enable Vulkan Synchronization Validation
+ Enable Vulkan Synchronization Validation
+
+
+
+ Enable RenderDoc Debugging
+ Enable RenderDoc Debugging
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts
new file mode 100644
index 00000000..1b42b18e
--- /dev/null
+++ b/src/qt_gui/translations/es_ES.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ Acerca de shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 es un emulador experimental de código abierto para la PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ Este software no debe utilizarse para jugar juegos que no hayas obtenido legalmente.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Abrir carpeta
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Cargando lista de juegos, por favor espera :3
+
+
+
+ Cancel
+ Cancelar
+
+
+
+ Loading...
+ Cargando...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Elegir carpeta
+
+
+
+ Directory to install games
+ Carpeta para instalar juegos
+
+
+
+ Browse
+ Buscar
+
+
+
+ Error
+ Error
+
+
+
+ The value for location to install games is not valid.
+ El valor para la ubicación de instalación de los juegos no es válido.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Crear acceso directo
+
+
+
+ Open Game Folder
+ Abrir carpeta del juego
+
+
+
+ SFO Viewer
+ Vista SFO
+
+
+
+ Trophy Viewer
+ Ver trofeos
+
+
+
+ Copy info
+ Copiar información
+
+
+
+ Copy Name
+ Copiar nombre
+
+
+
+ Copy Serial
+ Copiar serial
+
+
+
+ Copy All
+ Copiar todo
+
+
+
+ Shortcut creation
+ Acceso directo creado
+
+
+
+ Shortcut created successfully!\n %1
+ ¡Acceso directo creado con éxito!\n %1
+
+
+
+ Error
+ Error
+
+
+
+ Error creating shortcut!\n %1
+ ¡Error al crear el acceso directo!\n %1
+
+
+
+ Install PKG
+ Instalar PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Abrir/Agregar carpeta Elf
+
+
+
+ Install Packages (PKG)
+ Instalar paquetes (PKG)
+
+
+
+ Boot Game
+ Iniciar juego
+
+
+
+ About shadPS4
+ Acerca de shadPS4
+
+
+
+ Configure...
+ Configurar...
+
+
+
+ Install application from a .pkg file
+ Instalar aplicación desde un archivo .pkg
+
+
+
+ Recent Games
+ Juegos recientes
+
+
+
+ Exit
+ Salir
+
+
+
+ Exit shadPS4
+ Salir de shadPS4
+
+
+
+ Exit the application.
+ Salir de la aplicación.
+
+
+
+ Show Game List
+ Mostrar lista de juegos
+
+
+
+ Game List Refresh
+ Actualizar lista de juegos
+
+
+
+ Tiny
+ Muy pequeño
+
+
+
+ Small
+ Pequeño
+
+
+
+ Medium
+ Mediano
+
+
+
+ Large
+ Grande
+
+
+
+ List View
+ Vista de lista
+
+
+
+ Grid View
+ Vista de cuadrícula
+
+
+
+ Elf Viewer
+ Vista Elf
+
+
+
+ Game Install Directory
+ Carpeta de instalación de los juegos
+
+
+
+ Dump Game List
+ Volcar lista de juegos
+
+
+
+ PKG Viewer
+ Vista PKG
+
+
+
+ Search...
+ Buscar...
+
+
+
+ File
+ Archivo
+
+
+
+ View
+ Vista
+
+
+
+ Game List Icons
+ Iconos de los juegos
+
+
+
+ Game List Mode
+ Tipo de lista
+
+
+
+ Settings
+ Configuraciones
+
+
+
+ Utils
+ Utilidades
+
+
+
+ Themes
+ Temas
+
+
+
+ About
+ Ayuda
+
+
+
+ Dark
+ Oscuro
+
+
+
+ Light
+ Claro
+
+
+
+ Green
+ Verde
+
+
+
+ Blue
+ Azul
+
+
+
+ Violet
+ Violeta
+
+
+
+ toolBar
+ barra de herramientas
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Abrir carpeta
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Vista de trofeos
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Configuraciones
+
+
+
+ General
+ General
+
+
+
+ System
+ Sistema
+
+
+
+ Console Language
+ Idioma de la consola
+
+
+
+ Emulator Language
+ Idioma del emulador
+
+
+
+ Emulator
+ Emulador
+
+
+
+ Enable Fullscreen
+ Habilitar pantalla completa
+
+
+
+ Show Splash
+ Mostrar splash
+
+
+
+ Is PS4 Pro
+ Modo PS4 Pro
+
+
+
+ Username
+ Nombre de usuario
+
+
+
+ Logger
+ Registro
+
+
+
+ Log Type
+ Tipo de registro
+
+
+
+ Log Filter
+ Filtro de registro
+
+
+
+ Graphics
+ Gráficos
+
+
+
+ Graphics Device
+ Dispositivo gráfico
+
+
+
+ Width
+ Ancho
+
+
+
+ Height
+ Alto
+
+
+
+ Vblank Divider
+ Divisor de Vblank
+
+
+
+ Advanced
+ Avanzado
+
+
+
+ Enable Shaders Dumping
+ Habilitar volcado de shaders
+
+
+
+ Enable NULL GPU
+ Habilitar GPU NULL
+
+
+
+ Enable PM4 Dumping
+ Habilitar volcado de PM4
+
+
+
+ Debug
+ Depuración
+
+
+
+ Enable Debug Dumping
+ Habilitar volcado de depuración
+
+
+
+ Enable Vulkan Validation Layers
+ Habilitar capas de validación de Vulkan
+
+
+
+ Enable Vulkan Synchronization Validation
+ Habilitar validación de sincronización de Vulkan
+
+
+
+ Enable RenderDoc Debugging
+ Habilitar depuración de RenderDoc
+
+
+
diff --git a/src/qt_gui/translations/fi.ts b/src/qt_gui/translations/fi.ts
new file mode 100644
index 00000000..af605d64
--- /dev/null
+++ b/src/qt_gui/translations/fi.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ This software should not be used to play games you have not legally obtained.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Loading game list, please wait :3
+
+
+
+ Cancel
+ Cancel
+
+
+
+ Loading...
+ Loading...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Choose directory
+
+
+
+ Directory to install games
+ Directory to install games
+
+
+
+ Browse
+ Browse
+
+
+
+ Error
+ Error
+
+
+
+ The value for location to install games is not valid.
+ The value for location to install games is not valid.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Create Shortcut
+
+
+
+ Open Game Folder
+ Open Game Folder
+
+
+
+ SFO Viewer
+ SFO Viewer
+
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ Copy info
+ Copy info
+
+
+
+ Copy Name
+ Copy Name
+
+
+
+ Copy Serial
+ Copy Serial
+
+
+
+ Copy All
+ Copy All
+
+
+
+ Shortcut creation
+ Shortcut creation
+
+
+
+ Shortcut created successfully!\n %1
+ Shortcut created successfully!\n %1
+
+
+
+ Error
+ Error
+
+
+
+ Error creating shortcut!\n %1
+ Error creating shortcut!\n %1
+
+
+
+ Install PKG
+ Install PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Open/Add Elf Folder
+
+
+
+ Install Packages (PKG)
+ Install Packages (PKG)
+
+
+
+ Boot Game
+ Boot Game
+
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ Configure...
+ Configure...
+
+
+
+ Install application from a .pkg file
+ Install application from a .pkg file
+
+
+
+ Recent Games
+ Recent Games
+
+
+
+ Exit
+ Exit
+
+
+
+ Exit shadPS4
+ Exit shadPS4
+
+
+
+ Exit the application.
+ Exit the application.
+
+
+
+ Show Game List
+ Show Game List
+
+
+
+ Game List Refresh
+ Game List Refresh
+
+
+
+ Tiny
+ Tiny
+
+
+
+ Small
+ Small
+
+
+
+ Medium
+ Medium
+
+
+
+ Large
+ Large
+
+
+
+ List View
+ List View
+
+
+
+ Grid View
+ Grid View
+
+
+
+ Elf Viewer
+ Elf Viewer
+
+
+
+ Game Install Directory
+ Game Install Directory
+
+
+
+ Dump Game List
+ Dump Game List
+
+
+
+ PKG Viewer
+ PKG Viewer
+
+
+
+ Search...
+ Search...
+
+
+
+ File
+ File
+
+
+
+ View
+ View
+
+
+
+ Game List Icons
+ Game List Icons
+
+
+
+ Game List Mode
+ Game List Mode
+
+
+
+ Settings
+ Settings
+
+
+
+ Utils
+ Utils
+
+
+
+ Themes
+ Themes
+
+
+
+ About
+ About
+
+
+
+ Dark
+ Dark
+
+
+
+ Light
+ Light
+
+
+
+ Green
+ Green
+
+
+
+ Blue
+ Blue
+
+
+
+ Violet
+ Violet
+
+
+
+ toolBar
+ toolBar
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Settings
+
+
+
+ General
+ General
+
+
+
+ System
+ System
+
+
+
+ Console Language
+ Console Language
+
+
+
+ Emulator Language
+ Emulator Language
+
+
+
+ Emulator
+ Emulator
+
+
+
+ Enable Fullscreen
+ Enable Fullscreen
+
+
+
+ Show Splash
+ Show Splash
+
+
+
+ Is PS4 Pro
+ Is PS4 Pro
+
+
+
+ Username
+ Username
+
+
+
+ Logger
+ Logger
+
+
+
+ Log Type
+ Log Type
+
+
+
+ Log Filter
+ Log Filter
+
+
+
+ Graphics
+ Graphics
+
+
+
+ Graphics Device
+ Graphics Device
+
+
+
+ Width
+ Width
+
+
+
+ Height
+ Height
+
+
+
+ Vblank Divider
+ Vblank Divider
+
+
+
+ Advanced
+ Advanced
+
+
+
+ Enable Shaders Dumping
+ Enable Shaders Dumping
+
+
+
+ Enable NULL GPU
+ Enable NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Enable PM4 Dumping
+
+
+
+ Debug
+ Debug
+
+
+
+ Enable Debug Dumping
+ Enable Debug Dumping
+
+
+
+ Enable Vulkan Validation Layers
+ Enable Vulkan Validation Layers
+
+
+
+ Enable Vulkan Synchronization Validation
+ Enable Vulkan Synchronization Validation
+
+
+
+ Enable RenderDoc Debugging
+ Enable RenderDoc Debugging
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts
new file mode 100644
index 00000000..3f3b38ba
--- /dev/null
+++ b/src/qt_gui/translations/fr.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ À propos de shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 est un émulateur open-source expérimental de la PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ Ce logiciel ne doit pas être utilisé pour jouer à des jeux que vous n'avez pas obtenus légalement.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Ouvrir un dossier
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Chargement de la liste de jeu, veuillez patienter...
+
+
+
+ Cancel
+ Annuler
+
+
+
+ Loading...
+ Chargement...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Choisir un répertoire
+
+
+
+ Directory to install games
+ Répertoire d'installation des jeux
+
+
+
+ Browse
+ Parcourir
+
+
+
+ Error
+ Erreur
+
+
+
+ The value for location to install games is not valid.
+ Le répertoire d'installation des jeux n'est pas valide.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Créer un raccourci
+
+
+
+ Open Game Folder
+ Ouvrir le dossier du jeu
+
+
+
+ SFO Viewer
+ Visionneuse SFO
+
+
+
+ Trophy Viewer
+ Visionneuse de trophées
+
+
+
+ Copy info
+ Copier les informations
+
+
+
+ Copy Name
+ Copier le nom
+
+
+
+ Copy Serial
+ Copier le numéro de série
+
+
+
+ Copy All
+ Copier tout
+
+
+
+ Shortcut creation
+ Création du raccourci
+
+
+
+ Shortcut created successfully!\n %1
+ Raccourci créé avec succès!\n %1
+
+
+
+ Error
+ Erreur
+
+
+
+ Error creating shortcut!\n %1
+ Erreur lors de la création du raccourci!\n %1
+
+
+
+ Install PKG
+ Installer un PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Ouvrir/Ajouter un dossier ELF
+
+
+
+ Install Packages (PKG)
+ Installer des packages (PKG)
+
+
+
+ Boot Game
+ Démarrer un jeu
+
+
+
+ About shadPS4
+ À propos de shadPS4
+
+
+
+ Configure...
+ Configurer...
+
+
+
+ Install application from a .pkg file
+ Installer une application depuis un fichier .pkg
+
+
+
+ Recent Games
+ Jeux récents
+
+
+
+ Exit
+ Fermer
+
+
+
+ Exit shadPS4
+ Fermer shadPS4
+
+
+
+ Exit the application.
+ Fermer l'application.
+
+
+
+ Show Game List
+ Afficher la liste de jeux
+
+
+
+ Game List Refresh
+ Rafraîchir la liste de jeux
+
+
+
+ Tiny
+ Très Petit
+
+
+
+ Small
+ Petit
+
+
+
+ Medium
+ Moyen
+
+
+
+ Large
+ Grand
+
+
+
+ List View
+ Mode liste
+
+
+
+ Grid View
+ Mode grille
+
+
+
+ Elf Viewer
+ Visionneuse ELF
+
+
+
+ Game Install Directory
+ Répertoire des jeux
+
+
+
+ Dump Game List
+ Dumper la liste des jeux
+
+
+
+ PKG Viewer
+ Visionneuse PKG
+
+
+
+ Search...
+ Chercher...
+
+
+
+ File
+ Fichier
+
+
+
+ View
+ Affichage
+
+
+
+ Game List Icons
+ Icônes des jeux
+
+
+
+ Game List Mode
+ Mode d'affichage
+
+
+
+ Settings
+ Paramètres
+
+
+
+ Utils
+ Utilitaire
+
+
+
+ Themes
+ Thèmes
+
+
+
+ About
+ À propos
+
+
+
+ Dark
+ Noir
+
+
+
+ Light
+ Blanc
+
+
+
+ Green
+ Vert
+
+
+
+ Blue
+ Bleu
+
+
+
+ Violet
+ Violet
+
+
+
+ toolBar
+ Bare d'outils
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Ouvrir un dossier
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Visionneuse de trophées
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Paramètres
+
+
+
+ General
+ Général
+
+
+
+ System
+ Système
+
+
+
+ Console Language
+ Langage de la console
+
+
+
+ Emulator Language
+ Langage de l'émulateur
+
+
+
+ Emulator
+ Émulateur
+
+
+
+ Enable Fullscreen
+ Plein écran
+
+
+
+ Show Splash
+ Afficher l'image du jeu
+
+
+
+ Is PS4 Pro
+ Mode PS4 Pro
+
+
+
+ Username
+ Nom d'utilisateur
+
+
+
+ Logger
+ Journalisation
+
+
+
+ Log Type
+ Type
+
+
+
+ Log Filter
+ Filtre
+
+
+
+ Graphics
+ Graphismes
+
+
+
+ Graphics Device
+ Carte graphique
+
+
+
+ Width
+ Largeur
+
+
+
+ Height
+ Hauteur
+
+
+
+ Vblank Divider
+ Vblank
+
+
+
+ Advanced
+ Avancé
+
+
+
+ Enable Shaders Dumping
+ Dumper les shaders
+
+
+
+ Enable NULL GPU
+ NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Dumper le PM4
+
+
+
+ Debug
+ Débogage
+
+
+
+ Enable Debug Dumping
+ Activer le débogage
+
+
+
+ Enable Vulkan Validation Layers
+ Couche de validation Vulkan
+
+
+
+ Enable Vulkan Synchronization Validation
+ Synchroniser la validation Vulkan
+
+
+
+ Enable RenderDoc Debugging
+ Activer le débogage RenderDoc
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts
new file mode 100644
index 00000000..a32b2d2a
--- /dev/null
+++ b/src/qt_gui/translations/hu_HU.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ This software should not be used to play games you have not legally obtained.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Loading game list, please wait :3
+
+
+
+ Cancel
+ Cancel
+
+
+
+ Loading...
+ Loading...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Choose directory
+
+
+
+ Directory to install games
+ Directory to install games
+
+
+
+ Browse
+ Browse
+
+
+
+ Error
+ Error
+
+
+
+ The value for location to install games is not valid.
+ The value for location to install games is not valid.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Create Shortcut
+
+
+
+ Open Game Folder
+ Open Game Folder
+
+
+
+ SFO Viewer
+ SFO Viewer
+
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ Copy info
+ Copy info
+
+
+
+ Copy Name
+ Copy Name
+
+
+
+ Copy Serial
+ Copy Serial
+
+
+
+ Copy All
+ Copy All
+
+
+
+ Shortcut creation
+ Shortcut creation
+
+
+
+ Shortcut created successfully!\n %1
+ Shortcut created successfully!\n %1
+
+
+
+ Error
+ Error
+
+
+
+ Error creating shortcut!\n %1
+ Error creating shortcut!\n %1
+
+
+
+ Install PKG
+ Install PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Open/Add Elf Folder
+
+
+
+ Install Packages (PKG)
+ Install Packages (PKG)
+
+
+
+ Boot Game
+ Boot Game
+
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ Configure...
+ Configure...
+
+
+
+ Install application from a .pkg file
+ Install application from a .pkg file
+
+
+
+ Recent Games
+ Recent Games
+
+
+
+ Exit
+ Exit
+
+
+
+ Exit shadPS4
+ Exit shadPS4
+
+
+
+ Exit the application.
+ Exit the application.
+
+
+
+ Show Game List
+ Show Game List
+
+
+
+ Game List Refresh
+ Game List Refresh
+
+
+
+ Tiny
+ Tiny
+
+
+
+ Small
+ Small
+
+
+
+ Medium
+ Medium
+
+
+
+ Large
+ Large
+
+
+
+ List View
+ List View
+
+
+
+ Grid View
+ Grid View
+
+
+
+ Elf Viewer
+ Elf Viewer
+
+
+
+ Game Install Directory
+ Game Install Directory
+
+
+
+ Dump Game List
+ Dump Game List
+
+
+
+ PKG Viewer
+ PKG Viewer
+
+
+
+ Search...
+ Search...
+
+
+
+ File
+ File
+
+
+
+ View
+ View
+
+
+
+ Game List Icons
+ Game List Icons
+
+
+
+ Game List Mode
+ Game List Mode
+
+
+
+ Settings
+ Settings
+
+
+
+ Utils
+ Utils
+
+
+
+ Themes
+ Themes
+
+
+
+ About
+ About
+
+
+
+ Dark
+ Dark
+
+
+
+ Light
+ Light
+
+
+
+ Green
+ Green
+
+
+
+ Blue
+ Blue
+
+
+
+ Violet
+ Violet
+
+
+
+ toolBar
+ toolBar
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Settings
+
+
+
+ General
+ General
+
+
+
+ System
+ System
+
+
+
+ Console Language
+ Console Language
+
+
+
+ Emulator Language
+ Emulator Language
+
+
+
+ Emulator
+ Emulator
+
+
+
+ Enable Fullscreen
+ Enable Fullscreen
+
+
+
+ Show Splash
+ Show Splash
+
+
+
+ Is PS4 Pro
+ Is PS4 Pro
+
+
+
+ Username
+ Username
+
+
+
+ Logger
+ Logger
+
+
+
+ Log Type
+ Log Type
+
+
+
+ Log Filter
+ Log Filter
+
+
+
+ Graphics
+ Graphics
+
+
+
+ Graphics Device
+ Graphics Device
+
+
+
+ Width
+ Width
+
+
+
+ Height
+ Height
+
+
+
+ Vblank Divider
+ Vblank Divider
+
+
+
+ Advanced
+ Advanced
+
+
+
+ Enable Shaders Dumping
+ Enable Shaders Dumping
+
+
+
+ Enable NULL GPU
+ Enable NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Enable PM4 Dumping
+
+
+
+ Debug
+ Debug
+
+
+
+ Enable Debug Dumping
+ Enable Debug Dumping
+
+
+
+ Enable Vulkan Validation Layers
+ Enable Vulkan Validation Layers
+
+
+
+ Enable Vulkan Synchronization Validation
+ Enable Vulkan Synchronization Validation
+
+
+
+ Enable RenderDoc Debugging
+ Enable RenderDoc Debugging
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/id.ts b/src/qt_gui/translations/id.ts
new file mode 100644
index 00000000..502be21e
--- /dev/null
+++ b/src/qt_gui/translations/id.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ This software should not be used to play games you have not legally obtained.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Loading game list, please wait :3
+
+
+
+ Cancel
+ Cancel
+
+
+
+ Loading...
+ Loading...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Choose directory
+
+
+
+ Directory to install games
+ Directory to install games
+
+
+
+ Browse
+ Browse
+
+
+
+ Error
+ Error
+
+
+
+ The value for location to install games is not valid.
+ The value for location to install games is not valid.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Create Shortcut
+
+
+
+ Open Game Folder
+ Open Game Folder
+
+
+
+ SFO Viewer
+ SFO Viewer
+
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ Copy info
+ Copy info
+
+
+
+ Copy Name
+ Copy Name
+
+
+
+ Copy Serial
+ Copy Serial
+
+
+
+ Copy All
+ Copy All
+
+
+
+ Shortcut creation
+ Shortcut creation
+
+
+
+ Shortcut created successfully!\n %1
+ Shortcut created successfully!\n %1
+
+
+
+ Error
+ Error
+
+
+
+ Error creating shortcut!\n %1
+ Error creating shortcut!\n %1
+
+
+
+ Install PKG
+ Install PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Open/Add Elf Folder
+
+
+
+ Install Packages (PKG)
+ Install Packages (PKG)
+
+
+
+ Boot Game
+ Boot Game
+
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ Configure...
+ Configure...
+
+
+
+ Install application from a .pkg file
+ Install application from a .pkg file
+
+
+
+ Recent Games
+ Recent Games
+
+
+
+ Exit
+ Exit
+
+
+
+ Exit shadPS4
+ Exit shadPS4
+
+
+
+ Exit the application.
+ Exit the application.
+
+
+
+ Show Game List
+ Show Game List
+
+
+
+ Game List Refresh
+ Game List Refresh
+
+
+
+ Tiny
+ Tiny
+
+
+
+ Small
+ Small
+
+
+
+ Medium
+ Medium
+
+
+
+ Large
+ Large
+
+
+
+ List View
+ List View
+
+
+
+ Grid View
+ Grid View
+
+
+
+ Elf Viewer
+ Elf Viewer
+
+
+
+ Game Install Directory
+ Game Install Directory
+
+
+
+ Dump Game List
+ Dump Game List
+
+
+
+ PKG Viewer
+ PKG Viewer
+
+
+
+ Search...
+ Search...
+
+
+
+ File
+ File
+
+
+
+ View
+ View
+
+
+
+ Game List Icons
+ Game List Icons
+
+
+
+ Game List Mode
+ Game List Mode
+
+
+
+ Settings
+ Settings
+
+
+
+ Utils
+ Utils
+
+
+
+ Themes
+ Themes
+
+
+
+ About
+ About
+
+
+
+ Dark
+ Dark
+
+
+
+ Light
+ Light
+
+
+
+ Green
+ Green
+
+
+
+ Blue
+ Blue
+
+
+
+ Violet
+ Violet
+
+
+
+ toolBar
+ toolBar
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Settings
+
+
+
+ General
+ General
+
+
+
+ System
+ System
+
+
+
+ Console Language
+ Console Language
+
+
+
+ Emulator Language
+ Emulator Language
+
+
+
+ Emulator
+ Emulator
+
+
+
+ Enable Fullscreen
+ Enable Fullscreen
+
+
+
+ Show Splash
+ Show Splash
+
+
+
+ Is PS4 Pro
+ Is PS4 Pro
+
+
+
+ Username
+ Username
+
+
+
+ Logger
+ Logger
+
+
+
+ Log Type
+ Log Type
+
+
+
+ Log Filter
+ Log Filter
+
+
+
+ Graphics
+ Graphics
+
+
+
+ Graphics Device
+ Graphics Device
+
+
+
+ Width
+ Width
+
+
+
+ Height
+ Height
+
+
+
+ Vblank Divider
+ Vblank Divider
+
+
+
+ Advanced
+ Advanced
+
+
+
+ Enable Shaders Dumping
+ Enable Shaders Dumping
+
+
+
+ Enable NULL GPU
+ Enable NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Enable PM4 Dumping
+
+
+
+ Debug
+ Debug
+
+
+
+ Enable Debug Dumping
+ Enable Debug Dumping
+
+
+
+ Enable Vulkan Validation Layers
+ Enable Vulkan Validation Layers
+
+
+
+ Enable Vulkan Synchronization Validation
+ Enable Vulkan Synchronization Validation
+
+
+
+ Enable RenderDoc Debugging
+ Enable RenderDoc Debugging
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/it.ts b/src/qt_gui/translations/it.ts
new file mode 100644
index 00000000..228d798d
--- /dev/null
+++ b/src/qt_gui/translations/it.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ Riguardo shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 è un emulatore sperimentale open source per Playstation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ Questo programma non dovrebbe essere utilizzato per riprodurre giochi che non vengono ottenuti legalmente.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Apri Cartella
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Caricamento lista giochi, attendere :3
+
+
+
+ Cancel
+ Annulla
+
+
+
+ Loading...
+ Caricamento...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Scegli cartella
+
+
+
+ Directory to install games
+ Cartella di installazione dei giochi
+
+
+
+ Browse
+ Sfoglia
+
+
+
+ Error
+ Errore
+
+
+
+ The value for location to install games is not valid.
+ Il valore del percorso di installazione dei giochi non è valido.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Crea scorciatoia
+
+
+
+ Open Game Folder
+ Apri cartella del gioco
+
+
+
+ SFO Viewer
+ Visualizzatore SFO
+
+
+
+ Trophy Viewer
+ Visualizzatore Trofei
+
+
+
+ Copy info
+ Copia informazioni
+
+
+
+ Copy Name
+ Copia Nome
+
+
+
+ Copy Serial
+ Copia Seriale
+
+
+
+ Copy All
+ Copia Tutto
+
+
+
+ Shortcut creation
+ Creazione scorciatoia
+
+
+
+ Shortcut created successfully!\n %1
+ Scorciatoia creata con successo!\n %1
+
+
+
+ Error
+ Errore
+
+
+
+ Error creating shortcut!\n %1
+ Errore nella creazione della scorciatoia!\n %1
+
+
+
+ Install PKG
+ Installa PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Apri/Aggiungi cartella Elf
+
+
+
+ Install Packages (PKG)
+ Installa Pacchetti (PKG)
+
+
+
+ Boot Game
+ Avvia Gioco
+
+
+
+ About shadPS4
+ Riguardo a shadPS4
+
+
+
+ Configure...
+ Configura...
+
+
+
+ Install application from a .pkg file
+ Installa applicaazione da un .pkg file
+
+
+
+ Recent Games
+ Giochi Recenti
+
+
+
+ Exit
+ Uscita
+
+
+
+ Exit shadPS4
+ Esci da shadPS4
+
+
+
+ Exit the application.
+ Esci dall'applicazione.
+
+
+
+ Show Game List
+ Mostra Lista Giochi
+
+
+
+ Game List Refresh
+ Aggiorna Lista Giochi
+
+
+
+ Tiny
+ Minuscolo
+
+
+
+ Small
+ Piccolo
+
+
+
+ Medium
+ Medio
+
+
+
+ Large
+ Grande
+
+
+
+ List View
+ Visualizzazione lista
+
+
+
+ Grid View
+ Visualizzazione Griglia
+
+
+
+ Elf Viewer
+ Visualizzatore Elf
+
+
+
+ Game Install Directory
+ Cartella Installazione Giochi
+
+
+
+ Dump Game List
+ Scarica Lista Giochi
+
+
+
+ PKG Viewer
+ Visualizzatore PKG
+
+
+
+ Search...
+ Cerca...
+
+
+
+ File
+ File
+
+
+
+ View
+ Visualizza
+
+
+
+ Game List Icons
+ Icone Lista Giochi
+
+
+
+ Game List Mode
+ Modalità Lista Giochi
+
+
+
+ Settings
+ Impostazioni
+
+
+
+ Utils
+ Utilità
+
+
+
+ Themes
+ Temi
+
+
+
+ About
+ Info su
+
+
+
+ Dark
+ Scuro
+
+
+
+ Light
+ Chiaro
+
+
+
+ Green
+ Verde
+
+
+
+ Blue
+ Blu
+
+
+
+ Violet
+ Viola
+
+
+
+ toolBar
+ barra strumenti
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Apri Cartella
+
+
+
+ TrophyViewer
+
+
+ Visualizzatore Trofei
+ Trophy Viewer
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Impostazioni
+
+
+
+ General
+ Generale
+
+
+
+ System
+ Systema
+
+
+
+ Console Language
+ Lingua della console
+
+
+
+ Emulator Language
+ Lingua dell'emulatore
+
+
+
+ Emulator
+ Emulatore
+
+
+
+ Enable Fullscreen
+ Abilita Schermo Intero
+
+
+
+ Show Splash
+ Mostra Schermata Iniziale
+
+
+
+ Is PS4 Pro
+ Modalità Ps4Pro
+
+
+
+ Username
+ Nome Utente
+
+
+
+ Logger
+ Logger
+
+
+
+ Log Type
+ Tipo di Log
+
+
+
+ Log Filter
+ Filtro Log
+
+
+
+ Graphics
+ Grafica
+
+
+
+ Graphics Device
+ Adattatore grafico
+
+
+
+ Width
+ Larghezza
+
+
+
+ Height
+ Altezza
+
+
+
+ Vblank Divider
+ Divisore Vblank
+
+
+
+ Advanced
+ Avanzato
+
+
+
+ Enable Shaders Dumping
+ Abilita Scaricamento Shader
+
+
+
+ Enable NULL GPU
+ Abilita NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Abilita Scaricamento PM4
+
+
+
+ Debug
+ Debug
+
+
+
+ Enable Debug Dumping
+ Abilita Scaricamento Debug
+
+
+
+ Enable Vulkan Validation Layers
+ Abilita Vulkan Validation Layers
+
+
+
+ Enable Vulkan Synchronization Validation
+ Abilita Vulkan Synchronization Validation
+
+
+
+ Enable RenderDoc Debugging
+ Abilita Debugging RenderDoc
+
+
+
diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts
new file mode 100644
index 00000000..557b0760
--- /dev/null
+++ b/src/qt_gui/translations/ja_JP.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ shadPS4について
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4は、PlayStation 4の実験的なオープンソースエミュレーターです。
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ このソフトウェアは、合法的に入手していないゲームをプレイするために使用するものではありません。
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ フォルダを開く
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ ゲームリストを読み込み中です。お待ちください :3
+
+
+
+ Cancel
+ キャンセル
+
+
+
+ Loading...
+ 読み込み中...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - ディレクトリを選択
+
+
+
+ Directory to install games
+ ゲームをインストールするディレクトリ
+
+
+
+ Browse
+ 参照
+
+
+
+ Error
+ エラー
+
+
+
+ The value for location to install games is not valid.
+ ゲームをインストールする場所が無効です。
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ ショートカットを作成
+
+
+
+ Open Game Folder
+ ゲームフォルダを開く
+
+
+
+ SFO Viewer
+ SFOビューワー
+
+
+
+ Trophy Viewer
+ トロフィービューワー
+
+
+
+ Copy info
+ 情報をコピー
+
+
+
+ Copy Name
+ 名前をコピー
+
+
+
+ Copy Serial
+ シリアルをコピー
+
+
+
+ Copy All
+ すべてコピー
+
+
+
+ Shortcut creation
+ ショートカットの作成
+
+
+
+ Shortcut created successfully!\n %1
+ ショートカットが正常に作成されました!\n %1
+
+
+
+ Error
+ エラー
+
+
+
+ Error creating shortcut!\n %1
+ ショートカットの作成に失敗しました!\n %1
+
+
+
+ Install PKG
+ PKGをインストール
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Elfフォルダを開く/追加する
+
+
+
+ Install Packages (PKG)
+ パッケージをインストール (PKG)
+
+
+
+ Boot Game
+ ゲームを起動
+
+
+
+ About shadPS4
+ shadPS4について
+
+
+
+ Configure...
+ 設定...
+
+
+
+ Install application from a .pkg file
+ .pkgファイルからアプリケーションをインストールする
+
+
+
+ Recent Games
+ 最近のゲーム
+
+
+
+ Exit
+ 終了
+
+
+
+ Exit shadPS4
+ shadPS4を終了
+
+
+
+ Exit the application.
+ アプリケーションを終了します。
+
+
+
+ Show Game List
+ ゲームリストを表示
+
+
+
+ Game List Refresh
+ ゲームリストの更新
+
+
+
+ Tiny
+ 極小
+
+
+
+ Small
+ 小
+
+
+
+ Medium
+ 中
+
+
+
+ Large
+ 大
+
+
+
+ List View
+ リストビュー
+
+
+
+ Grid View
+ グリッドビュー
+
+
+
+ Elf Viewer
+ Elfビュワー
+
+
+
+ Game Install Directory
+ ゲームインストールディレクトリ
+
+
+
+ Dump Game List
+ ゲームリストをダンプ
+
+
+
+ PKG Viewer
+ PKGビューアー
+
+
+
+ Search...
+ 検索...
+
+
+
+ File
+ ファイル
+
+
+
+ View
+ 表示
+
+
+
+ Game List Icons
+ ゲームリストアイコン
+
+
+
+ Game List Mode
+ ゲームリストモード
+
+
+
+ Settings
+ 設定
+
+
+
+ Utils
+ ユーティリティ
+
+
+
+ Themes
+ テーマ
+
+
+
+ About
+ 情報
+
+
+
+ Dark
+ ダーク
+
+
+
+ Light
+ ライト
+
+
+
+ Green
+ グリーン
+
+
+
+ Blue
+ ブルー
+
+
+
+ Violet
+ バイオレット
+
+
+
+ toolBar
+ ツールバー
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ フォルダーを開く
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ トロフィービューアー
+
+
+
+ SettingsDialog
+
+
+ Settings
+ 設定
+
+
+
+ General
+ 一般
+
+
+
+ System
+ システム
+
+
+
+ Console Language
+ コンソール言語
+
+
+
+ Emulator Language
+ エミュレーター言語
+
+
+
+ Emulator
+ エミュレーター
+
+
+
+ Enable Fullscreen
+ フルスクリーンを有効にする
+
+
+
+ Show Splash
+ スプラッシュを表示する
+
+
+
+ Is PS4 Pro
+ PS4 Proモード
+
+
+
+ Username
+ ユーザー名
+
+
+
+ Logger
+ ロガー
+
+
+
+ Log Type
+ ログタイプ
+
+
+
+ Log Filter
+ ログフィルター
+
+
+
+ Graphics
+ グラフィックス
+
+
+
+ Graphics Device
+ グラフィックスデバイス
+
+
+
+ Width
+ 幅
+
+
+
+ Height
+ 高さ
+
+
+
+ Vblank Divider
+ Vblankディバイダー
+
+
+
+ Advanced
+ 高度な設定
+
+
+
+ Enable Shaders Dumping
+ シェーダーのダンプを有効にする
+
+
+
+ Enable NULL GPU
+ NULL GPUを有効にする
+
+
+
+ Enable PM4 Dumping
+ PM4ダンプを有効にする
+
+
+
+ Debug
+ デバッグ
+
+
+
+ Enable Debug Dumping
+ デバッグダンプを有効にする
+
+
+
+ Enable Vulkan Validation Layers
+ Vulkan検証レイヤーを有効にする
+
+
+
+ Enable Vulkan Synchronization Validation
+ Vulkan同期検証を有効にする
+
+
+
+ Enable RenderDoc Debugging
+ RenderDocデバッグを有効にする
+
+
+
diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts
new file mode 100644
index 00000000..b33b5d92
--- /dev/null
+++ b/src/qt_gui/translations/ko_KR.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ This software should not be used to play games you have not legally obtained.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Loading game list, please wait :3
+
+
+
+ Cancel
+ Cancel
+
+
+
+ Loading...
+ Loading...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Choose directory
+
+
+
+ Directory to install games
+ Directory to install games
+
+
+
+ Browse
+ Browse
+
+
+
+ Error
+ Error
+
+
+
+ The value for location to install games is not valid.
+ The value for location to install games is not valid.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Create Shortcut
+
+
+
+ Open Game Folder
+ Open Game Folder
+
+
+
+ SFO Viewer
+ SFO Viewer
+
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ Copy info
+ Copy info
+
+
+
+ Copy Name
+ Copy Name
+
+
+
+ Copy Serial
+ Copy Serial
+
+
+
+ Copy All
+ Copy All
+
+
+
+ Shortcut creation
+ Shortcut creation
+
+
+
+ Shortcut created successfully!\n %1
+ Shortcut created successfully!\n %1
+
+
+
+ Error
+ Error
+
+
+
+ Error creating shortcut!\n %1
+ Error creating shortcut!\n %1
+
+
+
+ Install PKG
+ Install PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Open/Add Elf Folder
+
+
+
+ Install Packages (PKG)
+ Install Packages (PKG)
+
+
+
+ Boot Game
+ Boot Game
+
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ Configure...
+ Configure...
+
+
+
+ Install application from a .pkg file
+ Install application from a .pkg file
+
+
+
+ Recent Games
+ Recent Games
+
+
+
+ Exit
+ Exit
+
+
+
+ Exit shadPS4
+ Exit shadPS4
+
+
+
+ Exit the application.
+ Exit the application.
+
+
+
+ Show Game List
+ Show Game List
+
+
+
+ Game List Refresh
+ Game List Refresh
+
+
+
+ Tiny
+ Tiny
+
+
+
+ Small
+ Small
+
+
+
+ Medium
+ Medium
+
+
+
+ Large
+ Large
+
+
+
+ List View
+ List View
+
+
+
+ Grid View
+ Grid View
+
+
+
+ Elf Viewer
+ Elf Viewer
+
+
+
+ Game Install Directory
+ Game Install Directory
+
+
+
+ Dump Game List
+ Dump Game List
+
+
+
+ PKG Viewer
+ PKG Viewer
+
+
+
+ Search...
+ Search...
+
+
+
+ File
+ File
+
+
+
+ View
+ View
+
+
+
+ Game List Icons
+ Game List Icons
+
+
+
+ Game List Mode
+ Game List Mode
+
+
+
+ Settings
+ Settings
+
+
+
+ Utils
+ Utils
+
+
+
+ Themes
+ Themes
+
+
+
+ About
+ About
+
+
+
+ Dark
+ Dark
+
+
+
+ Light
+ Light
+
+
+
+ Green
+ Green
+
+
+
+ Blue
+ Blue
+
+
+
+ Violet
+ Violet
+
+
+
+ toolBar
+ toolBar
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Settings
+
+
+
+ General
+ General
+
+
+
+ System
+ System
+
+
+
+ Console Language
+ Console Language
+
+
+
+ Emulator Language
+ Emulator Language
+
+
+
+ Emulator
+ Emulator
+
+
+
+ Enable Fullscreen
+ Enable Fullscreen
+
+
+
+ Show Splash
+ Show Splash
+
+
+
+ Is PS4 Pro
+ Is PS4 Pro
+
+
+
+ Username
+ Username
+
+
+
+ Logger
+ Logger
+
+
+
+ Log Type
+ Log Type
+
+
+
+ Log Filter
+ Log Filter
+
+
+
+ Graphics
+ Graphics
+
+
+
+ Graphics Device
+ Graphics Device
+
+
+
+ Width
+ Width
+
+
+
+ Height
+ Height
+
+
+
+ Vblank Divider
+ Vblank Divider
+
+
+
+ Advanced
+ Advanced
+
+
+
+ Enable Shaders Dumping
+ Enable Shaders Dumping
+
+
+
+ Enable NULL GPU
+ Enable NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Enable PM4 Dumping
+
+
+
+ Debug
+ Debug
+
+
+
+ Enable Debug Dumping
+ Enable Debug Dumping
+
+
+
+ Enable Vulkan Validation Layers
+ Enable Vulkan Validation Layers
+
+
+
+ Enable Vulkan Synchronization Validation
+ Enable Vulkan Synchronization Validation
+
+
+
+ Enable RenderDoc Debugging
+ Enable RenderDoc Debugging
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts
new file mode 100644
index 00000000..286ec3f4
--- /dev/null
+++ b/src/qt_gui/translations/lt_LT.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ This software should not be used to play games you have not legally obtained.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Loading game list, please wait :3
+
+
+
+ Cancel
+ Cancel
+
+
+
+ Loading...
+ Loading...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Choose directory
+
+
+
+ Directory to install games
+ Directory to install games
+
+
+
+ Browse
+ Browse
+
+
+
+ Error
+ Error
+
+
+
+ The value for location to install games is not valid.
+ The value for location to install games is not valid.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Create Shortcut
+
+
+
+ Open Game Folder
+ Open Game Folder
+
+
+
+ SFO Viewer
+ SFO Viewer
+
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ Copy info
+ Copy info
+
+
+
+ Copy Name
+ Copy Name
+
+
+
+ Copy Serial
+ Copy Serial
+
+
+
+ Copy All
+ Copy All
+
+
+
+ Shortcut creation
+ Shortcut creation
+
+
+
+ Shortcut created successfully!\n %1
+ Shortcut created successfully!\n %1
+
+
+
+ Error
+ Error
+
+
+
+ Error creating shortcut!\n %1
+ Error creating shortcut!\n %1
+
+
+
+ Install PKG
+ Install PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Open/Add Elf Folder
+
+
+
+ Install Packages (PKG)
+ Install Packages (PKG)
+
+
+
+ Boot Game
+ Boot Game
+
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ Configure...
+ Configure...
+
+
+
+ Install application from a .pkg file
+ Install application from a .pkg file
+
+
+
+ Recent Games
+ Recent Games
+
+
+
+ Exit
+ Exit
+
+
+
+ Exit shadPS4
+ Exit shadPS4
+
+
+
+ Exit the application.
+ Exit the application.
+
+
+
+ Show Game List
+ Show Game List
+
+
+
+ Game List Refresh
+ Game List Refresh
+
+
+
+ Tiny
+ Tiny
+
+
+
+ Small
+ Small
+
+
+
+ Medium
+ Medium
+
+
+
+ Large
+ Large
+
+
+
+ List View
+ List View
+
+
+
+ Grid View
+ Grid View
+
+
+
+ Elf Viewer
+ Elf Viewer
+
+
+
+ Game Install Directory
+ Game Install Directory
+
+
+
+ Dump Game List
+ Dump Game List
+
+
+
+ PKG Viewer
+ PKG Viewer
+
+
+
+ Search...
+ Search...
+
+
+
+ File
+ File
+
+
+
+ View
+ View
+
+
+
+ Game List Icons
+ Game List Icons
+
+
+
+ Game List Mode
+ Game List Mode
+
+
+
+ Settings
+ Settings
+
+
+
+ Utils
+ Utils
+
+
+
+ Themes
+ Themes
+
+
+
+ About
+ About
+
+
+
+ Dark
+ Dark
+
+
+
+ Light
+ Light
+
+
+
+ Green
+ Green
+
+
+
+ Blue
+ Blue
+
+
+
+ Violet
+ Violet
+
+
+
+ toolBar
+ toolBar
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Settings
+
+
+
+ General
+ General
+
+
+
+ System
+ System
+
+
+
+ Console Language
+ Console Language
+
+
+
+ Emulator Language
+ Emulator Language
+
+
+
+ Emulator
+ Emulator
+
+
+
+ Enable Fullscreen
+ Enable Fullscreen
+
+
+
+ Show Splash
+ Show Splash
+
+
+
+ Is PS4 Pro
+ Is PS4 Pro
+
+
+
+ Username
+ Username
+
+
+
+ Logger
+ Logger
+
+
+
+ Log Type
+ Log Type
+
+
+
+ Log Filter
+ Log Filter
+
+
+
+ Graphics
+ Graphics
+
+
+
+ Graphics Device
+ Graphics Device
+
+
+
+ Width
+ Width
+
+
+
+ Height
+ Height
+
+
+
+ Vblank Divider
+ Vblank Divider
+
+
+
+ Advanced
+ Advanced
+
+
+
+ Enable Shaders Dumping
+ Enable Shaders Dumping
+
+
+
+ Enable NULL GPU
+ Enable NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Enable PM4 Dumping
+
+
+
+ Debug
+ Debug
+
+
+
+ Enable Debug Dumping
+ Enable Debug Dumping
+
+
+
+ Enable Vulkan Validation Layers
+ Enable Vulkan Validation Layers
+
+
+
+ Enable Vulkan Synchronization Validation
+ Enable Vulkan Synchronization Validation
+
+
+
+ Enable RenderDoc Debugging
+ Enable RenderDoc Debugging
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/nb.ts b/src/qt_gui/translations/nb.ts
new file mode 100644
index 00000000..27fc540c
--- /dev/null
+++ b/src/qt_gui/translations/nb.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ This software should not be used to play games you have not legally obtained.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Loading game list, please wait :3
+
+
+
+ Cancel
+ Cancel
+
+
+
+ Loading...
+ Loading...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Choose directory
+
+
+
+ Directory to install games
+ Directory to install games
+
+
+
+ Browse
+ Browse
+
+
+
+ Error
+ Error
+
+
+
+ The value for location to install games is not valid.
+ The value for location to install games is not valid.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Create Shortcut
+
+
+
+ Open Game Folder
+ Open Game Folder
+
+
+
+ SFO Viewer
+ SFO Viewer
+
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ Copy info
+ Copy info
+
+
+
+ Copy Name
+ Copy Name
+
+
+
+ Copy Serial
+ Copy Serial
+
+
+
+ Copy All
+ Copy All
+
+
+
+ Shortcut creation
+ Shortcut creation
+
+
+
+ Shortcut created successfully!\n %1
+ Shortcut created successfully!\n %1
+
+
+
+ Error
+ Error
+
+
+
+ Error creating shortcut!\n %1
+ Error creating shortcut!\n %1
+
+
+
+ Install PKG
+ Install PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Open/Add Elf Folder
+
+
+
+ Install Packages (PKG)
+ Install Packages (PKG)
+
+
+
+ Boot Game
+ Boot Game
+
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ Configure...
+ Configure...
+
+
+
+ Install application from a .pkg file
+ Install application from a .pkg file
+
+
+
+ Recent Games
+ Recent Games
+
+
+
+ Exit
+ Exit
+
+
+
+ Exit shadPS4
+ Exit shadPS4
+
+
+
+ Exit the application.
+ Exit the application.
+
+
+
+ Show Game List
+ Show Game List
+
+
+
+ Game List Refresh
+ Game List Refresh
+
+
+
+ Tiny
+ Tiny
+
+
+
+ Small
+ Small
+
+
+
+ Medium
+ Medium
+
+
+
+ Large
+ Large
+
+
+
+ List View
+ List View
+
+
+
+ Grid View
+ Grid View
+
+
+
+ Elf Viewer
+ Elf Viewer
+
+
+
+ Game Install Directory
+ Game Install Directory
+
+
+
+ Dump Game List
+ Dump Game List
+
+
+
+ PKG Viewer
+ PKG Viewer
+
+
+
+ Search...
+ Search...
+
+
+
+ File
+ File
+
+
+
+ View
+ View
+
+
+
+ Game List Icons
+ Game List Icons
+
+
+
+ Game List Mode
+ Game List Mode
+
+
+
+ Settings
+ Settings
+
+
+
+ Utils
+ Utils
+
+
+
+ Themes
+ Themes
+
+
+
+ About
+ About
+
+
+
+ Dark
+ Dark
+
+
+
+ Light
+ Light
+
+
+
+ Green
+ Green
+
+
+
+ Blue
+ Blue
+
+
+
+ Violet
+ Violet
+
+
+
+ toolBar
+ toolBar
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Settings
+
+
+
+ General
+ General
+
+
+
+ System
+ System
+
+
+
+ Console Language
+ Console Language
+
+
+
+ Emulator Language
+ Emulator Language
+
+
+
+ Emulator
+ Emulator
+
+
+
+ Enable Fullscreen
+ Enable Fullscreen
+
+
+
+ Show Splash
+ Show Splash
+
+
+
+ Is PS4 Pro
+ Is PS4 Pro
+
+
+
+ Username
+ Username
+
+
+
+ Logger
+ Logger
+
+
+
+ Log Type
+ Log Type
+
+
+
+ Log Filter
+ Log Filter
+
+
+
+ Graphics
+ Graphics
+
+
+
+ Graphics Device
+ Graphics Device
+
+
+
+ Width
+ Width
+
+
+
+ Height
+ Height
+
+
+
+ Vblank Divider
+ Vblank Divider
+
+
+
+ Advanced
+ Advanced
+
+
+
+ Enable Shaders Dumping
+ Enable Shaders Dumping
+
+
+
+ Enable NULL GPU
+ Enable NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Enable PM4 Dumping
+
+
+
+ Debug
+ Debug
+
+
+
+ Enable Debug Dumping
+ Enable Debug Dumping
+
+
+
+ Enable Vulkan Validation Layers
+ Enable Vulkan Validation Layers
+
+
+
+ Enable Vulkan Synchronization Validation
+ Enable Vulkan Synchronization Validation
+
+
+
+ Enable RenderDoc Debugging
+ Enable RenderDoc Debugging
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/nl.ts b/src/qt_gui/translations/nl.ts
new file mode 100644
index 00000000..2f4f5f9b
--- /dev/null
+++ b/src/qt_gui/translations/nl.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ This software should not be used to play games you have not legally obtained.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Loading game list, please wait :3
+
+
+
+ Cancel
+ Cancel
+
+
+
+ Loading...
+ Loading...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Choose directory
+
+
+
+ Directory to install games
+ Directory to install games
+
+
+
+ Browse
+ Browse
+
+
+
+ Error
+ Error
+
+
+
+ The value for location to install games is not valid.
+ The value for location to install games is not valid.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Create Shortcut
+
+
+
+ Open Game Folder
+ Open Game Folder
+
+
+
+ SFO Viewer
+ SFO Viewer
+
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ Copy info
+ Copy info
+
+
+
+ Copy Name
+ Copy Name
+
+
+
+ Copy Serial
+ Copy Serial
+
+
+
+ Copy All
+ Copy All
+
+
+
+ Shortcut creation
+ Shortcut creation
+
+
+
+ Shortcut created successfully!\n %1
+ Shortcut created successfully!\n %1
+
+
+
+ Error
+ Error
+
+
+
+ Error creating shortcut!\n %1
+ Error creating shortcut!\n %1
+
+
+
+ Install PKG
+ Install PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Open/Add Elf Folder
+
+
+
+ Install Packages (PKG)
+ Install Packages (PKG)
+
+
+
+ Boot Game
+ Boot Game
+
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ Configure...
+ Configure...
+
+
+
+ Install application from a .pkg file
+ Install application from a .pkg file
+
+
+
+ Recent Games
+ Recent Games
+
+
+
+ Exit
+ Exit
+
+
+
+ Exit shadPS4
+ Exit shadPS4
+
+
+
+ Exit the application.
+ Exit the application.
+
+
+
+ Show Game List
+ Show Game List
+
+
+
+ Game List Refresh
+ Game List Refresh
+
+
+
+ Tiny
+ Tiny
+
+
+
+ Small
+ Small
+
+
+
+ Medium
+ Medium
+
+
+
+ Large
+ Large
+
+
+
+ List View
+ List View
+
+
+
+ Grid View
+ Grid View
+
+
+
+ Elf Viewer
+ Elf Viewer
+
+
+
+ Game Install Directory
+ Game Install Directory
+
+
+
+ Dump Game List
+ Dump Game List
+
+
+
+ PKG Viewer
+ PKG Viewer
+
+
+
+ Search...
+ Search...
+
+
+
+ File
+ File
+
+
+
+ View
+ View
+
+
+
+ Game List Icons
+ Game List Icons
+
+
+
+ Game List Mode
+ Game List Mode
+
+
+
+ Settings
+ Settings
+
+
+
+ Utils
+ Utils
+
+
+
+ Themes
+ Themes
+
+
+
+ About
+ About
+
+
+
+ Dark
+ Dark
+
+
+
+ Light
+ Light
+
+
+
+ Green
+ Green
+
+
+
+ Blue
+ Blue
+
+
+
+ Violet
+ Violet
+
+
+
+ toolBar
+ toolBar
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Settings
+
+
+
+ General
+ General
+
+
+
+ System
+ System
+
+
+
+ Console Language
+ Console Language
+
+
+
+ Emulator Language
+ Emulator Language
+
+
+
+ Emulator
+ Emulator
+
+
+
+ Enable Fullscreen
+ Enable Fullscreen
+
+
+
+ Show Splash
+ Show Splash
+
+
+
+ Is PS4 Pro
+ Is PS4 Pro
+
+
+
+ Username
+ Username
+
+
+
+ Logger
+ Logger
+
+
+
+ Log Type
+ Log Type
+
+
+
+ Log Filter
+ Log Filter
+
+
+
+ Graphics
+ Graphics
+
+
+
+ Graphics Device
+ Graphics Device
+
+
+
+ Width
+ Width
+
+
+
+ Height
+ Height
+
+
+
+ Vblank Divider
+ Vblank Divider
+
+
+
+ Advanced
+ Advanced
+
+
+
+ Enable Shaders Dumping
+ Enable Shaders Dumping
+
+
+
+ Enable NULL GPU
+ Enable NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Enable PM4 Dumping
+
+
+
+ Debug
+ Debug
+
+
+
+ Enable Debug Dumping
+ Enable Debug Dumping
+
+
+
+ Enable Vulkan Validation Layers
+ Enable Vulkan Validation Layers
+
+
+
+ Enable Vulkan Synchronization Validation
+ Enable Vulkan Synchronization Validation
+
+
+
+ Enable RenderDoc Debugging
+ Enable RenderDoc Debugging
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts
new file mode 100644
index 00000000..7d18f203
--- /dev/null
+++ b/src/qt_gui/translations/pl_PL.ts
@@ -0,0 +1,493 @@
+
+
+
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ O programie
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 to eksperymentalny otwartoźródłowy emulator konsoli PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ To oprogramowanie nie służy do grania w gry pochodzące z nielegalnego źródła.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Otwórz folder
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Ładowanie listy gier, proszę poczekaj :3
+
+
+
+ Cancel
+ Anuluj
+
+
+
+ Loading...
+ Ładowanie...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Wybierz katalog
+
+
+
+ Directory to install games
+ Katalog do instalacji gier
+
+
+
+ Browse
+ Przeglądaj
+
+
+
+ Error
+ Błąd
+
+
+
+ The value for location to install games is not valid.
+ Podana ścieżka do instalacji gier nie jest prawidłowa.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Utwórz skrót
+
+
+
+ Open Game Folder
+ Otwórz katalog gry
+
+
+
+ SFO Viewer
+ Menedżer plików SFO
+
+
+
+ Trophy Viewer
+ Menedżer trofeów
+
+
+
+ Copy info
+ Kopiuj informacje
+
+
+
+ Copy Name
+ Kopiuj nazwę
+
+
+
+ Copy Serial
+ Kopiuj numer seryjny
+
+
+
+ Copy All
+ Kopiuj wszystko
+
+
+
+ Shortcut creation
+ Tworzenie skrótu
+
+
+
+ Shortcut created successfully!\n %1
+ Utworzenie skrótu zakończone pomyślnie!\n %1
+
+
+
+ Error
+ Błąd
+
+
+
+ Error creating shortcut!\n %1
+ Utworzenie skrótu zakończone niepowodzeniem!\n %1
+
+
+
+ Install PKG
+ Zainstaluj PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Otwórz/Dodaj folder Elf
+
+
+
+ Install Packages (PKG)
+ Zainstaluj paczkę (PKG)
+
+
+
+ Boot Game
+ Uruchom grę
+
+
+
+ About shadPS4
+ O programie
+
+
+
+ Configure...
+ Konfiguruj...
+
+
+
+ Install application from a .pkg file
+ Zainstaluj aplikacje z pliku .pkg
+
+
+
+ Recent Games
+ Ostatnie gry
+
+
+
+ Exit
+ Wyjdź
+
+
+
+ Exit shadPS4
+ Wyjdź z shadPS4
+
+
+
+ Exit the application.
+ Wyjdź z aplikacji.
+
+
+
+ Show Game List
+ Pokaż listę gier
+
+
+
+ Game List Refresh
+ Odśwież listę gier
+
+
+
+ Tiny
+ Malutkie
+
+
+
+ Small
+ Małe
+
+
+
+ Medium
+ Średnie
+
+
+
+ Large
+ Wielkie
+
+
+
+ List View
+ Widok listy
+
+
+
+ Grid View
+ Widok siatki
+
+
+
+ Elf Viewer
+ Menedżer plików ELF
+
+
+
+ Game Install Directory
+ Katalog zainstalowanej gry
+
+
+
+ Dump Game List
+ Zgraj listę gier
+
+
+
+ PKG Viewer
+ Menedżer plików PKG
+
+
+
+ Search...
+ Szukaj...
+
+
+
+ File
+ Plik
+
+
+
+ View
+ Widok
+
+
+
+ Game List Icons
+ Ikony w widoku listy
+
+
+
+ Game List Mode
+ Tryb listy gier
+
+
+
+ Settings
+ Ustawienia
+
+
+
+ Utils
+ Narzędzia
+
+
+
+ Themes
+ Motywy
+
+
+
+ About
+ O programie
+
+
+
+ Dark
+ Ciemny
+
+
+
+ Light
+ Jasny
+
+
+
+ Green
+ Zielony
+
+
+
+ Blue
+ Niebieski
+
+
+
+ Violet
+ Fioletowy
+
+
+
+ toolBar
+ Pasek narzędzi
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Menedżer trofeów
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Ustawienia
+
+
+
+ General
+ Ogólne
+
+
+
+ System
+ System
+
+
+
+ Console Language
+ Język konsoli
+
+
+
+ Emulator Language
+ Język emulatora
+
+
+
+ Emulator
+ Emulator
+
+
+
+ Enable Fullscreen
+ Włącz pełny ekran
+
+
+
+ Show Splash
+ Pokaż ekran powitania
+
+
+
+ Is PS4 Pro
+ Emulacja PS4 Pro
+
+
+
+ Username
+ Nazwa użytkownika
+
+
+
+ Logger
+ Dziennik zdarzeń
+
+
+
+ Log Type
+ Typ dziennika
+
+
+
+ Log Filter
+ Filtrowanie dziennika
+
+
+
+ Graphics
+ Grafika
+
+
+
+ Graphics Device
+ Karta graficzna
+
+
+
+ Width
+ Szerokość
+
+
+
+ Height
+ Wysokość
+
+
+
+ Vblank Divider
+ Dzielnik pionowego blankingu (Vblank)
+
+
+
+ Advanced
+ Zaawansowane
+
+
+
+ Enable Shaders Dumping
+ Włącz zgrywanie cieni
+
+
+
+ Enable NULL GPU
+ Wyłącz kartę graficzną
+
+
+
+ Enable PM4 Dumping
+ Włącz zgrywanie PM4
+
+
+
+ Debug
+ Debugowanie
+
+
+
+ Enable Debug Dumping
+ Włącz zgrywanie debugowania
+
+
+
+ Enable Vulkan Validation Layers
+ Włącz warstwy walidacji Vulkan
+
+
+
+ Enable Vulkan Synchronization Validation
+ Włącz walidację synchronizacji Vulkan
+
+
+
+ Enable RenderDoc Debugging
+ Włącz debugowanie RenderDoc
+
+
+
diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts
new file mode 100644
index 00000000..c98d8441
--- /dev/null
+++ b/src/qt_gui/translations/pt_BR.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ Sobre o shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 é um emulador experimental de código-fonte aberto para o PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ Este software não deve ser usado para jogar jogos piratas.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Abrir Pasta
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Carregando lista de jogos, por favor aguarde :3
+
+
+
+ Cancel
+ Cancelar
+
+
+
+ Loading...
+ Carregando...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Escolha o diretório
+
+
+
+ Directory to install games
+ Diretório para instalar jogos
+
+
+
+ Browse
+ Procurar
+
+
+
+ Error
+ Erro
+
+
+
+ The value for location to install games is not valid.
+ O diretório da instalação dos jogos não é válido.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Criar Atalho
+
+
+
+ Open Game Folder
+ Abrir Pasta do Jogo
+
+
+
+ SFO Viewer
+ Visualizador de SFO
+
+
+
+ Trophy Viewer
+ Visualizador de Troféu
+
+
+
+ Copy info
+ Copiar informação
+
+
+
+ Copy Name
+ Copiar Nome
+
+
+
+ Copy Serial
+ Copiar Serial
+
+
+
+ Copy All
+ Copiar Tudo
+
+
+
+ Shortcut creation
+ Criação de atalho
+
+
+
+ Shortcut created successfully!\n %1
+ Atalho criado com sucesso!\n %1
+
+
+
+ Error
+ Erro
+
+
+
+ Error creating shortcut!\n %1
+ Erro ao criar atalho!\n %1
+
+
+
+ Install PKG
+ Instalar PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Abrir/Adicionar pasta Elf
+
+
+
+ Install Packages (PKG)
+ Instalar Pacotes (PKG)
+
+
+
+ Boot Game
+ Iniciar Jogo
+
+
+
+ About shadPS4
+ Sobre o shadPS4
+
+
+
+ Configure...
+ Configurar...
+
+
+
+ Install application from a .pkg file
+ Instalar aplicação de um arquivo .pkg
+
+
+
+ Recent Games
+ Jogos Recentes
+
+
+
+ Exit
+ Sair
+
+
+
+ Exit shadPS4
+ Sair do shadPS4
+
+
+
+ Exit the application.
+ Sair da aplicação.
+
+
+
+ Show Game List
+ Mostrar Lista de Jogos
+
+
+
+ Game List Refresh
+ Atualizar Lista de Jogos
+
+
+
+ Tiny
+ Muito pequeno
+
+
+
+ Small
+ Pequeno
+
+
+
+ Medium
+ Médio
+
+
+
+ Large
+ Grande
+
+
+
+ List View
+ Visualizar em Lista
+
+
+
+ Grid View
+ Visualizar em Grade
+
+
+
+ Elf Viewer
+ Visualizador de Elf
+
+
+
+ Game Install Directory
+ Diretório de Instalação de Jogos
+
+
+
+ Dump Game List
+ Dumpar Lista de Jogos
+
+
+
+ PKG Viewer
+ Visualizador de PKG
+
+
+
+ Search...
+ Pesquisar...
+
+
+
+ File
+ Arquivo
+
+
+
+ View
+ Ver
+
+
+
+ Game List Icons
+ Ícones da Lista de Jogos
+
+
+
+ Game List Mode
+ Modo de Lista de Jogos
+
+
+
+ Settings
+ Configurações
+
+
+
+ Utils
+ Utilitários
+
+
+
+ Themes
+ Temas
+
+
+
+ About
+ Sobre
+
+
+
+ Dark
+ Escuro
+
+
+
+ Light
+ Claro
+
+
+
+ Green
+ Verde
+
+
+
+ Blue
+ Azul
+
+
+
+ Violet
+ Violeta
+
+
+
+ toolBar
+ Barra de Ferramentas
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Abrir Pasta
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Visualizador de Troféu
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Configurações
+
+
+
+ General
+ Geral
+
+
+
+ System
+ Sistema
+
+
+
+ Console Language
+ Idioma do Console
+
+
+
+ Emulator Language
+ Idioma do Emulador
+
+
+
+ Emulator
+ Emulador
+
+
+
+ Enable Fullscreen
+ Ativar Tela Cheia
+
+
+
+ Show Splash
+ Mostrar Splash Inicial
+
+
+
+ Is PS4 Pro
+ Modo PS4 Pro
+
+
+
+ Username
+ Nome de usuário
+
+
+
+ Logger
+ Registro
+
+
+
+ Log Type
+ Tipo de Registro
+
+
+
+ Log Filter
+ Filtro
+
+
+
+ Graphics
+ Gráficos
+
+
+
+ Graphics Device
+ Placa de Vídeo
+
+
+
+ Width
+ Largura
+
+
+
+ Height
+ Altura
+
+
+
+ Vblank Divider
+ Divisor Vblank
+
+
+
+ Advanced
+ Avançado
+
+
+
+ Enable Shaders Dumping
+ Ativar Dumping de Shaders
+
+
+
+ Enable NULL GPU
+ Ativar GPU NULA
+
+
+
+ Enable PM4 Dumping
+ Ativar Dumping de PM4
+
+
+
+ Debug
+ Depuração
+
+
+
+ Enable Debug Dumping
+ Ativar Depuração de Dumping
+
+
+
+ Enable Vulkan Validation Layers
+ Ativar Camadas de Validação do Vulkan
+
+
+
+ Enable Vulkan Synchronization Validation
+ Ativar Validação de Sincronização do Vulkan
+
+
+
+ Enable RenderDoc Debugging
+ Ativar Depuração por RenderDoc
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts
new file mode 100644
index 00000000..c7dfae1b
--- /dev/null
+++ b/src/qt_gui/translations/ro_RO.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ This software should not be used to play games you have not legally obtained.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Loading game list, please wait :3
+
+
+
+ Cancel
+ Cancel
+
+
+
+ Loading...
+ Loading...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Choose directory
+
+
+
+ Directory to install games
+ Directory to install games
+
+
+
+ Browse
+ Browse
+
+
+
+ Error
+ Error
+
+
+
+ The value for location to install games is not valid.
+ The value for location to install games is not valid.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Create Shortcut
+
+
+
+ Open Game Folder
+ Open Game Folder
+
+
+
+ SFO Viewer
+ SFO Viewer
+
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ Copy info
+ Copy info
+
+
+
+ Copy Name
+ Copy Name
+
+
+
+ Copy Serial
+ Copy Serial
+
+
+
+ Copy All
+ Copy All
+
+
+
+ Shortcut creation
+ Shortcut creation
+
+
+
+ Shortcut created successfully!\n %1
+ Shortcut created successfully!\n %1
+
+
+
+ Error
+ Error
+
+
+
+ Error creating shortcut!\n %1
+ Error creating shortcut!\n %1
+
+
+
+ Install PKG
+ Install PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Open/Add Elf Folder
+
+
+
+ Install Packages (PKG)
+ Install Packages (PKG)
+
+
+
+ Boot Game
+ Boot Game
+
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ Configure...
+ Configure...
+
+
+
+ Install application from a .pkg file
+ Install application from a .pkg file
+
+
+
+ Recent Games
+ Recent Games
+
+
+
+ Exit
+ Exit
+
+
+
+ Exit shadPS4
+ Exit shadPS4
+
+
+
+ Exit the application.
+ Exit the application.
+
+
+
+ Show Game List
+ Show Game List
+
+
+
+ Game List Refresh
+ Game List Refresh
+
+
+
+ Tiny
+ Tiny
+
+
+
+ Small
+ Small
+
+
+
+ Medium
+ Medium
+
+
+
+ Large
+ Large
+
+
+
+ List View
+ List View
+
+
+
+ Grid View
+ Grid View
+
+
+
+ Elf Viewer
+ Elf Viewer
+
+
+
+ Game Install Directory
+ Game Install Directory
+
+
+
+ Dump Game List
+ Dump Game List
+
+
+
+ PKG Viewer
+ PKG Viewer
+
+
+
+ Search...
+ Search...
+
+
+
+ File
+ File
+
+
+
+ View
+ View
+
+
+
+ Game List Icons
+ Game List Icons
+
+
+
+ Game List Mode
+ Game List Mode
+
+
+
+ Settings
+ Settings
+
+
+
+ Utils
+ Utils
+
+
+
+ Themes
+ Themes
+
+
+
+ About
+ About
+
+
+
+ Dark
+ Dark
+
+
+
+ Light
+ Light
+
+
+
+ Green
+ Green
+
+
+
+ Blue
+ Blue
+
+
+
+ Violet
+ Violet
+
+
+
+ toolBar
+ toolBar
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Settings
+
+
+
+ General
+ General
+
+
+
+ System
+ System
+
+
+
+ Console Language
+ Console Language
+
+
+
+ Emulator Language
+ Emulator Language
+
+
+
+ Emulator
+ Emulator
+
+
+
+ Enable Fullscreen
+ Enable Fullscreen
+
+
+
+ Show Splash
+ Show Splash
+
+
+
+ Is PS4 Pro
+ Is PS4 Pro
+
+
+
+ Username
+ Username
+
+
+
+ Logger
+ Logger
+
+
+
+ Log Type
+ Log Type
+
+
+
+ Log Filter
+ Log Filter
+
+
+
+ Graphics
+ Graphics
+
+
+
+ Graphics Device
+ Graphics Device
+
+
+
+ Width
+ Width
+
+
+
+ Height
+ Height
+
+
+
+ Vblank Divider
+ Vblank Divider
+
+
+
+ Advanced
+ Advanced
+
+
+
+ Enable Shaders Dumping
+ Enable Shaders Dumping
+
+
+
+ Enable NULL GPU
+ Enable NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Enable PM4 Dumping
+
+
+
+ Debug
+ Debug
+
+
+
+ Enable Debug Dumping
+ Enable Debug Dumping
+
+
+
+ Enable Vulkan Validation Layers
+ Enable Vulkan Validation Layers
+
+
+
+ Enable Vulkan Synchronization Validation
+ Enable Vulkan Synchronization Validation
+
+
+
+ Enable RenderDoc Debugging
+ Enable RenderDoc Debugging
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts
new file mode 100644
index 00000000..46a30cde
--- /dev/null
+++ b/src/qt_gui/translations/ru_RU.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ О shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 это экспериментальный эмулятор с открытым исходным кодом для PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ Это програмное обеспечение не должно использоваться для запуска игр, которые вы получили нелегально.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Открыть папку
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Загрузка списка игр, пожалуйста подождите :3
+
+
+
+ Cancel
+ Отмена
+
+
+
+ Loading...
+ Загрузка...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Выберите папку
+
+
+
+ Directory to install games
+ Папка для установки игр
+
+
+
+ Browse
+ Обзор
+
+
+
+ Error
+ Ошибка
+
+
+
+ The value for location to install games is not valid.
+ Недопустимое значение местоположения для установки игр.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Создать ярлык
+
+
+
+ Open Game Folder
+ Открыть папку с игрой
+
+
+
+ SFO Viewer
+ Просмотр SFO
+
+
+
+ Trophy Viewer
+ Просмотр трофеев
+
+
+
+ Copy info
+ Копировать информацию
+
+
+
+ Copy Name
+ Копировать имя
+
+
+
+ Copy Serial
+ Копировать серийный номер
+
+
+
+ Copy All
+ Копировать все
+
+
+
+ Shortcut creation
+ Создание ярлыка
+
+
+
+ Shortcut created successfully!\n %1
+ Ярлык создан успешно!\n %1
+
+
+
+ Error
+ Ошибка
+
+
+
+ Error creating shortcut!\n %1
+ Ошибка создания ярлыка!\n %1
+
+
+
+ Install PKG
+ Установить PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Открыть/Добавить папку Elf
+
+
+
+ Install Packages (PKG)
+ Установить пакеты (PKG)
+
+
+
+ Boot Game
+ Запустить игру
+
+
+
+ About shadPS4
+ О shadPS4
+
+
+
+ Configure...
+ Настроить...
+
+
+
+ Install application from a .pkg file
+ Установить приложение из файла .pkg
+
+
+
+ Recent Games
+ Недавние игры
+
+
+
+ Exit
+ Выход
+
+
+
+ Exit shadPS4
+ Выйти из shadPS4
+
+
+
+ Exit the application.
+ Выйти из приложения.
+
+
+
+ Show Game List
+ Показать список игр
+
+
+
+ Game List Refresh
+ Обновить список игр
+
+
+
+ Tiny
+ Крошечный
+
+
+
+ Small
+ Маленький
+
+
+
+ Medium
+ Средний
+
+
+
+ Large
+ Большой
+
+
+
+ List View
+ Список
+
+
+
+ Grid View
+ Сетка
+
+
+
+ Elf Viewer
+ Elf
+
+
+
+ Game Install Directory
+ Каталог установки игры
+
+
+
+ Dump Game List
+ Дамп списка игр
+
+
+
+ PKG Viewer
+ Просмотр PKG
+
+
+
+ Search...
+ Поиск...
+
+
+
+ File
+ Файл
+
+
+
+ View
+ Вид
+
+
+
+ Game List Icons
+ Размер иконок списка игр
+
+
+
+ Game List Mode
+ Вид списка игр
+
+
+
+ Settings
+ Настройки
+
+
+
+ Utils
+ Утилиты
+
+
+
+ Themes
+ Темы
+
+
+
+ About
+ Справка
+
+
+
+ Dark
+ Темная
+
+
+
+ Light
+ Светлая
+
+
+
+ Green
+ Зеленая
+
+
+
+ Blue
+ Синяя
+
+
+
+ Violet
+ Фиолетовая
+
+
+
+ toolBar
+ Панель инструментов
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Открыть папку
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Трофеи
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Настройки
+
+
+
+ General
+ Общее
+
+
+
+ System
+ Система
+
+
+
+ Console Language
+ Язык консоли
+
+
+
+ Emulator Language
+ Язык эмулятора
+
+
+
+ Emulator
+ Эмулятор
+
+
+
+ Enable Fullscreen
+ Включить полноэкранный режим
+
+
+
+ Show Splash
+ Показать заставку
+
+
+
+ Is PS4 Pro
+ Режим PS4 Pro
+
+
+
+ Username
+ Имя пользователя
+
+
+
+ Logger
+ Логирование
+
+
+
+ Log Type
+ Тип логов
+
+
+
+ Log Filter
+ Фильтр логов
+
+
+
+ Graphics
+ Графика
+
+
+
+ Graphics Device
+ Графическое устройство
+
+
+
+ Width
+ Ширина
+
+
+
+ Height
+ Высота
+
+
+
+ Vblank Divider
+ Разделитель Vblank
+
+
+
+ Advanced
+ Продвинутые
+
+
+
+ Enable Shaders Dumping
+ Включить дамп шейдеров
+
+
+
+ Enable NULL GPU
+ Включить NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Включить дамп PM4
+
+
+
+ Debug
+ Отладка
+
+
+
+ Enable Debug Dumping
+ Включить отладочные дампы
+
+
+
+ Enable Vulkan Validation Layers
+ Включить слои валидации Vulkan
+
+
+
+ Enable Vulkan Synchronization Validation
+ Включить валидацию синхронизации Vulkan
+
+
+
+ Enable RenderDoc Debugging
+ Включить отладку RenderDoc
+
+
+
diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts
new file mode 100644
index 00000000..ea5d0765
--- /dev/null
+++ b/src/qt_gui/translations/tr_TR.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ shadPS4 Hakkında
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4, PlayStation 4 için deneysel bir açık kaynak kodlu emülatördür.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ Bu yazılım, yasal olarak edinmediğiniz oyunları oynamak için kullanılmamalıdır.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Klasörü Aç
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Oyun listesi yükleniyor, lütfen bekleyin :3
+
+
+
+ Cancel
+ İptal
+
+
+
+ Loading...
+ Yükleniyor...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Klasörü Seç
+
+
+
+ Directory to install games
+ Oyunların yükleneceği klasör
+
+
+
+ Browse
+ Gözat
+
+
+
+ Error
+ Hata
+
+
+
+ The value for location to install games is not valid.
+ Oyunların yükleneceği konum için girilen klasör geçerli değil.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Kısayol Oluştur
+
+
+
+ Open Game Folder
+ Oyun Klasörünü Aç
+
+
+
+ SFO Viewer
+ SFO Görüntüleyici
+
+
+
+ Trophy Viewer
+ Kupa Görüntüleyici
+
+
+
+ Copy info
+ Bilgiyi Kopyala
+
+
+
+ Copy Name
+ Adı Kopyala
+
+
+
+ Copy Serial
+ Seri Numarasını Kopyala
+
+
+
+ Copy All
+ Tümünü Kopyala
+
+
+
+ Shortcut creation
+ Kısayol oluşturma
+
+
+
+ Shortcut created successfully!\n %1
+ Kısayol başarıyla oluşturuldu!\n %1
+
+
+
+ Error
+ Hata
+
+
+
+ Error creating shortcut!\n %1
+ Kısayol oluşturulurken hata oluştu!\n %1
+
+
+
+ Install PKG
+ PKG Yükle
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Elf Klasörünü Aç/Ekle
+
+
+
+ Install Packages (PKG)
+ Paketleri Kur (PKG)
+
+
+
+ Boot Game
+ Oyunu Başlat
+
+
+
+ About shadPS4
+ shadPS4 Hakkında
+
+
+
+ Configure...
+ Yapılandır...
+
+
+
+ Install application from a .pkg file
+ .pkg dosyasından uygulama yükle
+
+
+
+ Recent Games
+ Son Oyunlar
+
+
+
+ Exit
+ Çıkış
+
+
+
+ Exit shadPS4
+ shadPS4'ten Çık
+
+
+
+ Exit the application.
+ Uygulamadan çık.
+
+
+
+ Show Game List
+ Oyun Listesini Göster
+
+
+
+ Game List Refresh
+ Oyun Listesini Yenile
+
+
+
+ Tiny
+ Küçük
+
+
+
+ Small
+ Ufak
+
+
+
+ Medium
+ Orta
+
+
+
+ Large
+ Büyük
+
+
+
+ List View
+ Liste Görünümü
+
+
+
+ Grid View
+ Izgara Görünümü
+
+
+
+ Elf Viewer
+ Elf Görüntüleyici
+
+
+
+ Game Install Directory
+ Oyun Kurulum Klasörü
+
+
+
+ Dump Game List
+ Oyun Listesini Kaydet
+
+
+
+ PKG Viewer
+ PKG Görüntüleyici
+
+
+
+ Search...
+ Ara...
+
+
+
+ File
+ Dosya
+
+
+
+ View
+ Görünüm
+
+
+
+ Game List Icons
+ Oyun Listesi Simgeleri
+
+
+
+ Game List Mode
+ Oyun Listesi Modu
+
+
+
+ Settings
+ Ayarlar
+
+
+
+ Utils
+ Yardımcı Araçlar
+
+
+
+ Themes
+ Temalar
+
+
+
+ About
+ Hakkında
+
+
+
+ Dark
+ Koyu
+
+
+
+ Light
+ Açık
+
+
+
+ Green
+ Yeşil
+
+
+
+ Blue
+ Mavi
+
+
+
+ Violet
+ Mor
+
+
+
+ toolBar
+ Araç Çubuğu
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Klasörü Aç
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Kupa Görüntüleyici
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Ayarlar
+
+
+
+ General
+ Genel
+
+
+
+ System
+ Sistem
+
+
+
+ Console Language
+ Konsol Dili
+
+
+
+ Emulator Language
+ Emülatör Dili
+
+
+
+ Emulator
+ Emülatör
+
+
+
+ Enable Fullscreen
+ Tam Ekranı Etkinleştir
+
+
+
+ Show Splash
+ Başlangıç Ekranını Göster
+
+
+
+ Is PS4 Pro
+ PS4 Pro mu
+
+
+
+ Username
+ Kullanıcı Adı
+
+
+
+ Logger
+ Kayıt Tutucu
+
+
+
+ Log Type
+ Kayıt Türü
+
+
+
+ Log Filter
+ Kayıt Filtresi
+
+
+
+ Graphics
+ Grafikler
+
+
+
+ Graphics Device
+ Grafik Cihazı
+
+
+
+ Width
+ Genişlik
+
+
+
+ Height
+ Yükseklik
+
+
+
+ Vblank Divider
+ Vblank Bölücü
+
+
+
+ Advanced
+ Gelişmiş
+
+
+
+ Enable Shaders Dumping
+ Shader Kaydını Etkinleştir
+
+
+
+ Enable NULL GPU
+ NULL GPU'yu Etkinleştir
+
+
+
+ Enable PM4 Dumping
+ PM4 Kaydını Etkinleştir
+
+
+
+ Debug
+ Hata Ayıklama
+
+
+
+ Enable Debug Dumping
+ Hata Ayıklama Dökümü Etkinleştir
+
+
+
+ Enable Vulkan Validation Layers
+ Vulkan Doğrulama Katmanlarını Etkinleştir
+
+
+
+ Enable Vulkan Synchronization Validation
+ Vulkan Senkronizasyon Doğrulamasını Etkinleştir
+
+
+
+ Enable RenderDoc Debugging
+ RenderDoc Hata Ayıklamayı Etkinleştir
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts
new file mode 100644
index 00000000..08af9b35
--- /dev/null
+++ b/src/qt_gui/translations/vi_VN.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ This software should not be used to play games you have not legally obtained.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Loading game list, please wait :3
+
+
+
+ Cancel
+ Cancel
+
+
+
+ Loading...
+ Loading...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Choose directory
+
+
+
+ Directory to install games
+ Directory to install games
+
+
+
+ Browse
+ Browse
+
+
+
+ Error
+ Error
+
+
+
+ The value for location to install games is not valid.
+ The value for location to install games is not valid.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Create Shortcut
+
+
+
+ Open Game Folder
+ Open Game Folder
+
+
+
+ SFO Viewer
+ SFO Viewer
+
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ Copy info
+ Copy info
+
+
+
+ Copy Name
+ Copy Name
+
+
+
+ Copy Serial
+ Copy Serial
+
+
+
+ Copy All
+ Copy All
+
+
+
+ Shortcut creation
+ Shortcut creation
+
+
+
+ Shortcut created successfully!\n %1
+ Shortcut created successfully!\n %1
+
+
+
+ Error
+ Error
+
+
+
+ Error creating shortcut!\n %1
+ Error creating shortcut!\n %1
+
+
+
+ Install PKG
+ Install PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Open/Add Elf Folder
+
+
+
+ Install Packages (PKG)
+ Install Packages (PKG)
+
+
+
+ Boot Game
+ Boot Game
+
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ Configure...
+ Configure...
+
+
+
+ Install application from a .pkg file
+ Install application from a .pkg file
+
+
+
+ Recent Games
+ Recent Games
+
+
+
+ Exit
+ Exit
+
+
+
+ Exit shadPS4
+ Exit shadPS4
+
+
+
+ Exit the application.
+ Exit the application.
+
+
+
+ Show Game List
+ Show Game List
+
+
+
+ Game List Refresh
+ Game List Refresh
+
+
+
+ Tiny
+ Tiny
+
+
+
+ Small
+ Small
+
+
+
+ Medium
+ Medium
+
+
+
+ Large
+ Large
+
+
+
+ List View
+ List View
+
+
+
+ Grid View
+ Grid View
+
+
+
+ Elf Viewer
+ Elf Viewer
+
+
+
+ Game Install Directory
+ Game Install Directory
+
+
+
+ Dump Game List
+ Dump Game List
+
+
+
+ PKG Viewer
+ PKG Viewer
+
+
+
+ Search...
+ Search...
+
+
+
+ File
+ File
+
+
+
+ View
+ View
+
+
+
+ Game List Icons
+ Game List Icons
+
+
+
+ Game List Mode
+ Game List Mode
+
+
+
+ Settings
+ Settings
+
+
+
+ Utils
+ Utils
+
+
+
+ Themes
+ Themes
+
+
+
+ About
+ About
+
+
+
+ Dark
+ Dark
+
+
+
+ Light
+ Light
+
+
+
+ Green
+ Green
+
+
+
+ Blue
+ Blue
+
+
+
+ Violet
+ Violet
+
+
+
+ toolBar
+ toolBar
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Settings
+
+
+
+ General
+ General
+
+
+
+ System
+ System
+
+
+
+ Console Language
+ Console Language
+
+
+
+ Emulator Language
+ Emulator Language
+
+
+
+ Emulator
+ Emulator
+
+
+
+ Enable Fullscreen
+ Enable Fullscreen
+
+
+
+ Show Splash
+ Show Splash
+
+
+
+ Is PS4 Pro
+ Is PS4 Pro
+
+
+
+ Username
+ Username
+
+
+
+ Logger
+ Logger
+
+
+
+ Log Type
+ Log Type
+
+
+
+ Log Filter
+ Log Filter
+
+
+
+ Graphics
+ Graphics
+
+
+
+ Graphics Device
+ Graphics Device
+
+
+
+ Width
+ Width
+
+
+
+ Height
+ Height
+
+
+
+ Vblank Divider
+ Vblank Divider
+
+
+
+ Advanced
+ Advanced
+
+
+
+ Enable Shaders Dumping
+ Enable Shaders Dumping
+
+
+
+ Enable NULL GPU
+ Enable NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Enable PM4 Dumping
+
+
+
+ Debug
+ Debug
+
+
+
+ Enable Debug Dumping
+ Enable Debug Dumping
+
+
+
+ Enable Vulkan Validation Layers
+ Enable Vulkan Validation Layers
+
+
+
+ Enable Vulkan Synchronization Validation
+ Enable Vulkan Synchronization Validation
+
+
+
+ Enable RenderDoc Debugging
+ Enable RenderDoc Debugging
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts
new file mode 100644
index 00000000..6f639223
--- /dev/null
+++ b/src/qt_gui/translations/zh_CN.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ This software should not be used to play games you have not legally obtained.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Loading game list, please wait :3
+
+
+
+ Cancel
+ Cancel
+
+
+
+ Loading...
+ Loading...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Choose directory
+
+
+
+ Directory to install games
+ Directory to install games
+
+
+
+ Browse
+ Browse
+
+
+
+ Error
+ Error
+
+
+
+ The value for location to install games is not valid.
+ The value for location to install games is not valid.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Create Shortcut
+
+
+
+ Open Game Folder
+ Open Game Folder
+
+
+
+ SFO Viewer
+ SFO Viewer
+
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ Copy info
+ Copy info
+
+
+
+ Copy Name
+ Copy Name
+
+
+
+ Copy Serial
+ Copy Serial
+
+
+
+ Copy All
+ Copy All
+
+
+
+ Shortcut creation
+ Shortcut creation
+
+
+
+ Shortcut created successfully!\n %1
+ Shortcut created successfully!\n %1
+
+
+
+ Error
+ Error
+
+
+
+ Error creating shortcut!\n %1
+ Error creating shortcut!\n %1
+
+
+
+ Install PKG
+ Install PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Open/Add Elf Folder
+
+
+
+ Install Packages (PKG)
+ Install Packages (PKG)
+
+
+
+ Boot Game
+ Boot Game
+
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ Configure...
+ Configure...
+
+
+
+ Install application from a .pkg file
+ Install application from a .pkg file
+
+
+
+ Recent Games
+ Recent Games
+
+
+
+ Exit
+ Exit
+
+
+
+ Exit shadPS4
+ Exit shadPS4
+
+
+
+ Exit the application.
+ Exit the application.
+
+
+
+ Show Game List
+ Show Game List
+
+
+
+ Game List Refresh
+ Game List Refresh
+
+
+
+ Tiny
+ Tiny
+
+
+
+ Small
+ Small
+
+
+
+ Medium
+ Medium
+
+
+
+ Large
+ Large
+
+
+
+ List View
+ List View
+
+
+
+ Grid View
+ Grid View
+
+
+
+ Elf Viewer
+ Elf Viewer
+
+
+
+ Game Install Directory
+ Game Install Directory
+
+
+
+ Dump Game List
+ Dump Game List
+
+
+
+ PKG Viewer
+ PKG Viewer
+
+
+
+ Search...
+ Search...
+
+
+
+ File
+ File
+
+
+
+ View
+ View
+
+
+
+ Game List Icons
+ Game List Icons
+
+
+
+ Game List Mode
+ Game List Mode
+
+
+
+ Settings
+ Settings
+
+
+
+ Utils
+ Utils
+
+
+
+ Themes
+ Themes
+
+
+
+ About
+ About
+
+
+
+ Dark
+ Dark
+
+
+
+ Light
+ Light
+
+
+
+ Green
+ Green
+
+
+
+ Blue
+ Blue
+
+
+
+ Violet
+ Violet
+
+
+
+ toolBar
+ toolBar
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Settings
+
+
+
+ General
+ General
+
+
+
+ System
+ System
+
+
+
+ Console Language
+ Console Language
+
+
+
+ Emulator Language
+ Emulator Language
+
+
+
+ Emulator
+ Emulator
+
+
+
+ Enable Fullscreen
+ Enable Fullscreen
+
+
+
+ Show Splash
+ Show Splash
+
+
+
+ Is PS4 Pro
+ Is PS4 Pro
+
+
+
+ Username
+ Username
+
+
+
+ Logger
+ Logger
+
+
+
+ Log Type
+ Log Type
+
+
+
+ Log Filter
+ Log Filter
+
+
+
+ Graphics
+ Graphics
+
+
+
+ Graphics Device
+ Graphics Device
+
+
+
+ Width
+ Width
+
+
+
+ Height
+ Height
+
+
+
+ Vblank Divider
+ Vblank Divider
+
+
+
+ Advanced
+ Advanced
+
+
+
+ Enable Shaders Dumping
+ Enable Shaders Dumping
+
+
+
+ Enable NULL GPU
+ Enable NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Enable PM4 Dumping
+
+
+
+ Debug
+ Debug
+
+
+
+ Enable Debug Dumping
+ Enable Debug Dumping
+
+
+
+ Enable Vulkan Validation Layers
+ Enable Vulkan Validation Layers
+
+
+
+ Enable Vulkan Synchronization Validation
+ Enable Vulkan Synchronization Validation
+
+
+
+ Enable RenderDoc Debugging
+ Enable RenderDoc Debugging
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts
new file mode 100644
index 00000000..1ddeaa43
--- /dev/null
+++ b/src/qt_gui/translations/zh_TW.ts
@@ -0,0 +1,491 @@
+
+
+
+ AboutDialog
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ shadPS4
+ shadPS4
+
+
+
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+ shadPS4 is an experimental open-source emulator for the PlayStation 4.
+
+
+
+ This software should not be used to play games you have not legally obtained.
+ This software should not be used to play games you have not legally obtained.
+
+
+
+ ElfViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ GameInfoClass
+
+
+ Loading game list, please wait :3
+ Loading game list, please wait :3
+
+
+
+ Cancel
+ Cancel
+
+
+
+ Loading...
+ Loading...
+
+
+
+ GameInstallDialog
+
+
+ shadPS4 - Choose directory
+ shadPS4 - Choose directory
+
+
+
+ Directory to install games
+ Directory to install games
+
+
+
+ Browse
+ Browse
+
+
+
+ Error
+ Error
+
+
+
+ The value for location to install games is not valid.
+ The value for location to install games is not valid.
+
+
+
+ GuiContextMenus
+
+
+ Create Shortcut
+ Create Shortcut
+
+
+
+ Open Game Folder
+ Open Game Folder
+
+
+
+ SFO Viewer
+ SFO Viewer
+
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ Copy info
+ Copy info
+
+
+
+ Copy Name
+ Copy Name
+
+
+
+ Copy Serial
+ Copy Serial
+
+
+
+ Copy All
+ Copy All
+
+
+
+ Shortcut creation
+ Shortcut creation
+
+
+
+ Shortcut created successfully!\n %1
+ Shortcut created successfully!\n %1
+
+
+
+ Error
+ Error
+
+
+
+ Error creating shortcut!\n %1
+ Error creating shortcut!\n %1
+
+
+
+ Install PKG
+ Install PKG
+
+
+
+ MainWindow
+
+
+ Open/Add Elf Folder
+ Open/Add Elf Folder
+
+
+
+ Install Packages (PKG)
+ Install Packages (PKG)
+
+
+
+ Boot Game
+ Boot Game
+
+
+
+ About shadPS4
+ About shadPS4
+
+
+
+ Configure...
+ Configure...
+
+
+
+ Install application from a .pkg file
+ Install application from a .pkg file
+
+
+
+ Recent Games
+ Recent Games
+
+
+
+ Exit
+ Exit
+
+
+
+ Exit shadPS4
+ Exit shadPS4
+
+
+
+ Exit the application.
+ Exit the application.
+
+
+
+ Show Game List
+ Show Game List
+
+
+
+ Game List Refresh
+ Game List Refresh
+
+
+
+ Tiny
+ Tiny
+
+
+
+ Small
+ Small
+
+
+
+ Medium
+ Medium
+
+
+
+ Large
+ Large
+
+
+
+ List View
+ List View
+
+
+
+ Grid View
+ Grid View
+
+
+
+ Elf Viewer
+ Elf Viewer
+
+
+
+ Game Install Directory
+ Game Install Directory
+
+
+
+ Dump Game List
+ Dump Game List
+
+
+
+ PKG Viewer
+ PKG Viewer
+
+
+
+ Search...
+ Search...
+
+
+
+ File
+ File
+
+
+
+ View
+ View
+
+
+
+ Game List Icons
+ Game List Icons
+
+
+
+ Game List Mode
+ Game List Mode
+
+
+
+ Settings
+ Settings
+
+
+
+ Utils
+ Utils
+
+
+
+ Themes
+ Themes
+
+
+
+ About
+ About
+
+
+
+ Dark
+ Dark
+
+
+
+ Light
+ Light
+
+
+
+ Green
+ Green
+
+
+
+ Blue
+ Blue
+
+
+
+ Violet
+ Violet
+
+
+
+ toolBar
+ toolBar
+
+
+
+ PKGViewer
+
+
+ Open Folder
+ Open Folder
+
+
+
+ TrophyViewer
+
+
+ Trophy Viewer
+ Trophy Viewer
+
+
+
+ SettingsDialog
+
+
+ Settings
+ Settings
+
+
+
+ General
+ General
+
+
+
+ System
+ System
+
+
+
+ Console Language
+ Console Language
+
+
+
+ Emulator Language
+ Emulator Language
+
+
+
+ Emulator
+ Emulator
+
+
+
+ Enable Fullscreen
+ Enable Fullscreen
+
+
+
+ Show Splash
+ Show Splash
+
+
+
+ Is PS4 Pro
+ Is PS4 Pro
+
+
+
+ Username
+ Username
+
+
+
+ Logger
+ Logger
+
+
+
+ Log Type
+ Log Type
+
+
+
+ Log Filter
+ Log Filter
+
+
+
+ Graphics
+ Graphics
+
+
+
+ Graphics Device
+ Graphics Device
+
+
+
+ Width
+ Width
+
+
+
+ Height
+ Height
+
+
+
+ Vblank Divider
+ Vblank Divider
+
+
+
+ Advanced
+ Advanced
+
+
+
+ Enable Shaders Dumping
+ Enable Shaders Dumping
+
+
+
+ Enable NULL GPU
+ Enable NULL GPU
+
+
+
+ Enable PM4 Dumping
+ Enable PM4 Dumping
+
+
+
+ Debug
+ Debug
+
+
+
+ Enable Debug Dumping
+ Enable Debug Dumping
+
+
+
+ Enable Vulkan Validation Layers
+ Enable Vulkan Validation Layers
+
+
+
+ Enable Vulkan Synchronization Validation
+ Enable Vulkan Synchronization Validation
+
+
+
+ Enable RenderDoc Debugging
+ Enable RenderDoc Debugging
+
+
+
\ No newline at end of file
diff --git a/src/qt_gui/trophy_viewer.cpp b/src/qt_gui/trophy_viewer.cpp
index bb17dfc3..57dce6b4 100644
--- a/src/qt_gui/trophy_viewer.cpp
+++ b/src/qt_gui/trophy_viewer.cpp
@@ -5,7 +5,7 @@
#include "trophy_viewer.h"
TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath) : QMainWindow() {
- this->setWindowTitle("Trophy Viewer");
+ this->setWindowTitle(tr("Trophy Viewer"));
this->setAttribute(Qt::WA_DeleteOnClose);
tabWidget = new QTabWidget(this);
gameTrpPath_ = gameTrpPath;
diff --git a/src/qt_gui/trophy_viewer.h b/src/qt_gui/trophy_viewer.h
index 2b794593..81b9b1ad 100644
--- a/src/qt_gui/trophy_viewer.h
+++ b/src/qt_gui/trophy_viewer.h
@@ -10,11 +10,9 @@
#include
#include
#include
-#include
#include
#include
#include
-#include
#include
#include "common/types.h"
diff --git a/src/sdl_window.h b/src/sdl_window.h
index cf6c3711..11ee9289 100644
--- a/src/sdl_window.h
+++ b/src/sdl_window.h
@@ -25,9 +25,6 @@ enum class WindowSystemType : u8 {
};
struct WindowSystemInfo {
- // Window system type. Determines which GL context or Vulkan WSI is used.
- WindowSystemType type = WindowSystemType::Headless;
-
// Connection to a display server. This is used on X11 and Wayland platforms.
void* display_connection = nullptr;
@@ -38,6 +35,9 @@ struct WindowSystemInfo {
// Scale of the render surface. For hidpi systems, this will be >1.
float render_surface_scale = 1.0f;
+
+ // Window system type. Determines which GL context or Vulkan WSI is used.
+ WindowSystemType type = WindowSystemType::Headless;
};
class WindowSDL {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp
index c7042763..09a9fd62 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp
@@ -179,6 +179,7 @@ void DefineEntryPoint(const IR::Program& program, EmitContext& ctx, Id main) {
spv::ExecutionModel execution_model{};
ctx.AddCapability(spv::Capability::Image1D);
ctx.AddCapability(spv::Capability::Sampled1D);
+ ctx.AddCapability(spv::Capability::ImageQuery);
if (info.uses_fp16) {
ctx.AddCapability(spv::Capability::Float16);
ctx.AddCapability(spv::Capability::Int16);
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp
index 37e91d3b..1d553dc5 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp
@@ -102,7 +102,7 @@ Id EmitBufferAtomicXor32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id addres
return BufferAtomicU32(ctx, inst, handle, address, value, &Sirit::Module::OpAtomicXor);
}
-Id EmitBufferAtomicExchange32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) {
+Id EmitBufferAtomicSwap32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) {
return BufferAtomicU32(ctx, inst, handle, address, value, &Sirit::Module::OpAtomicExchange);
}
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp
index 0b02f3a3..03fc52ff 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp
@@ -305,7 +305,7 @@ static Id ConvertValue(EmitContext& ctx, Id value, AmdGpu::NumberFormat format,
case AmdGpu::NumberFormat::Float:
return value;
default:
- UNREACHABLE_MSG("Unsupported number fromat for conversion: {}",
+ UNREACHABLE_MSG("Unsupported number format for conversion: {}",
magic_enum::enum_name(format));
}
}
@@ -478,7 +478,7 @@ static Id ConvertF32ToFormat(EmitContext& ctx, Id value, AmdGpu::NumberFormat fo
case AmdGpu::NumberFormat::Float:
return value;
default:
- UNREACHABLE_MSG("Unsupported number fromat for conversion: {}",
+ UNREACHABLE_MSG("Unsupported number format for conversion: {}",
magic_enum::enum_name(format));
}
}
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
index 5526e541..530f381d 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
@@ -16,6 +16,12 @@ struct ImageOperands {
static_cast(new_mask));
operands.push_back(value);
}
+ void Add(spv::ImageOperandsMask new_mask, Id value1, Id value2) {
+ mask = static_cast(static_cast(mask) |
+ static_cast(new_mask));
+ operands.push_back(value1);
+ operands.push_back(value2);
+ }
void AddOffset(EmitContext& ctx, const IR::Value& offset,
bool can_use_runtime_offsets = false) {
@@ -53,6 +59,15 @@ struct ImageOperands {
}
}
+ void AddDerivatives(EmitContext& ctx, Id derivatives) {
+ if (!Sirit::ValidId(derivatives)) {
+ return;
+ }
+ const Id dx{ctx.OpVectorShuffle(ctx.F32[2], derivatives, derivatives, 0, 1)};
+ const Id dy{ctx.OpVectorShuffle(ctx.F32[2], derivatives, derivatives, 2, 3)};
+ Add(spv::ImageOperandsMask::Grad, dx, dy);
+ }
+
spv::ImageOperandsMask mask{};
boost::container::static_vector operands;
};
@@ -117,7 +132,7 @@ Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords,
const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler);
const u32 comp = inst->Flags().gather_comp.Value();
ImageOperands operands;
- operands.AddOffset(ctx, offset);
+ operands.AddOffset(ctx, offset, true);
return ctx.OpImageGather(ctx.F32[4], sampled_image, coords, ctx.ConstU32(comp), operands.mask,
operands.operands);
}
@@ -129,7 +144,7 @@ Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords,
const Id sampler = ctx.OpLoad(ctx.sampler_type, ctx.samplers[handle >> 16]);
const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler);
ImageOperands operands;
- operands.AddOffset(ctx, offset);
+ operands.AddOffset(ctx, offset, true);
return ctx.OpImageDrefGather(ctx.F32[4], sampled_image, coords, dref, operands.mask,
operands.operands);
}
@@ -181,9 +196,17 @@ Id EmitImageQueryLod(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords) {
return ctx.OpImageQueryLod(ctx.F32[2], sampled_image, coords);
}
-Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
- Id derivatives, const IR::Value& offset, Id lod_clamp) {
- UNREACHABLE_MSG("SPIR-V Instruction");
+Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id derivatives,
+ const IR::Value& offset, Id lod_clamp) {
+ const auto& texture = ctx.images[handle & 0xFFFF];
+ const Id image = ctx.OpLoad(texture.image_type, texture.id);
+ const Id sampler = ctx.OpLoad(ctx.sampler_type, ctx.samplers[handle >> 16]);
+ const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler);
+ ImageOperands operands;
+ operands.AddDerivatives(ctx, derivatives);
+ operands.AddOffset(ctx, offset);
+ return ctx.OpImageSampleExplicitLod(ctx.F32[4], sampled_image, coords, operands.mask,
+ operands.operands);
}
Id EmitImageRead(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords) {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h
index bc39bc0f..dd3d8fae 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h
@@ -91,7 +91,7 @@ Id EmitBufferAtomicDec32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id addres
Id EmitBufferAtomicAnd32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
Id EmitBufferAtomicOr32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
Id EmitBufferAtomicXor32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
-Id EmitBufferAtomicExchange32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
+Id EmitBufferAtomicSwap32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr, u32 comp);
Id EmitGetAttributeU32(EmitContext& ctx, IR::Attribute attr, u32 comp);
void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, Id value, u32 comp);
@@ -387,8 +387,8 @@ Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, const
Id lod, Id ms);
Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, u32 handle, Id lod, bool skip_mips);
Id EmitImageQueryLod(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords);
-Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
- Id derivatives, const IR::Value& offset, Id lod_clamp);
+Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id derivatives,
+ const IR::Value& offset, Id lod_clamp);
Id EmitImageRead(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords);
void EmitImageWrite(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id color);
@@ -407,5 +407,8 @@ Id EmitImageAtomicExchange32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id co
Id EmitLaneId(EmitContext& ctx);
Id EmitWarpId(EmitContext& ctx);
Id EmitQuadShuffle(EmitContext& ctx, Id value, Id index);
+Id EmitReadFirstLane(EmitContext& ctx, Id value);
+Id EmitReadLane(EmitContext& ctx, Id value, u32 lane);
+Id EmitWriteLane(EmitContext& ctx, Id value, Id write_value, u32 lane);
} // namespace Shader::Backend::SPIRV
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp
index 38afd90f..c55763c5 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp
@@ -22,4 +22,16 @@ Id EmitQuadShuffle(EmitContext& ctx, Id value, Id index) {
return ctx.OpGroupNonUniformQuadBroadcast(ctx.U32[1], SubgroupScope(ctx), value, index);
}
+Id EmitReadFirstLane(EmitContext& ctx, Id value) {
+ UNREACHABLE();
+}
+
+Id EmitReadLane(EmitContext& ctx, Id value, u32 lane) {
+ UNREACHABLE();
+}
+
+Id EmitWriteLane(EmitContext& ctx, Id value, Id write_value, u32 lane) {
+ return ctx.u32_zero_value;
+}
+
} // namespace Shader::Backend::SPIRV
diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp
index d61e108f..994c2847 100644
--- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp
+++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp
@@ -405,6 +405,10 @@ spv::ImageFormat GetFormat(const AmdGpu::Image& image) {
image.GetNumberFmt() == AmdGpu::NumberFormat::Float) {
return spv::ImageFormat::Rg16f;
}
+ if (image.GetDataFmt() == AmdGpu::DataFormat::Format16_16 &&
+ image.GetNumberFmt() == AmdGpu::NumberFormat::Snorm) {
+ return spv::ImageFormat::Rg16Snorm;
+ }
if (image.GetDataFmt() == AmdGpu::DataFormat::Format8_8 &&
image.GetNumberFmt() == AmdGpu::NumberFormat::Unorm) {
return spv::ImageFormat::Rg8;
@@ -485,8 +489,8 @@ void EmitContext::DefineImagesAndSamplers() {
Name(id, fmt::format("{}_{}{}_{:02x}", stage, "img", image_desc.sgpr_base,
image_desc.dword_offset));
images.push_back({
- .id = id,
.data_types = data_types,
+ .id = id,
.sampled_type = image_desc.is_storage ? sampled_type : TypeSampledImage(image_type),
.pointer_type = pointer_type,
.image_type = image_type,
diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.h b/src/shader_recompiler/backend/spirv/spirv_emit_context.h
index 768b591f..5a09c411 100644
--- a/src/shader_recompiler/backend/spirv/spirv_emit_context.h
+++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.h
@@ -193,8 +193,8 @@ public:
Id shared_memory_u32_type{};
struct TextureDefinition {
- Id id;
const VectorIds* data_types;
+ Id id;
Id sampled_type;
Id pointer_type;
Id image_type;
diff --git a/src/shader_recompiler/frontend/control_flow_graph.cpp b/src/shader_recompiler/frontend/control_flow_graph.cpp
index 3faf8665..276bd9db 100644
--- a/src/shader_recompiler/frontend/control_flow_graph.cpp
+++ b/src/shader_recompiler/frontend/control_flow_graph.cpp
@@ -21,8 +21,13 @@ struct Compare {
}
};
-static IR::Condition MakeCondition(Opcode opcode) {
- switch (opcode) {
+static IR::Condition MakeCondition(const GcnInst& inst) {
+ if (inst.IsCmpx()) {
+ ASSERT(inst.opcode == Opcode::V_CMPX_NE_U32);
+ return IR::Condition::Execnz;
+ }
+
+ switch (inst.opcode) {
case Opcode::S_CBRANCH_SCC0:
return IR::Condition::Scc0;
case Opcode::S_CBRANCH_SCC1:
@@ -37,7 +42,6 @@ static IR::Condition MakeCondition(Opcode opcode) {
return IR::Condition::Execnz;
case Opcode::S_AND_SAVEEXEC_B64:
case Opcode::S_ANDN2_B64:
- case Opcode::V_CMPX_NE_U32:
return IR::Condition::Execnz;
default:
return IR::Condition::True;
@@ -94,7 +98,8 @@ void CFG::EmitDivergenceLabels() {
// While this instruction does not save EXEC it is often used paired
// with SAVEEXEC to mask the threads that didn't pass the condition
// of initial branch.
- inst.opcode == Opcode::S_ANDN2_B64 || inst.opcode == Opcode::V_CMPX_NE_U32;
+ (inst.opcode == Opcode::S_ANDN2_B64 && inst.dst[0].field == OperandField::ExecLo) ||
+ inst.opcode == Opcode::V_CMPX_NE_U32;
};
const auto is_close_scope = [](const GcnInst& inst) {
// Closing an EXEC scope can be either a branch instruction
@@ -104,7 +109,8 @@ void CFG::EmitDivergenceLabels() {
// Sometimes compiler might insert instructions between the SAVEEXEC and the branch.
// Those instructions need to be wrapped in the condition as well so allow branch
// as end scope instruction.
- inst.opcode == Opcode::S_CBRANCH_EXECZ || inst.opcode == Opcode::S_ANDN2_B64;
+ inst.opcode == Opcode::S_CBRANCH_EXECZ ||
+ (inst.opcode == Opcode::S_ANDN2_B64 && inst.dst[0].field == OperandField::ExecLo);
};
// Since we will be adding new labels, avoid iterating those as well.
@@ -171,7 +177,7 @@ void CFG::EmitBlocks() {
block->begin_index = GetIndex(start);
block->end_index = end_index;
block->end_inst = end_inst;
- block->cond = MakeCondition(end_inst.opcode);
+ block->cond = MakeCondition(end_inst);
blocks.insert(*block);
}
}
diff --git a/src/shader_recompiler/frontend/fetch_shader.cpp b/src/shader_recompiler/frontend/fetch_shader.cpp
index 81e4093f..16938410 100644
--- a/src/shader_recompiler/frontend/fetch_shader.cpp
+++ b/src/shader_recompiler/frontend/fetch_shader.cpp
@@ -3,6 +3,7 @@
#include
#include
+#include "common/assert.h"
#include "shader_recompiler/frontend/decode.h"
#include "shader_recompiler/frontend/fetch_shader.h"
@@ -33,8 +34,8 @@ namespace Shader::Gcn {
* We take the reverse way, extract the original input semantics from these instructions.
**/
-std::vector ParseFetchShader(const u32* code, u32* out_size) {
- std::vector attributes;
+FetchShaderData ParseFetchShader(const u32* code, u32* out_size) {
+ FetchShaderData data{};
GcnCodeSlice code_slice(code, code + std::numeric_limits::max());
GcnDecodeContext decoder;
@@ -59,6 +60,21 @@ std::vector ParseFetchShader(const u32* code, u32* out_size) {
continue;
}
+ if (inst.opcode == Opcode::V_ADD_I32) {
+ const auto vgpr = inst.dst[0].code;
+ const auto sgpr = s8(inst.src[0].code);
+ switch (vgpr) {
+ case 0: // V0 is always the vertex offset
+ data.vertex_offset_sgpr = sgpr;
+ break;
+ case 3: // V3 is always the instance offset
+ data.instance_offset_sgpr = sgpr;
+ break;
+ default:
+ UNREACHABLE();
+ }
+ }
+
if (inst.inst_class == InstClass::VectorMemBufFmt) {
// SRSRC is in units of 4 SPGRs while SBASE is in pairs of SGPRs
const u32 base_sgpr = inst.src[2].code * 4;
@@ -68,7 +84,7 @@ std::vector ParseFetchShader(const u32* code, u32* out_size) {
const auto it = std::ranges::find_if(
loads, [&](VsharpLoad& load) { return load.dst_reg == base_sgpr; });
- auto& attrib = attributes.emplace_back();
+ auto& attrib = data.attributes.emplace_back();
attrib.semantic = semantic_index++;
attrib.dest_vgpr = inst.src[1].code;
attrib.num_elements = inst.control.mubuf.count;
@@ -83,7 +99,7 @@ std::vector ParseFetchShader(const u32* code, u32* out_size) {
}
}
- return attributes;
+ return data;
}
} // namespace Shader::Gcn
diff --git a/src/shader_recompiler/frontend/fetch_shader.h b/src/shader_recompiler/frontend/fetch_shader.h
index 0858061a..0e5d1541 100644
--- a/src/shader_recompiler/frontend/fetch_shader.h
+++ b/src/shader_recompiler/frontend/fetch_shader.h
@@ -17,6 +17,12 @@ struct VertexAttribute {
u8 instance_data; ///< Indicates that the buffer will be accessed in instance rate
};
-std::vector ParseFetchShader(const u32* code, u32* out_size);
+struct FetchShaderData {
+ std::vector attributes;
+ s8 vertex_offset_sgpr = -1; ///< SGPR of vertex offset from VADDR
+ s8 instance_offset_sgpr = -1; ///< SGPR of instance offset from VADDR
+};
+
+FetchShaderData ParseFetchShader(const u32* code, u32* out_size);
} // namespace Shader::Gcn
diff --git a/src/shader_recompiler/frontend/instruction.cpp b/src/shader_recompiler/frontend/instruction.cpp
index d4847708..a0c13205 100644
--- a/src/shader_recompiler/frontend/instruction.cpp
+++ b/src/shader_recompiler/frontend/instruction.cpp
@@ -7,7 +7,7 @@
namespace Shader::Gcn {
u32 GcnInst::BranchTarget(u32 pc) const {
- const s16 simm = static_cast(control.sopp.simm * 4);
+ const s32 simm = static_cast(control.sopp.simm) * 4;
const u32 target = pc + simm + 4;
return target;
}
@@ -47,4 +47,18 @@ bool GcnInst::IsConditionalBranch() const {
return false;
}
+bool GcnInst::IsCmpx() const {
+ if ((opcode >= Opcode::V_CMPX_F_F32 && opcode <= Opcode::V_CMPX_T_F32) ||
+ (opcode >= Opcode::V_CMPX_F_F64 && opcode <= Opcode::V_CMPX_T_F64) ||
+ (opcode >= Opcode::V_CMPSX_F_F32 && opcode <= Opcode::V_CMPSX_T_F32) ||
+ (opcode >= Opcode::V_CMPSX_F_F64 && opcode <= Opcode::V_CMPSX_T_F64) ||
+ (opcode >= Opcode::V_CMPX_F_I32 && opcode <= Opcode::V_CMPX_CLASS_F32) ||
+ (opcode >= Opcode::V_CMPX_F_I64 && opcode <= Opcode::V_CMPX_CLASS_F64) ||
+ (opcode >= Opcode::V_CMPX_F_U32 && opcode <= Opcode::V_CMPX_T_U32) ||
+ (opcode >= Opcode::V_CMPX_F_U64 && opcode <= Opcode::V_CMPX_T_U64)) {
+ return true;
+ }
+ return false;
+}
+
} // namespace Shader::Gcn
diff --git a/src/shader_recompiler/frontend/instruction.h b/src/shader_recompiler/frontend/instruction.h
index f83f43db..7c2e0bd1 100644
--- a/src/shader_recompiler/frontend/instruction.h
+++ b/src/shader_recompiler/frontend/instruction.h
@@ -203,6 +203,7 @@ struct GcnInst {
bool IsUnconditionalBranch() const;
bool IsConditionalBranch() const;
bool IsFork() const;
+ bool IsCmpx() const;
};
} // namespace Shader::Gcn
diff --git a/src/shader_recompiler/frontend/translate/data_share.cpp b/src/shader_recompiler/frontend/translate/data_share.cpp
index b7b5aa13..7580f744 100644
--- a/src/shader_recompiler/frontend/translate/data_share.cpp
+++ b/src/shader_recompiler/frontend/translate/data_share.cpp
@@ -127,7 +127,6 @@ void Translator::DS_ADD_U32(const GcnInst& inst, bool rtn) {
const IR::U32 data{GetSrc(inst.src[1])};
const IR::U32 offset = ir.Imm32(u32(inst.control.ds.offset0));
const IR::U32 addr_offset = ir.IAdd(addr, offset);
- IR::VectorReg dst_reg{inst.dst[0].code};
const IR::Value original_val = ir.SharedAtomicIAdd(addr_offset, data);
if (rtn) {
SetDst(inst.dst[0], IR::U32{original_val});
@@ -139,7 +138,6 @@ void Translator::DS_MIN_U32(const GcnInst& inst, bool rtn) {
const IR::U32 data{GetSrc(inst.src[1])};
const IR::U32 offset = ir.Imm32(u32(inst.control.ds.offset0));
const IR::U32 addr_offset = ir.IAdd(addr, offset);
- IR::VectorReg dst_reg{inst.dst[0].code};
const IR::Value original_val = ir.SharedAtomicIMin(addr_offset, data, false);
if (rtn) {
SetDst(inst.dst[0], IR::U32{original_val});
@@ -151,7 +149,6 @@ void Translator::DS_MAX_U32(const GcnInst& inst, bool rtn) {
const IR::U32 data{GetSrc(inst.src[1])};
const IR::U32 offset = ir.Imm32(u32(inst.control.ds.offset0));
const IR::U32 addr_offset = ir.IAdd(addr, offset);
- IR::VectorReg dst_reg{inst.dst[0].code};
const IR::Value original_val = ir.SharedAtomicIMax(addr_offset, data, false);
if (rtn) {
SetDst(inst.dst[0], IR::U32{original_val});
@@ -168,13 +165,18 @@ void Translator::V_READFIRSTLANE_B32(const GcnInst& inst) {
}
void Translator::V_READLANE_B32(const GcnInst& inst) {
- ASSERT(info.stage != Stage::Compute);
- SetDst(inst.dst[0], GetSrc(inst.src[0]));
+ const IR::ScalarReg dst{inst.dst[0].code};
+ const IR::U32 value{GetSrc(inst.src[0])};
+ const IR::U32 lane{GetSrc(inst.src[1])};
+ ir.SetScalarReg(dst, ir.ReadLane(value, lane));
}
void Translator::V_WRITELANE_B32(const GcnInst& inst) {
- ASSERT(info.stage != Stage::Compute);
- SetDst(inst.dst[0], GetSrc(inst.src[0]));
+ const IR::VectorReg dst{inst.dst[0].code};
+ const IR::U32 value{GetSrc(inst.src[0])};
+ const IR::U32 lane{GetSrc(inst.src[1])};
+ const IR::U32 old_value{GetSrc(inst.dst[0])};
+ ir.SetVectorReg(dst, ir.WriteLane(old_value, value, lane));
}
} // namespace Shader::Gcn
diff --git a/src/shader_recompiler/frontend/translate/scalar_alu.cpp b/src/shader_recompiler/frontend/translate/scalar_alu.cpp
index 812d93ba..50a550d4 100644
--- a/src/shader_recompiler/frontend/translate/scalar_alu.cpp
+++ b/src/shader_recompiler/frontend/translate/scalar_alu.cpp
@@ -96,6 +96,8 @@ void Translator::EmitScalarAlu(const GcnInst& inst) {
return S_MAX_U32(inst);
case Opcode::S_WQM_B64:
break;
+ case Opcode::S_CMPK_EQ_U32:
+ return S_CMPK_EQ_U32(inst);
default:
LogMissingOpcode(inst);
}
@@ -440,13 +442,16 @@ void Translator::S_SUB_U32(const GcnInst& inst) {
void Translator::S_GETPC_B64(u32 pc, const GcnInst& inst) {
// This only really exists to let resource tracking pass know
// there is an inline cbuf.
- SetDst(inst.dst[0], ir.Imm32(pc));
+ const IR::ScalarReg dst{inst.dst[0].code};
+ ir.SetScalarReg(dst, ir.Imm32(pc));
+ ir.SetScalarReg(dst + 1, ir.Imm32(0));
}
void Translator::S_ADDC_U32(const GcnInst& inst) {
const IR::U32 src0{GetSrc(inst.src[0])};
const IR::U32 src1{GetSrc(inst.src[1])};
- SetDst(inst.dst[0], ir.IAdd(ir.IAdd(src0, src1), ir.GetSccLo()));
+ const IR::U32 carry{ir.Select(ir.GetScc(), ir.Imm32(1U), ir.Imm32(0U))};
+ SetDst(inst.dst[0], ir.IAdd(ir.IAdd(src0, src1), carry));
}
void Translator::S_MAX_U32(const GcnInst& inst) {
@@ -465,4 +470,11 @@ void Translator::S_MIN_U32(const GcnInst& inst) {
ir.SetScc(ir.IEqual(result, src0));
}
+void Translator::S_CMPK_EQ_U32(const GcnInst& inst) {
+ const s32 simm16 = inst.control.sopk.simm;
+ const IR::U32 src0{GetSrc(inst.src[0])};
+ const IR::U32 src1{ir.Imm32(simm16)};
+ ir.SetScc(ir.IEqual(src0, src1));
+}
+
} // namespace Shader::Gcn
diff --git a/src/shader_recompiler/frontend/translate/translate.cpp b/src/shader_recompiler/frontend/translate/translate.cpp
index 4070560a..e59cd565 100644
--- a/src/shader_recompiler/frontend/translate/translate.cpp
+++ b/src/shader_recompiler/frontend/translate/translate.cpp
@@ -346,7 +346,7 @@ void Translator::EmitFetch(const GcnInst& inst) {
// Parse the assembly to generate a list of attributes.
u32 fetch_size{};
- const auto attribs = ParseFetchShader(code, &fetch_size);
+ const auto fetch_data = ParseFetchShader(code, &fetch_size);
if (Config::dumpShaders()) {
using namespace Common::FS;
@@ -359,7 +359,10 @@ void Translator::EmitFetch(const GcnInst& inst) {
file.WriteRaw(code, fetch_size);
}
- for (const auto& attrib : attribs) {
+ info.vertex_offset_sgpr = fetch_data.vertex_offset_sgpr;
+ info.instance_offset_sgpr = fetch_data.instance_offset_sgpr;
+
+ for (const auto& attrib : fetch_data.attributes) {
const IR::Attribute attr{IR::Attribute::Param0 + attrib.semantic};
IR::VectorReg dst_reg{attrib.dest_vgpr};
diff --git a/src/shader_recompiler/frontend/translate/translate.h b/src/shader_recompiler/frontend/translate/translate.h
index 009acabd..6de5e367 100644
--- a/src/shader_recompiler/frontend/translate/translate.h
+++ b/src/shader_recompiler/frontend/translate/translate.h
@@ -98,6 +98,7 @@ public:
void S_ADDK_I32(const GcnInst& inst);
void S_MAX_U32(const GcnInst& inst);
void S_MIN_U32(const GcnInst& inst);
+ void S_CMPK_EQ_U32(const GcnInst& inst);
// Scalar Memory
void S_LOAD_DWORD(int num_dwords, const GcnInst& inst);
diff --git a/src/shader_recompiler/frontend/translate/vector_alu.cpp b/src/shader_recompiler/frontend/translate/vector_alu.cpp
index 1bbc3c16..99543a20 100644
--- a/src/shader_recompiler/frontend/translate/vector_alu.cpp
+++ b/src/shader_recompiler/frontend/translate/vector_alu.cpp
@@ -280,6 +280,8 @@ void Translator::EmitVectorAlu(const GcnInst& inst) {
return V_CMP_U32(ConditionOp::GT, true, false, inst);
case Opcode::V_CMP_LT_I32:
return V_CMP_U32(ConditionOp::LT, true, false, inst);
+ case Opcode::V_CMPX_GT_I32:
+ return V_CMP_U32(ConditionOp::GT, true, true, inst);
case Opcode::V_CMPX_LT_I32:
return V_CMP_U32(ConditionOp::LT, true, true, inst);
case Opcode::V_CMPX_F_U32:
@@ -305,6 +307,8 @@ void Translator::EmitVectorAlu(const GcnInst& inst) {
return V_MBCNT_U32_B32(true, inst);
case Opcode::V_MBCNT_HI_U32_B32:
return V_MBCNT_U32_B32(false, inst);
+ case Opcode::V_NOP:
+ return;
default:
LogMissingOpcode(inst);
}
diff --git a/src/shader_recompiler/frontend/translate/vector_memory.cpp b/src/shader_recompiler/frontend/translate/vector_memory.cpp
index 08674fa2..b88cfc46 100644
--- a/src/shader_recompiler/frontend/translate/vector_memory.cpp
+++ b/src/shader_recompiler/frontend/translate/vector_memory.cpp
@@ -17,6 +17,7 @@ void Translator::EmitVectorMemory(const GcnInst& inst) {
case Opcode::IMAGE_SAMPLE_C_O:
case Opcode::IMAGE_SAMPLE_B:
case Opcode::IMAGE_SAMPLE_C_LZ_O:
+ case Opcode::IMAGE_SAMPLE_D:
return IMAGE_SAMPLE(inst);
case Opcode::IMAGE_GATHER4_C:
case Opcode::IMAGE_GATHER4_LZ:
@@ -93,6 +94,8 @@ void Translator::EmitVectorMemory(const GcnInst& inst) {
case Opcode::TBUFFER_STORE_FORMAT_X:
return BUFFER_STORE_FORMAT(1, true, true, inst);
+ case Opcode::TBUFFER_STORE_FORMAT_XY:
+ return BUFFER_STORE_FORMAT(2, true, true, inst);
case Opcode::TBUFFER_STORE_FORMAT_XYZ:
return BUFFER_STORE_FORMAT(3, true, true, inst);
@@ -108,6 +111,8 @@ void Translator::EmitVectorMemory(const GcnInst& inst) {
// Buffer atomic operations
case Opcode::BUFFER_ATOMIC_ADD:
return BUFFER_ATOMIC(AtomicOp::Add, inst);
+ case Opcode::BUFFER_ATOMIC_SWAP:
+ return BUFFER_ATOMIC(AtomicOp::Swap, inst);
default:
LogMissingOpcode(inst);
}
@@ -162,12 +167,15 @@ void Translator::IMAGE_SAMPLE(const GcnInst& inst) {
flags.test(MimgModifier::LodBias) ? ir.GetVectorReg(addr_reg++) : IR::F32{};
const IR::F32 dref =
flags.test(MimgModifier::Pcf) ? ir.GetVectorReg(addr_reg++) : IR::F32{};
-
- // Derivatives are tricky because their number depends on the texture type which is located in
- // T#. We don't have access to T# though until resource tracking pass. For now assume no
- // derivatives are present, otherwise we don't know where coordinates are placed in the address
- // stream.
- ASSERT_MSG(!flags.test(MimgModifier::Derivative), "Derivative image instruction");
+ const IR::Value derivatives = [&] -> IR::Value {
+ if (!flags.test(MimgModifier::Derivative)) {
+ return {};
+ }
+ addr_reg = addr_reg + 4;
+ return ir.CompositeConstruct(
+ ir.GetVectorReg(addr_reg - 4), ir.GetVectorReg(addr_reg - 3),
+ ir.GetVectorReg(addr_reg - 2), ir.GetVectorReg(addr_reg - 1));
+ }();
// Now we can load body components as noted in Table 8.9 Image Opcodes with Sampler
// Since these are at most 4 dwords, we load them into a single uvec4 and place them
@@ -177,6 +185,10 @@ void Translator::IMAGE_SAMPLE(const GcnInst& inst) {
ir.GetVectorReg(addr_reg), ir.GetVectorReg(addr_reg + 1),
ir.GetVectorReg(addr_reg + 2), ir.GetVectorReg(addr_reg + 3));
+ // Derivatives are tricky because their number depends on the texture type which is located in
+ // T#. We don't have access to T# though until resource tracking pass. For now assume if
+ // derivatives are present, that a 2D image is bound.
+ const bool has_derivatives = flags.test(MimgModifier::Derivative);
const bool explicit_lod = flags.any(MimgModifier::Level0, MimgModifier::Lod);
IR::TextureInstInfo info{};
@@ -186,9 +198,13 @@ void Translator::IMAGE_SAMPLE(const GcnInst& inst) {
info.force_level0.Assign(flags.test(MimgModifier::Level0));
info.has_offset.Assign(flags.test(MimgModifier::Offset));
info.explicit_lod.Assign(explicit_lod);
+ info.has_derivatives.Assign(has_derivatives);
// Issue IR instruction, leaving unknown fields blank to patch later.
const IR::Value texel = [&]() -> IR::Value {
+ if (has_derivatives) {
+ return ir.ImageGradient(handle, body, derivatives, offset, {}, info);
+ }
if (!flags.test(MimgModifier::Pcf)) {
if (explicit_lod) {
return ir.ImageSampleExplicitLod(handle, body, offset, info);
@@ -462,7 +478,7 @@ void Translator::BUFFER_ATOMIC(AtomicOp op, const GcnInst& inst) {
const IR::Value original_val = [&] {
switch (op) {
case AtomicOp::Swap:
- return ir.BufferAtomicExchange(handle, address, vdata_val, info);
+ return ir.BufferAtomicSwap(handle, address, vdata_val, info);
case AtomicOp::Add:
return ir.BufferAtomicIAdd(handle, address, vdata_val, info);
case AtomicOp::Smin:
diff --git a/src/shader_recompiler/ir/ir_emitter.cpp b/src/shader_recompiler/ir/ir_emitter.cpp
index 3ae06807..a65e538c 100644
--- a/src/shader_recompiler/ir/ir_emitter.cpp
+++ b/src/shader_recompiler/ir/ir_emitter.cpp
@@ -209,10 +209,6 @@ U1 IREmitter::GetVcc() {
return Inst(Opcode::GetVcc);
}
-U32 IREmitter::GetSccLo() {
- return Inst(Opcode::GetSccLo);
-}
-
U32 IREmitter::GetVccLo() {
return Inst(Opcode::GetVccLo);
}
@@ -408,9 +404,9 @@ Value IREmitter::BufferAtomicXor(const Value& handle, const Value& address, cons
return Inst(Opcode::BufferAtomicXor32, Flags{info}, handle, address, value);
}
-Value IREmitter::BufferAtomicExchange(const Value& handle, const Value& address, const Value& value,
- BufferInstInfo info) {
- return Inst(Opcode::BufferAtomicExchange32, Flags{info}, handle, address, value);
+Value IREmitter::BufferAtomicSwap(const Value& handle, const Value& address, const Value& value,
+ BufferInstInfo info) {
+ return Inst(Opcode::BufferAtomicSwap32, Flags{info}, handle, address, value);
}
void IREmitter::StoreBufferFormat(int num_dwords, const Value& handle, const Value& address,
@@ -445,6 +441,18 @@ U32 IREmitter::QuadShuffle(const U32& value, const U32& index) {
return Inst(Opcode::QuadShuffle, value, index);
}
+U32 IREmitter::ReadFirstLane(const U32& value) {
+ return Inst(Opcode::ReadFirstLane, value);
+}
+
+U32 IREmitter::ReadLane(const U32& value, const U32& lane) {
+ return Inst(Opcode::ReadLane, value, lane);
+}
+
+U32 IREmitter::WriteLane(const U32& value, const U32& write_value, const U32& lane) {
+ return Inst(Opcode::WriteLane, value, write_value, lane);
+}
+
F32F64 IREmitter::FPAdd(const F32F64& a, const F32F64& b) {
if (a.Type() != b.Type()) {
UNREACHABLE_MSG("Mismatching types {} and {}", a.Type(), b.Type());
diff --git a/src/shader_recompiler/ir/ir_emitter.h b/src/shader_recompiler/ir/ir_emitter.h
index be7f2515..8f806eb5 100644
--- a/src/shader_recompiler/ir/ir_emitter.h
+++ b/src/shader_recompiler/ir/ir_emitter.h
@@ -65,7 +65,6 @@ public:
[[nodiscard]] U1 GetScc();
[[nodiscard]] U1 GetExec();
[[nodiscard]] U1 GetVcc();
- [[nodiscard]] U32 GetSccLo();
[[nodiscard]] U32 GetVccLo();
[[nodiscard]] U32 GetVccHi();
void SetScc(const U1& value);
@@ -116,12 +115,15 @@ public:
const Value& value, BufferInstInfo info);
[[nodiscard]] Value BufferAtomicXor(const Value& handle, const Value& address,
const Value& value, BufferInstInfo info);
- [[nodiscard]] Value BufferAtomicExchange(const Value& handle, const Value& address,
- const Value& value, BufferInstInfo info);
+ [[nodiscard]] Value BufferAtomicSwap(const Value& handle, const Value& address,
+ const Value& value, BufferInstInfo info);
[[nodiscard]] U32 LaneId();
[[nodiscard]] U32 WarpId();
[[nodiscard]] U32 QuadShuffle(const U32& value, const U32& index);
+ [[nodiscard]] U32 ReadFirstLane(const U32& value);
+ [[nodiscard]] U32 ReadLane(const U32& value, const U32& lane);
+ [[nodiscard]] U32 WriteLane(const U32& value, const U32& write_value, const U32& lane);
[[nodiscard]] Value CompositeConstruct(const Value& e1, const Value& e2);
[[nodiscard]] Value CompositeConstruct(const Value& e1, const Value& e2, const Value& e3);
diff --git a/src/shader_recompiler/ir/microinstruction.cpp b/src/shader_recompiler/ir/microinstruction.cpp
index e35be8a7..a8c8b073 100644
--- a/src/shader_recompiler/ir/microinstruction.cpp
+++ b/src/shader_recompiler/ir/microinstruction.cpp
@@ -70,7 +70,7 @@ bool Inst::MayHaveSideEffects() const noexcept {
case Opcode::BufferAtomicAnd32:
case Opcode::BufferAtomicOr32:
case Opcode::BufferAtomicXor32:
- case Opcode::BufferAtomicExchange32:
+ case Opcode::BufferAtomicSwap32:
case Opcode::WriteSharedU128:
case Opcode::WriteSharedU64:
case Opcode::WriteSharedU32:
diff --git a/src/shader_recompiler/ir/opcodes.inc b/src/shader_recompiler/ir/opcodes.inc
index e9ecd435..26da00bb 100644
--- a/src/shader_recompiler/ir/opcodes.inc
+++ b/src/shader_recompiler/ir/opcodes.inc
@@ -58,7 +58,6 @@ OPCODE(SetAttribute, Void, Attr
OPCODE(GetScc, U1, Void, )
OPCODE(GetExec, U1, Void, )
OPCODE(GetVcc, U1, Void, )
-OPCODE(GetSccLo, U32, Void, )
OPCODE(GetVccLo, U32, Void, )
OPCODE(GetVccHi, U32, Void, )
OPCODE(SetScc, Void, U1, )
@@ -96,7 +95,7 @@ OPCODE(StoreBufferFormatF32x4, Void, Opaq
OPCODE(StoreBufferU32, Void, Opaque, Opaque, U32, )
// Buffer atomic operations
-OPCODE(BufferAtomicIAdd32, U32, Opaque, Opaque, U32 )
+OPCODE(BufferAtomicIAdd32, U32, Opaque, Opaque, U32 )
OPCODE(BufferAtomicSMin32, U32, Opaque, Opaque, U32 )
OPCODE(BufferAtomicUMin32, U32, Opaque, Opaque, U32 )
OPCODE(BufferAtomicSMax32, U32, Opaque, Opaque, U32 )
@@ -106,7 +105,7 @@ OPCODE(BufferAtomicDec32, U32, Opaq
OPCODE(BufferAtomicAnd32, U32, Opaque, Opaque, U32, )
OPCODE(BufferAtomicOr32, U32, Opaque, Opaque, U32, )
OPCODE(BufferAtomicXor32, U32, Opaque, Opaque, U32, )
-OPCODE(BufferAtomicExchange32, U32, Opaque, Opaque, U32, )
+OPCODE(BufferAtomicSwap32, U32, Opaque, Opaque, U32, )
// Vector utility
OPCODE(CompositeConstructU32x2, U32x2, U32, U32, )
@@ -330,19 +329,22 @@ OPCODE(ImageRead, U32x4, Opaq
OPCODE(ImageWrite, Void, Opaque, Opaque, U32x4, )
// Image atomic operations
-OPCODE(ImageAtomicIAdd32, U32, Opaque, Opaque, U32, )
-OPCODE(ImageAtomicSMin32, U32, Opaque, Opaque, U32, )
-OPCODE(ImageAtomicUMin32, U32, Opaque, Opaque, U32, )
-OPCODE(ImageAtomicSMax32, U32, Opaque, Opaque, U32, )
-OPCODE(ImageAtomicUMax32, U32, Opaque, Opaque, U32, )
-OPCODE(ImageAtomicInc32, U32, Opaque, Opaque, U32, )
-OPCODE(ImageAtomicDec32, U32, Opaque, Opaque, U32, )
-OPCODE(ImageAtomicAnd32, U32, Opaque, Opaque, U32, )
-OPCODE(ImageAtomicOr32, U32, Opaque, Opaque, U32, )
-OPCODE(ImageAtomicXor32, U32, Opaque, Opaque, U32, )
-OPCODE(ImageAtomicExchange32, U32, Opaque, Opaque, U32, )
+OPCODE(ImageAtomicIAdd32, U32, Opaque, Opaque, U32, )
+OPCODE(ImageAtomicSMin32, U32, Opaque, Opaque, U32, )
+OPCODE(ImageAtomicUMin32, U32, Opaque, Opaque, U32, )
+OPCODE(ImageAtomicSMax32, U32, Opaque, Opaque, U32, )
+OPCODE(ImageAtomicUMax32, U32, Opaque, Opaque, U32, )
+OPCODE(ImageAtomicInc32, U32, Opaque, Opaque, U32, )
+OPCODE(ImageAtomicDec32, U32, Opaque, Opaque, U32, )
+OPCODE(ImageAtomicAnd32, U32, Opaque, Opaque, U32, )
+OPCODE(ImageAtomicOr32, U32, Opaque, Opaque, U32, )
+OPCODE(ImageAtomicXor32, U32, Opaque, Opaque, U32, )
+OPCODE(ImageAtomicExchange32, U32, Opaque, Opaque, U32, )
// Warp operations
OPCODE(LaneId, U32, )
OPCODE(WarpId, U32, )
OPCODE(QuadShuffle, U32, U32, U32 )
+OPCODE(ReadFirstLane, U32, U32, U32 )
+OPCODE(ReadLane, U32, U32, U32 )
+OPCODE(WriteLane, U32, U32, U32, U32 )
diff --git a/src/shader_recompiler/ir/passes/constant_propogation_pass.cpp b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp
similarity index 97%
rename from src/shader_recompiler/ir/passes/constant_propogation_pass.cpp
rename to src/shader_recompiler/ir/passes/constant_propagation_pass.cpp
index 94218b32..b0d9dcc4 100644
--- a/src/shader_recompiler/ir/passes/constant_propogation_pass.cpp
+++ b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp
@@ -250,6 +250,18 @@ void FoldCmpClass(IR::Inst& inst) {
}
}
+void FoldReadLane(IR::Inst& inst) {
+ const u32 lane = inst.Arg(1).U32();
+ IR::Inst* prod = inst.Arg(0).InstRecursive();
+ while (prod->GetOpcode() == IR::Opcode::WriteLane) {
+ if (prod->Arg(2).U32() == lane) {
+ inst.ReplaceUsesWith(prod->Arg(1));
+ return;
+ }
+ prod = prod->Arg(0).InstRecursive();
+ }
+}
+
void ConstantPropagation(IR::Block& block, IR::Inst& inst) {
switch (inst.GetOpcode()) {
case IR::Opcode::IAdd32:
@@ -289,6 +301,8 @@ void ConstantPropagation(IR::Block& block, IR::Inst& inst) {
case IR::Opcode::SelectF32:
case IR::Opcode::SelectF64:
return FoldSelect(inst);
+ case IR::Opcode::ReadLane:
+ return FoldReadLane(inst);
case IR::Opcode::FPNeg32:
FoldWhenAllImmediates(inst, [](f32 a) { return -a; });
return;
diff --git a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp
index 20a66ad0..ccdcfc6e 100644
--- a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp
+++ b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp
@@ -32,7 +32,7 @@ bool IsBufferAtomic(const IR::Inst& inst) {
case IR::Opcode::BufferAtomicAnd32:
case IR::Opcode::BufferAtomicOr32:
case IR::Opcode::BufferAtomicXor32:
- case IR::Opcode::BufferAtomicExchange32:
+ case IR::Opcode::BufferAtomicSwap32:
return true;
default:
return false;
@@ -136,6 +136,7 @@ IR::Type BufferDataType(const IR::Inst& inst, AmdGpu::NumberFormat num_format) {
case IR::Opcode::ReadConstBufferU32:
case IR::Opcode::StoreBufferU32:
case IR::Opcode::BufferAtomicIAdd32:
+ case IR::Opcode::BufferAtomicSwap32:
return IR::Type::U32;
default:
UNREACHABLE();
@@ -246,10 +247,7 @@ public:
return true;
}
// Samplers with different bindings might still be the same.
- const auto old_sharp =
- info.ReadUd(existing.sgpr_base, existing.dword_offset);
- const auto new_sharp = info.ReadUd(desc.sgpr_base, desc.dword_offset);
- return old_sharp == new_sharp;
+ return existing.GetSsharp(info) == desc.GetSsharp(info);
})};
return index;
}
@@ -345,6 +343,7 @@ SharpLocation TrackSharp(const IR::Inst* inst) {
// Retrieve SGPR pair that holds sbase
const auto pred1 = [](const IR::Inst* inst) -> std::optional {
+ ASSERT(inst->GetOpcode() != IR::Opcode::ReadConst);
if (inst->GetOpcode() == IR::Opcode::GetUserData) {
return inst->Arg(0).ScalarReg();
}
@@ -402,24 +401,13 @@ s32 TryHandleInlineCbuf(IR::Inst& inst, Info& info, Descriptors& descriptors,
// is used to define an inline constant buffer
IR::Inst* handle = inst.Arg(0).InstRecursive();
- IR::Inst* p0 = handle->Arg(0).InstRecursive();
- if (p0->GetOpcode() != IR::Opcode::IAdd32 || !p0->Arg(0).IsImmediate() ||
- !p0->Arg(1).IsImmediate()) {
- return -1;
- }
- IR::Inst* p1 = handle->Arg(1).InstRecursive();
- if (p1->GetOpcode() != IR::Opcode::IAdd32) {
- return -1;
- }
- if (!handle->Arg(3).IsImmediate() || !handle->Arg(2).IsImmediate()) {
+ if (!handle->AreAllArgsImmediates()) {
return -1;
}
// We have found this pattern. Build the sharp.
- std::array buffer;
- buffer[0] = info.pgm_base + p0->Arg(0).U32() + p0->Arg(1).U32();
- buffer[1] = 0;
- buffer[2] = handle->Arg(2).U32();
- buffer[3] = handle->Arg(3).U32();
+ std::array buffer;
+ buffer[0] = info.pgm_base + (handle->Arg(0).U32() | u64(handle->Arg(1).U32()) << 32);
+ buffer[1] = handle->Arg(2).U32() | u64(handle->Arg(3).U32()) << 32;
cbuf = std::bit_cast(buffer);
// Assign a binding to this sharp.
return descriptors.Add(BufferResource{
@@ -617,7 +605,11 @@ void PatchImageInstruction(IR::Block& block, IR::Inst& inst, Info& info, Descrip
const IR::Value arg = inst.Arg(arg_pos);
ASSERT_MSG(arg.Type() == IR::Type::U32, "Unexpected offset type");
- const auto read = [&](u32 offset) -> auto {
+ const auto read = [&](u32 offset) -> IR::U32 {
+ if (arg.IsImmediate()) {
+ const u16 comp = (arg.U32() >> offset) & 0x3F;
+ return ir.Imm32(s32(comp << 26) >> 26);
+ }
return ir.BitFieldExtract(IR::U32{arg}, ir.Imm32(offset), ir.Imm32(6), true);
};
@@ -637,7 +629,10 @@ void PatchImageInstruction(IR::Block& block, IR::Inst& inst, Info& info, Descrip
UNREACHABLE();
}
}
-
+ if (inst_info.has_derivatives) {
+ ASSERT_MSG(image.GetType() == AmdGpu::ImageType::Color2D,
+ "User derivatives only supported for 2D images");
+ }
if (inst_info.has_lod_clamp) {
const u32 arg_pos = [&]() -> u32 {
switch (inst.GetOpcode()) {
diff --git a/src/shader_recompiler/ir/passes/ssa_rewrite_pass.cpp b/src/shader_recompiler/ir/passes/ssa_rewrite_pass.cpp
index eef73a65..9edb157d 100644
--- a/src/shader_recompiler/ir/passes/ssa_rewrite_pass.cpp
+++ b/src/shader_recompiler/ir/passes/ssa_rewrite_pass.cpp
@@ -32,7 +32,6 @@ struct SccFlagTag : FlagTag {};
struct ExecFlagTag : FlagTag {};
struct VccFlagTag : FlagTag {};
struct VccLoTag : FlagTag {};
-struct SccLoTag : FlagTag {};
struct VccHiTag : FlagTag {};
struct GotoVariable : FlagTag {
@@ -45,7 +44,7 @@ struct GotoVariable : FlagTag {
};
using Variant = std::variant;
+ VccFlagTag, VccLoTag, VccHiTag>;
using ValueMap = std::unordered_map;
struct DefTable {
@@ -84,13 +83,6 @@ struct DefTable {
exec_flag.insert_or_assign(block, value);
}
- const IR::Value& Def(IR::Block* block, SccLoTag) {
- return scc_lo_flag[block];
- }
- void SetDef(IR::Block* block, SccLoTag, const IR::Value& value) {
- scc_lo_flag.insert_or_assign(block, value);
- }
-
const IR::Value& Def(IR::Block* block, VccLoTag) {
return vcc_lo_flag[block];
}
@@ -133,10 +125,6 @@ IR::Opcode UndefOpcode(const VccLoTag) noexcept {
return IR::Opcode::UndefU32;
}
-IR::Opcode UndefOpcode(const SccLoTag) noexcept {
- return IR::Opcode::UndefU32;
-}
-
IR::Opcode UndefOpcode(const VccHiTag) noexcept {
return IR::Opcode::UndefU32;
}
@@ -336,9 +324,6 @@ void VisitInst(Pass& pass, IR::Block* block, IR::Inst& inst) {
case IR::Opcode::SetVcc:
pass.WriteVariable(VccFlagTag{}, block, inst.Arg(0));
break;
- case IR::Opcode::SetSccLo:
- pass.WriteVariable(SccLoTag{}, block, inst.Arg(0));
- break;
case IR::Opcode::SetVccLo:
pass.WriteVariable(VccLoTag{}, block, inst.Arg(0));
break;
@@ -371,9 +356,6 @@ void VisitInst(Pass& pass, IR::Block* block, IR::Inst& inst) {
case IR::Opcode::GetVcc:
inst.ReplaceUsesWith(pass.ReadVariable(VccFlagTag{}, block));
break;
- case IR::Opcode::GetSccLo:
- inst.ReplaceUsesWith(pass.ReadVariable(SccLoTag{}, block));
- break;
case IR::Opcode::GetVccLo:
inst.ReplaceUsesWith(pass.ReadVariable(VccLoTag{}, block));
break;
diff --git a/src/shader_recompiler/ir/reg.h b/src/shader_recompiler/ir/reg.h
index e3d04260..7868a5a3 100644
--- a/src/shader_recompiler/ir/reg.h
+++ b/src/shader_recompiler/ir/reg.h
@@ -58,6 +58,7 @@ union TextureInstInfo {
BitField<4, 1, u32> explicit_lod;
BitField<5, 1, u32> has_offset;
BitField<6, 2, u32> gather_comp;
+ BitField<8, 1, u32> has_derivatives;
};
union BufferInstInfo {
diff --git a/src/shader_recompiler/recompiler.cpp b/src/shader_recompiler/recompiler.cpp
index 0f9fd6d4..0efac4ff 100644
--- a/src/shader_recompiler/recompiler.cpp
+++ b/src/shader_recompiler/recompiler.cpp
@@ -56,11 +56,11 @@ IR::Program TranslateProgram(Common::ObjectPool& inst_pool,
// Run optimization passes
Shader::Optimization::SsaRewritePass(program.post_order_blocks);
- Shader::Optimization::ResourceTrackingPass(program);
Shader::Optimization::ConstantPropagationPass(program.post_order_blocks);
if (program.info.stage != Stage::Compute) {
Shader::Optimization::LowerSharedMemToRegisters(program);
}
+ Shader::Optimization::ResourceTrackingPass(program);
Shader::Optimization::IdentityRemovalPass(program.blocks);
Shader::Optimization::DeadCodeEliminationPass(program);
Shader::Optimization::CollectShaderInfoPass(program);
diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h
index b1eb6aea..7d36dbe1 100644
--- a/src/shader_recompiler/runtime_info.h
+++ b/src/shader_recompiler/runtime_info.h
@@ -175,6 +175,9 @@ struct Info {
AttributeFlags stores{};
boost::container::static_vector vs_outputs;
+ s8 vertex_offset_sgpr = -1;
+ s8 instance_offset_sgpr = -1;
+
BufferResourceList buffers;
ImageResourceList images;
SamplerResourceList samplers;
@@ -210,6 +213,18 @@ struct Info {
std::memcpy(&data, base + dword_offset, sizeof(T));
return data;
}
+
+ [[nodiscard]] std::pair GetDrawOffsets() const noexcept {
+ u32 vertex_offset = 0;
+ u32 instance_offset = 0;
+ if (vertex_offset_sgpr != -1) {
+ vertex_offset = user_data[vertex_offset_sgpr];
+ }
+ if (instance_offset_sgpr != -1) {
+ instance_offset = user_data[instance_offset_sgpr];
+ }
+ return {vertex_offset, instance_offset};
+ }
};
constexpr AmdGpu::Buffer BufferResource::GetVsharp(const Info& info) const noexcept {
diff --git a/src/video_core/amdgpu/default_context.cpp b/src/video_core/amdgpu/default_context.cpp
new file mode 100644
index 00000000..01229e7b
--- /dev/null
+++ b/src/video_core/amdgpu/default_context.cpp
@@ -0,0 +1,55 @@
+// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "common/types.h"
+#include "video_core/amdgpu/liverpool.h"
+
+#include
+
+namespace AmdGpu {
+
+// The following values are taken from fpPS4:
+// https://github.com/red-prig/fpPS4/blob/436b43064be4c78229500f3d3c054fc76639247d/chip/pm4_pfp.pas#L410
+//
+static constexpr std::array reg_array_default{
+ 0x00000000u, 0x80000000u, 0x40004000u, 0xdeadbeefu, 0x00000000u, 0x40004000u, 0x00000000u,
+ 0x40004000u, 0x00000000u, 0x40004000u, 0x00000000u, 0x40004000u, 0xaa99aaaau, 0x00000000u,
+ 0xdeadbeefu, 0xdeadbeefu, 0x80000000u, 0x40004000u, 0x00000000u, 0x00000000u, 0x80000000u,
+ 0x40004000u, 0x80000000u, 0x40004000u, 0x80000000u, 0x40004000u, 0x80000000u, 0x40004000u,
+ 0x80000000u, 0x40004000u, 0x80000000u, 0x40004000u, 0x80000000u, 0x40004000u, 0x80000000u,
+ 0x40004000u, 0x80000000u, 0x40004000u, 0x80000000u, 0x40004000u, 0x80000000u, 0x40004000u,
+ 0x80000000u, 0x40004000u, 0x80000000u, 0x40004000u, 0x80000000u, 0x40004000u, 0x80000000u,
+ 0x40004000u, 0x80000000u, 0x40004000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u,
+ 0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u, 0x00000000u,
+ 0x3f800000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u,
+ 0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u, 0x00000000u,
+ 0x3f800000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u,
+ 0x2a00161au,
+};
+
+void Liverpool::Regs::SetDefaults() {
+ std::memset(reg_array.data(), 0, reg_array.size() * sizeof(u32));
+
+ std::memcpy(®_array[ContextRegWordOffset + 0x80], reg_array_default.data(),
+ reg_array_default.size() * sizeof(u32));
+
+ // Individual context regs values
+ reg_array[ContextRegWordOffset + 0x000d] = 0x40004000u;
+ reg_array[ContextRegWordOffset + 0x01b6] = 0x00000002u;
+ reg_array[ContextRegWordOffset + 0x0204] = 0x00090000u;
+ reg_array[ContextRegWordOffset + 0x0205] = 0x00000004u;
+ reg_array[ContextRegWordOffset + 0x0295] = 0x00000100u;
+ reg_array[ContextRegWordOffset + 0x0296] = 0x00000080u;
+ reg_array[ContextRegWordOffset + 0x0297] = 0x00000002u;
+ reg_array[ContextRegWordOffset + 0x02aa] = 0x00001000u;
+ reg_array[ContextRegWordOffset + 0x02f7] = 0x00001000u;
+ reg_array[ContextRegWordOffset + 0x02f9] = 0x00000005u;
+ reg_array[ContextRegWordOffset + 0x02fa] = 0x3f800000u;
+ reg_array[ContextRegWordOffset + 0x02fb] = 0x3f800000u;
+ reg_array[ContextRegWordOffset + 0x02fc] = 0x3f800000u;
+ reg_array[ContextRegWordOffset + 0x02fd] = 0x3f800000u;
+ reg_array[ContextRegWordOffset + 0x0316] = 0x0000000eu;
+ reg_array[ContextRegWordOffset + 0x0317] = 0x00000010u;
+}
+
+} // namespace AmdGpu
diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp
index dce2d4b4..5b3db603 100644
--- a/src/video_core/amdgpu/liverpool.cpp
+++ b/src/video_core/amdgpu/liverpool.cpp
@@ -216,6 +216,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span dcb, std::span(opcode), count);
diff --git a/src/video_core/amdgpu/liverpool.h b/src/video_core/amdgpu/liverpool.h
index 595c98f5..2806f330 100644
--- a/src/video_core/amdgpu/liverpool.h
+++ b/src/video_core/amdgpu/liverpool.h
@@ -556,7 +556,7 @@ struct Liverpool {
union {
BitField<0, 15, s32> top_left_x;
BitField<15, 15, s32> top_left_y;
- BitField<30, 1, s32> window_offset_disble;
+ BitField<30, 1, s32> window_offset_disable;
};
union {
BitField<0, 15, s32> bottom_right_x;
@@ -1017,6 +1017,8 @@ struct Liverpool {
}
return nullptr;
}
+
+ void SetDefaults();
};
Regs regs{};
diff --git a/src/video_core/amdgpu/pm4_opcodes.h b/src/video_core/amdgpu/pm4_opcodes.h
index fba0cbb9..83c1deaa 100644
--- a/src/video_core/amdgpu/pm4_opcodes.h
+++ b/src/video_core/amdgpu/pm4_opcodes.h
@@ -48,7 +48,7 @@ enum class PM4ItOpcode : u32 {
EventWriteEop = 0x47,
EventWriteEos = 0x48,
ReleaseMem = 0x49,
- PremableCntl = 0x4A,
+ PreambleCntl = 0x4A,
DmaData = 0x50,
ContextRegRmw = 0x51,
AcquireMem = 0x58,
diff --git a/src/video_core/amdgpu/resource.h b/src/video_core/amdgpu/resource.h
index ef5bf1b6..8c3b675e 100644
--- a/src/video_core/amdgpu/resource.h
+++ b/src/video_core/amdgpu/resource.h
@@ -179,6 +179,10 @@ struct Image {
return base_address << 8;
}
+ operator bool() const noexcept {
+ return base_address != 0;
+ }
+
u32 DstSelect() const {
return dst_sel_x | (dst_sel_y << 3) | (dst_sel_z << 6) | (dst_sel_w << 9);
}
diff --git a/src/video_core/buffer_cache/buffer.h b/src/video_core/buffer_cache/buffer.h
index d373fbff..5c64ba65 100644
--- a/src/video_core/buffer_cache/buffer.h
+++ b/src/video_core/buffer_cache/buffer.h
@@ -38,9 +38,9 @@ struct UniqueBuffer {
UniqueBuffer& operator=(const UniqueBuffer&) = delete;
UniqueBuffer(UniqueBuffer&& other)
- : buffer{std::exchange(other.buffer, VK_NULL_HANDLE)},
- allocator{std::exchange(other.allocator, VK_NULL_HANDLE)},
- allocation{std::exchange(other.allocation, VK_NULL_HANDLE)} {}
+ : allocator{std::exchange(other.allocator, VK_NULL_HANDLE)},
+ allocation{std::exchange(other.allocation, VK_NULL_HANDLE)},
+ buffer{std::exchange(other.buffer, VK_NULL_HANDLE)} {}
UniqueBuffer& operator=(UniqueBuffer&& other) {
buffer = std::exchange(other.buffer, VK_NULL_HANDLE);
allocator = std::exchange(other.allocator, VK_NULL_HANDLE);
diff --git a/src/video_core/host_shaders/detile_m8x1.comp b/src/video_core/host_shaders/detile_m8x1.comp
index 5ec48fae..3ca2e64b 100644
--- a/src/video_core/host_shaders/detile_m8x1.comp
+++ b/src/video_core/host_shaders/detile_m8x1.comp
@@ -4,7 +4,7 @@
#version 450
#extension GL_KHR_shader_subgroup_shuffle : require
-// NOTE: Current subgroup utilization is subotimal on most GPUs, so
+// NOTE: Current subgroup utilization is suboptimal on most GPUs, so
// it will be nice to process two tiles at once here.
layout (local_size_x = 16, local_size_y = 1, local_size_z = 1) in;
diff --git a/src/video_core/host_shaders/detile_m8x2.comp b/src/video_core/host_shaders/detile_m8x2.comp
index d27bc6e2..ee9b7281 100644
--- a/src/video_core/host_shaders/detile_m8x2.comp
+++ b/src/video_core/host_shaders/detile_m8x2.comp
@@ -3,7 +3,7 @@
#version 450
-// NOTE: Current subgroup utilization is subotimal on most GPUs, so
+// NOTE: Current subgroup utilization is suboptimal on most GPUs, so
// it will be nice to process two tiles at once here.
layout (local_size_x = 32, local_size_y = 1, local_size_z = 1) in;
diff --git a/src/video_core/page_manager.cpp b/src/video_core/page_manager.cpp
index 6225f11b..18b8aee2 100644
--- a/src/video_core/page_manager.cpp
+++ b/src/video_core/page_manager.cpp
@@ -51,7 +51,8 @@ struct PageManager::Impl {
if (ec == EXCEPTION_ACCESS_VIOLATION) {
const auto info = pExp->ExceptionRecord->ExceptionInformation;
if (info[0] == 1) { // Write violation
- rasterizer->InvalidateMemory(info[1], sizeof(u64));
+ const VAddr addr_aligned = Common::AlignDown(info[1], PAGESIZE);
+ rasterizer->InvalidateMemory(addr_aligned, PAGESIZE);
return EXCEPTION_CONTINUE_EXECUTION;
} /* else {
UNREACHABLE();
@@ -199,7 +200,8 @@ struct PageManager::Impl {
const greg_t err = ctx->uc_mcontext.gregs[REG_ERR];
#endif
if (err & 0x2) {
- rasterizer->InvalidateMemory(address, sizeof(u64));
+ const VAddr addr_aligned = Common::AlignDown(address, PAGESIZE);
+ rasterizer->InvalidateMemory(addr_aligned, PAGESIZE);
} else {
// Read not supported!
UNREACHABLE();
diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp
index daf64a4d..025f311d 100644
--- a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp
+++ b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp
@@ -306,6 +306,7 @@ std::span GetAllFormats() {
vk::Format::eBc7UnormBlock,
vk::Format::eD16Unorm,
vk::Format::eD16UnormS8Uint,
+ vk::Format::eD24UnormS8Uint,
vk::Format::eD32Sfloat,
vk::Format::eD32SfloatS8Uint,
vk::Format::eR4G4B4A4UnormPack16,
@@ -319,6 +320,7 @@ std::span GetAllFormats() {
vk::Format::eR8G8Uint,
vk::Format::eR8G8Unorm,
vk::Format::eR8Sint,
+ vk::Format::eR8Snorm,
vk::Format::eR8Uint,
vk::Format::eR8Unorm,
vk::Format::eR8Srgb,
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp
index c78d629e..b1270808 100644
--- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp
+++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp
@@ -258,7 +258,7 @@ void RendererVulkan::Present(Frame* frame) {
{
auto* profiler_ctx = instance.GetProfilerContext();
TracyVkNamedZoneC(profiler_ctx, renderer_gpu_zone, cmdbuf, "Host frame",
- MarkersPallete::GpuMarkerColor, profiler_ctx != nullptr);
+ MarkersPalette::GpuMarkerColor, profiler_ctx != nullptr);
const vk::Extent2D extent = swapchain.GetExtent();
const std::array pre_barriers{
@@ -380,7 +380,7 @@ Frame* RendererVulkan::GetRenderFrame() {
// Reset fence for next queue submission.
device.resetFences(frame->present_done);
- // If the window dimentions changed, recreate this frame
+ // If the window dimensions changed, recreate this frame
if (frame->width != window.getWidth() || frame->height != window.getHeight()) {
RecreateFrame(frame, window.getWidth(), window.getHeight());
}
diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
index c2649b96..95d3a4b2 100644
--- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
+++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
@@ -396,13 +396,18 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs,
boost::container::static_vector tsharps;
for (const auto& image_desc : stage->images) {
- const auto& tsharp = tsharps.emplace_back(
- stage->ReadUd(image_desc.sgpr_base, image_desc.dword_offset));
- VideoCore::ImageInfo image_info{tsharp};
- VideoCore::ImageViewInfo view_info{tsharp, image_desc.is_storage};
- const auto& image_view = texture_cache.FindTexture(image_info, view_info);
- const auto& image = texture_cache.GetImage(image_view.image_id);
- image_infos.emplace_back(VK_NULL_HANDLE, *image_view.image_view, image.layout);
+ const auto tsharp =
+ stage->ReadUd(image_desc.sgpr_base, image_desc.dword_offset);
+ if (tsharp) {
+ tsharps.emplace_back(tsharp);
+ VideoCore::ImageInfo image_info{tsharp};
+ VideoCore::ImageViewInfo view_info{tsharp, image_desc.is_storage};
+ const auto& image_view = texture_cache.FindTexture(image_info, view_info);
+ const auto& image = texture_cache.GetImage(image_view.image_id);
+ image_infos.emplace_back(VK_NULL_HANDLE, *image_view.image_view, image.layout);
+ } else {
+ image_infos.emplace_back(VK_NULL_HANDLE, VK_NULL_HANDLE, vk::ImageLayout::eGeneral);
+ }
set_writes.push_back({
.dstSet = VK_NULL_HANDLE,
.dstBinding = binding++,
diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp
index 66da030f..19939a32 100644
--- a/src/video_core/renderer_vulkan/vk_instance.cpp
+++ b/src/video_core/renderer_vulkan/vk_instance.cpp
@@ -210,6 +210,8 @@ bool Instance::CreateDevice() {
color_write_en &= add_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME);
const bool calibrated_timestamps = add_extension(VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME);
const bool robustness = add_extension(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
+ const bool topology_restart =
+ add_extension(VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME);
// These extensions are promoted by Vulkan 1.3, but for greater compatibility we use Vulkan 1.2
// with extensions.
@@ -272,6 +274,7 @@ bool Instance::CreateDevice() {
.independentBlend = features.independentBlend,
.geometryShader = features.geometryShader,
.logicOp = features.logicOp,
+ .depthBiasClamp = features.depthBiasClamp,
.multiViewport = features.multiViewport,
.samplerAnisotropy = features.samplerAnisotropy,
.fragmentStoresAndAtomics = features.fragmentStoresAndAtomics,
@@ -330,6 +333,9 @@ bool Instance::CreateDevice() {
vk::PhysicalDeviceVertexInputDynamicStateFeaturesEXT{
.vertexInputDynamicState = true,
},
+ vk::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT{
+ .primitiveTopologyListRestart = true,
+ },
#ifdef __APPLE__
feature_chain.get(),
#endif
@@ -351,6 +357,9 @@ bool Instance::CreateDevice() {
if (!workgroup_memory_explicit_layout) {
device_chain.unlink();
}
+ if (!topology_restart) {
+ device_chain.unlink();
+ }
if (robustness) {
device_chain.get().nullDescriptor =
feature_chain.get().nullDescriptor;
@@ -481,6 +490,8 @@ bool Instance::IsFormatSupported(const vk::Format format) const {
vk::Format Instance::GetAlternativeFormat(const vk::Format format) const {
if (format == vk::Format::eB5G6R5UnormPack16) {
return vk::Format::eR5G6B5UnormPack16;
+ } else if (format == vk::Format::eD16UnormS8Uint) {
+ return vk::Format::eD24UnormS8Uint;
}
return format;
}
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
index 55f04bac..139edcf7 100644
--- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
@@ -280,9 +280,6 @@ std::unique_ptr PipelineCache::CreateGraphicsPipeline() {
DumpShader(code, hash, stage, "bin");
}
- block_pool.ReleaseContents();
- inst_pool.ReleaseContents();
-
if (stage != Shader::Stage::Fragment && stage != Shader::Stage::Vertex) {
LOG_ERROR(Render_Vulkan, "Unsupported shader stage {}. PL creation skipped.", stage);
return {};
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
index 6cd80393..f22f19ea 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
@@ -52,13 +52,17 @@ void Rasterizer::Draw(bool is_indexed, u32 index_offset) {
BeginRendering();
UpdateDynamicState(*pipeline);
+ const auto [vertex_offset, instance_offset] = vs_info.GetDrawOffsets();
+
if (is_indexed) {
- cmdbuf.drawIndexed(num_indices, regs.num_instances.NumInstances(), 0, 0, 0);
+ cmdbuf.drawIndexed(num_indices, regs.num_instances.NumInstances(), 0, s32(vertex_offset),
+ instance_offset);
} else {
const u32 num_vertices = regs.primitive_type == AmdGpu::Liverpool::PrimitiveType::RectList
? 4
: regs.num_indices;
- cmdbuf.draw(num_vertices, regs.num_instances.NumInstances(), 0, 0);
+ cmdbuf.draw(num_vertices, regs.num_instances.NumInstances(), vertex_offset,
+ instance_offset);
}
}
@@ -134,8 +138,8 @@ void Rasterizer::BeginRendering() {
using StencilFormat = AmdGpu::Liverpool::DepthBuffer::StencilFormat;
if (regs.depth_buffer.Address() != 0 &&
((regs.depth_control.depth_enable && regs.depth_buffer.z_info.format != ZFormat::Invalid) ||
- regs.depth_control.stencil_enable &&
- regs.depth_buffer.stencil_info.format != StencilFormat::Invalid)) {
+ (regs.depth_control.stencil_enable &&
+ regs.depth_buffer.stencil_info.format != StencilFormat::Invalid))) {
const auto htile_address = regs.depth_htile_data_base.GetAddress();
const bool is_clear = regs.depth_render_control.depth_clear_enable ||
texture_cache.IsMetaCleared(htile_address);
@@ -239,7 +243,7 @@ void Rasterizer::UpdateDepthStencilState() {
}
void Rasterizer::ScopeMarkerBegin(const std::string_view& str) {
- if (!Config::isMarkersEnabled()) {
+ if (Config::nullGpu() || !Config::isMarkersEnabled()) {
return;
}
@@ -250,7 +254,7 @@ void Rasterizer::ScopeMarkerBegin(const std::string_view& str) {
}
void Rasterizer::ScopeMarkerEnd() {
- if (!Config::isMarkersEnabled()) {
+ if (Config::nullGpu() || !Config::isMarkersEnabled()) {
return;
}
@@ -259,7 +263,7 @@ void Rasterizer::ScopeMarkerEnd() {
}
void Rasterizer::ScopedMarkerInsert(const std::string_view& str) {
- if (!Config::isMarkersEnabled()) {
+ if (Config::nullGpu() || !Config::isMarkersEnabled()) {
return;
}
@@ -270,7 +274,7 @@ void Rasterizer::ScopedMarkerInsert(const std::string_view& str) {
}
void Rasterizer::Breadcrumb(u64 id) {
- if (!instance.HasNvCheckpoints()) {
+ if (Config::nullGpu() || !instance.HasNvCheckpoints()) {
return;
}
scheduler.CommandBuffer().setCheckpointNV(id);
diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp
index ef0307ef..2f1f13d7 100644
--- a/src/video_core/renderer_vulkan/vk_scheduler.cpp
+++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp
@@ -145,7 +145,7 @@ void Scheduler::AllocateWorkerCommandBuffers() {
auto* profiler_ctx = instance.GetProfilerContext();
if (profiler_ctx) {
static const auto scope_loc =
- GPU_SCOPE_LOCATION("Guest Frame", MarkersPallete::GpuMarkerColor);
+ GPU_SCOPE_LOCATION("Guest Frame", MarkersPalette::GpuMarkerColor);
new (profiler_scope) tracy::VkCtxScope{profiler_ctx, &scope_loc, current_cmdbuf, true};
}
}
diff --git a/src/video_core/texture_cache/image.cpp b/src/video_core/texture_cache/image.cpp
index 528dda55..0b725655 100644
--- a/src/video_core/texture_cache/image.cpp
+++ b/src/video_core/texture_cache/image.cpp
@@ -73,14 +73,15 @@ static vk::ImageUsageFlags ImageUsageFlags(const ImageInfo& info) {
if (!info.IsBlockCoded() && !info.IsPacked()) {
usage |= vk::ImageUsageFlagBits::eColorAttachment;
}
+
+ // In cases where an image is created as a render/depth target and cleared with compute,
+ // we cannot predict whether it will be used as a storage image. A proper solution would
+ // involve re-creating the resource with a new configuration and copying previous content
+ // into it. However, for now, we will set storage usage for all images (if the format
+ // allows), sacrificing a bit of performance. Note use of ExtendedUsage flag set by default.
+ usage |= vk::ImageUsageFlagBits::eStorage;
}
- // In cases where an image is created as a render/depth target and cleared with compute,
- // we cannot predict whether it will be used as a storage image. A proper solution would
- // involve re-creating the resource with a new configuration and copying previous content into
- // it. However, for now, we will set storage usage for all images (if the format allows),
- // sacrificing a bit of performance. Note use of ExtendedUsage flag set by default.
- usage |= vk::ImageUsageFlagBits::eStorage;
return usage;
}
diff --git a/src/video_core/texture_cache/image.h b/src/video_core/texture_cache/image.h
index 5a888346..3df8ddb7 100644
--- a/src/video_core/texture_cache/image.h
+++ b/src/video_core/texture_cache/image.h
@@ -43,9 +43,9 @@ struct UniqueImage {
UniqueImage& operator=(const UniqueImage&) = delete;
UniqueImage(UniqueImage&& other)
- : image{std::exchange(other.image, VK_NULL_HANDLE)},
- allocator{std::exchange(other.allocator, VK_NULL_HANDLE)},
- allocation{std::exchange(other.allocation, VK_NULL_HANDLE)} {}
+ : allocator{std::exchange(other.allocator, VK_NULL_HANDLE)},
+ allocation{std::exchange(other.allocation, VK_NULL_HANDLE)},
+ image{std::exchange(other.image, VK_NULL_HANDLE)} {}
UniqueImage& operator=(UniqueImage&& other) {
image = std::exchange(other.image, VK_NULL_HANDLE);
allocator = std::exchange(other.allocator, VK_NULL_HANDLE);
diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp
index 17b78a6d..a073d046 100644
--- a/src/video_core/texture_cache/image_info.cpp
+++ b/src/video_core/texture_cache/image_info.cpp
@@ -219,7 +219,12 @@ ImageInfo::ImageInfo(const AmdGpu::Image& image) noexcept {
guest_address = image.Address();
mips_layout.reserve(resources.levels);
+ tiling_idx = image.tiling_index;
+ UpdateSize();
+}
+void ImageInfo::UpdateSize() {
+ mips_layout.clear();
MipInfo mip_info{};
guest_size_bytes = 0;
for (auto mip = 0u; mip < resources.levels; ++mip) {
@@ -265,7 +270,7 @@ ImageInfo::ImageInfo(const AmdGpu::Image& image) noexcept {
ASSERT(!props.is_block);
ASSERT(num_samples == 1);
std::tie(mip_info.pitch, mip_info.size) =
- ImageSizeMacroTiled(mip_w, mip_h, bpp, num_samples, image.tiling_index);
+ ImageSizeMacroTiled(mip_w, mip_h, bpp, num_samples, tiling_idx);
break;
}
default: {
diff --git a/src/video_core/texture_cache/image_info.h b/src/video_core/texture_cache/image_info.h
index 9dad0dd6..ddad318d 100644
--- a/src/video_core/texture_cache/image_info.h
+++ b/src/video_core/texture_cache/image_info.h
@@ -29,6 +29,8 @@ struct ImageInfo {
bool IsPacked() const;
bool IsDepthStencil() const;
+ void UpdateSize();
+
struct {
VAddr cmask_addr;
VAddr fmask_addr;
@@ -69,6 +71,7 @@ struct ImageInfo {
boost::container::small_vector mips_layout;
VAddr guest_address{0};
u32 guest_size_bytes{0};
+ u32 tiling_idx{0}; // TODO: merge with existing!
};
} // namespace VideoCore
diff --git a/src/video_core/texture_cache/image_view.cpp b/src/video_core/texture_cache/image_view.cpp
index cbf77f2d..08be6bdc 100644
--- a/src/video_core/texture_cache/image_view.cpp
+++ b/src/video_core/texture_cache/image_view.cpp
@@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include "common/logging/log.h"
+#include "video_core/amdgpu/resource.h"
#include "video_core/renderer_vulkan/liverpool_to_vk.h"
#include "video_core/renderer_vulkan/vk_instance.h"
#include "video_core/texture_cache/image.h"
@@ -58,6 +59,9 @@ vk::Format TrySwizzleFormat(vk::Format format, u32 dst_sel) {
if (format == vk::Format::eR8G8B8A8Unorm && dst_sel == 0b111100101110) {
return vk::Format::eB8G8R8A8Unorm;
}
+ if (format == vk::Format::eR8G8B8A8Srgb && dst_sel == 0b111100101110) {
+ return vk::Format::eB8G8R8A8Srgb;
+ }
return format;
}
@@ -110,7 +114,7 @@ ImageViewInfo::ImageViewInfo(const AmdGpu::Liverpool::DepthBuffer& depth_buffer,
ImageView::ImageView(const Vulkan::Instance& instance, const ImageViewInfo& info_, Image& image,
ImageId image_id_, std::optional usage_override /*= {}*/)
- : info{info_}, image_id{image_id_} {
+ : image_id{image_id_}, info{info_} {
vk::ImageViewUsageCreateInfo usage_ci{};
if (usage_override) {
usage_ci.usage = usage_override.value();
diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp
index 6bc893b0..cae12422 100644
--- a/src/video_core/texture_cache/texture_cache.cpp
+++ b/src/video_core/texture_cache/texture_cache.cpp
@@ -18,11 +18,15 @@ TextureCache::TextureCache(const Vulkan::Instance& instance_, Vulkan::Scheduler&
BufferCache& buffer_cache_, PageManager& tracker_)
: instance{instance_}, scheduler{scheduler_}, buffer_cache{buffer_cache_}, tracker{tracker_},
tile_manager{instance, scheduler} {
- ImageInfo info;
+ ImageInfo info{};
info.pixel_format = vk::Format::eR8G8B8A8Unorm;
info.type = vk::ImageType::e2D;
+ info.tiling_idx = u32(AmdGpu::TilingMode::Texture_MicroTiled);
+ info.num_bits = 32;
+ info.UpdateSize();
const ImageId null_id = slot_images.insert(instance, scheduler, info);
ASSERT(null_id.index == 0);
+ slot_images[null_id].flags = ImageFlagBits{};
ImageViewInfo view_info;
void(slot_image_views.insert(instance, view_info, slot_images[null_id], null_id));
@@ -200,6 +204,7 @@ ImageView& TextureCache::FindDepthTarget(const ImageInfo& image_info,
Image& image = slot_images[image_id];
image.flags |= ImageFlagBits::GpuModified;
image.flags &= ~ImageFlagBits::CpuModified;
+ image.aspect_mask = vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil;
const auto new_layout = view_info.is_storage ? vk::ImageLayout::eDepthStencilAttachmentOptimal
: vk::ImageLayout::eDepthStencilReadOnlyOptimal;
@@ -328,7 +333,6 @@ void TextureCache::UnregisterImage(ImageId image_id) {
}
image_ids.erase(vector_it);
});
- slot_images.erase(image_id);
}
void TextureCache::TrackImage(Image& image, ImageId image_id) {
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index 137b6014..8af68424 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -28,7 +28,7 @@ class TextureCache {
using Entry = boost::container::small_vector;
static constexpr size_t AddressSpaceBits = 39;
static constexpr size_t FirstLevelBits = 9;
- static constexpr size_t PageBits = 22;
+ static constexpr size_t PageBits = 20;
};
using PageTable = MultiLevelPageTable;
@@ -124,7 +124,7 @@ private:
using FuncReturn = typename std::invoke_result::type;
static constexpr bool BOOL_BREAK = std::is_same_v;
boost::container::small_vector images;
- ForEachPage(cpu_addr, size, [this, &images, cpu_addr, size, func](u64 page) {
+ ForEachPage(cpu_addr, size, [this, &images, func](u64 page) {
const auto it = page_table.find(page);
if (it == nullptr) {
if constexpr (BOOL_BREAK) {
diff --git a/src/video_core/texture_cache/tile_manager.cpp b/src/video_core/texture_cache/tile_manager.cpp
index 6bb104a6..0bed5adc 100644
--- a/src/video_core/texture_cache/tile_manager.cpp
+++ b/src/video_core/texture_cache/tile_manager.cpp
@@ -342,12 +342,6 @@ TileManager::ScratchBuffer TileManager::AllocBuffer(u32 size, bool is_storage /*
.usage = usage,
};
-#ifdef __APPLE__
- // Fix for detiler artifacts on macOS
- const bool is_large_buffer = true;
-#else
- const bool is_large_buffer = size > 128_MB;
-#endif
VmaAllocationCreateInfo alloc_info{
.flags = !is_storage ? VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT |
VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT
@@ -462,7 +456,6 @@ std::optional TileManager::TryDetile(Image& image) {
(m > 0 ? params.sizes[m - 1] : 0);
}
- auto pitch = image.info.pitch;
cmdbuf.pushConstants(*detiler->pl_layout, vk::ShaderStageFlagBits::eCompute, 0u, sizeof(params),
¶ms);