Merge branch 'shadps4-emu:main' into main

This commit is contained in:
Richers Örs 2024-10-15 08:10:34 +02:00 committed by GitHub
commit c5391ba62e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
77 changed files with 7653 additions and 471 deletions

3
.gitmodules vendored
View File

@ -97,4 +97,5 @@
shallow = true shallow = true
[submodule "externals/discord-rpc"] [submodule "externals/discord-rpc"]
path = externals/discord-rpc path = externals/discord-rpc
url = https://github.com/shadps4-emu/ext-discord-rpc url = https://github.com/shadps4-emu/ext-discord-rpc.git
shallow = true

View File

@ -354,15 +354,25 @@ set(MISC_LIBS src/core/libraries/screenshot/screenshot.cpp
set(DEV_TOOLS src/core/devtools/layer.cpp set(DEV_TOOLS src/core/devtools/layer.cpp
src/core/devtools/layer.h src/core/devtools/layer.h
src/core/devtools/options.cpp
src/core/devtools/options.h
src/core/devtools/gcn/gcn_context_regs.cpp src/core/devtools/gcn/gcn_context_regs.cpp
src/core/devtools/gcn/gcn_op_names.cpp src/core/devtools/gcn/gcn_op_names.cpp
src/core/devtools/gcn/gcn_shader_regs.cpp src/core/devtools/gcn/gcn_shader_regs.cpp
src/core/devtools/widget/cmd_list.cpp src/core/devtools/widget/cmd_list.cpp
src/core/devtools/widget/cmd_list.h src/core/devtools/widget/cmd_list.h
src/core/devtools/widget/common.h
src/core/devtools/widget/frame_dump.cpp src/core/devtools/widget/frame_dump.cpp
src/core/devtools/widget/frame_dump.h src/core/devtools/widget/frame_dump.h
src/core/devtools/widget/frame_graph.cpp src/core/devtools/widget/frame_graph.cpp
src/core/devtools/widget/frame_graph.h src/core/devtools/widget/frame_graph.h
src/core/devtools/widget/imgui_memory_editor.h
src/core/devtools/widget/reg_popup.cpp
src/core/devtools/widget/reg_popup.h
src/core/devtools/widget/reg_view.cpp
src/core/devtools/widget/reg_view.h
src/core/devtools/widget/text_editor.cpp
src/core/devtools/widget/text_editor.h
) )
set(COMMON src/common/logging/backend.cpp set(COMMON src/common/logging/backend.cpp

View File

@ -36,14 +36,10 @@ SPDX-License-Identifier: GPL-2.0-or-later
**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). 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 verify that a game works, you can look at [**shadPS4 Game Compatibility**](https://github.com/shadps4-emu/shadps4-game-compatibility). To discuss shadPS4 development, suggest ideas or to ask for help, join our [**Discord server**](https://discord.gg/bFJxfftGW6).\
To get the latest news, go to our [**X (Twitter)**](https://x.com/shadps4) or our [**website**](https://shadps4.net/).\
To discuss shadPS4 development, suggest ideas or to ask for help, join our [**Discord server**](https://discord.gg/bFJxfftGW6).
To get the latest news, go to our [**X (Twitter)**](https://x.com/shadps4) or our [**website**](https://shadps4.net/).
For those who'd like to donate to the project, we now have a [**Kofi page**](https://ko-fi.com/shadps4)! For those who'd like to donate to the project, we now have a [**Kofi page**](https://ko-fi.com/shadps4)!
# Status # Status
@ -51,7 +47,7 @@ For those who'd like to donate to the project, we now have a [**Kofi page**](htt
> [!IMPORTANT] > [!IMPORTANT]
> shadPS4 is early in development, don't expect a flawless experience. > shadPS4 is early in development, 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 run [**Bloodborne**](https://www.youtube.com/watch?v=wC6s0avpQRE). Currently, the emulator can successfully run games like [**Bloodborne**](https://www.youtube.com/watch?v=wC6s0avpQRE), [**Dark Souls Remastered**](https://www.youtube.com/watch?v=-3PA-Xwszts), [**Red Dead Redemption**](https://www.youtube.com/watch?v=Al7yz_5nLag) and many other games.
# Why # Why
@ -123,8 +119,7 @@ Logo is done by [**Xphalnos**](https://github.com/Xphalnos)
# Contributing # Contributing
If you want to contribute, please look the [**CONTRIBUTING.md**](https://github.com/shadps4-emu/shadPS4/blob/main/CONTRIBUTING.md) file. If you want to contribute, please look the [**CONTRIBUTING.md**](https://github.com/shadps4-emu/shadPS4/blob/main/CONTRIBUTING.md) file.\
Open a PR and we'll check it :) Open a PR and we'll check it :)
# Contributors # Contributors

View File

@ -7,16 +7,16 @@ SPDX-License-Identifier: GPL-2.0-or-later
## Summary ## Summary
- [PC Requirements](#pc-requirements) - [**PC Requirements**](#minimum-pc-requirements)
- [CPU](#cpu) - [**CPU**](#cpu)
- [GPU](#gpu) - [**GPU**](#gpu)
- [RAM](#ram) - [**RAM**](#ram)
- [OS](#os) - [**OS**](#os)
- [Have the latest WIP version](#have-the-latest-wip-version) - [**Have the latest WIP version**](#how-to-run-the-latest-work-in-progress-builds-of-shadps4)
- [Install PKG files (Games and Updates)](#install-pkg-files) - [**Install PKG files (Games and Updates)**](#install-pkg-files)
- [Configure the emulator](#configure-the-emulator) - [**Configure the emulator**](#configure-the-emulator)
## PC Requirements ## Minimum PC requirements
### CPU ### CPU
@ -38,41 +38,25 @@ SPDX-License-Identifier: GPL-2.0-or-later
- Windows 10 or Ubuntu 22.04 - Windows 10 or Ubuntu 22.04
## How to run the latest Work-in-Progress builds of ShadPS4 ## How to run the latest Work-in-Progress builds of shadPS4
1. Go to <https://github.com/shadps4-emu/shadPS4/releases> In the release identified as 'pre-release' click on the down arrow(Assets), select your operating system of choice (the "**qt**" versions have a user interface, which is probably the one you want. The others are SDL versions, which can only be run via command line). 1. Go to <https://github.com/shadps4-emu/shadPS4/releases> In the release identified as 'pre-release' click on the down arrow(Assets), select your operating system of choice (the "**qt**" versions have a user interface, which is probably the one you want. The others are SDL versions, which can only be run via command line).
![image](https://github.com/user-attachments/assets/af520c77-797c-41a0-8f67-d87f5de3e3df) ![image](https://github.com/user-attachments/assets/af520c77-797c-41a0-8f67-d87f5de3e3df)
2. Once downloaded, extract to its own folder, and run ShadPS4's executable from the extracted folder. 2. Once downloaded, extract to its own folder, and run shadPS4's executable from the extracted folder.
3. Upon first launch, ShadPS4 will prompt you to select a folder to store your installed games in. Select "Browse" and then select a folder that ShadPS4 can use to install your PKG files to. 3. Upon first launch, shadPS4 will prompt you to select a folder to store your installed games in. Select "Browse" and then select a folder that shadPS4 can use to install your PKG files to.
## Install PKG files ## Install PKG files
To install PKG files (game and updates), you will need the Qt application (with UI). You will have to go to "File" then to "Install Packages (PKG)", a window will open then you will have to select the files. You can install multiple PKG files at once. Once finished, the game should appear in the application. To install PKG files (game and updates), you will need the Qt application (with UI). You will have to go to "File" then to "Install Packages (PKG)", a window will open then you will have to select the files. You can install multiple PKG files at once. Once finished, the game should appear in the application.
<img src="https://github.com/shadps4-emu/shadPS4/blob/main/documents/Quickstart/2.png" width="800"></a> <img src="https://github.com/shadps4-emu/shadPS4/blob/main/documents/Quickstart/2.png" width="800">
## Configure the emulator ## Configure the emulator
You can configure the emulator by editing the `config.toml` file found in the `user` folder created after starting the application.\ To configure the emulator, you can go through the interface and go to "settings".
Some settings may be related to more technical development and debugging. For more information on those, see [Debugging](https://github.com/shadps4-emu/shadPS4/blob/main/documents/Debugging/Debugging.md#configuration).
Here's a list of configuration entries that are worth changing: You can also configure the emulator by editing the `config.toml` file located in the `user` folder created after the application is started (Mostly useful if you are using the SDL version).
Some settings may be related to more technical development and debugging.\
- `[General]` For more information on this, see [**Debugging**](https://github.com/shadps4-emu/shadPS4/blob/main/documents/Debugging/Debugging.md#configuration).
- `Fullscreen`: Display the game in a full screen borderless window.
- `logType`: Configures logging synchronization (`sync`/`async`)
- It can be beneficial to set this to `sync` in order for the log to accurately maintain message order, at the cost of performance.
- Use when sending logs to developers. See more about [reporting issues](https://github.com/shadps4-emu/shadPS4/blob/main/documents/Debugging/Debugging.md#reporting-and-communicating-about-issues).
- `logFilter`: Sets the logging category for various logging classes.
- Format: `<class>:<level> ...`, `<class.*>:<level> <*:level> ...`
- Valid log levels: `Trace, Debug, Info, Warning, Error, Critical` - in this order, setting a level silences all levels preceding it and logs every level after it.
- Examples:
- If the log is being spammed with messages coming from Lib.Pad, you can use `Lib.Pad:Critical` to only log critical-level messages.
- If you'd like to mute everything, but still want to receive messages from Vulkan rendering: `*:Error Render.Vulkan:Info`
- `[GPU]`
- `screenWidth` and `screenHeight`: Configures the game window width and height.

View File

@ -6,7 +6,7 @@ v0.3.0 23/09/2024 - codename broamic
- New translations support (26 languages) - New translations support (26 languages)
- Support for unlocking trophies - Support for unlocking trophies
- Support for more controllers (Dualshock and Xbox) - Support for more controllers (Dualshock and Xbox)
- Many GUI imporovements - Many GUI improvements
- AVplayer - AVplayer
v0.2.0 15/08/2024 - codename validptr v0.2.0 15/08/2024 - codename validptr

2
externals/glslang vendored

@ -1 +1 @@
Subproject commit 46ef757e048e760b46601e6e77ae0cb72c97bd2f Subproject commit e61d7bb3006f451968714e2f653412081871e1ee

2
externals/toml11 vendored

@ -1 +1 @@
Subproject commit d050c6b137199666cae75c2628a75d63b49b1c22 Subproject commit f925e7f287c0008813c2294798cf9ca167fd9ffd

@ -1 +1 @@
Subproject commit 29f979ee5aa58b7b005f805ea8df7a855c39ff37 Subproject commit d91597a82f881d473887b560a03a7edf2720b72c

2
externals/xbyak vendored

@ -1 +1 @@
Subproject commit ccdf68421bc8eb85693f573080fc0a5faad862db Subproject commit d067f0d3f55696ae8bc9a25ad7012ee80f221d54

2
externals/xxhash vendored

@ -1 +1 @@
Subproject commit 3e321b4407318ac1348c0b80fb6fbae8c81ad5fa Subproject commit d4ad85e4afaad5c780f54db1dc967fff5a869ffd

2
externals/zydis vendored

@ -1 +1 @@
Subproject commit bd73bc03b0aacaa89c9c203b9b43cd08f1b1843b Subproject commit 9d298eb8067ff62a237203d1e1470785033e185c

View File

@ -1,13 +1,16 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <imgui.h>
#include "common/assert.h" #include "common/assert.h"
#include "common/native_clock.h" #include "common/native_clock.h"
#include "common/singleton.h" #include "common/singleton.h"
#include "debug_state.h" #include "debug_state.h"
#include "libraries/kernel/event_queues.h" #include "devtools/widget/common.h"
#include "libraries/kernel/time_management.h" #include "libraries/kernel/time_management.h"
#include "libraries/system/msgdialog.h" #include "libraries/system/msgdialog.h"
#include "video_core/amdgpu/pm4_cmds.h"
using namespace DebugStateType; using namespace DebugStateType;
@ -95,8 +98,68 @@ void DebugStateImpl::ResumeGuestThreads() {
} }
void DebugStateImpl::RequestFrameDump(s32 count) { void DebugStateImpl::RequestFrameDump(s32 count) {
ASSERT(!DumpingCurrentFrame());
gnm_frame_dump_request_count = count; gnm_frame_dump_request_count = count;
frame_dump_list.clear(); frame_dump_list.clear();
frame_dump_list.resize(count); frame_dump_list.resize(count);
waiting_submit_pause = true; waiting_submit_pause = true;
} }
void DebugStateImpl::PushQueueDump(QueueDump dump) {
ASSERT(DumpingCurrentFrame());
std::unique_lock lock{frame_dump_list_mutex};
auto& frame = GetFrameDump();
{ // Find draw calls
auto data = std::span{dump.data};
auto initial_data = data.data();
while (!data.empty()) {
const auto* header = reinterpret_cast<const AmdGpu::PM4Type3Header*>(data.data());
const auto type = header->type;
if (type == 2) {
data = data.subspan(1);
} else if (type != 3) {
UNREACHABLE();
}
const AmdGpu::PM4ItOpcode opcode = header->opcode;
if (Core::Devtools::Widget::IsDrawCall(opcode)) {
const auto offset =
reinterpret_cast<uintptr_t>(header) - reinterpret_cast<uintptr_t>(initial_data);
const auto addr = dump.base_addr + offset;
waiting_reg_dumps.emplace(addr, &frame);
waiting_reg_dumps_dbg.emplace(
addr,
fmt::format("#{} h({}) queue {} {} {}",
frame_dump_list.size() - gnm_frame_dump_request_count, addr,
magic_enum::enum_name(dump.type), dump.submit_num, dump.num2));
}
data = data.subspan(header->NumWords() + 1);
}
}
frame.queues.push_back(std::move(dump));
}
void DebugStateImpl::PushRegsDump(uintptr_t base_addr, uintptr_t header_addr,
const AmdGpu::Liverpool::Regs& regs) {
std::scoped_lock lock{frame_dump_list_mutex};
const auto it = waiting_reg_dumps.find(header_addr);
if (it == waiting_reg_dumps.end()) {
return;
}
auto& frame = *it->second;
waiting_reg_dumps.erase(it);
waiting_reg_dumps_dbg.erase(waiting_reg_dumps_dbg.find(header_addr));
auto& dump = frame.regs[header_addr - base_addr];
dump.regs = regs;
for (int i = 0; i < RegDump::MaxShaderStages; i++) {
if (regs.stage_enable.IsStageEnabled(i)) {
auto stage = regs.ProgramForStage(i);
if (stage->address_lo != 0) {
auto code = stage->Code();
dump.stages[i] = ShaderDump{
.user_data = *stage,
.code = std::vector<u32>{code.begin(), code.end()},
};
}
}
}
}

View File

@ -5,10 +5,14 @@
#include <atomic> #include <atomic>
#include <mutex> #include <mutex>
#include <shared_mutex>
#include <unordered_map>
#include <vector> #include <vector>
#include <queue> #include <queue>
#include "common/types.h" #include "common/types.h"
#include "video_core/amdgpu/liverpool.h"
#include "video_core/renderer_vulkan/vk_pipeline_cache.h"
#ifdef _WIN32 #ifdef _WIN32
#ifndef WIN32_LEAN_AND_MEAN #ifndef WIN32_LEAN_AND_MEAN
@ -42,10 +46,23 @@ struct QueueDump {
u32 submit_num; u32 submit_num;
u32 num2; // acb: queue_num; else: buffer_in_submit u32 num2; // acb: queue_num; else: buffer_in_submit
std::vector<u32> data; std::vector<u32> data;
uintptr_t base_addr;
};
struct ShaderDump {
Vulkan::Liverpool::ShaderProgram user_data{};
std::vector<u32> code{};
};
struct RegDump {
static constexpr size_t MaxShaderStages = 5;
Vulkan::Liverpool::Regs regs{};
std::array<ShaderDump, MaxShaderStages> stages{};
}; };
struct FrameDump { struct FrameDump {
std::vector<QueueDump> queues; std::vector<QueueDump> queues;
std::unordered_map<uintptr_t, RegDump> regs; // address -> reg dump
}; };
class DebugStateImpl { class DebugStateImpl {
@ -61,15 +78,24 @@ class DebugStateImpl {
std::atomic_int32_t gnm_frame_count = 0; std::atomic_int32_t gnm_frame_count = 0;
s32 gnm_frame_dump_request_count = -1; s32 gnm_frame_dump_request_count = -1;
std::unordered_map<size_t, FrameDump*> waiting_reg_dumps;
std::unordered_map<size_t, std::string> waiting_reg_dumps_dbg;
bool waiting_submit_pause = false; bool waiting_submit_pause = false;
bool should_show_frame_dump = false; bool should_show_frame_dump = false;
std::mutex frame_dump_list_mutex; std::shared_mutex frame_dump_list_mutex;
std::vector<FrameDump> frame_dump_list{}; std::vector<FrameDump> frame_dump_list{};
std::queue<std::string> debug_message_popup; std::queue<std::string> debug_message_popup;
public: public:
void ShowDebugMessage(std::string message) {
if (message.empty()) {
return;
}
debug_message_popup.push(std::move(message));
}
void AddCurrentThreadToGuestList(); void AddCurrentThreadToGuestList();
void RemoveCurrentThreadFromGuestList(); void RemoveCurrentThreadFromGuestList();
@ -99,6 +125,11 @@ public:
return gnm_frame_dump_request_count > 0; return gnm_frame_dump_request_count > 0;
} }
bool DumpingCurrentReg() {
std::shared_lock lock{frame_dump_list_mutex};
return !waiting_reg_dumps.empty();
}
bool ShouldPauseInSubmit() const { bool ShouldPauseInSubmit() const {
return waiting_submit_pause && gnm_frame_dump_request_count == 0; return waiting_submit_pause && gnm_frame_dump_request_count == 0;
} }
@ -109,17 +140,10 @@ public:
return frame_dump_list[frame_dump_list.size() - gnm_frame_dump_request_count]; return frame_dump_list[frame_dump_list.size() - gnm_frame_dump_request_count];
} }
void PushQueueDump(QueueDump dump) { void PushQueueDump(QueueDump dump);
std::unique_lock lock{frame_dump_list_mutex};
GetFrameDump().queues.push_back(std::move(dump));
}
void ShowDebugMessage(std::string message) { void PushRegsDump(uintptr_t base_addr, uintptr_t header_addr,
if (message.empty()) { const AmdGpu::Liverpool::Regs& regs);
return;
}
debug_message_popup.push(std::move(message));
}
}; };
} // namespace DebugStateType } // namespace DebugStateType

View File

@ -10,6 +10,7 @@
#include "imgui/imgui_std.h" #include "imgui/imgui_std.h"
#include "imgui_internal.h" #include "imgui_internal.h"
#include "layer.h" #include "layer.h"
#include "options.h"
#include "widget/frame_dump.h" #include "widget/frame_dump.h"
#include "widget/frame_graph.h" #include "widget/frame_graph.h"
@ -18,10 +19,9 @@ using namespace Core::Devtools;
using L = Core::Devtools::Layer; using L = Core::Devtools::Layer;
static bool show_simple_fps = false; static bool show_simple_fps = false;
static float fps_scale = 1.0f; static float fps_scale = 1.0f;
static bool show_advanced_debug = false; static bool show_advanced_debug = false;
static int dump_frame_count = 1; static int dump_frame_count = 1;
static Widget::FrameGraph frame_graph; static Widget::FrameGraph frame_graph;
@ -29,12 +29,16 @@ static std::vector<Widget::FrameDumpViewer> frame_viewers;
static float debug_popup_timing = 3.0f; static float debug_popup_timing = 3.0f;
static bool just_opened_options = false;
void L::DrawMenuBar() { void L::DrawMenuBar() {
const auto& ctx = *GImGui; const auto& ctx = *GImGui;
const auto& io = ctx.IO; const auto& io = ctx.IO;
auto isSystemPaused = DebugState.IsGuestThreadsPaused(); auto isSystemPaused = DebugState.IsGuestThreadsPaused();
bool open_popup_options = false;
if (BeginMainMenuBar()) { if (BeginMainMenuBar()) {
if (BeginMenu("Options")) { if (BeginMenu("Options")) {
if (MenuItemEx("Emulator Paused", nullptr, nullptr, isSystemPaused)) { if (MenuItemEx("Emulator Paused", nullptr, nullptr, isSystemPaused)) {
@ -55,6 +59,7 @@ void L::DrawMenuBar() {
} }
ImGui::EndMenu(); ImGui::EndMenu();
} }
open_popup_options = MenuItem("Options");
ImGui::EndMenu(); ImGui::EndMenu();
} }
EndMainMenuBar(); EndMainMenuBar();
@ -74,6 +79,11 @@ void L::DrawMenuBar() {
} }
} }
} }
if (open_popup_options) {
OpenPopup("GPU Tools Options");
just_opened_options = true;
}
} }
void L::DrawAdvanced() { void L::DrawAdvanced() {
@ -91,13 +101,19 @@ void L::DrawAdvanced() {
->AddText({10.0f, io.DisplaySize.y - 40.0f}, IM_COL32_WHITE, "Emulator paused"); ->AddText({10.0f, io.DisplaySize.y - 40.0f}, IM_COL32_WHITE, "Emulator paused");
} }
if (DebugState.should_show_frame_dump) { if (DebugState.should_show_frame_dump && DebugState.waiting_reg_dumps.empty()) {
DebugState.should_show_frame_dump = false; DebugState.should_show_frame_dump = false;
std::unique_lock lock{DebugState.frame_dump_list_mutex}; std::unique_lock lock{DebugState.frame_dump_list_mutex};
while (!DebugState.frame_dump_list.empty()) { while (!DebugState.frame_dump_list.empty()) {
auto frame_dump = std::move(DebugState.frame_dump_list.back()); const auto& frame_dump = DebugState.frame_dump_list.back();
DebugState.frame_dump_list.pop_back();
frame_viewers.emplace_back(frame_dump); frame_viewers.emplace_back(frame_dump);
DebugState.frame_dump_list.pop_back();
}
static bool first_time = true;
if (first_time) {
first_time = false;
DebugState.ShowDebugMessage("Tip: You can shift+click any\n"
"popup to open a new window");
} }
} }
@ -133,6 +149,30 @@ void L::DrawAdvanced() {
debug_popup_timing = 3.0f; debug_popup_timing = 3.0f;
} }
} }
bool close_popup_options = true;
if (BeginPopupModal("GPU Tools Options", &close_popup_options,
ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings)) {
static char disassembly_cli[512];
if (just_opened_options) {
just_opened_options = false;
auto s = Options.disassembly_cli.copy(disassembly_cli, sizeof(disassembly_cli) - 1);
disassembly_cli[s] = '\0';
}
InputText("Shader disassembler: ", disassembly_cli, sizeof(disassembly_cli));
if (IsItemHovered()) {
SetTooltip(R"(Command to disassemble shaders. Example "dis.exe" --raw "{src}")");
}
if (Button("Save")) {
Options.disassembly_cli = disassembly_cli;
SaveIniSettingsToDisk(io.IniFilename);
CloseCurrentPopup();
}
EndPopup();
}
} }
void L::DrawSimple() { void L::DrawSimple() {
@ -140,26 +180,54 @@ void L::DrawSimple() {
Text("Frame time: %.3f ms (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); Text("Frame time: %.3f ms (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate);
} }
static void LoadSettings(const char* line) {
int i;
float f;
if (sscanf(line, "fps_scale=%f", &f) == 1) {
fps_scale = f;
return;
}
if (sscanf(line, "show_advanced_debug=%d", &i) == 1) {
show_advanced_debug = i != 0;
return;
}
if (sscanf(line, "show_frame_graph=%d", &i) == 1) {
frame_graph.is_open = i != 0;
return;
}
if (sscanf(line, "dump_frame_count=%d", &i) == 1) {
dump_frame_count = i;
return;
}
}
void L::SetupSettings() { void L::SetupSettings() {
frame_graph.is_open = true; frame_graph.is_open = true;
using SettingLoader = void (*)(const char*);
ImGuiSettingsHandler handler{}; ImGuiSettingsHandler handler{};
handler.TypeName = "DevtoolsLayer"; handler.TypeName = "DevtoolsLayer";
handler.TypeHash = ImHashStr(handler.TypeName); handler.TypeHash = ImHashStr(handler.TypeName);
handler.ReadOpenFn = [](ImGuiContext*, ImGuiSettingsHandler*, const char* name) { handler.ReadOpenFn = [](ImGuiContext*, ImGuiSettingsHandler*, const char* name) {
return std::string_view("Data") == name ? (void*)1 : nullptr; if (std::string_view("Data") == name) {
static_assert(std::is_same_v<decltype(&LoadSettings), SettingLoader>);
return (void*)&LoadSettings;
}
if (std::string_view("CmdList") == name) {
static_assert(
std::is_same_v<decltype(&Widget::CmdListViewer::LoadConfig), SettingLoader>);
return (void*)&Widget::CmdListViewer::LoadConfig;
}
if (std::string_view("Options") == name) {
static_assert(std::is_same_v<decltype(&LoadOptionsConfig), SettingLoader>);
return (void*)&LoadOptionsConfig;
}
return (void*)nullptr;
}; };
handler.ReadLineFn = [](ImGuiContext*, ImGuiSettingsHandler*, void*, const char* line) { handler.ReadLineFn = [](ImGuiContext*, ImGuiSettingsHandler*, void* handle, const char* line) {
int v; if (handle != nullptr) {
float f; reinterpret_cast<SettingLoader>(handle)(line);
if (sscanf(line, "fps_scale=%f", &f) == 1) {
fps_scale = f;
} else if (sscanf(line, "show_advanced_debug=%d", &v) == 1) {
show_advanced_debug = v != 0;
} else if (sscanf(line, "show_frame_graph=%d", &v) == 1) {
frame_graph.is_open = v != 0;
} else if (sscanf(line, "dump_frame_count=%d", &v) == 1) {
dump_frame_count = v;
} }
}; };
handler.WriteAllFn = [](ImGuiContext*, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf) { handler.WriteAllFn = [](ImGuiContext*, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf) {
@ -169,12 +237,19 @@ void L::SetupSettings() {
buf->appendf("show_frame_graph=%d\n", frame_graph.is_open); buf->appendf("show_frame_graph=%d\n", frame_graph.is_open);
buf->appendf("dump_frame_count=%d\n", dump_frame_count); buf->appendf("dump_frame_count=%d\n", dump_frame_count);
buf->append("\n"); buf->append("\n");
buf->appendf("[%s][CmdList]\n", handler->TypeName);
Widget::CmdListViewer::SerializeConfig(buf);
buf->append("\n");
buf->appendf("[%s][Options]\n", handler->TypeName);
SerializeOptionsConfig(buf);
buf->append("\n");
}; };
AddSettingsHandler(&handler); AddSettingsHandler(&handler);
const ImGuiID dock_id = ImHashStr("FrameDumpDock"); const ImGuiID dock_id = ImHashStr("FrameDumpDock");
DockBuilderAddNode(dock_id, 0); DockBuilderAddNode(dock_id, 0);
DockBuilderSetNodePos(dock_id, ImVec2{50.0, 50.0}); DockBuilderSetNodePos(dock_id, ImVec2{450.0, 150.0});
DockBuilderSetNodeSize(dock_id, ImVec2{400.0, 500.0});
DockBuilderFinish(dock_id); DockBuilderFinish(dock_id);
} }

View File

@ -0,0 +1,24 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <imgui.h>
#include "options.h"
namespace Core::Devtools {
TOptions Options;
void LoadOptionsConfig(const char* line) {
char str[512];
if (sscanf(line, "disassembly_cli=%511[^\n]", str) == 1) {
Options.disassembly_cli = str;
return;
}
}
void SerializeOptionsConfig(ImGuiTextBuffer* buf) {
buf->appendf("disassembly_cli=%s\n", Options.disassembly_cli.c_str());
}
} // namespace Core::Devtools

View File

@ -0,0 +1,21 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <string>
struct ImGuiTextBuffer;
namespace Core::Devtools {
struct TOptions {
std::string disassembly_cli;
};
extern TOptions Options;
void LoadOptionsConfig(const char* line);
void SerializeOptionsConfig(ImGuiTextBuffer* buf);
} // namespace Core::Devtools

View File

@ -32,6 +32,26 @@ const char* GetOpCodeName(u32 op);
namespace Core::Devtools::Widget { namespace Core::Devtools::Widget {
static bool group_batches = true;
static bool show_markers = false;
void CmdListViewer::LoadConfig(const char* line) {
int i;
if (sscanf(line, "group_batches=%d", &i) == 1) {
group_batches = i != 0;
return;
}
if (sscanf(line, "show_markers=%d", &i) == 1) {
show_markers = i != 0;
return;
}
}
void CmdListViewer::SerializeConfig(ImGuiTextBuffer* buf) {
buf->appendf("group_batches=%d\n", group_batches);
buf->appendf("show_markers=%d\n", show_markers);
}
template <typename HdrType> template <typename HdrType>
static HdrType GetNext(HdrType this_pm4, uint32_t n) { static HdrType GetNext(HdrType this_pm4, uint32_t n) {
HdrType curr_pm4 = this_pm4; HdrType curr_pm4 = this_pm4;
@ -43,10 +63,11 @@ static HdrType GetNext(HdrType this_pm4, uint32_t n) {
return curr_pm4; return curr_pm4;
} }
static void ParsePolygonControl(u32 value) { void ParsePolygonControl(u32 value, bool begin_table) {
auto const reg = reinterpret_cast<AmdGpu::Liverpool::PolygonControl const&>(value); auto const reg = reinterpret_cast<AmdGpu::Liverpool::PolygonControl const&>(value);
if (BeginTable("PA_SU_SC_MODE_CNTL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { if (!begin_table ||
BeginTable("PA_SU_SC_MODE_CNTL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
TableNextRow(); TableNextRow();
TableSetColumnIndex(0); TableSetColumnIndex(0);
Text("CULL_FRONT"); Text("CULL_FRONT");
@ -126,14 +147,17 @@ static void ParsePolygonControl(u32 value) {
TableSetColumnIndex(1); TableSetColumnIndex(1);
Text("%X", reg.multi_prim_ib_ena.Value()); Text("%X", reg.multi_prim_ib_ena.Value());
if (begin_table) {
EndTable(); EndTable();
} }
}
} }
static void ParseAaConfig(u32 value) { void ParseAaConfig(u32 value, bool begin_table) {
auto const reg = reinterpret_cast<Liverpool::AaConfig const&>(value); auto const reg = reinterpret_cast<Liverpool::AaConfig const&>(value);
if (BeginTable("PA_SC_AA_CONFIG", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { if (!begin_table ||
BeginTable("PA_SC_AA_CONFIG", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
TableNextRow(); TableNextRow();
TableSetColumnIndex(0); TableSetColumnIndex(0);
Text("MSAA_NUM_SAMPLES"); Text("MSAA_NUM_SAMPLES");
@ -164,14 +188,17 @@ static void ParseAaConfig(u32 value) {
TableSetColumnIndex(1); TableSetColumnIndex(1);
Text("%X", reg.detail_to_exposed_mode.Value()); Text("%X", reg.detail_to_exposed_mode.Value());
if (begin_table) {
EndTable(); EndTable();
} }
}
} }
static void ParseViewportControl(u32 value) { void ParseViewportControl(u32 value, bool begin_table) {
auto const reg = reinterpret_cast<Liverpool::ViewportControl const&>(value); auto const reg = reinterpret_cast<Liverpool::ViewportControl const&>(value);
if (BeginTable("PA_CL_VTE_CNTL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { if (!begin_table ||
BeginTable("PA_CL_VTE_CNTL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
TableNextRow(); TableNextRow();
TableSetColumnIndex(0); TableSetColumnIndex(0);
Text("VPORT_X_SCALE_ENA"); Text("VPORT_X_SCALE_ENA");
@ -232,14 +259,17 @@ static void ParseViewportControl(u32 value) {
TableSetColumnIndex(1); TableSetColumnIndex(1);
Text("%X", reg.perfcounter_ref.Value()); Text("%X", reg.perfcounter_ref.Value());
if (begin_table) {
EndTable(); EndTable();
} }
}
} }
static void ParseColorControl(u32 value) { void ParseColorControl(u32 value, bool begin_table) {
auto const reg = reinterpret_cast<Liverpool::ColorControl const&>(value); auto const reg = reinterpret_cast<Liverpool::ColorControl const&>(value);
if (BeginTable("CB_COLOR_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { if (!begin_table ||
BeginTable("CB_COLOR_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
TableNextRow(); TableNextRow();
TableSetColumnIndex(0); TableSetColumnIndex(0);
Text("DISABLE_DUAL_QUAD__VI"); Text("DISABLE_DUAL_QUAD__VI");
@ -264,14 +294,17 @@ static void ParseColorControl(u32 value) {
TableSetColumnIndex(1); TableSetColumnIndex(1);
Text("%X", reg.rop3.Value()); Text("%X", reg.rop3.Value());
if (begin_table) {
EndTable(); EndTable();
} }
}
} }
static void ParseColor0Info(u32 value) { void ParseColor0Info(u32 value, bool begin_table) {
auto const reg = reinterpret_cast<Liverpool::ColorBuffer::Color0Info const&>(value); auto const reg = reinterpret_cast<Liverpool::ColorBuffer::Color0Info const&>(value);
if (BeginTable("CB_COLOR_INFO", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { if (!begin_table ||
BeginTable("CB_COLOR_INFO", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
TableNextRow(); TableNextRow();
TableSetColumnIndex(0); TableSetColumnIndex(0);
Text("ENDIAN"); Text("ENDIAN");
@ -380,14 +413,17 @@ static void ParseColor0Info(u32 value) {
TableSetColumnIndex(1); TableSetColumnIndex(1);
Text("%X", reg.cmask_addr_type.Value()); Text("%X", reg.cmask_addr_type.Value());
if (begin_table) {
EndTable(); EndTable();
} }
}
} }
static void ParseColor0Attrib(u32 value) { void ParseColor0Attrib(u32 value, bool begin_table) {
auto const reg = reinterpret_cast<Liverpool::ColorBuffer::Color0Attrib const&>(value); auto const reg = reinterpret_cast<Liverpool::ColorBuffer::Color0Attrib const&>(value);
if (BeginTable("CB_COLOR_ATTRIB", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { if (!begin_table ||
BeginTable("CB_COLOR_ATTRIB", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
TableNextRow(); TableNextRow();
TableSetColumnIndex(0); TableSetColumnIndex(0);
Text("TILE_MODE_INDEX"); Text("TILE_MODE_INDEX");
@ -424,14 +460,17 @@ static void ParseColor0Attrib(u32 value) {
TableSetColumnIndex(1); TableSetColumnIndex(1);
Text("%X", reg.force_dst_alpha_1.Value()); Text("%X", reg.force_dst_alpha_1.Value());
if (begin_table) {
EndTable(); EndTable();
} }
}
} }
static void ParseBlendControl(u32 value) { void ParseBlendControl(u32 value, bool begin_table) {
auto const reg = reinterpret_cast<Liverpool::BlendControl const&>(value); auto const reg = reinterpret_cast<Liverpool::BlendControl const&>(value);
if (BeginTable("CB_BLEND_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { if (!begin_table ||
BeginTable("CB_BLEND_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
TableNextRow(); TableNextRow();
TableSetColumnIndex(0); TableSetColumnIndex(0);
Text("COLOR_SRCBLEND"); Text("COLOR_SRCBLEND");
@ -490,14 +529,17 @@ static void ParseBlendControl(u32 value) {
TableSetColumnIndex(1); TableSetColumnIndex(1);
Text("%X", reg.disable_rop3.Value()); Text("%X", reg.disable_rop3.Value());
if (begin_table) {
EndTable(); EndTable();
} }
}
} }
static void ParseDepthRenderControl(u32 value) { void ParseDepthRenderControl(u32 value, bool begin_table) {
auto const reg = reinterpret_cast<Liverpool::DepthRenderControl const&>(value); auto const reg = reinterpret_cast<Liverpool::DepthRenderControl const&>(value);
if (BeginTable("DB_RENDER_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { if (!begin_table ||
BeginTable("DB_RENDER_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
TableNextRow(); TableNextRow();
TableSetColumnIndex(0); TableSetColumnIndex(0);
Text("DEPTH_CLEAR_ENABLE"); Text("DEPTH_CLEAR_ENABLE");
@ -558,14 +600,17 @@ static void ParseDepthRenderControl(u32 value) {
TableSetColumnIndex(1); TableSetColumnIndex(1);
Text("%X", reg.decompress_enable.Value()); Text("%X", reg.decompress_enable.Value());
if (begin_table) {
EndTable(); EndTable();
} }
}
} }
static void ParseDepthControl(u32 value) { void ParseDepthControl(u32 value, bool begin_table) {
auto const reg = reinterpret_cast<Liverpool::DepthControl const&>(value); auto const reg = reinterpret_cast<Liverpool::DepthControl const&>(value);
if (BeginTable("DB_DEPTH_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { if (!begin_table ||
BeginTable("DB_DEPTH_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
TableNextRow(); TableNextRow();
TableSetColumnIndex(0); TableSetColumnIndex(0);
Text("STENCIL_ENABLE"); Text("STENCIL_ENABLE");
@ -628,14 +673,17 @@ static void ParseDepthControl(u32 value) {
TableSetColumnIndex(1); TableSetColumnIndex(1);
Text("%X", reg.disable_color_writes_on_depth_pass.Value()); Text("%X", reg.disable_color_writes_on_depth_pass.Value());
if (begin_table) {
EndTable(); EndTable();
} }
}
} }
static void ParseEqaa(u32 value) { void ParseEqaa(u32 value, bool begin_table) {
auto const reg = reinterpret_cast<Liverpool::Eqaa const&>(value); auto const reg = reinterpret_cast<Liverpool::Eqaa const&>(value);
if (BeginTable("DB_DEPTH_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { if (!begin_table ||
BeginTable("DB_DEPTH_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
TableNextRow(); TableNextRow();
TableSetColumnIndex(0); TableSetColumnIndex(0);
Text("MAX_ANCHOR_SAMPLES"); Text("MAX_ANCHOR_SAMPLES");
@ -708,14 +756,17 @@ static void ParseEqaa(u32 value) {
TableSetColumnIndex(1); TableSetColumnIndex(1);
Text("%X", reg.enable_postz_overrasterization.Value()); Text("%X", reg.enable_postz_overrasterization.Value());
if (begin_table) {
EndTable(); EndTable();
} }
}
} }
static void ParseZInfo(u32 value) { void ParseZInfo(u32 value, bool begin_table) {
auto const reg = reinterpret_cast<Liverpool::DepthBuffer::ZInfo const&>(value); auto const reg = reinterpret_cast<Liverpool::DepthBuffer::ZInfo const&>(value);
if (BeginTable("DB_DEPTH_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { if (!begin_table ||
BeginTable("DB_DEPTH_CONTROL", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
TableNextRow(); TableNextRow();
TableSetColumnIndex(0); TableSetColumnIndex(0);
Text("FORMAT"); Text("FORMAT");
@ -776,40 +827,41 @@ static void ParseZInfo(u32 value) {
TableSetColumnIndex(1); TableSetColumnIndex(1);
Text("%X", reg.zrange_precision.Value()); Text("%X", reg.zrange_precision.Value());
if (begin_table) {
EndTable(); EndTable();
} }
}
} }
void CmdListViewer::OnNop(AmdGpu::PM4Type3Header const* header, u32 const* body) { void CmdListViewer::OnNop(AmdGpu::PM4Type3Header const* header, u32 const* body) {
using namespace std::string_view_literals; using namespace std::string_view_literals;
enum class NOP_PAYLOAD : u32 { #define NOP_PAYLOAD \
ACB_SUBMIT_MRK = 0x68750013, P(PUSH_MARKER, 0x68750001) \
ALLOC_ALIGN8 = 0x68753000, P(POP_MARKER, 0x68750002) \
PUSH_MARKER = 0x68750001, P(SET_MARKER, 0x68750003) \
SET_VSHARP = 0x68750004, P(SET_VSHARP, 0x68750004) \
SET_TSHARP = 0x68750005, P(SET_TSHARP, 0x68750005) \
SET_SSHARP = 0x68750006, P(SET_SSHARP, 0x68750006) \
SET_USER_DATA = 0x6875000d, P(ACB_SUBMIT_MRK, 0x68750013) \
}; P(SET_USER_DATA, 0x6875000D) \
auto get_noppayload_text = [](NOP_PAYLOAD const nop_payload) { P(PATCHED_FLIP, 0x68750776) \
P(PREPARE_FLIP, 0x68750777) \
P(PREPARE_FLIP_LABEL, 0x68750778) \
P(PREPARE_FLIP_INTERRUPT, 0x68750780) \
P(PREPARE_FLIP_INTERRUPT_LABEL, 0x68750781) \
P(ALLOC_ALIGN8, 0x68753000)
auto get_nop_payload_text = [](u32 const nop_payload) {
switch (nop_payload) { switch (nop_payload) {
case NOP_PAYLOAD::ACB_SUBMIT_MRK: #define P(name, value) \
return "ACB_SUBMIT_MRK"sv; case value: \
case NOP_PAYLOAD::ALLOC_ALIGN8: return #name##sv;
return "ALLOC_ALIGN8"sv; NOP_PAYLOAD
case NOP_PAYLOAD::PUSH_MARKER: #undef P
return "PUSH_MARKER"sv; default:
case NOP_PAYLOAD::SET_VSHARP:
return "SET_VSHARP"sv;
case NOP_PAYLOAD::SET_TSHARP:
return "SET_TSHARP"sv;
case NOP_PAYLOAD::SET_SSHARP:
return "SET_SSHARP"sv;
case NOP_PAYLOAD::SET_USER_DATA:
return "SET_USER_DATA"sv;
}
return ""sv; return ""sv;
}
}; };
Separator(); Separator();
@ -822,7 +874,7 @@ void CmdListViewer::OnNop(AmdGpu::PM4Type3Header const* header, u32 const* body)
for (unsigned i = 0; i < pkt->header.count + 1; ++i) { for (unsigned i = 0; i < pkt->header.count + 1; ++i) {
Text("%02X: %08X", i, payload[i]); Text("%02X: %08X", i, payload[i]);
if ((payload[i] & 0xffff0000) == 0x68750000) { if ((payload[i] & 0xffff0000) == 0x68750000) {
const auto& e = get_noppayload_text((NOP_PAYLOAD)payload[i]); const auto& e = get_nop_payload_text(payload[i]);
if (!e.empty()) { if (!e.empty()) {
SameLine(); SameLine();
Text("(%s)", e.data()); Text("(%s)", e.data());
@ -836,7 +888,7 @@ void CmdListViewer::OnSetBase(AmdGpu::PM4Type3Header const* header, u32 const* b
Separator(); Separator();
BeginGroup(); BeginGroup();
auto const* pkt = reinterpret_cast<AmdGpu::PM4CmdSetBase const*>(header); // auto const* pkt = reinterpret_cast<AmdGpu::PM4CmdSetBase const*>(header);
Text("BASE_INDEX: %08X", body[0]); Text("BASE_INDEX: %08X", body[0]);
Text("ADDRESS0 : %08X", body[1]); Text("ADDRESS0 : %08X", body[1]);
Text("ADDRESS1 : %08X", body[2]); Text("ADDRESS1 : %08X", body[2]);
@ -1025,20 +1077,31 @@ void CmdListViewer::OnDispatch(AmdGpu::PM4Type3Header const* header, u32 const*
EndGroup(); EndGroup();
} }
CmdListViewer::CmdListViewer(FrameDumpViewer* parent, const std::vector<u32>& cmd_list) CmdListViewer::CmdListViewer(DebugStateType::FrameDump* _frame_dump,
: parent(parent) { const std::vector<u32>& cmd_list, uintptr_t _base_addr,
std::string _name)
: frame_dump(_frame_dump), base_addr(_base_addr), name(std::move(_name)) {
using namespace AmdGpu; using namespace AmdGpu;
cmdb_addr = (uintptr_t)cmd_list.data(); cmdb_addr = (uintptr_t)cmd_list.data();
cmdb_size = cmd_list.size() * sizeof(u32); cmdb_size = cmd_list.size() * sizeof(u32);
cmdb_view_name = fmt::format("[GFX] Command buffer {}###cmdview_hex_{}", this->name, cmdb_addr);
cmdb_view.Open = false;
cmdb_view.ReadOnly = true;
auto const* pm4_hdr = reinterpret_cast<PM4Header const*>(cmdb_addr); auto const* pm4_hdr = reinterpret_cast<PM4Header const*>(cmdb_addr);
size_t processed_size = 0; size_t processed_size = 0;
size_t prev_offset = 0; size_t prev_offset = 0;
u32 batch_id = 0;
std::string marker{}; std::string marker{};
if (cmdb_size > 0) {
events.emplace_back(BatchBegin{.id = 0});
}
while (processed_size < cmdb_size) { while (processed_size < cmdb_size) {
auto* next_pm4_hdr = GetNext(pm4_hdr, 1); auto* next_pm4_hdr = GetNext(pm4_hdr, 1);
auto processed_len = auto processed_len =
@ -1048,22 +1111,28 @@ CmdListViewer::CmdListViewer(FrameDumpViewer* parent, const std::vector<u32>& cm
if (pm4_hdr->type == PM4Type3Header::TYPE) { if (pm4_hdr->type == PM4Type3Header::TYPE) {
auto const* pm4_t3 = reinterpret_cast<PM4Type3Header const*>(pm4_hdr); auto const* pm4_t3 = reinterpret_cast<PM4Type3Header const*>(pm4_hdr);
auto opcode = pm4_t3->opcode;
if (pm4_t3->opcode == PM4ItOpcode::Nop) { if (opcode == PM4ItOpcode::Nop) {
auto const* it_body = reinterpret_cast<uint32_t const*>(pm4_hdr + 1); auto const* it_body = reinterpret_cast<uint32_t const*>(pm4_hdr + 1);
if (it_body[0] == 0x68750001) { switch (it_body[0]) {
case PM4CmdNop::PayloadType::DebugSetMarker:
marker = std::string{(char*)&it_body[1]}; marker = std::string{(char*)&it_body[1]};
break;
case PM4CmdNop::PayloadType::DebugMarkerPush:
events.emplace_back(PushMarker{
.name = std::string{(char*)&it_body[1]},
});
break;
case PM4CmdNop::PayloadType::DebugMarkerPop:
events.emplace_back(PopMarker{});
break;
default:
break;
} }
} }
if (pm4_t3->opcode == PM4ItOpcode::DispatchDirect || if (IsDrawCall(opcode)) {
pm4_t3->opcode == PM4ItOpcode::DispatchIndirect ||
pm4_t3->opcode == PM4ItOpcode::DrawIndex2 ||
pm4_t3->opcode == PM4ItOpcode::DrawIndexAuto ||
pm4_t3->opcode == PM4ItOpcode::DrawIndexOffset2 ||
pm4_t3->opcode == PM4ItOpcode::DrawIndexIndirect
// ...
) {
// All these commands are terminated by NOP at the end, so // All these commands are terminated by NOP at the end, so
// it is safe to skip it to be even with CP // it is safe to skip it to be even with CP
// next_pm4_hdr = get_next(next_pm4_hdr, 1); // next_pm4_hdr = get_next(next_pm4_hdr, 1);
@ -1071,15 +1140,17 @@ CmdListViewer::CmdListViewer(FrameDumpViewer* parent, const std::vector<u32>& cm
// processed_len += nop_len; // processed_len += nop_len;
// processed_size += nop_len; // processed_size += nop_len;
batches.emplace_back(BatchInfo{ events.emplace_back(BatchInfo{
marker, .id = batch_id++,
prev_offset, .marker = marker,
processed_size, .start_addr = prev_offset,
processed_size - processed_len, .end_addr = processed_size,
pm4_t3->opcode, .command_addr = processed_size - processed_len,
.type = opcode,
}); });
prev_offset = processed_size; prev_offset = processed_size;
marker.clear(); marker.clear();
events.emplace_back(BatchBegin{.id = batch_id});
} }
} }
@ -1088,18 +1159,58 @@ CmdListViewer::CmdListViewer(FrameDumpViewer* parent, const std::vector<u32>& cm
// state batch (last) // state batch (last)
if (processed_size - prev_offset > 0) { if (processed_size - prev_offset > 0) {
batches.emplace_back(BatchInfo{ events.emplace_back(BatchInfo{
marker, .id = batch_id++,
prev_offset, .marker = marker,
processed_size, .start_addr = prev_offset,
0, .end_addr = processed_size,
static_cast<PM4ItOpcode>(0xFF), .command_addr = 0,
.type = static_cast<PM4ItOpcode>(0xFF),
}); });
} }
if (!events.empty() && std::holds_alternative<BatchBegin>(events.back())) {
events.pop_back();
}
} }
void CmdListViewer::Draw() { void CmdListViewer::Draw() {
const auto& ctx = *GetCurrentContext();
if (batch_view.open) {
batch_view.Draw();
}
for (auto it = extra_batch_view.begin(); it != extra_batch_view.end();) {
if (!it->open) {
it = extra_batch_view.erase(it);
continue;
}
it->Draw();
++it;
}
if (cmdb_view.Open) {
MemoryEditor::Sizes s;
cmdb_view.CalcSizes(s, cmdb_size, cmdb_addr);
SetNextWindowSize({s.WindowWidth, s.WindowWidth * 0.6f}, ImGuiCond_FirstUseEver);
SetNextWindowSizeConstraints({0.0f}, {s.WindowWidth, FLT_MAX});
if (Begin(cmdb_view_name.c_str(), &cmdb_view.Open,
ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings)) {
cmdb_view.DrawContents((void*)cmdb_addr, cmdb_size, base_addr);
if (cmdb_view.ContentsWidthChanged) {
cmdb_view.CalcSizes(s, cmdb_size, cmdb_addr);
SetWindowSize({s.WindowWidth, s.WindowWidth * 0.6f});
}
}
End();
}
PushID(name.c_str());
if (BeginChild("cmd_queue", {})) { if (BeginChild("cmd_queue", {})) {
Checkbox("Group batches", &group_batches);
SameLine();
Checkbox("Show markers", &show_markers);
char queue_name[32]{}; char queue_name[32]{};
if (vqid < 254) { if (vqid < 254) {
std::snprintf(queue_name, sizeof(queue_name), "%s %d", vqid > 254 ? "GFX" : "ASC", std::snprintf(queue_name, sizeof(queue_name), "%s %d", vqid > 254 ? "GFX" : "ASC",
@ -1111,28 +1222,121 @@ void CmdListViewer::Draw() {
Text("queue : %s", queue_name); Text("queue : %s", queue_name);
Text("base addr: %08llX", cmdb_addr); Text("base addr: %08llX", cmdb_addr);
SameLine(); SameLine();
if (SmallButton(">")) { if (SmallButton("Memory >")) {
parent->cmdb_view.Open ^= true; cmdb_view.Open ^= true;
} }
Text("size : %04llX", cmdb_size); Text("size : %04llX", cmdb_size);
Separator(); Separator();
char batch_hdr[128]; if (TreeNode("Batches")) {
for (int batch_id = 0; batch_id < batches.size(); ++batch_id) { int tree_depth = 0;
auto processed_size = 0ull; int tree_depth_show = 0;
auto const* pm4_hdr =
reinterpret_cast<PM4Header const*>(cmdb_addr + batches[batch_id].start_addr);
sprintf(batch_hdr, "%08llX: batch-%03d | %s", cmdb_addr + batches[batch_id].start_addr, u32 last_batch_id = ~0u;
batch_id, batches[batch_id].marker.c_str()); if (!events.empty() && std::holds_alternative<BatchInfo>(events.back())) {
last_batch_id = std::get<BatchInfo>(events.back()).id;
if (batch_id == batch_bp) { // highlight batch at breakpoint
PushStyleColor(ImGuiCol_Header, ImVec4{1.0f, 0.5f, 0.5f, 0.5f});
} }
if (batches[batch_id].type == static_cast<AmdGpu::PM4ItOpcode>(0xFF) || u32 batch_id = ~0u;
CollapsingHeader(batch_hdr)) { u32 current_highlight_batch = ~0u;
auto const batch_sz = batches[batch_id].end_addr - batches[batch_id].start_addr;
int id = 0;
PushID(0);
for (const auto& event : events) {
PopID();
PushID(id++);
if (std::holds_alternative<BatchBegin>(event)) {
batch_id = std::get<BatchBegin>(event).id;
}
if (show_markers) {
if (std::holds_alternative<PushMarker>(event)) {
if (tree_depth_show >= tree_depth) {
auto& marker = std::get<PushMarker>(event);
bool show = TreeNode(&event, "%s", marker.name.c_str());
if (show) {
tree_depth_show++;
}
}
tree_depth++;
continue;
}
if (std::holds_alternative<PopMarker>(event)) {
if (tree_depth_show >= tree_depth) {
tree_depth_show--;
TreePop();
}
tree_depth--;
continue;
}
if (tree_depth_show < tree_depth) {
continue;
}
}
if (!std::holds_alternative<BatchInfo>(event)) {
continue;
}
auto& batch = std::get<BatchInfo>(event);
auto const* pm4_hdr =
reinterpret_cast<PM4Header const*>(cmdb_addr + batch.start_addr);
char batch_hdr[128];
if (batch.type == static_cast<AmdGpu::PM4ItOpcode>(0xFF)) {
snprintf(batch_hdr, sizeof(batch_hdr), "State batch");
} else if (!batch.marker.empty()) {
snprintf(batch_hdr, sizeof(batch_hdr), "%08llX: batch-%03d %s | %s",
cmdb_addr + batch.start_addr, batch.id,
Gcn::GetOpCodeName(static_cast<u32>(batch.type)),
batch.marker.c_str());
} else {
snprintf(batch_hdr, sizeof(batch_hdr), "%08llX: batch-%03d %s",
cmdb_addr + batch.start_addr, batch.id,
Gcn::GetOpCodeName(static_cast<u32>(batch.type)));
}
if (batch.id == batch_bp) { // highlight batch at breakpoint
PushStyleColor(ImGuiCol_Header, ImVec4{1.0f, 0.5f, 0.5f, 0.5f});
}
if (batch.id == highlight_batch) {
PushStyleColor(ImGuiCol_Text, ImVec4{1.0f, 0.7f, 0.7f, 1.0f});
}
const auto open_batch_view = [&, this] {
if (frame_dump->regs.contains(batch.command_addr)) {
auto data = frame_dump->regs.at(batch.command_addr);
if (GetIO().KeyShift) {
auto& pop = extra_batch_view.emplace_back();
pop.SetData(data, batch_id);
pop.open = true;
} else {
batch_view.SetData(data, batch_id);
batch_view.open = true;
}
}
};
bool show_batch_content = true;
if (group_batches) {
show_batch_content =
CollapsingHeader(batch_hdr, ImGuiTreeNodeFlags_AllowOverlap);
SameLine(GetContentRegionAvail().x - 40.0f);
if (Button("->", {40.0f, 0.0f})) {
open_batch_view();
}
}
if (show_batch_content) {
auto processed_size = 0ull;
auto bb = ctx.LastItemData.Rect;
if (group_batches) {
Indent();
}
auto const batch_sz = batch.end_addr - batch.start_addr;
while (processed_size < batch_sz) { while (processed_size < batch_sz) {
AmdGpu::PM4ItOpcode op{0xFFu}; AmdGpu::PM4ItOpcode op{0xFFu};
@ -1141,25 +1345,39 @@ void CmdListViewer::Draw() {
reinterpret_cast<AmdGpu::PM4Type3Header const*>(pm4_hdr); reinterpret_cast<AmdGpu::PM4Type3Header const*>(pm4_hdr);
op = pm4_t3->opcode; op = pm4_t3->opcode;
static char header_name[128]; char header_name[128];
sprintf(header_name, "%08llX: %s", sprintf(header_name, "%08llX: %s",
cmdb_addr + batches[batch_id].start_addr + processed_size, cmdb_addr + batch.start_addr + processed_size,
Gcn::GetOpCodeName((u32)op)); Gcn::GetOpCodeName((u32)op));
if (TreeNode(header_name)) { bool open_pm4 = TreeNode(header_name);
bool just_opened = IsItemToggledOpen(); if (!group_batches) {
if (BeginTable("split", 1)) { if (IsDrawCall(op)) {
TableNextColumn(); SameLine(GetContentRegionAvail().x - 40.0f);
Text("size: %d", pm4_hdr->count + 1); if (Button("->", {40.0f, 0.0f})) {
open_batch_view();
if (just_opened) { }
}
if (IsItemHovered() && ctx.IO.KeyShift) {
if (BeginTooltip()) {
Text("Batch %d", batch_id);
EndTooltip();
}
}
}
if (open_pm4) {
if (IsItemToggledOpen()) {
// Editor // Editor
parent->cmdb_view.GotoAddrAndHighlight( cmdb_view.GotoAddrAndHighlight(
reinterpret_cast<size_t>(pm4_hdr) - cmdb_addr, reinterpret_cast<size_t>(pm4_hdr) - cmdb_addr,
reinterpret_cast<size_t>(pm4_hdr) - cmdb_addr + reinterpret_cast<size_t>(pm4_hdr) - cmdb_addr +
(pm4_hdr->count + 2) * 4); (pm4_hdr->count + 2) * 4);
} }
if (BeginTable("split", 1)) {
TableNextColumn();
Text("size: %d", pm4_hdr->count + 1);
auto const* it_body = auto const* it_body =
reinterpret_cast<uint32_t const*>(pm4_hdr + 1); reinterpret_cast<uint32_t const*>(pm4_hdr + 1);
@ -1196,6 +1414,7 @@ void CmdListViewer::Draw() {
} }
TreePop(); TreePop();
} }
} else { } else {
Text("<UNK PACKET>"); Text("<UNK PACKET>");
} }
@ -1206,18 +1425,37 @@ void CmdListViewer::Draw() {
pm4_hdr = next_pm4_hdr; pm4_hdr = next_pm4_hdr;
processed_size += processed_len; processed_size += processed_len;
} }
if (group_batches) {
Unindent();
};
bb = {{0.0f, bb.Max.y}, ctx.LastItemData.Rect.Max};
if (bb.Contains(ctx.IO.MousePos)) {
current_highlight_batch = batch.id;
}
} }
if (batch_id == batch_bp) { if (batch.id == highlight_batch) {
PopStyleColor(); PopStyleColor();
} }
if (batch_id == batches.size() - 2) { if (batch.id == batch_bp) {
PopStyleColor();
}
if (batch.id == last_batch_id) {
Separator(); Separator();
} }
} }
PopID();
highlight_batch = current_highlight_batch;
TreePop();
}
} }
EndChild(); EndChild();
PopID();
} }
} // namespace Core::Devtools::Widget } // namespace Core::Devtools::Widget

View File

@ -5,10 +5,14 @@
#pragma once #pragma once
#include <memory>
#include <vector> #include <vector>
#include <imgui.h>
#include "common.h"
#include "common/types.h" #include "common/types.h"
#include "video_core/buffer_cache/buffer_cache.h" #include "imgui_memory_editor.h"
#include "reg_view.h"
namespace AmdGpu { namespace AmdGpu {
union PM4Type3Header; union PM4Type3Header;
@ -19,43 +23,50 @@ namespace Core::Devtools::Widget {
class FrameDumpViewer; class FrameDumpViewer;
class CmdListViewer { void ParsePolygonControl(u32 value, bool begin_table = true);
/* void ParseAaConfig(u32 value, bool begin_table = true);
* Generic PM4 header void ParseViewportControl(u32 value, bool begin_table = true);
*/ void ParseColorControl(u32 value, bool begin_table = true);
union PM4Header { void ParseColor0Info(u32 value, bool begin_table = true);
struct { void ParseColor0Attrib(u32 value, bool begin_table = true);
u32 reserved : 16; void ParseBlendControl(u32 value, bool begin_table = true);
u32 count : 14; void ParseDepthRenderControl(u32 value, bool begin_table = true);
u32 type : 2; // PM4_TYPE void ParseDepthControl(u32 value, bool begin_table = true);
}; void ParseEqaa(u32 value, bool begin_table = true);
u32 u32All; void ParseZInfo(u32 value, bool begin_table = true);
};
struct BatchInfo {
std::string marker{};
size_t start_addr;
size_t end_addr;
size_t command_addr;
AmdGpu::PM4ItOpcode type;
bool bypass{false};
};
FrameDumpViewer* parent; class CmdListViewer {
std::vector<BatchInfo> batches{};
DebugStateType::FrameDump* frame_dump;
uintptr_t base_addr;
std::string name;
std::vector<GPUEvent> events{};
uintptr_t cmdb_addr; uintptr_t cmdb_addr;
size_t cmdb_size; size_t cmdb_size;
std::string cmdb_view_name;
MemoryEditor cmdb_view;
int batch_bp{-1}; int batch_bp{-1};
int vqid{255}; int vqid{255};
u32 highlight_batch{~0u};
void OnNop(AmdGpu::PM4Type3Header const* header, u32 const* body); RegView batch_view;
void OnSetBase(AmdGpu::PM4Type3Header const* header, u32 const* body); std::vector<RegView> extra_batch_view;
void OnSetContextReg(AmdGpu::PM4Type3Header const* header, u32 const* body);
void OnSetShReg(AmdGpu::PM4Type3Header const* header, u32 const* body); static void OnNop(AmdGpu::PM4Type3Header const* header, u32 const* body);
void OnDispatch(AmdGpu::PM4Type3Header const* header, u32 const* body); static void OnSetBase(AmdGpu::PM4Type3Header const* header, u32 const* body);
static void OnSetContextReg(AmdGpu::PM4Type3Header const* header, u32 const* body);
static void OnSetShReg(AmdGpu::PM4Type3Header const* header, u32 const* body);
static void OnDispatch(AmdGpu::PM4Type3Header const* header, u32 const* body);
public: public:
explicit CmdListViewer(FrameDumpViewer* parent, const std::vector<u32>& cmd_list); static void LoadConfig(const char* line);
static void SerializeConfig(ImGuiTextBuffer* buf);
explicit CmdListViewer(DebugStateType::FrameDump* frame_dump, const std::vector<u32>& cmd_list,
uintptr_t base_addr = 0, std::string name = "");
void Draw(); void Draw();
}; };

View File

@ -0,0 +1,100 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <string>
#include <variant>
#include <magic_enum.hpp>
#include "common/types.h"
#include "video_core/amdgpu/pm4_opcodes.h"
namespace Core::Devtools::Widget {
/*
* Generic PM4 header
*/
union PM4Header {
struct {
u32 reserved : 16;
u32 count : 14;
u32 type : 2; // PM4_TYPE
};
u32 u32All;
};
struct PushMarker {
std::string name{};
};
struct PopMarker {};
struct BatchBegin {
u32 id;
};
struct BatchInfo {
u32 id;
std::string marker{};
size_t start_addr;
size_t end_addr;
size_t command_addr;
AmdGpu::PM4ItOpcode type;
bool bypass{false};
};
using GPUEvent = std::variant<PushMarker, PopMarker, BatchBegin, BatchInfo>;
template <typename... Args>
void DrawRow(const char* text, const char* fmt, Args... args) {
ImGui::TableNextColumn();
ImGui::TextUnformatted(text);
ImGui::TableNextColumn();
char buf[128];
snprintf(buf, sizeof(buf), fmt, args...);
ImGui::TextUnformatted(buf);
}
template <typename T, typename V = u32>
void DrawEnumRow(const char* text, T value) {
DrawRow(text, "%X (%s)", V(value), magic_enum::enum_name(value).data());
}
template <typename V, typename... Extra>
void DrawMultipleRow(const char* text, const char* fmt, V arg, Extra&&... extra_args) {
DrawRow(text, fmt, arg);
if constexpr (sizeof...(extra_args) > 0) {
DrawMultipleRow(std::forward<Extra>(extra_args)...);
}
}
template <typename... Args>
static void DoTooltip(const char* str_id, Args&&... args) {
if (ImGui::BeginTooltip()) {
if (ImGui::BeginTable(str_id, 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
DrawMultipleRow(std::forward<Args>(args)...);
ImGui::EndTable();
}
ImGui::EndTooltip();
}
}
static bool IsDrawCall(AmdGpu::PM4ItOpcode opcode) {
using AmdGpu::PM4ItOpcode;
switch (opcode) {
case PM4ItOpcode::DrawIndex2:
case PM4ItOpcode::DrawIndexOffset2:
case PM4ItOpcode::DrawIndexAuto:
case PM4ItOpcode::DrawIndirect:
case PM4ItOpcode::DrawIndexIndirect:
case PM4ItOpcode::DispatchDirect:
case PM4ItOpcode::DispatchIndirect:
return true;
default:
return false;
}
}
} // namespace Core::Devtools::Widget

View File

@ -36,7 +36,8 @@ static std::array<char, 3> small_int_to_str(const s32 i) {
namespace Core::Devtools::Widget { namespace Core::Devtools::Widget {
FrameDumpViewer::FrameDumpViewer(FrameDump _frame_dump) : frame_dump(std::move(_frame_dump)) { FrameDumpViewer::FrameDumpViewer(const FrameDump& _frame_dump)
: frame_dump(std::make_shared<FrameDump>(_frame_dump)) {
static int unique_id = 0; static int unique_id = 0;
id = unique_id++; id = unique_id++;
@ -44,20 +45,19 @@ FrameDumpViewer::FrameDumpViewer(FrameDump _frame_dump) : frame_dump(std::move(_
selected_submit_num = 0; selected_submit_num = 0;
selected_queue_num2 = 0; selected_queue_num2 = 0;
cmd_list_viewer.reserve(frame_dump.queues.size()); cmd_list_viewer.reserve(frame_dump->queues.size());
for (const auto& cmd : frame_dump.queues) { for (const auto& cmd : frame_dump->queues) {
cmd_list_viewer.emplace_back(this, cmd.data); const auto fname =
if (cmd.type == QueueType::dcb && cmd.submit_num == selected_submit_num && fmt::format("{}_{}_{:02}_{:02}", id, magic_enum::enum_name(selected_queue_type),
cmd.num2 == selected_queue_num2) { selected_submit_num, selected_queue_num2);
selected_cmd = cmd_list_viewer.size() - 1; cmd_list_viewer.emplace_back(frame_dump.get(), cmd.data, cmd.base_addr, fname);
if (cmd.type == QueueType::dcb && cmd.submit_num == 0 && cmd.num2 == 0) {
selected_cmd = static_cast<s32>(cmd_list_viewer.size() - 1);
} }
} }
cmdb_view.Open = false;
cmdb_view.ReadOnly = true;
} }
FrameDumpViewer::~FrameDumpViewer() {} FrameDumpViewer::~FrameDumpViewer() = default;
void FrameDumpViewer::Draw() { void FrameDumpViewer::Draw() {
if (!is_open) { if (!is_open) {
@ -66,11 +66,11 @@ void FrameDumpViewer::Draw() {
char name[32]; char name[32];
snprintf(name, sizeof(name), "Frame #%d dump", id); snprintf(name, sizeof(name), "Frame #%d dump", id);
static ImGuiID dock_id = ImHashStr("FrameDumpDock");
SetNextWindowDockID(dock_id, ImGuiCond_Appearing);
if (Begin(name, &is_open, ImGuiWindowFlags_NoSavedSettings)) { if (Begin(name, &is_open, ImGuiWindowFlags_NoSavedSettings)) {
if (IsWindowAppearing()) { if (IsWindowAppearing()) {
auto window = GetCurrentWindow(); auto window = GetCurrentWindow();
static ImGuiID dock_id = ImHashStr("FrameDumpDock");
SetWindowDock(window, dock_id, ImGuiCond_Once | ImGuiCond_FirstUseEver);
SetWindowSize(window, ImVec2{470.0f, 600.0f}); SetWindowSize(window, ImVec2{470.0f, 600.0f});
} }
BeginGroup(); BeginGroup();
@ -89,12 +89,30 @@ void FrameDumpViewer::Draw() {
EndCombo(); EndCombo();
} }
SameLine(); SameLine();
BeginDisabled(selected_cmd == -1);
if (SmallButton("Dump cmd")) {
auto now_time = fmt::localtime(std::time(nullptr));
const auto fname = fmt::format("{:%F %H-%M-%S} {}_{}_{}.bin", now_time,
magic_enum::enum_name(selected_queue_type),
selected_submit_num, selected_queue_num2);
Common::FS::IOFile file(fname, Common::FS::FileAccessMode::Write);
const auto& data = frame_dump->queues[selected_cmd].data;
if (file.IsOpen()) {
DebugState.ShowDebugMessage(fmt::format("Dumping cmd as {}", fname));
file.Write(data);
} else {
DebugState.ShowDebugMessage(fmt::format("Failed to save {}", fname));
LOG_ERROR(Core, "Failed to open file {}", fname);
}
}
EndDisabled();
TextEx("Submit num"); TextEx("Submit num");
SameLine(); SameLine();
if (BeginCombo("##select_submit_num", small_int_to_str(selected_submit_num).data(), if (BeginCombo("##select_submit_num", small_int_to_str(selected_submit_num).data(),
ImGuiComboFlags_WidthFitPreview)) { ImGuiComboFlags_WidthFitPreview)) {
std::array<bool, 32> available_submits{}; std::array<bool, 32> available_submits{};
for (const auto& cmd : frame_dump.queues) { for (const auto& cmd : frame_dump->queues) {
if (cmd.type == selected_queue_type) { if (cmd.type == selected_queue_type) {
available_submits[cmd.submit_num] = true; available_submits[cmd.submit_num] = true;
} }
@ -119,7 +137,7 @@ void FrameDumpViewer::Draw() {
if (BeginCombo("##select_queue_num2", small_int_to_str(selected_queue_num2).data(), if (BeginCombo("##select_queue_num2", small_int_to_str(selected_queue_num2).data(),
ImGuiComboFlags_WidthFitPreview)) { ImGuiComboFlags_WidthFitPreview)) {
std::array<bool, 32> available_queues{}; std::array<bool, 32> available_queues{};
for (const auto& cmd : frame_dump.queues) { for (const auto& cmd : frame_dump->queues) {
if (cmd.type == selected_queue_type && cmd.submit_num == selected_submit_num) { if (cmd.type == selected_queue_type && cmd.submit_num == selected_submit_num) {
available_queues[cmd.num2] = true; available_queues[cmd.num2] = true;
} }
@ -134,34 +152,16 @@ void FrameDumpViewer::Draw() {
} }
} }
if (selected) { if (selected) {
const auto it = std::ranges::find_if(frame_dump.queues, [&](const auto& cmd) { const auto it = std::ranges::find_if(frame_dump->queues, [&](const auto& cmd) {
return cmd.type == selected_queue_type && return cmd.type == selected_queue_type &&
cmd.submit_num == selected_submit_num && cmd.num2 == selected_queue_num2; cmd.submit_num == selected_submit_num && cmd.num2 == selected_queue_num2;
}); });
if (it != frame_dump.queues.end()) { if (it != frame_dump->queues.end()) {
selected_cmd = std::distance(frame_dump.queues.begin(), it); selected_cmd = static_cast<s32>(std::distance(frame_dump->queues.begin(), it));
} }
} }
EndCombo(); EndCombo();
} }
SameLine();
BeginDisabled(selected_cmd == -1);
if (SmallButton("Dump cmd")) {
auto now_time = fmt::localtime(std::time(nullptr));
const auto fname = fmt::format("{:%F %H-%M-%S} {}_{}_{}.bin", now_time,
magic_enum::enum_name(selected_queue_type),
selected_submit_num, selected_queue_num2);
Common::FS::IOFile file(fname, Common::FS::FileAccessMode::Write);
auto& data = frame_dump.queues[selected_cmd].data;
if (file.IsOpen()) {
DebugState.ShowDebugMessage(fmt::format("Dumping cmd as {}", fname));
file.Write(data);
} else {
DebugState.ShowDebugMessage(fmt::format("Failed to save {}", fname));
LOG_ERROR(Core, "Failed to open file {}", fname);
}
}
EndDisabled();
EndGroup(); EndGroup();
if (selected_cmd != -1) { if (selected_cmd != -1) {
@ -169,21 +169,6 @@ void FrameDumpViewer::Draw() {
} }
} }
End(); End();
if (cmdb_view.Open && selected_cmd != -1) {
auto& cmd = frame_dump.queues[selected_cmd].data;
auto cmd_size = cmd.size() * sizeof(u32);
MemoryEditor::Sizes s;
cmdb_view.CalcSizes(s, cmd_size, (size_t)cmd.data());
SetNextWindowSizeConstraints(ImVec2(0.0f, 0.0f), ImVec2(s.WindowWidth, FLT_MAX));
char name[64];
snprintf(name, sizeof(name), "[GFX] Command buffer %d###cmdbuf_hex_%d", id, id);
if (Begin(name, &cmdb_view.Open, ImGuiWindowFlags_NoScrollbar)) {
cmdb_view.DrawContents(cmd.data(), cmd_size, (size_t)cmd.data());
}
End();
}
} }
} // namespace Core::Devtools::Widget } // namespace Core::Devtools::Widget

View File

@ -8,7 +8,6 @@
#include "cmd_list.h" #include "cmd_list.h"
#include "core/debug_state.h" #include "core/debug_state.h"
#include "imgui_memory_editor.h"
namespace Core::Devtools::Widget { namespace Core::Devtools::Widget {
@ -17,11 +16,10 @@ class CmdListViewer;
class FrameDumpViewer { class FrameDumpViewer {
friend class CmdListViewer; friend class CmdListViewer;
DebugStateType::FrameDump frame_dump; std::shared_ptr<DebugStateType::FrameDump> frame_dump;
int id; int id;
std::vector<CmdListViewer> cmd_list_viewer; std::vector<CmdListViewer> cmd_list_viewer;
MemoryEditor cmdb_view;
DebugStateType::QueueType selected_queue_type; DebugStateType::QueueType selected_queue_type;
s32 selected_submit_num; s32 selected_submit_num;
@ -31,7 +29,7 @@ class FrameDumpViewer {
public: public:
bool is_open = true; bool is_open = true;
explicit FrameDumpViewer(DebugStateType::FrameDump frame_dump); explicit FrameDumpViewer(const DebugStateType::FrameDump& frame_dump);
~FrameDumpViewer(); ~FrameDumpViewer();

View File

@ -0,0 +1,182 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "reg_popup.h"
#include <cstdio>
#include <imgui.h>
#include <magic_enum.hpp>
#include "cmd_list.h"
#include "common.h"
using namespace ImGui;
using magic_enum::enum_name;
namespace Core::Devtools::Widget {
void RegPopup::DrawColorBuffer(const AmdGpu::Liverpool::ColorBuffer& buffer) {
if (BeginTable("COLOR_BUFFER", 2, ImGuiTableFlags_Borders)) {
TableNextRow();
// clang-format off
DrawMultipleRow(
"BASE_ADDR", "%X", buffer.base_address,
"PITCH.TILE_MAX", "%X", buffer.pitch.tile_max,
"PITCH.FMASK_TILE_MAX", "%X", buffer.pitch.fmask_tile_max,
"SLICE.TILE_MAX", "%X", buffer.slice.tile_max,
"VIEW.SLICE_START", "%X", buffer.view.slice_start,
"VIEW.SLICE_MAX", "%X", buffer.view.slice_max
);
TableNextRow();
TableNextColumn();
if (TreeNode("Color0Info")) {
TableNextRow();
TableNextColumn();
ParseColor0Info(buffer.info.u32all, false);
TreePop();
}
TableNextRow();
TableNextColumn();
if (TreeNode("Color0Attrib")) {
TableNextRow();
TableNextColumn();
ParseColor0Attrib(buffer.attrib.u32all, false);
TreePop();
}
TableNextRow();
DrawMultipleRow(
"CMASK_BASE_EXT", "%X", buffer.cmask_base_address,
"FMASK_BASE_EXT", "%X", buffer.fmask_base_address,
"FMASK_SLICE.TILE_MAX", "%X", buffer.fmask_slice.tile_max,
"CLEAR_WORD0", "%X", buffer.clear_word0,
"CLEAR_WORD1", "%X", buffer.clear_word1
);
DrawMultipleRow(
"Pitch()", "%X", buffer.Pitch(),
"Height()", "%X", buffer.Height(),
"Address()", "%X", buffer.Address(),
"CmaskAddress", "%X", buffer.CmaskAddress(),
"FmaskAddress", "%X", buffer.FmaskAddress(),
"NumSamples()", "%X", buffer.NumSamples(),
"NumSlices()", "%X", buffer.NumSlices(),
"GetColorSliceSize()", "%X", buffer.GetColorSliceSize()
);
auto tiling_mode = buffer.GetTilingMode();
auto num_format = buffer.NumFormat();
DrawEnumRow("GetTilingMode()", tiling_mode);
DrawRow("IsTiled()", "%X", buffer.IsTiled());
DrawEnumRow("NumFormat()", num_format);
// clang-format on
EndTable();
}
}
void RegPopup::DrawDepthBuffer(const DepthBuffer& depth_data) {
const auto& [depth_buffer, depth_control] = depth_data;
SeparatorText("Depth buffer");
if (BeginTable("DEPTH_BUFFER", 2, ImGuiTableFlags_Borders)) {
TableNextRow();
// clang-format off
DrawEnumRow("Z_INFO.FORMAT", depth_buffer.z_info.format.Value());
DrawMultipleRow(
"Z_INFO.NUM_SAMPLES", "%X", depth_buffer.z_info.num_samples,
"Z_INFO.TILE_SPLIT", "%X", depth_buffer.z_info.tile_split,
"Z_INFO.TILE_MODE_INDEX", "%X", depth_buffer.z_info.tile_mode_index,
"Z_INFO.DECOMPRESS_ON_N_ZPLANES", "%X", depth_buffer.z_info.decompress_on_n_zplanes,
"Z_INFO.ALLOW_EXPCLEAR", "%X", depth_buffer.z_info.allow_expclear,
"Z_INFO.READ_SIZE", "%X", depth_buffer.z_info.read_size,
"Z_INFO.TILE_SURFACE_EN", "%X", depth_buffer.z_info.tile_surface_en,
"Z_INFO.CLEAR_DISALLOWED", "%X", depth_buffer.z_info.clear_disallowed,
"Z_INFO.ZRANGE_PRECISION", "%X", depth_buffer.z_info.zrange_precision
);
DrawEnumRow("STENCIL_INFO.FORMAT", depth_buffer.stencil_info.format.Value());
DrawMultipleRow(
"Z_READ_BASE", "%X", depth_buffer.z_read_base,
"STENCIL_READ_BASE", "%X", depth_buffer.stencil_read_base,
"Z_WRITE_BASE", "%X", depth_buffer.z_write_base,
"STENCIL_WRITE_BASE", "%X", depth_buffer.stencil_write_base,
"DEPTH_SIZE.PITCH_TILE_MAX", "%X", depth_buffer.depth_size.pitch_tile_max,
"DEPTH_SIZE.HEIGHT_TILE_MAX", "%X", depth_buffer.depth_size.height_tile_max,
"DEPTH_SLICE.TILE_MAX", "%X", depth_buffer.depth_slice.tile_max,
"Pitch()", "%X", depth_buffer.Pitch(),
"Height()", "%X", depth_buffer.Height(),
"Address()", "%X", depth_buffer.Address(),
"NumSamples()", "%X", depth_buffer.NumSamples(),
"NumBits()", "%X", depth_buffer.NumBits(),
"GetDepthSliceSize()", "%X", depth_buffer.GetDepthSliceSize()
);
// clang-format on
EndTable();
}
SeparatorText("Depth control");
if (BeginTable("DEPTH_CONTROL", 2, ImGuiTableFlags_Borders)) {
TableNextRow();
// clang-format off
DrawMultipleRow(
"STENCIL_ENABLE", "%X", depth_control.stencil_enable,
"DEPTH_ENABLE", "%X", depth_control.depth_enable,
"DEPTH_WRITE_ENABLE", "%X", depth_control.depth_write_enable,
"DEPTH_BOUNDS_ENABLE", "%X", depth_control.depth_bounds_enable
);
DrawEnumRow("DEPTH_FUNC", depth_control.depth_func.Value());
DrawRow("BACKFACE_ENABLE", "%X", depth_control.backface_enable);
DrawEnumRow("STENCIL_FUNC", depth_control.stencil_ref_func.Value());
DrawEnumRow("STENCIL_FUNC_BF", depth_control.stencil_bf_func.Value());
DrawMultipleRow(
"ENABLE_COLOR_WRITES_ON_DEPTH_FAIL", "%X", depth_control.enable_color_writes_on_depth_fail,
"DISABLE_COLOR_WRITES_ON_DEPTH_PASS", "%X", depth_control.disable_color_writes_on_depth_pass
);
// clang-format on
EndTable();
}
}
RegPopup::RegPopup() {
static int unique_id = 0;
id = unique_id++;
}
void RegPopup::SetData(AmdGpu::Liverpool::ColorBuffer color_buffer, u32 batch_id, u32 cb_id) {
this->data = color_buffer;
this->title = fmt::format("Batch #{} CB #{}", batch_id, cb_id);
}
void RegPopup::SetData(AmdGpu::Liverpool::DepthBuffer depth_buffer,
AmdGpu::Liverpool::DepthControl depth_control, u32 batch_id) {
this->data = std::make_tuple(depth_buffer, depth_control);
this->title = fmt::format("Batch #{} Depth", batch_id);
}
void RegPopup::Draw() {
char name[128];
snprintf(name, sizeof(name), "%s###reg_popup_%d", title.c_str(), id);
SetNextWindowSize({250.0f, 300.0f}, ImGuiCond_FirstUseEver);
if (Begin(name, &open, ImGuiWindowFlags_NoSavedSettings)) {
if (const auto* buffer = std::get_if<AmdGpu::Liverpool::ColorBuffer>(&data)) {
DrawColorBuffer(*buffer);
} else if (const auto* depth_data = std::get_if<DepthBuffer>(&data)) {
DrawDepthBuffer(*depth_data);
}
}
End();
}
} // namespace Core::Devtools::Widget

View File

@ -0,0 +1,38 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <variant>
#include "common/types.h"
#include "video_core/renderer_vulkan/liverpool_to_vk.h"
namespace Core::Devtools::Widget {
class RegPopup {
int id;
using DepthBuffer = std::tuple<AmdGpu::Liverpool::DepthBuffer, AmdGpu::Liverpool::DepthControl>;
std::variant<AmdGpu::Liverpool::ColorBuffer, DepthBuffer> data;
std::string title{};
void DrawColorBuffer(const AmdGpu::Liverpool::ColorBuffer& buffer);
void DrawDepthBuffer(const DepthBuffer& depth_data);
public:
bool open = false;
RegPopup();
void SetData(AmdGpu::Liverpool::ColorBuffer color_buffer, u32 batch_id, u32 cb_id);
void SetData(AmdGpu::Liverpool::DepthBuffer depth_buffer,
AmdGpu::Liverpool::DepthControl depth_control, u32 batch_id);
void Draw();
};
} // namespace Core::Devtools::Widget

View File

@ -0,0 +1,305 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <filesystem>
#include <optional>
#include <string>
#include <imgui.h>
#include <magic_enum.hpp>
#include <stdio.h>
#include "common.h"
#include "common/io_file.h"
#include "core/devtools/options.h"
#include "imgui_internal.h"
#include "reg_view.h"
#if defined(_WIN32)
#define popen _popen
#define pclose _pclose
#endif
using namespace ImGui;
using magic_enum::enum_name;
static std::optional<std::string> exec_cli(const char* cli) {
std::array<char, 64> buffer{};
std::string output;
const auto f = popen(cli, "r");
if (!f) {
pclose(f);
return {};
}
while (fgets(buffer.data(), buffer.size(), f)) {
output += buffer.data();
}
pclose(f);
return output;
}
namespace Core::Devtools::Widget {
void RegView::ProcessShader(int shader_id) {
auto shader = data.stages[shader_id];
std::string shader_dis;
if (Options.disassembly_cli.empty()) {
shader_dis = "No disassembler set";
} else {
auto bin_path = std::filesystem::temp_directory_path() / "shadps4_tmp_shader.bin";
constexpr std::string_view src_arg = "{src}";
std::string cli = Options.disassembly_cli;
const auto pos = cli.find(src_arg);
if (pos == std::string::npos) {
DebugState.ShowDebugMessage("Disassembler CLI does not contain {src} argument");
} else {
cli.replace(pos, src_arg.size(), "\"" + bin_path.string() + "\"");
Common::FS::IOFile file(bin_path, Common::FS::FileAccessMode::Write);
file.Write(shader.code);
file.Close();
auto result = exec_cli(cli.c_str());
shader_dis = result.value_or("Could not disassemble shader");
if (shader_dis.empty()) {
shader_dis = "Disassembly empty or failed";
}
std::filesystem::remove(bin_path);
}
}
MemoryEditor hex_view;
hex_view.Open = true;
hex_view.ReadOnly = true;
hex_view.Cols = 16;
hex_view.OptShowAscii = false;
TextEditor dis_view;
dis_view.SetPalette(TextEditor::GetDarkPalette());
dis_view.SetReadOnly(true);
dis_view.SetText(shader_dis);
ShaderCache cache{
.hex_view = hex_view,
.dis_view = dis_view,
.user_data = shader.user_data.user_data,
};
shader_decomp.emplace(shader_id, std::move(cache));
}
void RegView::SelectShader(int id) {
selected_shader = id;
if (!shader_decomp.contains(id)) {
ProcessShader(id);
}
}
void RegView::DrawRegs() {
const auto& regs = data.regs;
if (BeginTable("REGS", 2, ImGuiTableFlags_Borders)) {
auto& s = regs.screen_scissor;
DrawRow("Scissor", "(%d, %d, %d, %d)", s.top_left_x, s.top_left_y, s.bottom_right_x,
s.bottom_right_y);
auto cc_mode = regs.color_control.mode.Value();
DrawRow("Color control", "%X (%s)", cc_mode, enum_name(cc_mode).data());
const auto open_new_popup = [&](int cb, auto... args) {
if (GetIO().KeyShift) {
auto& pop = extra_reg_popup.emplace_back();
pop.SetData(args...);
pop.open = true;
} else if (last_selected_cb == cb && default_reg_popup.open) {
default_reg_popup.open = false;
} else {
last_selected_cb = cb;
default_reg_popup.SetData(args...);
if (!default_reg_popup.open) {
default_reg_popup.open = true;
auto popup_pos =
GetCurrentContext()->LastItemData.Rect.Max + ImVec2(5.0f, 0.0f);
SetNextWindowPos(popup_pos, ImGuiCond_Always);
default_reg_popup.Draw();
}
}
};
for (int cb = 0; cb < AmdGpu::Liverpool::NumColorBuffers; ++cb) {
PushID(cb);
TableNextRow();
TableNextColumn();
const auto& buffer = regs.color_buffers[cb];
Text("Color buffer %d", cb);
TableNextColumn();
if (!buffer || !regs.color_target_mask.GetMask(cb)) {
TextUnformatted("N/A");
} else {
const char* text = last_selected_cb == cb && default_reg_popup.open ? "x" : "->";
if (SmallButton(text)) {
open_new_popup(cb, buffer, batch_id, cb);
}
}
PopID();
}
TableNextRow();
TableNextColumn();
TextUnformatted("Depth buffer");
TableNextColumn();
if (regs.depth_buffer.Address() == 0 || !regs.depth_control.depth_enable) {
TextUnformatted("N/A");
} else {
constexpr auto depth_id = 0xF3;
const char* text = last_selected_cb == depth_id && default_reg_popup.open ? "x" : "->";
if (SmallButton(text)) {
open_new_popup(depth_id, regs.depth_buffer, regs.depth_control, batch_id);
}
}
EndTable();
}
}
RegView::RegView() {
static int unique_id = 0;
id = unique_id++;
char name[128];
snprintf(name, sizeof(name), "BatchView###reg_dump_%d", id);
SetNextWindowPos({400.0f, 200.0f});
SetNextWindowSize({450.0f, 500.0f});
ImGuiID root_dock_id;
Begin(name);
{
char dock_name[64];
snprintf(dock_name, sizeof(dock_name), "BatchView###reg_dump_%d/dock_space", id);
root_dock_id = ImHashStr(dock_name);
DockSpace(root_dock_id);
}
End();
ImGuiID up1, down1;
DockBuilderRemoveNodeChildNodes(root_dock_id);
DockBuilderSplitNode(root_dock_id, ImGuiDir_Up, 0.2f, &up1, &down1);
snprintf(name, sizeof(name), "User data###reg_dump_%d/user_data", id);
DockBuilderDockWindow(name, up1);
snprintf(name, sizeof(name), "Regs###reg_dump_%d/regs", id);
DockBuilderDockWindow(name, down1);
snprintf(name, sizeof(name), "Disassembly###reg_dump_%d/disassembly", id);
DockBuilderDockWindow(name, down1);
DockBuilderFinish(root_dock_id);
}
void RegView::SetData(DebugStateType::RegDump data, u32 batch_id) {
this->data = std::move(data);
this->batch_id = batch_id;
// clear cache
selected_shader = -1;
shader_decomp.clear();
default_reg_popup.open = false;
extra_reg_popup.clear();
}
void RegView::Draw() {
char name[128];
snprintf(name, sizeof(name), "BatchView %u###reg_dump_%d", batch_id, id);
if (Begin(name, &open, ImGuiWindowFlags_MenuBar)) {
const char* names[] = {"vs", "ps", "gs", "es", "hs", "ls"};
if (BeginMenuBar()) {
if (BeginMenu("Stage")) {
for (int i = 0; i < DebugStateType::RegDump::MaxShaderStages; i++) {
if (data.regs.stage_enable.IsStageEnabled(i)) {
bool selected = selected_shader == i;
if (Selectable(names[i], &selected)) {
SelectShader(i);
}
}
}
ImGui::EndMenu();
}
if (BeginMenu("Windows")) {
Checkbox("Registers", &show_registers);
Checkbox("User data", &show_user_data);
Checkbox("Disassembly", &show_disassembly);
ImGui::EndMenu();
}
EndMenuBar();
}
char dock_name[64];
snprintf(dock_name, sizeof(dock_name), "BatchView###reg_dump_%d/dock_space", id);
auto root_dock_id = ImHashStr(dock_name);
DockSpace(root_dock_id);
}
End();
auto get_shader = [&]() -> ShaderCache* {
auto shader_cache = shader_decomp.find(selected_shader);
if (shader_cache == shader_decomp.end()) {
return nullptr;
}
return &shader_cache->second;
};
if (show_user_data) {
snprintf(name, sizeof(name), "User data###reg_dump_%d/user_data", id);
if (Begin(name, &show_user_data)) {
auto shader = get_shader();
if (!shader) {
Text("Select a stage");
} else {
shader->hex_view.DrawContents(shader->user_data.data(), shader->user_data.size());
}
}
End();
}
if (show_disassembly) {
snprintf(name, sizeof(name), "Disassembly###reg_dump_%d/disassembly", id);
if (Begin(name, &show_disassembly)) {
auto shader = get_shader();
if (!shader) {
Text("Select a stage");
} else {
shader->dis_view.Render("Disassembly", GetContentRegionAvail());
}
}
End();
}
if (show_registers) {
snprintf(name, sizeof(name), "Regs###reg_dump_%d/regs", id);
if (Begin(name, &show_registers)) {
DrawRegs();
}
End();
}
if (default_reg_popup.open) {
default_reg_popup.Draw();
}
for (auto it = extra_reg_popup.begin(); it != extra_reg_popup.end();) {
if (!it->open) {
it = extra_reg_popup.erase(it);
continue;
}
it->Draw();
++it;
}
}
} // namespace Core::Devtools::Widget

View File

@ -0,0 +1,50 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include "core/debug_state.h"
#include "imgui_memory_editor.h"
#include "reg_popup.h"
#include "text_editor.h"
namespace Core::Devtools::Widget {
struct ShaderCache {
MemoryEditor hex_view;
TextEditor dis_view;
Vulkan::Liverpool::UserData user_data;
};
class RegView {
int id;
DebugStateType::RegDump data;
u32 batch_id{~0u};
std::unordered_map<int, ShaderCache> shader_decomp;
int selected_shader{-1};
RegPopup default_reg_popup;
int last_selected_cb{-1};
std::vector<RegPopup> extra_reg_popup;
bool show_registers{true};
bool show_user_data{true};
bool show_disassembly{true};
void ProcessShader(int shader_id);
void SelectShader(int shader_id);
void DrawRegs();
public:
bool open = false;
RegView();
void SetData(DebugStateType::RegDump data, u32 batch_id);
void Draw();
};
} // namespace Core::Devtools::Widget

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,408 @@
// SPDX-FileCopyrightText: Copyright (c) 2017 BalazsJako
// SPDX-License-Identifier: MIT
// source: https://github.com/BalazsJako/ImGuiColorTextEdit
#pragma once
#include <array>
#include <map>
#include <memory>
#include <regex>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include "common/assert.h"
#include "imgui.h"
namespace Core::Devtools::Widget {
class TextEditor {
public:
enum class PaletteIndex {
Default,
Keyword,
Number,
String,
CharLiteral,
Punctuation,
Preprocessor,
Identifier,
KnownIdentifier,
PreprocIdentifier,
Comment,
MultiLineComment,
Background,
Cursor,
Selection,
ErrorMarker,
Breakpoint,
LineNumber,
CurrentLineFill,
CurrentLineFillInactive,
CurrentLineEdge,
Max
};
enum class SelectionMode { Normal, Word, Line };
struct Breakpoint {
int mLine;
bool mEnabled;
std::string mCondition;
Breakpoint() : mLine(-1), mEnabled(false) {}
};
// Represents a character coordinate from the user's point of view,
// i. e. consider an uniform grid (assuming fixed-width font) on the
// screen as it is rendered, and each cell has its own coordinate, starting from 0.
// Tabs are counted as [1..mTabSize] count empty spaces, depending on
// how many space is necessary to reach the next tab stop.
// For example, coordinate (1, 5) represents the character 'B' in a line "\tABC", when mTabSize
// = 4, because it is rendered as " ABC" on the screen.
struct Coordinates {
int mLine, mColumn;
Coordinates() : mLine(0), mColumn(0) {}
Coordinates(int aLine, int aColumn) : mLine(aLine), mColumn(aColumn) {
ASSERT(aLine >= 0);
ASSERT(aColumn >= 0);
}
static Coordinates Invalid() {
static Coordinates invalid(-1, -1);
return invalid;
}
bool operator==(const Coordinates& o) const {
return mLine == o.mLine && mColumn == o.mColumn;
}
bool operator!=(const Coordinates& o) const {
return mLine != o.mLine || mColumn != o.mColumn;
}
bool operator<(const Coordinates& o) const {
if (mLine != o.mLine)
return mLine < o.mLine;
return mColumn < o.mColumn;
}
bool operator>(const Coordinates& o) const {
if (mLine != o.mLine)
return mLine > o.mLine;
return mColumn > o.mColumn;
}
bool operator<=(const Coordinates& o) const {
if (mLine != o.mLine)
return mLine < o.mLine;
return mColumn <= o.mColumn;
}
bool operator>=(const Coordinates& o) const {
if (mLine != o.mLine)
return mLine > o.mLine;
return mColumn >= o.mColumn;
}
};
struct Identifier {
Coordinates mLocation;
std::string mDeclaration;
};
typedef std::string String;
typedef std::unordered_map<std::string, Identifier> Identifiers;
typedef std::unordered_set<std::string> Keywords;
typedef std::map<int, std::string> ErrorMarkers;
typedef std::unordered_set<int> Breakpoints;
typedef std::array<ImU32, (unsigned)PaletteIndex::Max> Palette;
typedef uint8_t Char;
struct Glyph {
Char mChar;
PaletteIndex mColorIndex = PaletteIndex::Default;
bool mComment : 1;
bool mMultiLineComment : 1;
bool mPreprocessor : 1;
Glyph(Char aChar, PaletteIndex aColorIndex)
: mChar(aChar), mColorIndex(aColorIndex), mComment(false), mMultiLineComment(false),
mPreprocessor(false) {}
};
typedef std::vector<Glyph> Line;
typedef std::vector<Line> Lines;
struct LanguageDefinition {
typedef std::pair<std::string, PaletteIndex> TokenRegexString;
typedef std::vector<TokenRegexString> TokenRegexStrings;
typedef bool (*TokenizeCallback)(const char* in_begin, const char* in_end,
const char*& out_begin, const char*& out_end,
PaletteIndex& paletteIndex);
std::string mName;
Keywords mKeywords;
Identifiers mIdentifiers;
Identifiers mPreprocIdentifiers;
std::string mCommentStart, mCommentEnd, mSingleLineComment;
char mPreprocChar;
bool mAutoIndentation;
TokenizeCallback mTokenize;
TokenRegexStrings mTokenRegexStrings;
bool mCaseSensitive;
LanguageDefinition()
: mPreprocChar('#'), mAutoIndentation(true), mTokenize(nullptr), mCaseSensitive(true) {}
static const LanguageDefinition& GLSL();
};
TextEditor();
~TextEditor();
void SetLanguageDefinition(const LanguageDefinition& aLanguageDef);
const LanguageDefinition& GetLanguageDefinition() const {
return mLanguageDefinition;
}
const Palette& GetPalette() const {
return mPaletteBase;
}
void SetPalette(const Palette& aValue);
void SetErrorMarkers(const ErrorMarkers& aMarkers) {
mErrorMarkers = aMarkers;
}
void SetBreakpoints(const Breakpoints& aMarkers) {
mBreakpoints = aMarkers;
}
void Render(const char* aTitle, const ImVec2& aSize = ImVec2(), bool aBorder = false);
void SetText(const std::string& aText);
std::string GetText() const;
void SetTextLines(const std::vector<std::string>& aLines);
std::vector<std::string> GetTextLines() const;
std::string GetSelectedText() const;
std::string GetCurrentLineText() const;
int GetTotalLines() const {
return (int)mLines.size();
}
bool IsOverwrite() const {
return mOverwrite;
}
void SetReadOnly(bool aValue);
bool IsReadOnly() const {
return mReadOnly;
}
bool IsTextChanged() const {
return mTextChanged;
}
bool IsCursorPositionChanged() const {
return mCursorPositionChanged;
}
bool IsColorizerEnabled() const {
return mColorizerEnabled;
}
void SetColorizerEnable(bool aValue);
Coordinates GetCursorPosition() const {
return GetActualCursorCoordinates();
}
void SetCursorPosition(const Coordinates& aPosition);
inline void SetHandleMouseInputs(bool aValue) {
mHandleMouseInputs = aValue;
}
inline bool IsHandleMouseInputsEnabled() const {
return mHandleKeyboardInputs;
}
inline void SetHandleKeyboardInputs(bool aValue) {
mHandleKeyboardInputs = aValue;
}
inline bool IsHandleKeyboardInputsEnabled() const {
return mHandleKeyboardInputs;
}
inline void SetImGuiChildIgnored(bool aValue) {
mIgnoreImGuiChild = aValue;
}
inline bool IsImGuiChildIgnored() const {
return mIgnoreImGuiChild;
}
inline void SetShowWhitespaces(bool aValue) {
mShowWhitespaces = aValue;
}
inline bool IsShowingWhitespaces() const {
return mShowWhitespaces;
}
void SetTabSize(int aValue);
inline int GetTabSize() const {
return mTabSize;
}
void InsertText(const std::string& aValue);
void InsertText(const char* aValue);
void MoveUp(int aAmount = 1, bool aSelect = false);
void MoveDown(int aAmount = 1, bool aSelect = false);
void MoveLeft(int aAmount = 1, bool aSelect = false, bool aWordMode = false);
void MoveRight(int aAmount = 1, bool aSelect = false, bool aWordMode = false);
void MoveTop(bool aSelect = false);
void MoveBottom(bool aSelect = false);
void MoveHome(bool aSelect = false);
void MoveEnd(bool aSelect = false);
void SetSelectionStart(const Coordinates& aPosition);
void SetSelectionEnd(const Coordinates& aPosition);
void SetSelection(const Coordinates& aStart, const Coordinates& aEnd,
SelectionMode aMode = SelectionMode::Normal);
void SelectWordUnderCursor();
void SelectAll();
bool HasSelection() const;
void Copy();
void Cut();
void Paste();
void Delete();
bool CanUndo() const;
bool CanRedo() const;
void Undo(int aSteps = 1);
void Redo(int aSteps = 1);
static const Palette& GetDarkPalette();
static const Palette& GetLightPalette();
static const Palette& GetRetroBluePalette();
private:
typedef std::vector<std::pair<std::regex, PaletteIndex>> RegexList;
struct EditorState {
Coordinates mSelectionStart;
Coordinates mSelectionEnd;
Coordinates mCursorPosition;
};
class UndoRecord {
public:
UndoRecord() {}
~UndoRecord() {}
UndoRecord(const std::string& aAdded, const TextEditor::Coordinates aAddedStart,
const TextEditor::Coordinates aAddedEnd,
const std::string& aRemoved, const TextEditor::Coordinates aRemovedStart,
const TextEditor::Coordinates aRemovedEnd,
TextEditor::EditorState& aBefore, TextEditor::EditorState& aAfter);
void Undo(TextEditor* aEditor);
void Redo(TextEditor* aEditor);
std::string mAdded;
Coordinates mAddedStart;
Coordinates mAddedEnd;
std::string mRemoved;
Coordinates mRemovedStart;
Coordinates mRemovedEnd;
EditorState mBefore;
EditorState mAfter;
};
typedef std::vector<UndoRecord> UndoBuffer;
void ProcessInputs();
void Colorize(int aFromLine = 0, int aCount = -1);
void ColorizeRange(int aFromLine = 0, int aToLine = 0);
void ColorizeInternal();
float TextDistanceToLineStart(const Coordinates& aFrom) const;
void EnsureCursorVisible();
int GetPageSize() const;
std::string GetText(const Coordinates& aStart, const Coordinates& aEnd) const;
Coordinates GetActualCursorCoordinates() const;
Coordinates SanitizeCoordinates(const Coordinates& aValue) const;
void Advance(Coordinates& aCoordinates) const;
void DeleteRange(const Coordinates& aStart, const Coordinates& aEnd);
int InsertTextAt(Coordinates& aWhere, const char* aValue);
void AddUndo(UndoRecord& aValue);
Coordinates ScreenPosToCoordinates(const ImVec2& aPosition) const;
Coordinates FindWordStart(const Coordinates& aFrom) const;
Coordinates FindWordEnd(const Coordinates& aFrom) const;
Coordinates FindNextWord(const Coordinates& aFrom) const;
int GetCharacterIndex(const Coordinates& aCoordinates) const;
int GetCharacterColumn(int aLine, int aIndex) const;
int GetLineCharacterCount(int aLine) const;
int GetLineMaxColumn(int aLine) const;
bool IsOnWordBoundary(const Coordinates& aAt) const;
void RemoveLine(int aStart, int aEnd);
void RemoveLine(int aIndex);
Line& InsertLine(int aIndex);
void EnterCharacter(ImWchar aChar, bool aShift);
void Backspace();
void DeleteSelection();
std::string GetWordUnderCursor() const;
std::string GetWordAt(const Coordinates& aCoords) const;
ImU32 GetGlyphColor(const Glyph& aGlyph) const;
void HandleKeyboardInputs();
void HandleMouseInputs();
void Render();
float mLineSpacing;
Lines mLines;
EditorState mState;
UndoBuffer mUndoBuffer;
int mUndoIndex;
int mTabSize;
bool mOverwrite;
bool mReadOnly;
bool mWithinRender;
bool mScrollToCursor;
bool mScrollToTop;
bool mTextChanged;
bool mColorizerEnabled;
float mTextStart; // position (in pixels) where a code line starts relative to the left of the
// TextEditor.
int mLeftMargin;
bool mCursorPositionChanged;
int mColorRangeMin, mColorRangeMax;
SelectionMode mSelectionMode;
bool mHandleKeyboardInputs;
bool mHandleMouseInputs;
bool mIgnoreImGuiChild;
bool mShowWhitespaces;
Palette mPaletteBase;
Palette mPalette;
LanguageDefinition mLanguageDefinition;
RegexList mRegexList;
bool mCheckComments;
Breakpoints mBreakpoints;
ErrorMarkers mErrorMarkers;
ImVec2 mCharAdvance;
Coordinates mInteractiveStart, mInteractiveEnd;
std::string mLineBuffer;
uint64_t mStartTime;
float mLastClick;
};
} // namespace Core::Devtools::Widget

View File

@ -75,7 +75,7 @@ public:
std::min(io.DisplaySize.y, 300.0f), std::min(io.DisplaySize.y, 300.0f),
}; };
CentralizeWindow(); CentralizeNextWindow();
SetNextWindowSize(window_size); SetNextWindowSize(window_size);
SetNextWindowCollapsed(false); SetNextWindowCollapsed(false);
if (first_render || !io.NavActive) { if (first_render || !io.NavActive) {

View File

@ -175,7 +175,7 @@ Error PS4_SYSV_ABI sceImeDialogInit(OrbisImeDialogParam* param, OrbisImeParamExt
} }
if (extended) { if (extended) {
if (magic_enum::enum_contains(extended->priority)) { if (!magic_enum::enum_contains(extended->priority)) {
LOG_INFO(Lib_ImeDialog, "Invalid extended->priority"); LOG_INFO(Lib_ImeDialog, "Invalid extended->priority");
return Error::INVALID_EXTENDED; return Error::INVALID_EXTENDED;
} }

View File

@ -519,10 +519,12 @@ void PS4_SYSV_ABI sceGnmDingDong(u32 gnm_vqid, u32 next_offs_dw) {
// Dumping them using the current ring pointer would result in files containing only the // Dumping them using the current ring pointer would result in files containing only the
// `IndirectBuffer` command. To access the actual command stream, we need to unwrap the IB. // `IndirectBuffer` command. To access the actual command stream, we need to unwrap the IB.
auto acb = acb_span; auto acb = acb_span;
auto base_addr = reinterpret_cast<uintptr_t>(acb_ptr);
const auto* indirect_buffer = const auto* indirect_buffer =
reinterpret_cast<const PM4CmdIndirectBuffer*>(acb_span.data()); reinterpret_cast<const PM4CmdIndirectBuffer*>(acb_span.data());
if (indirect_buffer->header.opcode == PM4ItOpcode::IndirectBuffer) { if (indirect_buffer->header.opcode == PM4ItOpcode::IndirectBuffer) {
acb = {indirect_buffer->Address<const u32>(), indirect_buffer->ib_size}; base_addr = reinterpret_cast<uintptr_t>(indirect_buffer->Address<const u32>());
acb = {reinterpret_cast<const u32*>(base_addr), indirect_buffer->ib_size};
} }
using namespace DebugStateType; using namespace DebugStateType;
@ -532,9 +534,9 @@ void PS4_SYSV_ABI sceGnmDingDong(u32 gnm_vqid, u32 next_offs_dw) {
.submit_num = seq_num, .submit_num = seq_num,
.num2 = gnm_vqid, .num2 = gnm_vqid,
.data = {acb.begin(), acb.end()}, .data = {acb.begin(), acb.end()},
.base_addr = base_addr,
}); });
} }
liverpool->SubmitAsc(vqid, acb_span); liverpool->SubmitAsc(vqid, acb_span);
*asc_queue.read_addr += acb_size; *asc_queue.read_addr += acb_size;
@ -1125,9 +1127,25 @@ int PS4_SYSV_ABI sceGnmInsertSetColorMarker() {
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI sceGnmInsertSetMarker() { s32 PS4_SYSV_ABI sceGnmInsertSetMarker(u32* cmdbuf, u32 size, const char* marker) {
LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); LOG_TRACE(Lib_GnmDriver, "called");
if (cmdbuf && marker) {
const auto len = std::strlen(marker);
const u32 packet_size = ((len + 8) >> 2) + ((len + 0xc) >> 3) * 2;
if (packet_size + 2 == size) {
auto* nop = reinterpret_cast<PM4CmdNop*>(cmdbuf);
nop->header =
PM4Type3Header{PM4ItOpcode::Nop, packet_size, PM4ShaderType::ShaderGraphics};
nop->data_block[0] = PM4CmdNop::PayloadType::DebugSetMarker;
const auto marker_len = len + 1;
std::memcpy(&nop->data_block[1], marker, marker_len);
std::memset(reinterpret_cast<u8*>(&nop->data_block[1]) + marker_len, 0,
packet_size * 4 - marker_len);
return ORBIS_OK; return ORBIS_OK;
}
}
return -1;
} }
int PS4_SYSV_ABI sceGnmInsertThreadTraceMarker() { int PS4_SYSV_ABI sceGnmInsertThreadTraceMarker() {
@ -2163,15 +2181,16 @@ s32 PS4_SYSV_ABI sceGnmSubmitCommandBuffers(u32 count, const u32* dcb_gpu_addrs[
.submit_num = seq_num, .submit_num = seq_num,
.num2 = cbpair, .num2 = cbpair,
.data = {dcb_span.begin(), dcb_span.end()}, .data = {dcb_span.begin(), dcb_span.end()},
.base_addr = reinterpret_cast<uintptr_t>(dcb_gpu_addrs[cbpair]),
}); });
DebugState.PushQueueDump({ DebugState.PushQueueDump({
.type = QueueType::ccb, .type = QueueType::ccb,
.submit_num = seq_num, .submit_num = seq_num,
.num2 = cbpair, .num2 = cbpair,
.data = {ccb_span.begin(), ccb_span.end()}, .data = {ccb_span.begin(), ccb_span.end()},
.base_addr = reinterpret_cast<uintptr_t>(ccb),
}); });
} }
liverpool->SubmitGfx(dcb_span, ccb_span); liverpool->SubmitGfx(dcb_span, ccb_span);
} }

View File

@ -108,7 +108,7 @@ s32 PS4_SYSV_ABI sceGnmInsertPopMarker(u32* cmdbuf, u32 size);
s32 PS4_SYSV_ABI sceGnmInsertPushColorMarker(u32* cmdbuf, u32 size, const char* marker, u32 color); s32 PS4_SYSV_ABI sceGnmInsertPushColorMarker(u32* cmdbuf, u32 size, const char* marker, u32 color);
s32 PS4_SYSV_ABI sceGnmInsertPushMarker(u32* cmdbuf, u32 size, const char* marker); s32 PS4_SYSV_ABI sceGnmInsertPushMarker(u32* cmdbuf, u32 size, const char* marker);
int PS4_SYSV_ABI sceGnmInsertSetColorMarker(); int PS4_SYSV_ABI sceGnmInsertSetColorMarker();
int PS4_SYSV_ABI sceGnmInsertSetMarker(); s32 PS4_SYSV_ABI sceGnmInsertSetMarker(u32* cmdbuf, u32 size, const char* marker);
int PS4_SYSV_ABI sceGnmInsertThreadTraceMarker(); int PS4_SYSV_ABI sceGnmInsertThreadTraceMarker();
s32 PS4_SYSV_ABI sceGnmInsertWaitFlipDone(u32* cmdbuf, u32 size, s32 vo_handle, u32 buf_idx); s32 PS4_SYSV_ABI sceGnmInsertWaitFlipDone(u32* cmdbuf, u32 size, s32 vo_handle, u32 buf_idx);
int PS4_SYSV_ABI sceGnmIsCoredumpValid(); int PS4_SYSV_ABI sceGnmIsCoredumpValid();

View File

@ -36,6 +36,10 @@ void init_pthreads() {
ScePthreadMutexattr default_mutexattr = nullptr; ScePthreadMutexattr default_mutexattr = nullptr;
scePthreadMutexattrInit(&default_mutexattr); scePthreadMutexattrInit(&default_mutexattr);
g_pthread_cxt->setDefaultMutexattr(default_mutexattr); g_pthread_cxt->setDefaultMutexattr(default_mutexattr);
ScePthreadMutexattr adaptive_mutexattr = nullptr;
scePthreadMutexattrInit(&adaptive_mutexattr);
scePthreadMutexattrSettype(&adaptive_mutexattr, ORBIS_PTHREAD_MUTEX_ADAPTIVE);
g_pthread_cxt->setAdaptiveMutexattr(adaptive_mutexattr);
// default cond init // default cond init
ScePthreadCondattr default_condattr = nullptr; ScePthreadCondattr default_condattr = nullptr;
scePthreadCondattrInit(&default_condattr); scePthreadCondattrInit(&default_condattr);
@ -412,7 +416,8 @@ int PS4_SYSV_ABI scePthreadGetaffinity(ScePthread thread, /*SceKernelCpumask*/ u
} }
ScePthreadMutex* createMutex(ScePthreadMutex* addr) { ScePthreadMutex* createMutex(ScePthreadMutex* addr) {
if (addr == nullptr || *addr != nullptr) { if (addr == nullptr ||
(*addr != nullptr && *addr != ORBIS_PTHREAD_MUTEX_ADAPTIVE_INITIALIZER)) {
return addr; return addr;
} }
@ -429,15 +434,15 @@ int PS4_SYSV_ABI scePthreadMutexInit(ScePthreadMutex* mutex, const ScePthreadMut
if (mutex == nullptr) { if (mutex == nullptr) {
return SCE_KERNEL_ERROR_EINVAL; return SCE_KERNEL_ERROR_EINVAL;
} }
if (mutex_attr == nullptr) { if (mutex_attr == nullptr || *mutex_attr == nullptr) {
attr = g_pthread_cxt->getDefaultMutexattr(); if (*mutex == ORBIS_PTHREAD_MUTEX_ADAPTIVE_INITIALIZER) {
attr = g_pthread_cxt->getAdaptiveMutexattr();
} else { } else {
if (*mutex_attr == nullptr) {
attr = g_pthread_cxt->getDefaultMutexattr(); attr = g_pthread_cxt->getDefaultMutexattr();
}
} else { } else {
attr = mutex_attr; attr = mutex_attr;
} }
}
*mutex = new PthreadMutexInternal{}; *mutex = new PthreadMutexInternal{};
if (name != nullptr) { if (name != nullptr) {

View File

@ -13,6 +13,8 @@
#include "common/types.h" #include "common/types.h"
#define ORBIS_PTHREAD_MUTEX_ADAPTIVE_INITIALIZER (reinterpret_cast<ScePthreadMutex>(1))
namespace Core::Loader { namespace Core::Loader {
class SymbolsResolver; class SymbolsResolver;
} }
@ -134,6 +136,12 @@ public:
void setDefaultMutexattr(ScePthreadMutexattr attr) { void setDefaultMutexattr(ScePthreadMutexattr attr) {
m_default_mutexattr = attr; m_default_mutexattr = attr;
} }
ScePthreadMutexattr* getAdaptiveMutexattr() {
return &m_adaptive_mutexattr;
}
void setAdaptiveMutexattr(ScePthreadMutexattr attr) {
m_adaptive_mutexattr = attr;
}
ScePthreadCondattr* getDefaultCondattr() { ScePthreadCondattr* getDefaultCondattr() {
return &m_default_condattr; return &m_default_condattr;
} }
@ -161,6 +169,7 @@ public:
private: private:
ScePthreadMutexattr m_default_mutexattr = nullptr; ScePthreadMutexattr m_default_mutexattr = nullptr;
ScePthreadMutexattr m_adaptive_mutexattr = nullptr;
ScePthreadCondattr m_default_condattr = nullptr; ScePthreadCondattr m_default_condattr = nullptr;
ScePthreadAttr m_default_attr = nullptr; ScePthreadAttr m_default_attr = nullptr;
PThreadPool* m_pthread_pool = nullptr; PThreadPool* m_pthread_pool = nullptr;

View File

@ -986,9 +986,9 @@ int PS4_SYSV_ABI sceNpGetNpReachabilityState() {
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI sceNpGetOnlineId() { int PS4_SYSV_ABI sceNpGetOnlineId(s32 userId, OrbisNpOnlineId* onlineId) {
LOG_ERROR(Lib_NpManager, "(STUBBED) called"); LOG_DEBUG(Lib_NpManager, "called returned sign out");
return ORBIS_OK; return ORBIS_NP_ERROR_SIGNED_OUT;
} }
int PS4_SYSV_ABI sceNpGetParentalControlInfo() { int PS4_SYSV_ABI sceNpGetParentalControlInfo() {

View File

@ -233,7 +233,7 @@ int PS4_SYSV_ABI sceNpGetGamePresenceStatus();
int PS4_SYSV_ABI sceNpGetGamePresenceStatusA(); int PS4_SYSV_ABI sceNpGetGamePresenceStatusA();
int PS4_SYSV_ABI sceNpGetNpId(OrbisUserServiceUserId userId, OrbisNpId* npId); int PS4_SYSV_ABI sceNpGetNpId(OrbisUserServiceUserId userId, OrbisNpId* npId);
int PS4_SYSV_ABI sceNpGetNpReachabilityState(); int PS4_SYSV_ABI sceNpGetNpReachabilityState();
int PS4_SYSV_ABI sceNpGetOnlineId(); int PS4_SYSV_ABI sceNpGetOnlineId(s32 userId, OrbisNpOnlineId* onlineId);
int PS4_SYSV_ABI sceNpGetParentalControlInfo(); int PS4_SYSV_ABI sceNpGetParentalControlInfo();
int PS4_SYSV_ABI sceNpGetParentalControlInfoA(); int PS4_SYSV_ABI sceNpGetParentalControlInfoA();
int PS4_SYSV_ABI sceNpGetState(s32 userId, OrbisNpState* state); int PS4_SYSV_ABI sceNpGetState(s32 userId, OrbisNpState* state);

View File

@ -520,7 +520,7 @@ s32 PS4_SYSV_ABI sceNpTrophyGetTrophyUnlockState(OrbisNpTrophyContext context,
if (!result) { if (!result) {
LOG_ERROR(Lib_NpTrophy, "Failed to open trophy xml : {}", result.description()); LOG_ERROR(Lib_NpTrophy, "Failed to open trophy xml : {}", result.description());
return ORBIS_OK; return -1;
} }
int num_trophies = 0; int num_trophies = 0;

View File

@ -98,7 +98,7 @@ SaveDialogState::SaveDialogState(const OrbisSaveDataDialogParam& param) {
param_sfo.Open(param_sfo_path); param_sfo.Open(param_sfo_path);
auto last_write = param_sfo.GetLastWrite(); auto last_write = param_sfo.GetLastWrite();
#ifdef _WIN32 #if defined(_WIN32) && !defined(__GNUC__) && !defined(__MINGW32__) && !defined(__MINGW64__)
auto utc_time = std::chrono::file_clock::to_utc(last_write); auto utc_time = std::chrono::file_clock::to_utc(last_write);
#else #else
auto utc_time = std::chrono::file_clock::to_sys(last_write); auto utc_time = std::chrono::file_clock::to_sys(last_write);
@ -402,7 +402,7 @@ void SaveDialogUi::Draw() {
}; };
} }
CentralizeWindow(); CentralizeNextWindow();
SetNextWindowSize(window_size); SetNextWindowSize(window_size);
SetNextWindowCollapsed(false); SetNextWindowCollapsed(false);
if (first_render || !io.NavActive) { if (first_render || !io.NavActive) {

View File

@ -256,7 +256,7 @@ void MsgDialogUi::Draw() {
std::min(io.DisplaySize.y, 300.0f), std::min(io.DisplaySize.y, 300.0f),
}; };
CentralizeWindow(); CentralizeNextWindow();
SetNextWindowSize(window_size); SetNextWindowSize(window_size);
SetNextWindowCollapsed(false); SetNextWindowCollapsed(false);
if (first_render || !io.NavActive) { if (first_render || !io.NavActive) {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 965 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 658 B

View File

@ -25,11 +25,16 @@ inline float FastInFastOutCubic(float x) {
} // namespace Easing } // namespace Easing
inline void CentralizeWindow() { inline void CentralizeNextWindow() {
const auto display_size = GetIO().DisplaySize; const auto display_size = GetIO().DisplaySize;
SetNextWindowPos(display_size / 2.0f, ImGuiCond_Always, {0.5f}); SetNextWindowPos(display_size / 2.0f, ImGuiCond_Always, {0.5f});
} }
inline void CentralizeWindow() {
const auto display_size = GetIO().DisplaySize;
SetWindowPos(display_size / 2.0f);
}
inline void KeepWindowInside(ImVec2 display_size = GetIO().DisplaySize) { inline void KeepWindowInside(ImVec2 display_size = GetIO().DisplaySize) {
const auto cur_pos = GetWindowPos(); const auto cur_pos = GetWindowPos();
if (cur_pos.x < 0.0f || cur_pos.y < 0.0f) { if (cur_pos.x < 0.0f || cur_pos.y < 0.0f) {

View File

@ -7,6 +7,7 @@
#include <externals/stb_image.h> #include <externals/stb_image.h>
#include "common/assert.h" #include "common/assert.h"
#include "common/config.h"
#include "common/io_file.h" #include "common/io_file.h"
#include "common/polyfill_thread.h" #include "common/polyfill_thread.h"
#include "imgui_impl_vulkan.h" #include "imgui_impl_vulkan.h"
@ -147,6 +148,11 @@ void WorkerLoop() {
g_job_list.pop_front(); g_job_list.pop_front();
g_job_list_mtx.unlock(); g_job_list_mtx.unlock();
if (Config::vkCrashDiagnosticEnabled()) {
// FIXME: Crash diagnostic hangs when building the command buffer here
continue;
}
if (!path.empty()) { // Decode PNG from file if (!path.empty()) { // Decode PNG from file
Common::FS::IOFile file(path, Common::FS::FileAccessMode::Read); Common::FS::IOFile file(path, Common::FS::FileAccessMode::Read);
if (!file.IsOpen()) { if (!file.IsOpen()) {

View File

@ -190,7 +190,7 @@ public:
settingsButton = new QPushButton(centralWidget); settingsButton = new QPushButton(centralWidget);
settingsButton->setFlat(true); settingsButton->setFlat(true);
settingsButton->setIcon(QIcon(":images/settings_icon.png")); settingsButton->setIcon(QIcon(":images/settings_icon.png"));
settingsButton->setIconSize(QSize(40, 40)); settingsButton->setIconSize(QSize(44, 44));
controllerButton = new QPushButton(centralWidget); controllerButton = new QPushButton(centralWidget);
controllerButton->setFlat(true); controllerButton->setFlat(true);
controllerButton->setIcon(QIcon(":images/controller_icon.png")); controllerButton->setIcon(QIcon(":images/controller_icon.png"));

View File

@ -51,6 +51,7 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices, QWidge
: QDialog(parent), ui(new Ui::SettingsDialog) { : QDialog(parent), ui(new Ui::SettingsDialog) {
ui->setupUi(this); ui->setupUi(this);
ui->tabWidgetSettings->setUsesScrollButtons(false); ui->tabWidgetSettings->setUsesScrollButtons(false);
initialHeight = this->height();
const auto config_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); const auto config_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir);
ui->buttonBox->button(QDialogButtonBox::StandardButton::Close)->setFocus(); ui->buttonBox->button(QDialogButtonBox::StandardButton::Close)->setFocus();
@ -268,6 +269,7 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices, QWidge
ui->fullscreenCheckBox->installEventFilter(this); ui->fullscreenCheckBox->installEventFilter(this);
ui->showSplashCheckBox->installEventFilter(this); ui->showSplashCheckBox->installEventFilter(this);
ui->ps4proCheckBox->installEventFilter(this); ui->ps4proCheckBox->installEventFilter(this);
ui->discordRPCCheckbox->installEventFilter(this);
ui->userName->installEventFilter(this); ui->userName->installEventFilter(this);
ui->logTypeGroupBox->installEventFilter(this); ui->logTypeGroupBox->installEventFilter(this);
ui->logFilter->installEventFilter(this); ui->logFilter->installEventFilter(this);
@ -275,7 +277,6 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices, QWidge
ui->GUIgroupBox->installEventFilter(this); ui->GUIgroupBox->installEventFilter(this);
// Input // Input
ui->cursorGroupBox->installEventFilter(this);
ui->hideCursorGroupBox->installEventFilter(this); ui->hideCursorGroupBox->installEventFilter(this);
ui->idleTimeoutGroupBox->installEventFilter(this); ui->idleTimeoutGroupBox->installEventFilter(this);
ui->backButtonBehaviorGroupBox->installEventFilter(this); ui->backButtonBehaviorGroupBox->installEventFilter(this);
@ -361,15 +362,30 @@ void SettingsDialog::LoadValuesFromConfig() {
void SettingsDialog::InitializeEmulatorLanguages() { void SettingsDialog::InitializeEmulatorLanguages() {
QDirIterator it(QStringLiteral(":/translations"), QDirIterator::NoIteratorFlags); QDirIterator it(QStringLiteral(":/translations"), QDirIterator::NoIteratorFlags);
int idx = 0; QVector<QPair<QString, QString>> languagesList;
while (it.hasNext()) { while (it.hasNext()) {
QString locale = it.next(); QString locale = it.next();
locale.truncate(locale.lastIndexOf(QLatin1Char{'.'})); locale.truncate(locale.lastIndexOf(QLatin1Char{'.'}));
locale.remove(0, locale.lastIndexOf(QLatin1Char{'/'}) + 1); locale.remove(0, locale.lastIndexOf(QLatin1Char{'/'}) + 1);
const QString lang = QLocale::languageToString(QLocale(locale).language()); const QString lang = QLocale::languageToString(QLocale(locale).language());
const QString country = QLocale::territoryToString(QLocale(locale).territory()); const QString country = QLocale::territoryToString(QLocale(locale).territory());
ui->emulatorLanguageComboBox->addItem(QStringLiteral("%1 (%2)").arg(lang, country), locale);
QString displayName = QStringLiteral("%1 (%2)").arg(lang, country);
languagesList.append(qMakePair(locale, displayName));
}
std::sort(languagesList.begin(), languagesList.end(),
[](const QPair<QString, QString>& a, const QPair<QString, QString>& b) {
return a.second < b.second;
});
int idx = 0;
for (const auto& pair : languagesList) {
const QString& locale = pair.first;
const QString& displayName = pair.second;
ui->emulatorLanguageComboBox->addItem(displayName, locale);
languages[locale.toStdString()] = idx; languages[locale.toStdString()] = idx;
idx++; idx++;
} }
@ -419,6 +435,8 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) {
text = tr("showSplashCheckBox"); text = tr("showSplashCheckBox");
} else if (elementName == "ps4proCheckBox") { } else if (elementName == "ps4proCheckBox") {
text = tr("ps4proCheckBox"); text = tr("ps4proCheckBox");
} else if (elementName == "discordRPCCheckbox") {
text = tr("discordRPCCheckbox");
} else if (elementName == "userName") { } else if (elementName == "userName") {
text = tr("userName"); text = tr("userName");
} else if (elementName == "logTypeGroupBox") { } else if (elementName == "logTypeGroupBox") {
@ -432,9 +450,7 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) {
} }
// Input // Input
if (elementName == "cursorGroupBox") { if (elementName == "hideCursorGroupBox") {
text = tr("cursorGroupBox");
} else if (elementName == "hideCursorGroupBox") {
text = tr("hideCursorGroupBox"); text = tr("hideCursorGroupBox");
} else if (elementName == "idleTimeoutGroupBox") { } else if (elementName == "idleTimeoutGroupBox") {
text = tr("idleTimeoutGroupBox"); text = tr("idleTimeoutGroupBox");
@ -493,12 +509,19 @@ bool SettingsDialog::eventFilter(QObject* obj, QEvent* event) {
} }
// if the text exceeds the size of the box, it will increase the size // if the text exceeds the size of the box, it will increase the size
QRect currentGeometry = this->geometry();
int newWidth = currentGeometry.width();
int documentHeight = ui->descriptionText->document()->size().height(); int documentHeight = ui->descriptionText->document()->size().height();
int visibleHeight = ui->descriptionText->viewport()->height(); int visibleHeight = ui->descriptionText->viewport()->height();
if (documentHeight > visibleHeight) { if (documentHeight > visibleHeight) {
ui->descriptionText->setMinimumHeight(90); ui->descriptionText->setMaximumSize(16777215, 110);
this->setGeometry(currentGeometry.x(), currentGeometry.y(), newWidth,
currentGeometry.height() + 40);
} else { } else {
ui->descriptionText->setMinimumHeight(70); ui->descriptionText->setMaximumSize(16777215, 70);
this->setGeometry(currentGeometry.x(), currentGeometry.y(), newWidth,
initialHeight);
} }
return true; return true;
} }

View File

@ -40,4 +40,6 @@ private:
std::map<std::string, int> languages; std::map<std::string, int> languages;
QString defaultTextEdit; QString defaultTextEdit;
int initialHeight;
}; };

View File

@ -12,7 +12,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>854</width> <width>854</width>
<height>605</height> <height>630</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
@ -1133,7 +1133,7 @@
<rect> <rect>
<x>100</x> <x>100</x>
<y>360</y> <y>360</y>
<width>80</width> <width>91</width>
<height>24</height> <height>24</height>
</rect> </rect>
</property> </property>
@ -1144,9 +1144,9 @@
<widget class="QPushButton" name="removeFolderButton"> <widget class="QPushButton" name="removeFolderButton">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>210</x> <x>199</x>
<y>360</y> <y>360</y>
<width>80</width> <width>91</width>
<height>24</height> <height>24</height>
</rect> </rect>
</property> </property>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>PS4 Pro هل هو</translation> <translation>PS4 Pro هل هو</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>تفعيل حالة الثراء في ديسكورد</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>مرشح السجل</translation> <translation>مرشح السجل</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>إدخال</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>مؤشر</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>إخفاء المؤشر</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>مهلة إخفاء المؤشر عند الخمول</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>التحكم</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>سلوك زر العودة</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>تمكين وحدة معالجة الرسومات الفارغة</translation> <translation>تمكين وحدة معالجة الرسومات الفارغة</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>المسارات</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>مجلدات اللعبة</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>إضافة...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>إزالة</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>هل هو PS4 Pro:\nيجعل المحاكي يعمل كـ PS4 PRO، مما قد يتيح ميزات خاصة في الألعاب التي تدعمه.</translation> <translation>هل هو PS4 Pro:\nيجعل المحاكي يعمل كـ PS4 PRO، مما قد يتيح ميزات خاصة في الألعاب التي تدعمه.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>تفعيل حالة الثراء في ديسكورد:\nيعرض أيقونة المحاكي ومعلومات ذات صلة على ملفك الشخصي في ديسكورد.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>فلتر السجل: يقوم بتصفية السجل لطباعة معلومات محددة فقط. أمثلة: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" المستويات: Trace, Debug, Info, Warning, Error, Critical - بالترتيب، مستوى محدد يخفي جميع المستويات التي تسبقه ويعرض جميع المستويات بعده.</translation> <translation>فلتر السجل:\nيقوم بتصفية السجل لطباعة معلومات محددة فقط.\nأمثلة: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" المستويات: Trace, Debug, Info, Warning, Error, Critical - بالترتيب، مستوى محدد يخفي جميع المستويات التي تسبقه ويعرض جميع المستويات بعده.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>تشغيل موسيقى العنوان:\nإذا كانت اللعبة تدعم ذلك، قم بتمكين تشغيل موسيقى خاصة عند اختيار اللعبة في واجهة المستخدم.</translation> <translation>تشغيل موسيقى العنوان:\nإذا كانت اللعبة تدعم ذلك، قم بتمكين تشغيل موسيقى خاصة عند اختيار اللعبة في واجهة المستخدم.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>إخفاء المؤشر:\nاختر متى سيختفي المؤشر:\nأبداً: سترى الفأرة دائماً.\اطل: حدد وقتاً لاختفائه بعد أن يكون غير مستخدم.\ائماً: لن ترى الفأرة أبداً.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>حدد وقتاً لاختفاء الفأرة بعد أن تكون غير مستخدم.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>سلوك زر العودة:\nيضبط زر العودة في وحدة التحكم ليحاكي الضغط على الموضع المحدد على لوحة اللمس في PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>أبداً</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>خامل</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>دائماً</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>لوحة اللمس اليسرى</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>لوحة اللمس اليمنى</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>وسط لوحة اللمس</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>لا شيء</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>تمكين GPU الافتراضية:\nلأغراض تصحيح الأخطاء التقنية، يقوم بتعطيل عرض اللعبة كما لو لم يكن هناك بطاقة رسومات.</translation> <translation>تمكين GPU الافتراضية:\nلأغراض تصحيح الأخطاء التقنية، يقوم بتعطيل عرض اللعبة كما لو لم يكن هناك بطاقة رسومات.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>مجلدات اللعبة:\ائمة بالمجلدات للتحقق من الألعاب المثبتة.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>إضافة:\nأضف مجلداً إلى القائمة.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>إزالة:\nأزل مجلداً من القائمة.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Is PS4 Pro</translation> <translation>Is PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Aktiver Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Log Filter</translation> <translation>Log Filter</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Indtastning</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Markør</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Skjul markør</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Timeout for skjul markør ved inaktivitet</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Controller</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Tilbageknap adfærd</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Enable NULL GPU</translation> <translation>Enable NULL GPU</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Stier</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Spilmapper</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Tilføj...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Fjern</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Er det en PS4 Pro:\nGør det muligt for emulatoren at fungere som en PS4 PRO, hvilket kan aktivere visse funktioner i spil, der understøtter det.</translation> <translation>Er det en PS4 Pro:\nGør det muligt for emulatoren at fungere som en PS4 PRO, hvilket kan aktivere visse funktioner i spil, der understøtter det.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Aktiver Discord Rich Presence:\nViser emulatorikonet og relevante oplysninger din Discord-profil.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Logfilter: Filtrerer loggen for kun at udskrive bestemte oplysninger. Eksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Warning, Error, Critical - i rækkefølge, et valgt niveau skjuler alle forudgående niveauer og viser alle efterfølgende niveauer.</translation> <translation>Logfilter:\nFiltrerer loggen for kun at udskrive bestemte oplysninger.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Warning, Error, Critical - i rækkefølge, et valgt niveau skjuler alle forudgående niveauer og viser alle efterfølgende niveauer.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Titelsmusikafspilning:\nHvis spillet understøtter det, aktiver speciel musik, når spillet vælges i brugergrænsefladen.</translation> <translation>Titelsmusikafspilning:\nHvis spillet understøtter det, aktiver speciel musik, når spillet vælges i brugergrænsefladen.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Skjul Cursor:\nVælg hvornår cursoren skal forsvinde:\nAldrig: Du vil altid se musen.\nInaktiv: Indstil en tid for, hvornår den skal forsvinde efter at være inaktiv.\nAltid: du vil aldrig se musen.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Indstil en tid for, at musen skal forsvinde efter at være inaktiv.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Tilbageknap Adfærd:\nIndstiller controllerens tilbageknap til at efterligne tryk den angivne position PS4 berøringsflade.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Aldrig</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Inaktiv</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Altid</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Berøringsplade Venstre</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Berøringsplade Højre</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Berøringsplade Center</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Ingen</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Aktiver virtuel GPU:\nTil teknisk fejlfinding deaktiverer det spilvisning, som om der ikke var et grafikkort.</translation> <translation>Aktiver virtuel GPU:\nTil teknisk fejlfinding deaktiverer det spilvisning, som om der ikke var et grafikkort.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Spilmappen:\nListen over mapper til at tjekke for installerede spil.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Tilføj:\nTilføj en mappe til listen.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Fjern:\nFjern en mappe fra listen.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Ist PS4 Pro</translation> <translation>Ist PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Discord Rich Presence aktivieren</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Log-Filter</translation> <translation>Log-Filter</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Eingabe</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Cursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Cursor ausblenden</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Inaktivitätszeitüberschreitung zum Ausblenden des Cursors</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Controller</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Verhalten der Zurück-Taste</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>NULL GPU aktivieren</translation> <translation>NULL GPU aktivieren</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Pfad</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Spieleordner</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Hinzufügen...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Entfernen</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Ist es eine PS4 Pro:\nErmöglicht es dem Emulator, als PS4 PRO zu arbeiten, was in Spielen, die dies unterstützen, spezielle Funktionen aktivieren kann.</translation> <translation>Ist es eine PS4 Pro:\nErmöglicht es dem Emulator, als PS4 PRO zu arbeiten, was in Spielen, die dies unterstützen, spezielle Funktionen aktivieren kann.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Discord Rich Presence aktivieren:\nZeigt das Emulator-Icon und relevante Informationen in deinem Discord-Profil an.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Protokollfilter: Filtert das Protokoll so, dass nur bestimmte Informationen ausgegeben werden. Beispiele: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Ebenen: Trace, Debug, Info, Warning, Error, Critical - in dieser Reihenfolge, ein ausgewähltes Level blendet alle vorherigen Ebenen aus und zeigt alle nachfolgenden an.</translation> <translation>Protokollfilter:\nFiltert das Protokoll so, dass nur bestimmte Informationen ausgegeben werden.\nBeispiele: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Ebenen: Trace, Debug, Info, Warning, Error, Critical - in dieser Reihenfolge, ein ausgewähltes Level blendet alle vorherigen Ebenen aus und zeigt alle nachfolgenden an.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Wiedergabe der Titelmusik:\nWenn das Spiel dies unterstützt, wird beim Auswählen des Spiels in der Benutzeroberfläche spezielle Musik abgespielt.</translation> <translation>Wiedergabe der Titelmusik:\nWenn das Spiel dies unterstützt, wird beim Auswählen des Spiels in der Benutzeroberfläche spezielle Musik abgespielt.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Maus ausblenden:\nWählen Sie, wann der Cursor verschwinden soll:\nNie: Sie sehen die Maus immer.\nInaktiv: Legen Sie eine Zeit fest, nach der sie nach Inaktivität verschwindet.\nImmer: Sie sehen die Maus niemals.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Stellen Sie eine Zeit ein, nach der die Maus nach Inaktivität verschwinden soll.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Zurück-Button Verhalten:\nStellt die Zurück-Taste des Controllers so ein, dass sie das Antippen der angegebenen Position auf dem PS4-Touchpad emuliert.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Niemals</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Im Leerlauf</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Immer</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Touchpad Links</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Touchpad Rechts</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Touchpad Mitte</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Keine</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Virtuelle GPU aktivieren:\nFür das technische Debugging deaktiviert es die Spielanzeige, als ob keine Grafikkarte vorhanden wäre.</translation> <translation>Virtuelle GPU aktivieren:\nFür das technische Debugging deaktiviert es die Spielanzeige, als ob keine Grafikkarte vorhanden wäre.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Spieleordner:\nDie Liste der Ordner, in denen nach installierten Spielen gesucht wird.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Hinzufügen:\nFügen Sie einen Ordner zur Liste hinzu.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Entfernen:\nEntfernen Sie einen Ordner aus der Liste.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Is PS4 Pro</translation> <translation>Is PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Ενεργοποίηση Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Log Filter</translation> <translation>Log Filter</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Είσοδος</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Δείκτης</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Απόκρυψη δείκτη</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Χρόνος αδράνειας απόκρυψης δείκτη</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Controller</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Συμπεριφορά κουμπιού επιστροφής</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Enable NULL GPU</translation> <translation>Enable NULL GPU</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Διαδρομές</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Φάκελοι παιχνιδιών</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Προσθήκη...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Αφαίρεση</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Είναι PS4 Pro:\nΕπιτρέπει στον εξομοιωτή να λειτουργεί σαν PS4 PRO, κάτι που μπορεί να ενεργοποιήσει συγκεκριμένες λειτουργίες σε παιχνίδια που το υποστηρίζουν.</translation> <translation>Είναι PS4 Pro:\nΕπιτρέπει στον εξομοιωτή να λειτουργεί σαν PS4 PRO, κάτι που μπορεί να ενεργοποιήσει συγκεκριμένες λειτουργίες σε παιχνίδια που το υποστηρίζουν.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Ενεργοποίηση Discord Rich Presence:\nΕμφανίζει το εικονίδιο του emulator και σχετικές πληροφορίες στο προφίλ σας στο Discord.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Φίλτρο Καταγραφής: Φιλτράρει τις καταγραφές ώστε να εκτυπώνονται μόνο συγκεκριμένες πληροφορίες. Παραδείγματα: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Επίπεδα: Trace, Debug, Info, Warning, Error, Critical - με τη σειρά αυτή, κάθε επίπεδο που επιλέγεται αποκλείει τα προηγούμενα και εμφανίζει τα επόμενα επίπεδα.</translation> <translation>Φίλτρο Καταγραφής:\nΦιλτράρει τις καταγραφές ώστε να εκτυπώνονται μόνο συγκεκριμένες πληροφορίες.\nΠαραδείγματα: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Επίπεδα: Trace, Debug, Info, Warning, Error, Critical - με τη σειρά αυτή, κάθε επίπεδο που επιλέγεται αποκλείει τα προηγούμενα και εμφανίζει τα επόμενα επίπεδα.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Αναπαραγωγή Μουσικής Τίτλων:\nΕάν το παιχνίδι το υποστηρίζει, ενεργοποιεί ειδική μουσική κατά την επιλογή του παιχνιδιού από τη διεπαφή χρήστη.</translation> <translation>Αναπαραγωγή Μουσικής Τίτλων:\nΕάν το παιχνίδι το υποστηρίζει, ενεργοποιεί ειδική μουσική κατά την επιλογή του παιχνιδιού από τη διεπαφή χρήστη.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Απόκρυψη Κέρσορα:\nΕπιλέξτε πότε θα εξαφανιστεί ο κέρσορας:\οτέ: θα βλέπετε πάντα το ποντίκι.\nΑδρανές: ορίστε έναν χρόνο για να εξαφανιστεί μετά από αδράνεια.\nΠάντα: δεν θα δείτε ποτέ το ποντίκι.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Ορίστε έναν χρόνο για να εξαφανιστεί το ποντίκι μετά από αδράνεια.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Συμπεριφορά Κουμπιού Επιστροφής:\nΟρίζει το κουμπί επιστροφής του ελεγκτή να προσομοιώνει το πάτημα της καθορισμένης θέσης στην οθόνη αφής PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Ποτέ</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Αδρανής</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Πάντα</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Touchpad Αριστερά</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Touchpad Δεξιά</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Κέντρο Touchpad</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Κανένα</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Ενεργοποίηση Εικονικής GPU:\ια τεχνικό εντοπισμό σφαλμάτων, απενεργοποιεί την εμφάνιση του παιχνιδιού σαν να μην υπάρχει κάρτα γραφικών.</translation> <translation>Ενεργοποίηση Εικονικής GPU:\ια τεχνικό εντοπισμό σφαλμάτων, απενεργοποιεί την εμφάνιση του παιχνιδιού σαν να μην υπάρχει κάρτα γραφικών.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Φάκελοι Παιχνιδιών:\nΗ λίστα των φακέλων για έλεγχο των εγκατεστημένων παιχνιδιών.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Προσθήκη:\ροσθέστε έναν φάκελο στη λίστα.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Αφαίρεση:\nΑφαιρέστε έναν φάκελο από τη λίστα.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Is PS4 Pro</translation> <translation>Is PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Enable Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -454,11 +459,6 @@
<source>Hide Cursor Idle Timeout</source> <source>Hide Cursor Idle Timeout</source>
<translation>Hide Cursor Idle Timeout</translation> <translation>Hide Cursor Idle Timeout</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Input</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="767"/> <location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source> <source>Controller</source>
@ -509,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Enable NULL GPU</translation> <translation>Enable NULL GPU</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Paths</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Game Folders</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Add...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Remove</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -1033,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Is PS4 Pro:\nMakes the emulator act as a PS4 PRO, which may enable special features in games that support it.</translation> <translation>Is PS4 Pro:\nMakes the emulator act as a PS4 PRO, which may enable special features in games that support it.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1046,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Log Filter: Filters the log to only print specific information. Examples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it.</translation> <translation>Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1059,20 +1084,20 @@
<translation>Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI.</translation> <translation>Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="392"/> <location filename="../settings_dialog.cpp" line="450"/>
<source>cursorGroupBox</source>
<translation>Cursor:\nChange settings related to the cursor.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="394"/>
<source>hideCursorGroupBox</source> <source>hideCursorGroupBox</source>
<translation>Hide Cursor:\nSet cursor hiding behavior.</translation> <translation>Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="396"/> <location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source> <source>idleTimeoutGroupBox</source>
<translation>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</translation> <translation>Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="70"/> <location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source> <source>Never</source>
@ -1088,16 +1113,6 @@
<source>Always</source> <source>Always</source>
<translation>Always</translation> <translation>Always</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="330"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Back Button Behavior:\nAllows setting which part of the touchpad the back button will emulate a touch on.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="330"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Back Button Behavior:\nAllows setting which part of the touchpad the back button will emulate a touch on.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="101"/> <location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source> <source>Touchpad Left</source>
@ -1146,17 +1161,17 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="465"/> <location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source> <source>gameFoldersBox</source>
<translation>Game Folders: The list of folders to check for installed games.</translation> <translation>Game Folders:\nThe list of folders to check for installed games.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="465"/> <location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source> <source>addFolderButton</source>
<translation>Add: Add a folder to the list.</translation> <translation>Add:\nAdd a folder to the list.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="465"/> <location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source> <source>removeFolderButton</source>
<translation>Remove: Remove a folder from the list.</translation> <translation>Remove:\nRemove a folder from the list.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Modo PS4 Pro</translation> <translation>Modo PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Habilitar Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Filtro de registro</translation> <translation>Filtro de registro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Entrada</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Cursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Ocultar cursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Tiempo de espera para ocultar cursor inactivo</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Controlador</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Comportamiento del botón de retroceso</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Habilitar GPU NULL</translation> <translation>Habilitar GPU NULL</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Rutas</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Carpetas de juego</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Añadir...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Eliminar</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Es PS4 Pro:\nHace que el emulador actúe como una PS4 PRO, lo que puede habilitar funciones especiales en los juegos que lo admitan.</translation> <translation>Es PS4 Pro:\nHace que el emulador actúe como una PS4 PRO, lo que puede habilitar funciones especiales en los juegos que lo admitan.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Habilitar Discord Rich Presence:\nMuestra el ícono del emulador y la información relevante en tu perfil de Discord.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Filtro de Registro: Filtra el registro para imprimir solo información específica. Ejemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveles: Trace, Debug, Info, Warning, Error, Critical - en este orden, un nivel específico silencia todos los niveles anteriores en la lista y registra cada nivel posterior.</translation> <translation>Filtro de Registro:\nFiltra el registro para imprimir solo información específica.\nEjemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveles: Trace, Debug, Info, Warning, Error, Critical - en este orden, un nivel específico silencia todos los niveles anteriores en la lista y registra cada nivel posterior.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Reproducir Música del Título:\nSi un juego lo admite, habilita la reproducción de música especial al seleccionar el juego en la interfaz gráfica.</translation> <translation>Reproducir Música del Título:\nSi un juego lo admite, habilita la reproducción de música especial al seleccionar el juego en la interfaz gráfica.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Ocultar Cursor:\nElija cuándo desaparecerá el cursor:\nNunca: Siempre verá el mouse.\nInactivo: Establezca un tiempo para que desaparezca después de estar inactivo.\nSiempre: nunca verá el mouse.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Establezca un tiempo para que el mouse desaparezca después de estar inactivo.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Comportamiento del Botón Atrás:\nEstablece el botón atrás del controlador para emular el toque en la posición especificada en el touchpad del PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Nunca</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Inactivo</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Siempre</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Touchpad Izquierda</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Touchpad Derecha</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Centro del Touchpad</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Ninguno</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Habilitar GPU Nula:\nPor el bien de la depuración técnica, desactiva el renderizado del juego como si no hubiera tarjeta gráfica.</translation> <translation>Habilitar GPU Nula:\nPor el bien de la depuración técnica, desactiva el renderizado del juego como si no hubiera tarjeta gráfica.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Carpetas de Juegos:\nLa lista de carpetas para verificar los juegos instalados.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Añadir:\nAgregar una carpeta a la lista.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Eliminar:\nEliminar una carpeta de la lista.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>PS4 Pro حالت</translation> <translation>PS4 Pro حالت</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Discord Rich Presence را فعال کنید</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Log فیلتر</translation> <translation>Log فیلتر</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>ورودی</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>نشانگر</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>پنهان کردن نشانگر</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>مخفی کردن زمان توقف مکان نما</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>کنترل کننده</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>رفتار دکمه بازگشت</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>NULL GPU فعال کردن</translation> <translation>NULL GPU فعال کردن</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>مسیرها</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>پوشه های بازی</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>افزودن...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>حذف</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Is PS4 Pro:\nMakes the emulator act as a PS4 PRO, which may enable special features in games that support it.</translation> <translation>Is PS4 Pro:\nMakes the emulator act as a PS4 PRO, which may enable special features in games that support it.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>فعال کردن Discord Rich Presence:\nآیکون شبیه ساز و اطلاعات مربوطه را در نمایه Discord شما نمایش می دهد.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Log Filter: Filters the log to only print specific information. Examples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it.</translation> <translation>Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI.</translation> <translation>Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>پنهان کردن نشانگر:\nانتخاب کنید که نشانگر چه زمانی ناپدید شود:\nهرگز: شما همیشه ماوس را خواهید دید.\nغیرفعال: زمانی را برای ناپدید شدن بعد از غیرفعالی تعیین کنید.\nهمیشه: شما هرگز ماوس را نخواهید دید.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>زمانی را برای ناپدید شدن ماوس بعد از غیرفعالی تعیین کنید.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>رفتار دکمه برگشت:\nدکمه برگشت کنترلر را طوری تنظیم می کند که ضربه زدن روی موقعیت مشخص شده روی صفحه لمسی PS4 را شبیه سازی کند.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>هرگز</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>بیکار</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>همیشه</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>پد لمسی سمت چپ</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>صفحه لمسی سمت راست</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>مرکز تاچ پد</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>هیچ کدام</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card.</translation> <translation>Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>پوشه های بازی:\nلیست پوشه هایی که باید بازی های نصب شده را بررسی کنید.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>اضافه کردن:\nیک پوشه به لیست اضافه کنید.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>حذف:\nیک پوشه را از لیست حذف کنید.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Is PS4 Pro</translation> <translation>Is PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Ota käyttöön Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Log Filter</translation> <translation>Log Filter</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Syöttö</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Kursori</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Piilota kursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Inaktiivisuuden aikaraja kursorin piilottamiselle</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Ohjain</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Takaisin-painikkeen käyttäytyminen</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Enable NULL GPU</translation> <translation>Enable NULL GPU</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Polut</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Pelihakemistot</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Lisää...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Poista</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Onko PS4 Pro:\nAsettaa emulaattorin toimimaan PS4 PRO:na, mikä voi mahdollistaa erityisiä ominaisuuksia peleissä, jotka tukevat sitä.</translation> <translation>Onko PS4 Pro:\nAsettaa emulaattorin toimimaan PS4 PRO:na, mikä voi mahdollistaa erityisiä ominaisuuksia peleissä, jotka tukevat sitä.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Ota käyttöön Discord Rich Presence:\nNäyttää emulaattorin kuvakkeen ja asiaankuuluvat tiedot Discord-profiilissasi.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Lokifiltteri: Suodattaa lokia tulostamaan vain erityistä tietoa. Esimerkkejä: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Tasot: Jälki, Virheenkorjaus, Tieto, Varoitus, Virhe, Kriittinen - tällä järjestyksellä, tietty taso vaientaa kaikki edeltävät tasot luettelossa ja kirjaa kaikki tasot sen jälkeen.</translation> <translation>Lokifiltteri:\nSuodattaa lokia tulostamaan vain erityistä tietoa.\nEsimerkkejä: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Tasot: Jälki, Virheenkorjaus, Tieto, Varoitus, Virhe, Kriittinen - tällä järjestyksellä, tietty taso vaientaa kaikki edeltävät tasot luettelossa ja kirjaa kaikki tasot sen jälkeen.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Soita Otsikkomusiikkia:\nJos peli tukee sitä, ota käyttöön erityisen musiikin soittaminen pelin valinnan yhteydessä käyttöliittymässä.</translation> <translation>Soita Otsikkomusiikkia:\nJos peli tukee sitä, ota käyttöön erityisen musiikin soittaminen pelin valinnan yhteydessä käyttöliittymässä.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Piilota kursori:\nValitse, milloin kursori häviää:\nEi koskaan: Näet hiiren aina.\nAktiivinen: Aseta aika, jolloin se häviää oltuaan aktiivinen.\nAina: et koskaan näe hiirtä.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Aseta aika, jolloin hiiri häviää oltuaan aktiivinen.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Takaisin-napin käyttäytyminen:\nAsettaa ohjaimen takaisin-napin jäljittelemään kosketusta PS4:n kosketuslevyn määritettyyn kohtaan.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Ei koskaan</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Odotustila</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation> aina</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Kosketuslevy Vasemmalla</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Kosketuslevy Oikealla</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Kosketuslevy Keskellä</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Ei mitään</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Ota Null GPU käyttöön:\nTeknistä vianetsintää varten pelin renderöinti estetään niin, että ikään kuin grafiikkakorttia ei olisi.</translation> <translation>Ota Null GPU käyttöön:\nTeknistä vianetsintää varten pelin renderöinti estetään niin, että ikään kuin grafiikkakorttia ei olisi.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Pelihakemistot:\nLuettelo hakemistoista asennettujen pelien tarkistamiseksi.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Lisää:\nLisää hakemisto luetteloon.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Poista:\nPoista hakemisto luettelosta.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Mode PS4 Pro</translation> <translation>Mode PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Activer Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Filtre</translation> <translation>Filtre</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Entrée</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Curseur</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Masquer le curseur</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Délai d'inactivité pour masquer le curseur</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Manette</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Comportement du bouton retour</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>NULL GPU</translation> <translation>NULL GPU</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Chemins</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Dossiers de jeu</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Ajouter...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Supprimer</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -580,7 +635,7 @@
<message> <message>
<location filename="../main_window.cpp" line="549"/> <location filename="../main_window.cpp" line="549"/>
<source>Games: </source> <source>Games: </source>
<translation>Jeux : </translation> <translation>Jeux: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="575"/> <location filename="../main_window.cpp" line="575"/>
@ -615,7 +670,7 @@
<message> <message>
<location filename="../main_window.cpp" line="646"/> <location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source> <source>PKG and Game versions match: </source>
<translation>Les versions PKG et jeu correspondent : </translation> <translation>Les versions PKG et jeu correspondent: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="647"/> <location filename="../main_window.cpp" line="647"/>
@ -625,17 +680,17 @@
<message> <message>
<location filename="../main_window.cpp" line="639"/> <location filename="../main_window.cpp" line="639"/>
<source>PKG Version %1 is older than installed version: </source> <source>PKG Version %1 is older than installed version: </source>
<translation>La version PKG %1 est plus ancienne que la version installée : </translation> <translation>La version PKG %1 est plus ancienne que la version installée: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="660"/> <location filename="../main_window.cpp" line="660"/>
<source>Game is installed: </source> <source>Game is installed: </source>
<translation>Jeu installé : </translation> <translation>Jeu installé: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="660"/> <location filename="../main_window.cpp" line="660"/>
<source>Would you like to install Patch: </source> <source>Would you like to install Patch: </source>
<translation>Souhaitez-vous installer le patch : </translation> <translation>Souhaitez-vous installer le patch: </translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="673"/> <location filename="../main_window.cpp" line="673"/>
@ -645,12 +700,12 @@
<message> <message>
<location filename="../main_window.cpp" line="674"/> <location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source> <source>Would you like to install DLC: %1?</source>
<translation>Souhaitez-vous installer le DLC : %1 ?</translation> <translation>Souhaitez-vous installer le DLC: %1 ?</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="688"/> <location filename="../main_window.cpp" line="688"/>
<source>DLC already installed:</source> <source>DLC already installed:</source>
<translation>DLC déjà installé :</translation> <translation>DLC déjà installé:</translation>
</message> </message>
<message> <message>
<location filename="../main_window.cpp" line="701"/> <location filename="../main_window.cpp" line="701"/>
@ -698,7 +753,7 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="50"/> <location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source> <source>defaultTextEdit_MSG</source>
<translation>Les Cheats/Patchs sont expérimentaux.\nUtilisez-les avec précaution.\n\nTéléchargez les Cheats individuellement en sélectionnant le dépôt et en cliquant sur le bouton de téléchargement.\nDans l'onglet Patchs, vous pouvez télécharger tous les patchs en une seule fois, choisir lesquels vous souhaitez utiliser et enregistrer votre sélection.\n\nComme nous ne développons pas les Cheats/Patches,\nmerci de signaler les problèmes à l'auteur du Cheat.\n\nVous avez créé un nouveau cheat ? Visitez :\nhttps://github.com/shadps4-emu/ps4_cheats</translation> <translation>Les Cheats/Patchs sont expérimentaux.\nUtilisez-les avec précaution.\n\nTéléchargez les Cheats individuellement en sélectionnant le dépôt et en cliquant sur le bouton de téléchargement.\nDans l'onglet Patchs, vous pouvez télécharger tous les patchs en une seule fois, choisir lesquels vous souhaitez utiliser et enregistrer votre sélection.\n\nComme nous ne développons pas les Cheats/Patches,\nmerci de signaler les problèmes à l'auteur du Cheat.\n\nVous avez créé un nouveau cheat ? Visitez:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="69"/> <location filename="../cheats_patches.cpp" line="69"/>
@ -708,27 +763,27 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="79"/> <location filename="../cheats_patches.cpp" line="79"/>
<source>Serial: </source> <source>Serial: </source>
<translation>Série : </translation> <translation>Série: </translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="83"/> <location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source> <source>Version: </source>
<translation>Version : </translation> <translation>Version: </translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="87"/> <location filename="../cheats_patches.cpp" line="87"/>
<source>Size: </source> <source>Size: </source>
<translation>Taille : </translation> <translation>Taille: </translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="126"/> <location filename="../cheats_patches.cpp" line="126"/>
<source>Select Cheat File:</source> <source>Select Cheat File:</source>
<translation>Sélectionner le fichier de Cheat :</translation> <translation>Sélectionner le fichier de Cheat:</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="133"/> <location filename="../cheats_patches.cpp" line="133"/>
<source>Repository:</source> <source>Repository:</source>
<translation>Dépôt :</translation> <translation>Dépôt:</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="149"/> <location filename="../cheats_patches.cpp" line="149"/>
@ -758,7 +813,7 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="213"/> <location filename="../cheats_patches.cpp" line="213"/>
<source>Select Patch File:</source> <source>Select Patch File:</source>
<translation>Sélectionner le fichier de patch :</translation> <translation>Sélectionner le fichier de patch:</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="241"/> <location filename="../cheats_patches.cpp" line="241"/>
@ -813,7 +868,7 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="432"/> <location filename="../cheats_patches.cpp" line="432"/>
<source>Failed to parse XML: </source> <source>Failed to parse XML: </source>
<translation>Échec de l'analyse XML : </translation> <translation>Échec de l'analyse XML: </translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="434"/> <location filename="../cheats_patches.cpp" line="434"/>
@ -848,12 +903,12 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="539"/> <location filename="../cheats_patches.cpp" line="539"/>
<source>Failed to save file:</source> <source>Failed to save file:</source>
<translation>Échec de l'enregistrement du fichier :</translation> <translation>Échec de l'enregistrement du fichier:</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="545"/> <location filename="../cheats_patches.cpp" line="545"/>
<source>Failed to download file:</source> <source>Failed to download file:</source>
<translation>Échec du téléchargement du fichier :</translation> <translation>Échec du téléchargement du fichier:</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="556"/> <location filename="../cheats_patches.cpp" line="556"/>
@ -878,12 +933,12 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="747"/> <location filename="../cheats_patches.cpp" line="747"/>
<source>Failed to save:</source> <source>Failed to save:</source>
<translation>Échec de l'enregistrement :</translation> <translation>Échec de l'enregistrement:</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="754"/> <location filename="../cheats_patches.cpp" line="754"/>
<source>Failed to download:</source> <source>Failed to download:</source>
<translation>Échec du téléchargement :</translation> <translation>Échec du téléchargement:</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="762"/> <location filename="../cheats_patches.cpp" line="762"/>
@ -908,12 +963,12 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="801"/> <location filename="../cheats_patches.cpp" line="801"/>
<source>Failed to open file:</source> <source>Failed to open file:</source>
<translation>Échec de l'ouverture du fichier :</translation> <translation>Échec de l'ouverture du fichier:</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="819"/> <location filename="../cheats_patches.cpp" line="819"/>
<source>XML ERROR:</source> <source>XML ERROR:</source>
<translation>Erreur XML :</translation> <translation>Erreur XML:</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="826"/> <location filename="../cheats_patches.cpp" line="826"/>
@ -923,12 +978,12 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="925"/> <location filename="../cheats_patches.cpp" line="925"/>
<source>Author: </source> <source>Author: </source>
<translation>Auteur : </translation> <translation>Auteur: </translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="997"/> <location filename="../cheats_patches.cpp" line="997"/>
<source>Directory does not exist:</source> <source>Directory does not exist:</source>
<translation>Répertoire n'existe pas :</translation> <translation>Répertoire n'existe pas:</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="1006"/> <location filename="../cheats_patches.cpp" line="1006"/>
@ -938,7 +993,7 @@
<message> <message>
<location filename="../cheats_patches.cpp" line="1006"/> <location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source> <source>Name:</source>
<translation>Nom :</translation> <translation>Nom:</translation>
</message> </message>
<message> <message>
<location filename="../cheats_patches.cpp" line="1163"/> <location filename="../cheats_patches.cpp" line="1163"/>
@ -976,97 +1031,167 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="289"/> <location filename="../settings_dialog.cpp" line="289"/>
<source>consoleLanguageGroupBox</source> <source>consoleLanguageGroupBox</source>
<translation>Langue de la console :\nDéfinit la langue utilisée par le jeu PS4.\nIl est recommandé de le définir sur une langue que le jeu prend en charge, ce qui variera selon la région.</translation> <translation>Langue de la console:\nDéfinit la langue utilisée par le jeu PS4.\nIl est recommandé de le définir sur une langue que le jeu prend en charge, ce qui variera selon la région.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="291"/> <location filename="../settings_dialog.cpp" line="291"/>
<source>emulatorLanguageGroupBox</source> <source>emulatorLanguageGroupBox</source>
<translation>Langue de l'émulateur :\nDéfinit la langue de l'interface utilisateur de l'émulateur.</translation> <translation>Langue de l'émulateur:\nDéfinit la langue de l'interface utilisateur de l'émulateur.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="293"/> <location filename="../settings_dialog.cpp" line="293"/>
<source>fullscreenCheckBox</source> <source>fullscreenCheckBox</source>
<translation>Activer le mode plein écran :\nMet automatiquement la fenêtre du jeu en mode plein écran.\nCela peut être activé en appuyant sur la touche F11.</translation> <translation>Activer le mode plein écran:\nMet automatiquement la fenêtre du jeu en mode plein écran.\nCela peut être activé en appuyant sur la touche F11.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="295"/> <location filename="../settings_dialog.cpp" line="295"/>
<source>showSplashCheckBox</source> <source>showSplashCheckBox</source>
<translation>Afficher l'écran de démarrage :\nAffiche l'écran de démarrage du jeu (une image spéciale) lors du démarrage du jeu.</translation> <translation>Afficher l'écran de démarrage:\nAffiche l'écran de démarrage du jeu (une image spéciale) lors du démarrage du jeu.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="297"/> <location filename="../settings_dialog.cpp" line="297"/>
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Est-ce un PS4 Pro :\nFait en sorte que l'émulateur se comporte comme un PS4 PRO, ce qui peut activer des fonctionnalités spéciales dans les jeux qui le prennent en charge.</translation> <translation>Est-ce un PS4 Pro:\nFait en sorte que l'émulateur se comporte comme un PS4 PRO, ce qui peut activer des fonctionnalités spéciales dans les jeux qui le prennent en charge.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Activer Discord Rich Presence:\nAffiche l'icône de l'émulateur et les informations pertinentes sur votre profil Discord.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
<translation>Nom d'utilisateur :\nDéfinit le nom d'utilisateur du compte PS4, qui peut être affiché par certains jeux.</translation> <translation>Nom d'utilisateur:\nDéfinit le nom d'utilisateur du compte PS4, qui peut être affiché par certains jeux.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="301"/> <location filename="../settings_dialog.cpp" line="301"/>
<source>logTypeGroupBox</source> <source>logTypeGroupBox</source>
<translation>Type de journal :\nDétermine si la sortie de la fenêtre de journalisation est synchronisée pour des raisons de performance. Cela peut avoir un impact négatif sur l'émulation.</translation> <translation>Type de journal:\nDétermine si la sortie de la fenêtre de journalisation est synchronisée pour des raisons de performance. Cela peut avoir un impact négatif sur l'émulation.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Filtre de journal : n'imprime que des informations spécifiques. Exemples : "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaux : Trace, Debug, Info, Avertissement, Erreur, Critique - dans cet ordre, un niveau particulier désactive tous les niveaux précédents de la liste et enregistre tous les niveaux suivants.</translation> <translation>Filtre de journal:\n n'imprime que des informations spécifiques.\nExemples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaux: Trace, Debug, Info, Avertissement, Erreur, Critique - dans cet ordre, un niveau particulier désactive tous les niveaux précédents de la liste et enregistre tous les niveaux suivants.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
<source>updaterGroupBox</source> <source>updaterGroupBox</source>
<translation>Mise à jour :\nRelease: versions officielles publiées chaque mois qui peuvent être très anciennes, mais plus fiables et testées.\nNightly: versions de développement avec toutes les dernières fonctionnalités et correctifs, mais pouvant avoir des bogues et être moins stables.</translation> <translation>Mise à jour:\nRelease: versions officielles publiées chaque mois qui peuvent être très anciennes, mais plus fiables et testées.\nNightly: versions de développement avec toutes les dernières fonctionnalités et correctifs, mais pouvant avoir des bogues et être moins stables.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="306"/> <location filename="../settings_dialog.cpp" line="306"/>
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Jouer de la musique de titre :\nSi le jeu le prend en charge, cela active la musique spéciale lorsque vous sélectionnez le jeu dans l'interface utilisateur.</translation> <translation>Jouer de la musique de titre:\nSi le jeu le prend en charge, cela active la musique spéciale lorsque vous sélectionnez le jeu dans l'interface utilisateur.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Masquer le curseur:\nChoisissez quand le curseur disparaîtra:\nJamais: Vous verrez toujours la souris.\nInactif: Définissez un temps pour qu'il disparaisse après inactivité.\nToujours: vous ne verrez jamais la souris.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Définissez un temps pour que la souris disparaisse après être inactif.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Comportement du bouton retour:\nDéfinit le bouton de retour de la manette pour imiter le toucher de la position spécifiée sur le pavé tactile PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Jamais</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Inactif</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Toujours</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Pavé Tactile Gauche</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Pavé Tactile Droit</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Centre du Pavé Tactile</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Aucun</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
<translation>Adaptateur graphique :\nSélectionnez le GPU que l'émulateur utilisera dans les systèmes multi-GPU à partir de la liste déroulante,\nou choisissez "Auto Select" pour le déterminer automatiquement.</translation> <translation>Adaptateur graphique:\nSélectionnez le GPU que l'émulateur utilisera dans les systèmes multi-GPU à partir de la liste déroulante,\nou choisissez "Auto Select" pour le déterminer automatiquement.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="314"/> <location filename="../settings_dialog.cpp" line="314"/>
<source>resolutionLayout</source> <source>resolutionLayout</source>
<translation>Largeur/Hauteur :\nDéfinit la taille de la fenêtre de l'émulateur au démarrage, qui peut être redimensionnée pendant le jeu.\nCela diffère de la résolution interne du jeu.</translation> <translation>Largeur/Hauteur:\nDéfinit la taille de la fenêtre de l'émulateur au démarrage, qui peut être redimensionnée pendant le jeu.\nCela diffère de la résolution interne du jeu.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="318"/> <location filename="../settings_dialog.cpp" line="318"/>
<source>heightDivider</source> <source>heightDivider</source>
<translation>Diviseur Vblank :\nLe taux de rafraîchissement de l'émulateur est multiplié par ce nombre. Changer cela peut avoir des effets négatifs, tels qu'une augmentation de la vitesse du jeu ou la rupture de fonctionnalités critiques du jeu qui ne s'attendent pas à ce changement !</translation> <translation>Diviseur Vblank:\nLe taux de rafraîchissement de l'émulateur est multiplié par ce nombre. Changer cela peut avoir des effets négatifs, tels qu'une augmentation de la vitesse du jeu ou la rupture de fonctionnalités critiques du jeu qui ne s'attendent pas à ce changement !</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="320"/> <location filename="../settings_dialog.cpp" line="320"/>
<source>dumpShadersCheckBox</source> <source>dumpShadersCheckBox</source>
<translation>Activer l'exportation de shaders :\nPour le débogage technique, les shaders du jeu sont enregistrés dans un dossier lors du rendu.</translation> <translation>Activer l'exportation de shaders:\nPour le débogage technique, les shaders du jeu sont enregistrés dans un dossier lors du rendu.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="322"/> <location filename="../settings_dialog.cpp" line="322"/>
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Activer le GPU nul :\nPour le débogage technique, désactive le rendu du jeu comme s'il n'y avait pas de carte graphique.</translation> <translation>Activer le GPU nul:\nPour le débogage technique, désactive le rendu du jeu comme s'il n'y avait pas de carte graphique.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Dossiers de jeux:\nLa liste des dossiers à vérifier pour les jeux installés.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Ajouter:\nAjouter un dossier à la liste.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Supprimer:\nSupprimer un dossier de la liste.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>
<translation>Activer l'exportation de débogage :\nEnregistre les symboles d'importation et d'exportation et les informations d'en-tête du fichier du programme PS4 actuel dans un répertoire.</translation> <translation>Activer l'exportation de débogage:\nEnregistre les symboles d'importation et d'exportation et les informations d'en-tête du fichier du programme PS4 actuel dans un répertoire.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="331"/> <location filename="../settings_dialog.cpp" line="331"/>
<source>vkValidationCheckBox</source> <source>vkValidationCheckBox</source>
<translation>Activer les couches de validation Vulkan :\nActive un système qui valide l'état du rendu Vulkan et enregistre des informations sur son état interne. Cela réduit les performances et peut changer le comportement de l'émulation.</translation> <translation>Activer les couches de validation Vulkan:\nActive un système qui valide l'état du rendu Vulkan et enregistre des informations sur son état interne. Cela réduit les performances et peut changer le comportement de l'émulation.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="333"/> <location filename="../settings_dialog.cpp" line="333"/>
<source>vkSyncValidationCheckBox</source> <source>vkSyncValidationCheckBox</source>
<translation>Activer la validation de synchronisation Vulkan :\nActive un système qui valide la planification des tâches de rendu Vulkan. Cela réduit les performances et peut changer le comportement de l'émulation.</translation> <translation>Activer la validation de synchronisation Vulkan:\nActive un système qui valide la planification des tâches de rendu Vulkan. Cela réduit les performances et peut changer le comportement de l'émulation.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="335"/> <location filename="../settings_dialog.cpp" line="335"/>
<source>rdocCheckBox</source> <source>rdocCheckBox</source>
<translation>Activer le débogage RenderDoc :\nS'il est activé, l'émulateur fournit une compatibilité avec Renderdoc, permettant d'enregistrer et d'analyser la trame rendue actuelle.</translation> <translation>Activer le débogage RenderDoc:\nS'il est activé, l'émulateur fournit une compatibilité avec Renderdoc, permettant d'enregistrer et d'analyser la trame rendue actuelle.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -1132,7 +1257,7 @@
<message> <message>
<location filename="../check_update.cpp" line="64"/> <location filename="../check_update.cpp" line="64"/>
<source>Network error:</source> <source>Network error:</source>
<translation>Erreur réseau :</translation> <translation>Erreur réseau:</translation>
</message> </message>
<message> <message>
<location filename="../check_update.cpp" line="73"/> <location filename="../check_update.cpp" line="73"/>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>PS4 Pro</translation> <translation>PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Engedélyezze a Discord Rich Presence-t</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Naplózási Filter</translation> <translation>Naplózási Filter</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Bemenet</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Kurzor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Kurzor elrejtése</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Kurzor inaktivitási időtúllépés</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Kontroller</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Vissza gomb viselkedése</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>NULL GPU Engedélyezése</translation> <translation>NULL GPU Engedélyezése</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Útvonalak</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Játékmappák</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Hozzáadás...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Eltávolítás</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>PS4 Pro:\nAz emulátort PS4 PRO-ként kezeli, ami engedélyezheti a speciális funkciókat olyan játékokban, amelyek támogatják.</translation> <translation>PS4 Pro:\nAz emulátort PS4 PRO-ként kezeli, ami engedélyezheti a speciális funkciókat olyan játékokban, amelyek támogatják.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Engedélyezze a Discord Rich Presence-t:\nMegjeleníti az emulator ikonját és a kapcsolódó információkat a Discord profilján.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Napló szűrő: Csak bizonyos információk megjelenítésére szűri a naplót. Példák: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Szintek: Trace, Debug, Info, Warning, Error, Critical - ebben a sorrendben, egy konkrét szint elnémítja az előtte lévő összes szintet, és naplózza az utána következő szinteket.</translation> <translation>Napló szűrő:\nCsak bizonyos információk megjelenítésére szűri a naplót.\nPéldák: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Szintek: Trace, Debug, Info, Warning, Error, Critical - ebben a sorrendben, egy konkrét szint elnémítja az előtte lévő összes szintet, és naplózza az utána következő szinteket.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Játék címzene lejátszása:\nHa a játék támogatja, engedélyezze a speciális zene lejátszását, amikor a játékot kiválasztja a GUI-ban.</translation> <translation>Játék címzene lejátszása:\nHa a játék támogatja, engedélyezze a speciális zene lejátszását, amikor a játékot kiválasztja a GUI-ban.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Akurátor elrejtése:\nVálassza ki, mikor tűnjön el az egérkurzor:\nSoha: Az egér mindig látható.\nInaktív: Állítson be egy időt, amikor inaktív állapotban eltűnik.\nMindig: soha nem látja az egeret.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Állítson be egy időt, ameddig az egér inaktív állapot után eltűnik.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Vissza gomb viselkedés:\nBeállítja a vezérlő vissza gombját, hogy utánozza a PS4 érintőpadján megadott pozíció megérintését.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Soha</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Inaktív</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Mindig</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Érintőpad Balra</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Érintőpad Jobbra</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Érintőpad Középen</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Semmi</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Null GPU engedélyezése:\nMűszaki hibaelhárítás céljából letiltja a játék renderelését, mintha nem lenne grafikus kártya.</translation> <translation>Null GPU engedélyezése:\nMűszaki hibaelhárítás céljából letiltja a játék renderelését, mintha nem lenne grafikus kártya.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Játék mappák:\nA mappák listája az telepített játékok ellenőrzésére.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Hozzáadás:\nHozzon létre egy mappát a listában.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Eltávolítás:\nTávolítson el egy mappát a listából.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Is PS4 Pro</translation> <translation>Is PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Aktifkan Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Log Filter</translation> <translation>Log Filter</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Masukan</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Kursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Sembunyikan kursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Batas waktu sembunyikan kursor tidak aktif</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Pengontrol</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Perilaku tombol kembali</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Enable NULL GPU</translation> <translation>Enable NULL GPU</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Jalur</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Folder Permainan</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Tambah...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Hapus</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Adalah PS4 Pro:\nMembuat emulator berfungsi sebagai PS4 PRO, yang mungkin mengaktifkan fitur khusus dalam permainan yang mendukungnya.</translation> <translation>Adalah PS4 Pro:\nMembuat emulator berfungsi sebagai PS4 PRO, yang mungkin mengaktifkan fitur khusus dalam permainan yang mendukungnya.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Aktifkan Discord Rich Presence:\nMenampilkan ikon emulator dan informasi relevan di profil Discord Anda.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Filter Log: Menyaring log untuk hanya mencetak informasi tertentu. Contoh: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Tingkatan: Trace, Debug, Info, Warning, Error, Critical - dalam urutan ini, tingkat tertentu membungkam semua tingkat sebelumnya dalam daftar dan mencatat setiap tingkat setelahnya.</translation> <translation>Filter Log:\nMenyaring log untuk hanya mencetak informasi tertentu.\nContoh: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Tingkatan: Trace, Debug, Info, Warning, Error, Critical - dalam urutan ini, tingkat tertentu membungkam semua tingkat sebelumnya dalam daftar dan mencatat setiap tingkat setelahnya.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Putar Musik Judul Permainan:\nJika permainan mendukungnya, aktifkan pemutaran musik khusus saat memilih permainan di GUI.</translation> <translation>Putar Musik Judul Permainan:\nJika permainan mendukungnya, aktifkan pemutaran musik khusus saat memilih permainan di GUI.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Sembunyikan Kursor:\nPilih kapan kursor akan menghilang:\nTidak Pernah: Anda akan selalu melihat mouse.\nTidak Aktif: Tetapkan waktu untuk menghilang setelah tidak aktif.\nSelalu: Anda tidak akan pernah melihat mouse.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Tetapkan waktu untuk mouse menghilang setelah tidak aktif.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Perilaku Tombol Kembali:\nMengatur tombol kembali pada pengontrol untuk meniru ketukan di posisi yang ditentukan di touchpad PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Tidak Pernah</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Diam</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Selalu</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Touchpad Kiri</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Touchpad Kanan</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Pusat Touchpad</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Tidak Ada</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Aktifkan GPU Null:\nUntuk tujuan debugging teknis, menonaktifkan rendering permainan seolah-olah tidak ada kartu grafis.</translation> <translation>Aktifkan GPU Null:\nUntuk tujuan debugging teknis, menonaktifkan rendering permainan seolah-olah tidak ada kartu grafis.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Folder Permainan:\nDaftar folder untuk memeriksa permainan yang diinstal.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Tambah:\nTambahkan folder ke daftar.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Hapus:\nHapus folder dari daftar.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Modalità Ps4Pro</translation> <translation>Modalità Ps4Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Abilita Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Filtro Log</translation> <translation>Filtro Log</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Input</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Cursore</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Nascondi cursore</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Timeout inattivo per nascondere il cursore</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Controller</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Comportamento del pulsante Indietro</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Abilita NULL GPU</translation> <translation>Abilita NULL GPU</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Percorsi</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Cartelle di gioco</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Aggiungi...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Rimuovi</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>È PS4 Pro:\nFa che l'emulatore si comporti come una PS4 PRO, il che può abilitare funzionalità speciali in giochi che la supportano.</translation> <translation>È PS4 Pro:\nFa che l'emulatore si comporti come una PS4 PRO, il che può abilitare funzionalità speciali in giochi che la supportano.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Abilita Discord Rich Presence:\nMostra l'icona dell'emulatore e informazioni pertinenti sul tuo profilo Discord.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Filtro Log: Filtra il log per stampare solo informazioni specifiche. Esempi: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Livelli: Trace, Debug, Info, Warning, Error, Critical - in questo ordine, un livello specifico silenzia tutti i livelli precedenti nell'elenco e registra ogni livello successivo.</translation> <translation>Filtro Log:\nFiltra il log per stampare solo informazioni specifiche.\nEsempi: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Livelli: Trace, Debug, Info, Warning, Error, Critical - in questo ordine, un livello specifico silenzia tutti i livelli precedenti nell'elenco e registra ogni livello successivo.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Riproduci Musica del Titolo:\nSe un gioco lo supporta, attiva la riproduzione di musica speciale quando selezioni il gioco nell'interfaccia grafica.</translation> <translation>Riproduci Musica del Titolo:\nSe un gioco lo supporta, attiva la riproduzione di musica speciale quando selezioni il gioco nell'interfaccia grafica.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Nascondi cursore:\nScegli quando il cursore scomparirà:\nMai: Vedrai sempre il mouse.\nInattivo: Imposta un tempo per farlo scomparire dopo essere stato inattivo.\nSempre: non vedrai mai il mouse.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Imposta un tempo affinché il mouse scompaia dopo essere stato inattivo.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Comportamento del pulsante Indietro:\nImposta il pulsante Indietro del controller per emulare il tocco sulla posizione specificata sul touchpad PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Mai</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Inattivo</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Sempre</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Touchpad Sinistra</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Touchpad Destra</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Centro del Touchpad</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Nessuno</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Abilita GPU Null:\nPer scopi di debug tecnico, disabilita il rendering del gioco come se non ci fosse alcuna scheda grafica.</translation> <translation>Abilita GPU Null:\nPer scopi di debug tecnico, disabilita il rendering del gioco come se non ci fosse alcuna scheda grafica.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Cartelle di Gioco:\nL'elenco delle cartelle da controllare per i giochi installati.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Aggiungi:\nAggiungi una cartella all'elenco.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Rimuovi:\nRimuovi una cartella dall'elenco.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>PS4 Proモード</translation> <translation>PS4 Proモード</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Discord Rich Presenceを有効にする</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation></translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>NULL GPUを有効にする</translation> <translation>NULL GPUを有効にする</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation></translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>PS4 Proです:\nエミュレーターがPS4 PROとして動作するようにし</translation> <translation>PS4 Proです:\nエミュレーターがPS4 PROとして動作するようにし</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Discord Rich Presenceを有効にする:\nエミュレーターのアイコンと関連情報をDiscordプロフィールに表示します</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>ログフィルター: 特定の情報のみを印刷するようにログをフィルタリングします: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" レベル: Trace, Debug, Info, Warning, Error, Critical - </translation> <translation>:\n特定の情報のみを印刷するようにログをフィルタリングします\n: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" レベル: Trace, Debug, Info, Warning, Error, Critical - </translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>:\nゲームがそれをサポートしている場合GUIでゲームを選択したときに特別な音楽を再生することを有効にします</translation> <translation>:\nゲームがそれをサポートしている場合GUIでゲームを選択したときに特別な音楽を再生することを有効にします</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>:\nカーソルが消えるタイミングを選択してください:\n決して: いつでもマウスが見えます\nアイドル: アイダルの後に消えるまでの時間を設定します\n常に: マウスは決して見えません</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>:\nコントローラーの戻るボタンをPS4のタッチパッドの指定された位置をタッチするように設定します</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation></translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Null GPUを有効にする:\n技術的なデバッグの目的で</translation> <translation>Null GPUを有効にする:\n技術的なデバッグの目的で</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>:\nインストールされたゲームを確認するためのフォルダのリスト</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>:\nリストにフォルダを追加します</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>:\nリストからフォルダを削除します</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Is PS4 Pro</translation> <translation>Is PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Enable Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Log Filter</translation> <translation>Log Filter</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Input</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Cursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Hide Cursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Hide Cursor Idle Timeout</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Controller</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Back Button Behavior</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Enable NULL GPU</translation> <translation>Enable NULL GPU</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Paths</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Game Folders</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Add...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Remove</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Is PS4 Pro:\nMakes the emulator act as a PS4 PRO, which may enable special features in games that support it.</translation> <translation>Is PS4 Pro:\nMakes the emulator act as a PS4 PRO, which may enable special features in games that support it.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Discord Rich Presence :\nDiscord .</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Log Filter: Filters the log to only print specific information. Examples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it.</translation> <translation>Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI.</translation> <translation>Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Set a time for the mouse to disappear after being after being idle.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Never</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Idle</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Always</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Touchpad Left</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Touchpad Right</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Touchpad Center</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>None</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card.</translation> <translation>Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Game Folders:\nThe list of folders to check for installed games.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Add:\nAdd a folder to the list.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Remove:\nRemove a folder from the list.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Is PS4 Pro</translation> <translation>Is PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Įjungti Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Log Filter</translation> <translation>Log Filter</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Įvestis</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Žymeklis</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Slėpti žymeklį</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Žymeklio paslėpimo neveikimo laikas</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Valdiklis</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Atgal mygtuko elgsena</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Enable NULL GPU</translation> <translation>Enable NULL GPU</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Keliai</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Žaidimų aplankai</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Pridėti...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Pašalinti</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Ar PS4 Pro:\nPadaro, kad emuliatorius veiktų kaip PS4 PRO, kas gali įjungti specialias funkcijas žaidimuose, kurie tai palaiko.</translation> <translation>Ar PS4 Pro:\nPadaro, kad emuliatorius veiktų kaip PS4 PRO, kas gali įjungti specialias funkcijas žaidimuose, kurie tai palaiko.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Įjungti Discord Rich Presence:\nRodo emuliatoriaus ikoną ir susijusią informaciją jūsų Discord profilyje.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Žurnalo filtras: Filtruojamas žurnalas, kad būtų spausdinama tik konkreti informacija. Pavyzdžiai: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Lygiai: Trace, Debug, Info, Warning, Error, Critical - šia tvarka, konkretus lygis nutildo visus ankstesnius lygius sąraše ir registruoja visus vėlesnius.</translation> <translation>Žurnalo filtras:\nFiltruojamas žurnalas, kad būtų spausdinama tik konkreti informacija.\nPavyzdžiai: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Lygiai: Trace, Debug, Info, Warning, Error, Critical - šia tvarka, konkretus lygis nutildo visus ankstesnius lygius sąraše ir registruoja visus vėlesnius.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Groti antraščių muziką:\nJei žaidimas tai palaiko, įjungia specialios muzikos grojimą, kai pasirinkite žaidimą GUI.</translation> <translation>Groti antraščių muziką:\nJei žaidimas tai palaiko, įjungia specialios muzikos grojimą, kai pasirinkite žaidimą GUI.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Slėpti žymeklį:\nPasirinkite, kada žymeklis dings:\nNiekuomet: Visada matysite pelę.\nNeaktyvus: Nustatykite laiką, po kurio ji dings, kai bus neaktyvi.\nVisada: niekada nematysite pelės.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Nustatykite laiką, po kurio pelė dings, kai bus neaktyvi.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Atgal mygtuko elgesys:\nNustato valdiklio atgal mygtuką imituoti paspaudimą nurodytoje vietoje PS4 jutiklinėje plokštėje.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Niekada</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Neaktyvus</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Visada</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Jutiklinis Paviršius Kairėje</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Jutiklinis Paviršius Dešinėje</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Jutiklinis Paviršius Centre</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Nieko</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Įjungti tuščią GPU:\nTechninio derinimo tikslais išjungia žaidimo renderiavimą, tarsi nebūtų grafikos plokštės.</translation> <translation>Įjungti tuščią GPU:\nTechninio derinimo tikslais išjungia žaidimo renderiavimą, tarsi nebūtų grafikos plokštės.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Žaidimų aplankai:\nAplankų sąrašas, kurį reikia patikrinti, ar yra įdiegtų žaidimų.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Pridėti:\nPridėti aplanką į sąrašą.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Pašalinti:\nPašalinti aplanką sąrašo.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Is PS4 Pro</translation> <translation>Is PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Aktiver Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Log Filter</translation> <translation>Log Filter</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Inndata</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Markør</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Skjul markør</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Timeout for å skjule markør ved inaktivitet</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Kontroller</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Tilbakeknapp atferd</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Enable NULL GPU</translation> <translation>Enable NULL GPU</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Stier</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Spillmapper</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Legg til...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Fjern</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Er PS4 Pro:\nFår emulatoren til å fungere som en PS4 PRO, noe som kan aktivere spesielle funksjoner i spill som støtter det.</translation> <translation>Er PS4 Pro:\nFår emulatoren til å fungere som en PS4 PRO, noe som kan aktivere spesielle funksjoner i spill som støtter det.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Aktiver Discord Rich Presence:\nViser emulatorikonet og relevant informasjon Discord-profilen din.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Loggfilter: Filtrerer loggen for å kun skrive ut spesifikk informasjon. Eksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i listen og logger alle nivåer etter det.</translation> <translation>Loggfilter:\nFiltrerer loggen for å kun skrive ut spesifikk informasjon.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i listen og logger alle nivåer etter det.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Spille tittelmusikk:\nHvis et spill støtter det, aktiverer det å spille spesiell musikk når du velger spillet i GUI.</translation> <translation>Spille tittelmusikk:\nHvis et spill støtter det, aktiverer det å spille spesiell musikk når du velger spillet i GUI.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Skjul musepeker:\nVelg når musepekeren skal forsvinne:\nAldri: Du vil alltid se musen.\nInaktiv: Sett en tid for at den skal forsvinne etter å ha vært inaktiv.\nAlltid: du vil aldri se musen.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Sett en tid for når musen forsvinner etter å ha vært inaktiv.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Atferd for tilbaketasten:\nSetter tilbaketasten kontrolleren til å imitere et trykk den angitte posisjonen PS4s berøringsplate.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Aldri</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Inaktiv</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Alltid</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Berøringsplate Venstre</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Berøringsplate Høyre</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Berøringsplate Midt</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Ingen</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Aktiver Null GPU:\nFor teknisk feilsøking deaktiverer spillrendering som om det ikke var noe grafikkort.</translation> <translation>Aktiver Null GPU:\nFor teknisk feilsøking deaktiverer spillrendering som om det ikke var noe grafikkort.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Spillmapper:\nListen over mapper for å sjekke installerte spill.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Legg til:\nLegg til en mappe til listen.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Fjern:\nFjern en mappe fra listen.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Is PS4 Pro</translation> <translation>Is PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Discord Rich Presence inschakelen</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Log Filter</translation> <translation>Log Filter</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Invoer</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Cursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Cursor verbergen</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Inactiviteit timeout voor het verbergen van de cursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Controller</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Achterknop gedrag</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Enable NULL GPU</translation> <translation>Enable NULL GPU</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Pad</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Spelmappen</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Toevoegen...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Verwijderen</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Is PS4 Pro:\nLaat de emulator zich gedragen als een PS4 PRO, wat speciale functies kan inschakelen in games die dit ondersteunen.</translation> <translation>Is PS4 Pro:\nLaat de emulator zich gedragen als een PS4 PRO, wat speciale functies kan inschakelen in games die dit ondersteunen.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Discord Rich Presence inschakelen:\nToont het emulatoricoon en relevante informatie op je Discord-profiel.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Logfilter: Filtert het logboek om alleen specifieke informatie af te drukken. Voorbeelden: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Waarschuwing, Fout, Kritiek - in deze volgorde, een specifiek niveau dempt alle voorgaande niveaus in de lijst en logt alle niveaus daarna.</translation> <translation>Logfilter:\nFiltert het logboek om alleen specifieke informatie af te drukken.\nVoorbeelden: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Waarschuwing, Fout, Kritiek - in deze volgorde, een specifiek niveau dempt alle voorgaande niveaus in de lijst en logt alle niveaus daarna.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Speel titelsong:\nAls een game dit ondersteunt, wordt speciale muziek afgespeeld wanneer je het spel in de GUI selecteert.</translation> <translation>Speel titelsong:\nAls een game dit ondersteunt, wordt speciale muziek afgespeeld wanneer je het spel in de GUI selecteert.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Verberg cursor:\nKies wanneer de cursor verdwijnt:\nNooit: Je ziet altijd de muis.\nInactief: Stel een tijd in waarna deze verdwijnt na inactiviteit.\nAltijd: je ziet de muis nooit.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Stel een tijd in voor wanneer de muis verdwijnt na inactiviteit.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Gedrag van de terugknop:\nStelt de terugknop van de controller in om een aanraking op de opgegeven positie op de PS4-touchpad na te bootsen.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Nooit</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Inactief</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Altijd</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Touchpad Links</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Touchpad Rechts</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Touchpad Midden</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Geen</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Null GPU inschakelen:\nVoor technische foutopsporing schakelt de game-rendering uit alsof er geen grafische kaart is.</translation> <translation>Null GPU inschakelen:\nVoor technische foutopsporing schakelt de game-rendering uit alsof er geen grafische kaart is.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Spelmap:\nDe lijst met mappen om te controleren op geïnstalleerde spellen.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Toevoegen:\nVoeg een map toe aan de lijst.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Verwijderen:\nVerwijder een map uit de lijst.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Emulacja PS4 Pro</translation> <translation>Emulacja PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Włącz Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Filtrowanie dziennika</translation> <translation>Filtrowanie dziennika</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Wejście</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Kursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Ukryj kursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Czas oczekiwania na ukrycie kursora przy bezczynności</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Kontroler</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Zachowanie przycisku wstecz</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Wyłącz kartę graficzną</translation> <translation>Wyłącz kartę graficzną</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Ścieżki</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Foldery gier</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Dodaj...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Usuń</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Czy PS4 Pro:\nSprawia, że emulator działa jak PS4 PRO, co może aktywować specjalne funkcje w grach, które to obsługują.</translation> <translation>Czy PS4 Pro:\nSprawia, że emulator działa jak PS4 PRO, co może aktywować specjalne funkcje w grach, które to obsługują.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Włącz Discord Rich Presence:\nWyświetla ikonę emuladora i odpowiednie informacje na twoim profilu Discord.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Filtr logu: Filtruje dziennik, aby drukować tylko określone informacje. Przykłady: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Poziomy: Trace, Debug, Info, Warning, Error, Critical - w tej kolejności, konkretny poziom wycisza wszystkie wcześniejsze poziomy w liście i rejestruje wszystkie poziomy później.</translation> <translation>Filtr logu:\nFiltruje dziennik, aby drukować tylko określone informacje.\nPrzykłady: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Poziomy: Trace, Debug, Info, Warning, Error, Critical - w tej kolejności, konkretny poziom wycisza wszystkie wcześniejsze poziomy w liście i rejestruje wszystkie poziomy później.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Odtwórz muzykę tytułową:\nJeśli gra to obsługuje, aktywuje odtwarzanie specjalnej muzyki podczas wybierania gry w GUI.</translation> <translation>Odtwórz muzykę tytułową:\nJeśli gra to obsługuje, aktywuje odtwarzanie specjalnej muzyki podczas wybierania gry w GUI.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Ukryj kursor:\nWybierz, kiedy kursor zniknie:\nNigdy: Zawsze będziesz widział myszkę.\nNieaktywny: Ustaw czas, po którym zniknie po bezczynności.\nZawsze: nigdy nie zobaczysz myszki.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Ustaw czas, po którym mysz zniknie po bezczynności.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Zachowanie przycisku Wstecz:\nUstawia przycisk Wstecz kontrolera tak, aby emulował dotknięcie określonego miejsca na panelu dotykowym PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Nigdy</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Bezczynny</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Zawsze</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Touchpad Lewy</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Touchpad Prawy</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Touchpad Środkowy</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Brak</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Włącz Null GPU:\nDla technicznego debugowania dezaktywuje renderowanie gry tak, jakby nie było karty graficznej.</translation> <translation>Włącz Null GPU:\nDla technicznego debugowania dezaktywuje renderowanie gry tak, jakby nie było karty graficznej.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Foldery gier:\nLista folderów do sprawdzenia zainstalowanych gier.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Dodaj:\nDodaj folder do listy.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Usuń:\nUsuń folder z listy.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Modo PS4 Pro</translation> <translation>Modo PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Ativar Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Filtro do Registro</translation> <translation>Filtro do Registro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Entradas</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Cursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Ocultar Cursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Tempo de Inatividade para Ocultar Cursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Controle</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Comportamento do botão Voltar</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Ativar GPU NULA</translation> <translation>Ativar GPU NULA</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Pastas</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Pastas dos Jogos</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Adicionar...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Remover</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -986,17 +1041,22 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="293"/> <location filename="../settings_dialog.cpp" line="293"/>
<source>fullscreenCheckBox</source> <source>fullscreenCheckBox</source>
<translation>Ativar modo tela cheia:\nMove automaticamente a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11.</translation> <translation>Ativar Tela Cheia:\nMove automaticamente a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="295"/> <location filename="../settings_dialog.cpp" line="295"/>
<source>showSplashCheckBox</source> <source>showSplashCheckBox</source>
<translation>Mostrar tela inicial:\nExibe a tela inicial do jogo (imagem especial) ao iniciar o jogo.</translation> <translation>Mostrar Splash Inicial:\nExibe a tela inicial do jogo (imagem especial) ao iniciar o jogo.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="297"/> <location filename="../settings_dialog.cpp" line="297"/>
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>É um PS4 Pro:\nFaz o emulador agir como um PS4 PRO, o que pode ativar recursos especiais em jogos que o suportam.</translation> <translation>Modo PS4 Pro:\nFaz o emulador agir como um PS4 PRO, o que pode ativar recursos especiais em jogos que o suportam.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Ativar Discord Rich Presence:\nExibe o ícone do emulador e informações relevantes no seu perfil do Discord.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
@ -1006,12 +1066,12 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="301"/> <location filename="../settings_dialog.cpp" line="301"/>
<source>logTypeGroupBox</source> <source>logTypeGroupBox</source>
<translation>Tipo de log:\nDefine se a saída da janela de log deve ser sincronizada para melhorar o desempenho. Isso pode impactar negativamente a emulação.</translation> <translation>Tipo de Registro:\nDefine se a saída da janela de log deve ser sincronizada para melhorar o desempenho. Isso pode impactar negativamente a emulação.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Filtro de log: Imprime apenas informações específicas. Exemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Níveis: Trace, Debug, Info, Warning, Error, Critical - assim, um nível específico desativa todos os níveis anteriores na lista e registra todos os níveis subsequentes.</translation> <translation>Filtro de Registro:\nImprime apenas informações específicas.\nExemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNíveis: Trace, Debug, Info, Warning, Error, Critical - assim, um nível específico desativa todos os níveis anteriores na lista e registra todos os níveis subsequentes.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Reproduzir música de abertura:\nSe o jogo suportar, ativa a reprodução de uma música especial ao selecionar o jogo na interface do menu.</translation> <translation>Reproduzir música de abertura:\nSe o jogo suportar, ativa a reprodução de uma música especial ao selecionar o jogo na interface do menu.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Ocultar Cursor:\nEscolha quando o cursor desaparecerá:\nNunca: Você sempre verá o mouse.\nParado: Defina um tempo para ele desaparecer após ficar inativo.\nSempre: Você nunca verá o mouse.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Defina um tempo em segundos para o mouse desaparecer após ficar inativo.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Comportamento do botão Voltar:\nDefine o botão Voltar do controle para emular o toque na posição especificada no touchpad do PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Nunca</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Parado</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Sempre</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Touchpad Esquerdo</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Touchpad Direito</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Touchpad Centro</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Nenhum</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Ativar GPU NULA:\nDesativa a renderização do jogo para fins de depuração técnica, como se não houvesse nenhuma placa gráfica.</translation> <translation>Ativar GPU NULA:\nDesativa a renderização do jogo para fins de depuração técnica, como se não houvesse nenhuma placa gráfica.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Pastas dos jogos:\nA lista de pastas para verificar se jogos instalados.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Adicionar:\nAdicione uma pasta à lista.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Remover:\nRemove uma pasta da lista.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>
@ -1114,7 +1239,7 @@
<message> <message>
<location filename="../game_list_frame.cpp" line="38"/> <location filename="../game_list_frame.cpp" line="38"/>
<source>Play Time</source> <source>Play Time</source>
<translation>Horas Jogadas</translation> <translation>Tempo Jogado</translation>
</message> </message>
</context> </context>
<context> <context>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Is PS4 Pro</translation> <translation>Is PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Activați Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Log Filter</translation> <translation>Log Filter</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Introducere</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Cursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Ascunde cursorul</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Timeout pentru ascunderea cursorului inactiv</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Controler</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Comportament buton înapoi</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Enable NULL GPU</translation> <translation>Enable NULL GPU</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Trasee</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Dosare de joc</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Adaugă...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Eliminare</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Este PS4 Pro:\nFace ca emulatorul se comporte ca un PS4 PRO, ceea ce poate activa funcții speciale în jocurile care o suportă.</translation> <translation>Este PS4 Pro:\nFace ca emulatorul se comporte ca un PS4 PRO, ceea ce poate activa funcții speciale în jocurile care o suportă.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Activați Discord Rich Presence:\nAfișează pictograma emulatorului și informații relevante pe profilul dumneavoastră Discord.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Filtrul jurnalului: Filtrează jurnalul pentru a imprima doar informații specifice. Exemple: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveluri: Trace, Debug, Info, Warning, Error, Critical - în această ordine, un nivel specific reduce toate nivelurile anterioare din listă și înregistrează toate nivelurile ulterioare.</translation> <translation>Filtrul jurnalului:\nFiltrează jurnalul pentru a imprima doar informații specifice.\nExemple: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveluri: Trace, Debug, Info, Warning, Error, Critical - în această ordine, un nivel specific reduce toate nivelurile anterioare din listă și înregistrează toate nivelurile ulterioare.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Redă muzica titlului:\nDacă un joc o suportă, activează redarea muzicii speciale când selectezi jocul în GUI.</translation> <translation>Redă muzica titlului:\nDacă un joc o suportă, activează redarea muzicii speciale când selectezi jocul în GUI.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Ascunde cursorul:\nAlegeți când va dispărea cursorul:\nNiciodată: Vei vedea întotdeauna mouse-ul.\nInactiv: Setează un timp pentru a dispărea după inactivitate.\nÎntotdeauna: nu vei vedea niciodată mouse-ul.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Setați un timp pentru ca mouse-ul dispară după ce a fost inactiv.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Comportamentul butonului înapoi:\nSetează butonul înapoi al controlerului imite atingerea poziției specificate pe touchpad-ul PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Niciodată</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Inactiv</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Întotdeauna</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Touchpad Stânga</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Touchpad Dreapta</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Centru Touchpad</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Niciunul</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Activează GPU Null:\nÎn scopuri de depanare tehnică, dezactivează redarea jocului ca și cum nu ar exista o placă grafică.</translation> <translation>Activează GPU Null:\nÎn scopuri de depanare tehnică, dezactivează redarea jocului ca și cum nu ar exista o placă grafică.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Folderele jocurilor:\nLista folderelor pentru a verifica jocurile instalate.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Adăugați:\nAdăugați un folder la listă.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Eliminați:\nÎndepărtați un folder din listă.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Режим PS4 Pro</translation> <translation>Режим PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Включить Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Фильтр логов</translation> <translation>Фильтр логов</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Ввод</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Курсор</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Скрыть курсор</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Тайм-аут скрытия курсора при неактивности</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Контроллер</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Поведение кнопки назад</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Включить NULL GPU</translation> <translation>Включить NULL GPU</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Пути</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Игровые папки</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Добавить...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Удалить</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Режим PS4 Pro:\nЗаставляет эмулятор работать как PS4 Pro, что может включить специальные функции в играх, поддерживающих это.</translation> <translation>Режим PS4 Pro:\nЗаставляет эмулятор работать как PS4 Pro, что может включить специальные функции в играх, поддерживающих это.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Включить Discord Rich Presence:\nОтображает значок эмулятора и соответствующую информацию в вашем профиле Discord.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Фильтр логов: Фильтрует логи, чтобы показывать только определенную информацию. Примеры: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Уровни: Trace, Debug, Info, Warning, Error, Critical - в этом порядке, конкретный уровень глушит все предыдущие уровни в списке и показывает все последующие уровни.</translation> <translation>Фильтр логов:\nФильтрует логи, чтобы показывать только определенную информацию.\nПримеры: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Уровни: Trace, Debug, Info, Warning, Error, Critical - в этом порядке, конкретный уровень глушит все предыдущие уровни в списке и показывает все последующие уровни.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Воспроизведение заглавной музыки:\nЕсли игра это поддерживает, включает воспроизведение специальной музыки при выборе игры в интерфейсе.</translation> <translation>Воспроизведение заглавной музыки:\nЕсли игра это поддерживает, включает воспроизведение специальной музыки при выборе игры в интерфейсе.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Скрыть курсор:\nВыберите, когда курсор исчезнет:\nНикогда: Вы всегда будете видеть мышь.\nНеактивный: Yстановите время, через которое она исчезнет после бездействия.\nВсегда: вы никогда не увидите мышь.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Установите время, через которое курсор исчезнет после бездействия.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Поведение кнопки «Назад»:\nУстанавливает кнопку «Назад» на контроллере для имитации нажатия в указанной позиции на сенсорной панели PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Никогда</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Неактивный</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Всегда</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Тачпад Слева</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Тачпад Справа</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Центр Тачпада</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Нет</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Включить NULL GPU:\nДля технической отладки отключает рендеринг игры так, как будто графической карты нет.</translation> <translation>Включить NULL GPU:\nДля технической отладки отключает рендеринг игры так, как будто графической карты нет.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Игровые папки:\nСписок папок для проверки установленных игр.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Добавить:\обавить папку в список.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Удалить:\nУдалить папку из списка.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Mënyra PS4 Pro</translation> <translation>Mënyra PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Aktivizo Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,71 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Filtri i Ditarit</translation> <translation>Filtri i Ditarit</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Hyrje</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Kursori</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Fshih kursorin</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Koha e pritjes për fshehjen e kursorit</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Kontrollues</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Sjellja e butonit kthimit</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Hyrja</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Kursori</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>Fshih kursorin</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Koha për fshehjen e kursorit joaktiv</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Hyrja</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Dorezë</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Sjellja e butonit mbrapa</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +544,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Aktivizo GPU- NULL</translation> <translation>Aktivizo GPU- NULL</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Rrugët</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Dosjet e lojës</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Shtoni...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Hiqni</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1088,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>Është PS4 Pro:\nBën emulatori veprojë si një PS4 PRO, gjë mund aktivizojë veçori veçanta lojrat e mbështesin.</translation> <translation>Është PS4 Pro:\nBën emulatori veprojë si një PS4 PRO, gjë mund aktivizojë veçori veçanta lojrat e mbështesin.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Aktivizo Discord Rich Presence:\nShfaq ikonën e emulatorit dhe informacionin përkatës profilin tuaj Discord.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1106,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Filtri i ditarit: Filtron ditarin për shfaqur vetëm informacione specifike. Shembuj: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivelet: Trace, Debug, Info, Warning, Error, Critical - këtë rend, një nivel specifik hesht gjitha nivelet përpara listë dhe regjistron çdo nivel pas atij.</translation> <translation>Filtri i ditarit:\nFiltron ditarin për shfaqur vetëm informacione specifike.\nShembuj: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivelet: Trace, Debug, Info, Warning, Error, Critical - këtë rend, një nivel specifik hesht gjitha nivelet përpara listë dhe regjistron çdo nivel pas atij.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1118,116 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Luaj muzikën e titullit:\nNëse një lojë e mbështet, aktivizohet luajtja e muzikës veçantë kur zgjidhësh lojën GUI.</translation> <translation>Luaj muzikën e titullit:\nNëse një lojë e mbështet, aktivizohet luajtja e muzikës veçantë kur zgjidhësh lojën GUI.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Fsheh kursori:\nZgjidhni kur do zhduket kursori:\nKurrë: Do ta shihni gjithmonë maus.\nInaktiv: Vendosni një kohë për zhdukur pas inaktivitetit.\nGjithmonë: nuk do ta shihni kurrë maus.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Vendosni një kohë për zhdukur maus pas inaktivitetit.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Sjellja e butonit mbrapa:\nVendos butonin mbrapa kontrollorit për imituar prekjen pozicionin e caktuar touchpad-in PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Kurrë</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Pasiv</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Gjithmonë</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Touchpad Majtas</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Touchpad Djathtas</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Qendra e Touchpad</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Asnjë</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="392"/>
<source>cursorGroupBox</source>
<translation>Kursori:\nNdrysho cilësimet lidhje me kursorin.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="394"/>
<source>hideCursorGroupBox</source>
<translation>Fshih kursorin:\nCakto sjelljen e fshehjes kursorit.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="396"/>
<source>idleTimeoutGroupBox</source>
<translation>Koha për fshehjen e kursorit joaktiv:\Kohëzgjatja ( sekonda) pas cilës kursori ka nuk ka qënë veprim fshihet.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Kurrë</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Pa vepruar</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Gjithmonë</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="330"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Back Button Behavior:\nAllows setting which part of the touchpad the back button will emulate a touch on.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="330"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Sjellja e butonit mbrapa:\nLejon përcaktohet se cilën pjesë tastierës prekëse do imitojë një prekje butoni prapa.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Tastiera prekëse majtas</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Tastiera prekëse djathtas</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Tastiera prekëse qendër</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Asnjë</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1253,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Aktivizo GPU- Null:\nPër qëllime korrigjimit teknik, çaktivizon pasqyrimin e lojës sikur nuk ka një kartë grafike.</translation> <translation>Aktivizo GPU- Null:\nPër qëllime korrigjimit teknik, çaktivizon pasqyrimin e lojës sikur nuk ka një kartë grafike.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Folderët e lojërave:\nLista e folderëve për kontrolluar lojërat e instaluara.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Shto:\nShto një folder listë.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Hiq:\nHiq një folder nga lista.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>
@ -1114,7 +1334,7 @@
<message> <message>
<location filename="../game_list_frame.cpp" line="38"/> <location filename="../game_list_frame.cpp" line="38"/>
<source>Play Time</source> <source>Play Time</source>
<translation>Kohë Lojë</translation> <translation>Koha e luajtjes</translation>
</message> </message>
</context> </context>
<context> <context>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>PS4 Pro mu</translation> <translation>PS4 Pro mu</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Discord Rich Presence'i etkinleştir</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Kayıt Filtresi</translation> <translation>Kayıt Filtresi</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Girdi</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>İmleç</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>İmleci gizle</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>İmleç için hareketsizlik zaman ımı</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Kontrolcü</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Geri Dön Butonu Davranışı</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>NULL GPU'yu Etkinleştir</translation> <translation>NULL GPU'yu Etkinleştir</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Yollar</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Oyun Klasörleri</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Ekle...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Kaldır</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>PS4 Pro Mu:\nEmülatörü bir PS4 PRO gibi çalıştırır; bu, bunu destekleyen oyunlarda özel özellikleri etkinleştirebilir.</translation> <translation>PS4 Pro Mu:\nEmülatörü bir PS4 PRO gibi çalıştırır; bu, bunu destekleyen oyunlarda özel özellikleri etkinleştirebilir.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Discord Rich Presence'i etkinleştir:\nEmülatör simgesini ve Discord profilinizdeki ilgili bilgileri gösterir.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Günlük Filtre: Sadece belirli bilgileri yazdırmak için günlüğü filtreler. Örnekler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Düzeyler: Trace, Debug, Info, Warning, Error, Critical - bu sırada, belirli bir seviye listede önceki tüm seviyeleri susturur ve sonraki tüm seviyeleri kaydeder.</translation> <translation>Günlük Filtre:\nSadece belirli bilgileri yazdırmak için günlüğü filtreler.\rnekler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Düzeyler: Trace, Debug, Info, Warning, Error, Critical - bu sırada, belirli bir seviye listede önceki tüm seviyeleri susturur ve sonraki tüm seviyeleri kaydeder.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Başlık Müziklerini Çal:\nEğer bir oyun bunu destekliyorsa, GUI'de oyunu seçtiğinizde özel müziklerin çalmasını etkinleştirir.</translation> <translation>Başlık Müziklerini Çal:\nEğer bir oyun bunu destekliyorsa, GUI'de oyunu seçtiğinizde özel müziklerin çalmasını etkinleştirir.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>İmleci gizle:\nİmlecin ne zaman kaybolacağını seçin:\nAsla: Fareyi her zaman göreceksiniz.\nPasif: Hareketsiz kaldıktan sonra kaybolması için bir süre belirleyin.\nHer zaman: fareyi asla göremeyeceksiniz.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Hareket etmeden sonra imlecin kaybolacağı süreyi ayarlayın.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Geri düğmesi davranışı:\nKontrol cihazındaki geri düğmesini, PS4'ün dokunmatik panelindeki belirlenen noktaya dokunmak için ayarlar.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Asla</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Boşta</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Her zaman</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Dokunmatik Yüzey Sol</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Dokunmatik Yüzey Sağ</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Dokunmatik Yüzey Orta</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Yok</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Null GPU'yu Etkinleştir:\nTeknik hata ayıklama amacıyla, oyunun render edilmesini grafik kartı yokmuş gibi devre dışı bırakır.</translation> <translation>Null GPU'yu Etkinleştir:\nTeknik hata ayıklama amacıyla, oyunun render edilmesini grafik kartı yokmuş gibi devre dışı bırakır.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Oyun klasörleri:\nYüklenmiş oyunları kontrol etmek için klasörlerin listesi.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Ekle:\nListeye bir klasör ekle.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Kaldır:\nListeden bir klasörü kaldır.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Is PS4 Pro</translation> <translation>Is PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation>Bật Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Log Filter</translation> <translation>Log Filter</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation>Đu vào</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation>Con trỏ</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation>n con trỏ</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Thời gian chờ n con trỏ</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>Điều khiển</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Hành vi nút quay lại</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Enable NULL GPU</translation> <translation>Enable NULL GPU</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation>Đưng dẫn</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation>Thư mục trò chơi</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>Thêm...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation>Xóa</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation> PS4 Pro:\nKhiến trình giả lập hoạt đng như một PS4 PRO, điều này thể kích hoạt các tính năng đc biệt trong các trò chơi hỗ trợ điều này.</translation> <translation> PS4 Pro:\nKhiến trình giả lập hoạt đng như một PS4 PRO, điều này thể kích hoạt các tính năng đc biệt trong các trò chơi hỗ trợ điều này.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation>Bật Discord Rich Presence:\nHiển thị biểu tượng trình giả lập thông tin liên quan trên hồ Discord của bạn.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>Bộ lọc nhật : Lọc nhật đ in chỉ thông tin cụ thể. dụ: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Các mức: Trace, Debug, Info, Warning, Error, Critical - theo thứ tự này, một mức cụ thể làm tắt tất cả các mức trước trong danh sách ghi lại tất cả các mức sau đó.</translation> <translation>Bộ lọc nhật :\nLọc nhật đ in chỉ thông tin cụ thể.\ndụ: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Các mức: Trace, Debug, Info, Warning, Error, Critical - theo thứ tự này, một mức cụ thể làm tắt tất cả các mức trước trong danh sách ghi lại tất cả các mức sau đó.</translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>Phát nhạc tiêu đ trò chơi:\nNếu một trò chơi hỗ trợ điều này, hãy kích hoạt phát nhạc đc biệt khi bạn chọn trò chơi trong GUI.</translation> <translation>Phát nhạc tiêu đ trò chơi:\nNếu một trò chơi hỗ trợ điều này, hãy kích hoạt phát nhạc đc biệt khi bạn chọn trò chơi trong GUI.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>n con trỏ:\nChọn khi nào con trỏ sẽ biến mất:\nKhông bao giờ: Bạn sẽ luôn thấy chuột.\nKhông hoạt động: Đặt một khoảng thời gian đ biến mất sau khi không hoạt đng.\nLuôn luôn: bạn sẽ không bao giờ thấy chuột.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation>Đt thời gian đ chuột biến mất sau khi không hoạt đng.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>Hành vi nút quay lại:\nĐặt nút quay lại của tay cầm đ phỏng việc chạm vào vị trí đã chỉ đnh trên touchpad của PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation>Không bao giờ</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation>Nhàn rỗi</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation>Luôn luôn</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>Touchpad Trái</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation>Touchpad Phải</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>Giữa Touchpad</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation>Không </translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>Bật GPU Null:\nĐể mục đích gỡ lỗi kỹ thuật, hiệu hóa việc kết xuất trò chơi như thể không card đ họa.</translation> <translation>Bật GPU Null:\nĐể mục đích gỡ lỗi kỹ thuật, hiệu hóa việc kết xuất trò chơi như thể không card đ họa.</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>Thư mục trò chơi:\nDanh sách các thư mục đ kiểm tra các trò chơi đã cài đt.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>Thêm:\nThêm một thư mục vào danh sách.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>Xóa:\nXóa một thư mục khỏi danh sách.</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation> PS4 Pro</translation> <translation> PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation> Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation></translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation> NULL GPU</translation> <translation> NULL GPU</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation></translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation> PS4 Pro:\n使模拟器作为 PS4 PRO </translation> <translation> PS4 Pro:\n使模拟器作为 PS4 PRO </translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation> Discord Rich Presence:\n在您的 Discord 仿</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>日志过滤器: 过滤日志"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 级别: Trace, Debug, Info, Warning, Error, Critical - </translation> <translation>:\n过滤日志\n例"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 级别: Trace, Debug, Info, Warning, Error, Critical - </translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>:\n如果游戏支持</translation> <translation>:\n如果游戏支持</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>:\n选择光标何时消失:\n从不: 您将始终看到鼠标\n空闲: 设置光标在空闲后消失的时间\n始终: 您将永远看不到鼠标</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>:\n设置控制器的返回按钮以模拟在 PS4 </translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation></translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation> GPU:\n为了技术调试仿</translation> <translation> GPU:\n为了技术调试仿</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>:\n检查已安装游戏的文件夹列表</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>:\n将文件夹添加到列表</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>:\n从列表中移除文件夹</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -414,6 +414,11 @@
<source>Is PS4 Pro</source> <source>Is PS4 Pro</source>
<translation>Is PS4 Pro</translation> <translation>Is PS4 Pro</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="154"/>
<source>Enable Discord Rich Presence</source>
<translation> Discord Rich Presence</translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="155"/> <location filename="../settings_dialog.ui" line="155"/>
<source>Username</source> <source>Username</source>
@ -434,6 +439,36 @@
<source>Log Filter</source> <source>Log Filter</source>
<translation>Log Filter</translation> <translation>Log Filter</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
<source>Input</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="611"/>
<source>Cursor</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="635"/>
<source>Hide Cursor</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation></translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="272"/> <location filename="../settings_dialog.ui" line="272"/>
<source>Graphics</source> <source>Graphics</source>
@ -474,6 +509,26 @@
<source>Enable NULL GPU</source> <source>Enable NULL GPU</source>
<translation>Enable NULL GPU</translation> <translation>Enable NULL GPU</translation>
</message> </message>
<message>
<location filename="../settings_dialog.ui" line="1111"/>
<source>Paths</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1119"/>
<source>Game Folders</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Add...</source>
<translation>...</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="1141"/>
<source>Remove</source>
<translation></translation>
</message>
<message> <message>
<location filename="../settings_dialog.ui" line="517"/> <location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source> <source>Debug</source>
@ -998,6 +1053,11 @@
<source>ps4proCheckBox</source> <source>ps4proCheckBox</source>
<translation>PS4 Pro:\n讓模擬器像PS4 PRO一樣運作</translation> <translation>PS4 Pro:\n讓模擬器像PS4 PRO一樣運作</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
<source>discordRPCCheckbox</source>
<translation> Discord Rich Presence:\n在您的 Discord </translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="299"/> <location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source> <source>userName</source>
@ -1011,7 +1071,7 @@
<message> <message>
<location filename="../settings_dialog.cpp" line="303"/> <location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source> <source>logFilter</source>
<translation>日誌過濾器: 過濾日誌以僅打印特定信息"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 等級: Trace, Debug, Info, Warning, Error, Critical - </translation> <translation>:\n過濾日誌以僅打印特定信息\n範"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 等級: Trace, Debug, Info, Warning, Error, Critical - </translation>
</message> </message>
<message> <message>
<location filename="../settings_dialog.cpp" line="305"/> <location filename="../settings_dialog.cpp" line="305"/>
@ -1023,6 +1083,56 @@
<source>GUIgroupBox</source> <source>GUIgroupBox</source>
<translation>:\n如果遊戲支持GUI中選擇遊戲時播放特殊音樂</translation> <translation>:\n如果遊戲支持GUI中選擇遊戲時播放特殊音樂</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>:\n選擇游標何時消失:\n從不: 您將始終看到滑鼠\n閒置: 設定在閒置後消失的時間\n始終: 您將永遠看不到滑鼠</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
<source>idleTimeoutGroupBox</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="454"/>
<source>backButtonBehaviorGroupBox</source>
<translation>:\n設定控制器的返回按鈕模擬在 PS4 </translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="71"/>
<source>Idle</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="72"/>
<source>Always</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
<source>Touchpad Right</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
<source>None</source>
<translation></translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="312"/> <location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source> <source>graphicsAdapterGroupBox</source>
@ -1048,6 +1158,21 @@
<source>nullGpuCheckBox</source> <source>nullGpuCheckBox</source>
<translation>GPU:\n為了技術調試彿</translation> <translation>GPU:\n為了技術調試彿</translation>
</message> </message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>gameFoldersBox</source>
<translation>:\n檢查已安裝遊戲的資料夾列表</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>addFolderButton</source>
<translation>:\n將資料夾添加到列表</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="465"/>
<source>removeFolderButton</source>
<translation>:\n從列表中移除資料夾</translation>
</message>
<message> <message>
<location filename="../settings_dialog.cpp" line="329"/> <location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source> <source>debugDump</source>

View File

@ -6,6 +6,7 @@
#include "common/debug.h" #include "common/debug.h"
#include "common/polyfill_thread.h" #include "common/polyfill_thread.h"
#include "common/thread.h" #include "common/thread.h"
#include "core/debug_state.h"
#include "core/libraries/videoout/driver.h" #include "core/libraries/videoout/driver.h"
#include "video_core/amdgpu/liverpool.h" #include "video_core/amdgpu/liverpool.h"
#include "video_core/amdgpu/pm4_cmds.h" #include "video_core/amdgpu/pm4_cmds.h"
@ -187,6 +188,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
TracyFiberEnter(dcb_task_name); TracyFiberEnter(dcb_task_name);
} }
const auto base_addr = reinterpret_cast<uintptr_t>(dcb.data());
while (!dcb.empty()) { while (!dcb.empty()) {
const auto* header = reinterpret_cast<const PM4Header*>(dcb.data()); const auto* header = reinterpret_cast<const PM4Header*>(dcb.data());
const u32 type = header->type; const u32 type = header->type;
@ -359,6 +361,9 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
regs.index_base_address.base_addr_hi.Assign(draw_index->index_base_hi); regs.index_base_address.base_addr_hi.Assign(draw_index->index_base_hi);
regs.num_indices = draw_index->index_count; regs.num_indices = draw_index->index_count;
regs.draw_initiator = draw_index->draw_initiator; regs.draw_initiator = draw_index->draw_initiator;
if (DebugState.DumpingCurrentReg()) {
DebugState.PushRegsDump(base_addr, reinterpret_cast<uintptr_t>(header), regs);
}
if (rasterizer) { if (rasterizer) {
const auto cmd_address = reinterpret_cast<const void*>(header); const auto cmd_address = reinterpret_cast<const void*>(header);
rasterizer->ScopeMarkerBegin(fmt::format("dcb:{}:DrawIndex2", cmd_address)); rasterizer->ScopeMarkerBegin(fmt::format("dcb:{}:DrawIndex2", cmd_address));
@ -373,6 +378,9 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
regs.max_index_size = draw_index_off->max_size; regs.max_index_size = draw_index_off->max_size;
regs.num_indices = draw_index_off->index_count; regs.num_indices = draw_index_off->index_count;
regs.draw_initiator = draw_index_off->draw_initiator; regs.draw_initiator = draw_index_off->draw_initiator;
if (DebugState.DumpingCurrentReg()) {
DebugState.PushRegsDump(base_addr, reinterpret_cast<uintptr_t>(header), regs);
}
if (rasterizer) { if (rasterizer) {
const auto cmd_address = reinterpret_cast<const void*>(header); const auto cmd_address = reinterpret_cast<const void*>(header);
rasterizer->ScopeMarkerBegin( rasterizer->ScopeMarkerBegin(
@ -386,6 +394,9 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
const auto* draw_index = reinterpret_cast<const PM4CmdDrawIndexAuto*>(header); const auto* draw_index = reinterpret_cast<const PM4CmdDrawIndexAuto*>(header);
regs.num_indices = draw_index->index_count; regs.num_indices = draw_index->index_count;
regs.draw_initiator = draw_index->draw_initiator; regs.draw_initiator = draw_index->draw_initiator;
if (DebugState.DumpingCurrentReg()) {
DebugState.PushRegsDump(base_addr, reinterpret_cast<uintptr_t>(header), regs);
}
if (rasterizer) { if (rasterizer) {
const auto cmd_address = reinterpret_cast<const void*>(header); const auto cmd_address = reinterpret_cast<const void*>(header);
rasterizer->ScopeMarkerBegin(fmt::format("dcb:{}:DrawIndexAuto", cmd_address)); rasterizer->ScopeMarkerBegin(fmt::format("dcb:{}:DrawIndexAuto", cmd_address));
@ -399,6 +410,9 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
const auto offset = draw_indirect->data_offset; const auto offset = draw_indirect->data_offset;
const auto ib_address = mapped_queues[GfxQueueId].indirect_args_addr; const auto ib_address = mapped_queues[GfxQueueId].indirect_args_addr;
const auto size = sizeof(PM4CmdDrawIndirect::DrawInstancedArgs); const auto size = sizeof(PM4CmdDrawIndirect::DrawInstancedArgs);
if (DebugState.DumpingCurrentReg()) {
DebugState.PushRegsDump(base_addr, reinterpret_cast<uintptr_t>(header), regs);
}
if (rasterizer) { if (rasterizer) {
const auto cmd_address = reinterpret_cast<const void*>(header); const auto cmd_address = reinterpret_cast<const void*>(header);
rasterizer->ScopeMarkerBegin(fmt::format("dcb:{}:DrawIndirect", cmd_address)); rasterizer->ScopeMarkerBegin(fmt::format("dcb:{}:DrawIndirect", cmd_address));
@ -413,6 +427,9 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
const auto offset = draw_index_indirect->data_offset; const auto offset = draw_index_indirect->data_offset;
const auto ib_address = mapped_queues[GfxQueueId].indirect_args_addr; const auto ib_address = mapped_queues[GfxQueueId].indirect_args_addr;
const auto size = sizeof(PM4CmdDrawIndexIndirect::DrawIndexInstancedArgs); const auto size = sizeof(PM4CmdDrawIndexIndirect::DrawIndexInstancedArgs);
if (DebugState.DumpingCurrentReg()) {
DebugState.PushRegsDump(base_addr, reinterpret_cast<uintptr_t>(header), regs);
}
if (rasterizer) { if (rasterizer) {
const auto cmd_address = reinterpret_cast<const void*>(header); const auto cmd_address = reinterpret_cast<const void*>(header);
rasterizer->ScopeMarkerBegin( rasterizer->ScopeMarkerBegin(
@ -428,6 +445,9 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
regs.cs_program.dim_y = dispatch_direct->dim_y; regs.cs_program.dim_y = dispatch_direct->dim_y;
regs.cs_program.dim_z = dispatch_direct->dim_z; regs.cs_program.dim_z = dispatch_direct->dim_z;
regs.cs_program.dispatch_initiator = dispatch_direct->dispatch_initiator; regs.cs_program.dispatch_initiator = dispatch_direct->dispatch_initiator;
if (DebugState.DumpingCurrentReg()) {
DebugState.PushRegsDump(base_addr, reinterpret_cast<uintptr_t>(header), regs);
}
if (rasterizer && (regs.cs_program.dispatch_initiator & 1)) { if (rasterizer && (regs.cs_program.dispatch_initiator & 1)) {
const auto cmd_address = reinterpret_cast<const void*>(header); const auto cmd_address = reinterpret_cast<const void*>(header);
rasterizer->ScopeMarkerBegin(fmt::format("dcb:{}:Dispatch", cmd_address)); rasterizer->ScopeMarkerBegin(fmt::format("dcb:{}:Dispatch", cmd_address));
@ -442,6 +462,9 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
const auto offset = dispatch_indirect->data_offset; const auto offset = dispatch_indirect->data_offset;
const auto ib_address = mapped_queues[GfxQueueId].indirect_args_addr; const auto ib_address = mapped_queues[GfxQueueId].indirect_args_addr;
const auto size = sizeof(PM4CmdDispatchIndirect::GroupDimensions); const auto size = sizeof(PM4CmdDispatchIndirect::GroupDimensions);
if (DebugState.DumpingCurrentReg()) {
DebugState.PushRegsDump(base_addr, reinterpret_cast<uintptr_t>(header), regs);
}
if (rasterizer && (regs.cs_program.dispatch_initiator & 1)) { if (rasterizer && (regs.cs_program.dispatch_initiator & 1)) {
const auto cmd_address = reinterpret_cast<const void*>(header); const auto cmd_address = reinterpret_cast<const void*>(header);
rasterizer->ScopeMarkerBegin( rasterizer->ScopeMarkerBegin(
@ -576,6 +599,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
Liverpool::Task Liverpool::ProcessCompute(std::span<const u32> acb, int vqid) { Liverpool::Task Liverpool::ProcessCompute(std::span<const u32> acb, int vqid) {
TracyFiberEnter(acb_task_name); TracyFiberEnter(acb_task_name);
auto base_addr = reinterpret_cast<uintptr_t>(acb.data());
while (!acb.empty()) { while (!acb.empty()) {
const auto* header = reinterpret_cast<const PM4Header*>(acb.data()); const auto* header = reinterpret_cast<const PM4Header*>(acb.data());
const u32 type = header->type; const u32 type = header->type;
@ -620,6 +644,9 @@ Liverpool::Task Liverpool::ProcessCompute(std::span<const u32> acb, int vqid) {
regs.cs_program.dim_y = dispatch_direct->dim_y; regs.cs_program.dim_y = dispatch_direct->dim_y;
regs.cs_program.dim_z = dispatch_direct->dim_z; regs.cs_program.dim_z = dispatch_direct->dim_z;
regs.cs_program.dispatch_initiator = dispatch_direct->dispatch_initiator; regs.cs_program.dispatch_initiator = dispatch_direct->dispatch_initiator;
if (DebugState.DumpingCurrentReg()) {
DebugState.PushRegsDump(base_addr, reinterpret_cast<uintptr_t>(header), regs);
}
if (rasterizer && (regs.cs_program.dispatch_initiator & 1)) { if (rasterizer && (regs.cs_program.dispatch_initiator & 1)) {
const auto cmd_address = reinterpret_cast<const void*>(header); const auto cmd_address = reinterpret_cast<const void*>(header);
rasterizer->ScopeMarkerBegin(fmt::format("acb[{}]:{}:Dispatch", vqid, cmd_address)); rasterizer->ScopeMarkerBegin(fmt::format("acb[{}]:{}:Dispatch", vqid, cmd_address));

View File

@ -772,6 +772,8 @@ struct Liverpool {
BitField<27, 1, u32> fmask_compress_1frag_only; BitField<27, 1, u32> fmask_compress_1frag_only;
BitField<28, 1, u32> dcc_enable; BitField<28, 1, u32> dcc_enable;
BitField<29, 1, u32> cmask_addr_type; BitField<29, 1, u32> cmask_addr_type;
u32 u32all;
} info; } info;
union Color0Attrib { union Color0Attrib {
BitField<0, 5, TilingMode> tile_mode_index; BitField<0, 5, TilingMode> tile_mode_index;
@ -780,6 +782,8 @@ struct Liverpool {
BitField<12, 3, u32> num_samples_log2; BitField<12, 3, u32> num_samples_log2;
BitField<15, 2, u32> num_fragments_log2; BitField<15, 2, u32> num_fragments_log2;
BitField<17, 1, u32> force_dst_alpha_1; BitField<17, 1, u32> force_dst_alpha_1;
u32 u32all;
} attrib; } attrib;
INSERT_PADDING_WORDS(1); INSERT_PADDING_WORDS(1);
u32 cmask_base_address; u32 cmask_base_address;
@ -935,7 +939,7 @@ struct Liverpool {
BitField<5, 1, u32> gs_en; BitField<5, 1, u32> gs_en;
BitField<6, 1, u32> vs_en; BitField<6, 1, u32> vs_en;
bool IsStageEnabled(u32 stage) { bool IsStageEnabled(u32 stage) const {
switch (stage) { switch (stage) {
case 0: case 0:
case 1: case 1:

View File

@ -213,6 +213,7 @@ struct PM4CmdNop {
enum PayloadType : u32 { enum PayloadType : u32 {
DebugMarkerPush = 0x68750001u, ///< Begin of GPU event scope DebugMarkerPush = 0x68750001u, ///< Begin of GPU event scope
DebugMarkerPop = 0x68750002u, ///< End of GPU event scope DebugMarkerPop = 0x68750002u, ///< End of GPU event scope
DebugSetMarker = 0x68750003u, ///< Set GPU event marker
SetVsharpInUdata = 0x68750004u, ///< Indicates that V# will be set in the next packet SetVsharpInUdata = 0x68750004u, ///< Indicates that V# will be set in the next packet
SetTsharpInUdata = 0x68750005u, ///< Indicates that T# will be set in the next packet SetTsharpInUdata = 0x68750005u, ///< Indicates that T# will be set in the next packet
SetSsharpInUdata = 0x68750006u, ///< Indicates that S# will be set in the next packet SetSsharpInUdata = 0x68750006u, ///< Indicates that S# will be set in the next packet

View File

@ -100,12 +100,12 @@ void Rasterizer::DrawIndirect(bool is_indexed, VAddr address, u32 offset, u32 si
buffer_cache.BindVertexBuffers(vs_info); buffer_cache.BindVertexBuffers(vs_info);
const u32 num_indices = buffer_cache.BindIndexBuffer(is_indexed, 0); const u32 num_indices = buffer_cache.BindIndexBuffer(is_indexed, 0);
BeginRendering(*pipeline);
UpdateDynamicState(*pipeline);
const auto [buffer, base] = buffer_cache.ObtainBuffer(address, size, true); const auto [buffer, base] = buffer_cache.ObtainBuffer(address, size, true);
const auto total_offset = base + offset; const auto total_offset = base + offset;
BeginRendering(*pipeline);
UpdateDynamicState(*pipeline);
// We can safely ignore both SGPR UD indices and results of fetch shader parsing, as vertex and // We can safely ignore both SGPR UD indices and results of fetch shader parsing, as vertex and
// instance offsets will be automatically applied by Vulkan from indirect args buffer. // instance offsets will be automatically applied by Vulkan from indirect args buffer.