Merge branch 'main' into wstr

This commit is contained in:
georgemoralis 2024-09-26 09:24:21 +03:00 committed by GitHub
commit 703525083a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
99 changed files with 7160 additions and 918 deletions

1
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1 @@
ko_fi: shadps4

View File

@ -113,6 +113,7 @@ jobs:
target: desktop
arch: win64_msvc2019_64
archives: qtbase qttools
modules: qtmultimedia
- name: Cache CMake Configuration
uses: actions/cache@v4
@ -237,6 +238,7 @@ jobs:
target: desktop
arch: clang_64
archives: qtbase qttools
modules: qtmultimedia
- name: Cache CMake Configuration
uses: actions/cache@v4
@ -341,7 +343,7 @@ jobs:
submodules: recursive
- name: Install dependencies
run: sudo apt-get update && sudo apt install -y libx11-dev libxext-dev libwayland-dev libfuse2 clang build-essential qt6-base-dev qt6-tools-dev
run: sudo apt-get update && sudo apt install -y libx11-dev libxext-dev libwayland-dev libfuse2 clang build-essential qt6-base-dev qt6-tools-dev qt6-multimedia-dev
- name: Cache CMake Configuration
uses: actions/cache@v4
@ -401,6 +403,7 @@ jobs:
done
- name: Create Pre-Release on GitHub
id: create_release
uses: ncipollo/release-action@v1
with:
token: ${{ secrets.SHADPS4_TOKEN_REPO }}
@ -411,28 +414,59 @@ jobs:
artifacts: |
./artifacts/*.zip
- name: Get current pre-release information
env:
GITHUB_TOKEN: ${{ secrets.SHADPS4_TOKEN_REPO }}
run: |
api_url="https://api.github.com/repos/${{ github.repository }}/releases"
# Get all releases (sorted by date)
releases=$(curl -H "Authorization: token $GITHUB_TOKEN" "$api_url")
# Capture the most recent pre-release (assuming the first one is the latest)
current_release=$(echo "$releases" | jq -c '.[] | select(.prerelease == true) | .published_at' | sort -r | head -n 1)
# Remove extra quotes from captured date
current_release=$(echo $current_release | tr -d '"')
# Export the current published_at to be available for the next step
echo "CURRENT_PUBLISHED_AT=$current_release" >> $GITHUB_ENV
- name: Delete old pre-releases and tags
env:
GITHUB_TOKEN: ${{ secrets.SHADPS4_TOKEN_REPO }}
run: |
current_date="${{ needs.get-info.outputs.date }}"
api_url="https://api.github.com/repos/${{ github.repository }}/releases"
# Get current pre-releases
releases=$(curl -H "Authorization: token $GITHUB_TOKEN" "$api_url?per_page=100")
releases=$(curl -H "Authorization: token $GITHUB_TOKEN" "$api_url")
# Parse and delete old pre-releases
# Remove extra quotes from captured date
CURRENT_PUBLISHED_AT=$(echo $CURRENT_PUBLISHED_AT | tr -d '"')
# Convert CURRENT_PUBLISHED_AT para timestamp Unix
current_published_ts=$(date -d "$CURRENT_PUBLISHED_AT" +%s)
# Identify pre-releases
echo "$releases" | jq -c '.[] | select(.prerelease == true)' | while read -r release; do
release_date=$(echo "$release" | jq -r '.created_at' | cut -d'T' -f1)
release_date=$(echo "$release" | jq -r '.published_at')
release_id=$(echo "$release" | jq -r '.id')
release_tag=$(echo "$release" | jq -r '.tag_name')
# Compare dates
if [[ "$release_date" < "$current_date" ]]; then
# Remove extra quotes from captured date
release_date=$(echo $release_date | tr -d '"')
# Convert release_date para timestamp Unix
release_date_ts=$(date -d "$release_date" +%s)
# Compare timestamps and delete old pre-releases
if [[ "$release_date_ts" -lt "$current_published_ts" ]]; then
echo "Deleting old pre-release: $release_id from $release_date with tag: $release_tag"
# Delete the pre-release
curl -X DELETE -H "Authorization: token $GITHUB_TOKEN" "$api_url/$release_id"
# Delete the tag
curl -X DELETE -H "Authorization: token $GITHUB_TOKEN" "https://api.github.com/repos/${{ github.repository }}/git/refs/tags/$release_tag"
else
echo "Skipping pre-release: $release_id (newer or same date)"
fi
done

2
.gitignore vendored
View File

@ -387,6 +387,8 @@ FodyWeavers.xsd
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
/CMakeUserPresets.json
/compile_commands.json
# Local History for Visual Studio Code
.history/

View File

@ -3,12 +3,11 @@ Comment: It is best to use this file to record copyright information about
generated, binary and third party files
Files: CMakeSettings.json
.github/FUNDING.yml
.github/shadps4.desktop
.github/shadps4.png
.gitmodules
documents/changelog.txt
documents/readme.txt
documents/Quickstart/1.png
documents/Quickstart/2.png
documents/Screenshots/Bloodborne.png
documents/Screenshots/Sonic Mania.png
@ -17,6 +16,7 @@ Files: CMakeSettings.json
scripts/ps4_names.txt
src/images/about_icon.png
src/images/controller_icon.png
src/images/dump_icon.png
src/images/exit_icon.png
src/images/file_icon.png
src/images/flag_china.png
@ -38,6 +38,7 @@ Files: CMakeSettings.json
src/images/shadPS4.icns
src/images/shadps4.ico
src/images/themes_icon.png
src/images/update_icon.png
src/shadps4.qrc
src/shadps4.rc
Copyright: shadPS4 Emulator Project

View File

@ -95,6 +95,7 @@ include(GetGitRevisionDescription)
get_git_head_revision(GIT_REF_SPEC GIT_REV)
git_describe(GIT_DESC --always --long --dirty)
git_branch_name(GIT_BRANCH)
string(TIMESTAMP BUILD_DATE "%Y-%m-%d %H:%M:%S")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/common/scm_rev.cpp.in" "${CMAKE_CURRENT_SOURCE_DIR}/src/common/scm_rev.cpp" @ONLY)
@ -143,7 +144,7 @@ add_subdirectory(externals)
include_directories(src)
if(ENABLE_QT_GUI)
find_package(Qt6 REQUIRED COMPONENTS Widgets Concurrent LinguistTools Network)
find_package(Qt6 REQUIRED COMPONENTS Widgets Concurrent LinguistTools Network Multimedia)
qt_standard_project_setup()
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOMOC ON)
@ -652,8 +653,12 @@ qt_add_resources(RESOURCE_FILES src/shadps4.qrc)
set(QT_GUI src/qt_gui/about_dialog.cpp
src/qt_gui/about_dialog.h
src/qt_gui/about_dialog.ui
src/qt_gui/background_music_player.cpp
src/qt_gui/background_music_player.h
src/qt_gui/cheats_patches.cpp
src/qt_gui/cheats_patches.h
src/qt_gui/check_update.cpp
src/qt_gui/check_update.h
src/qt_gui/main_window_ui.h
src/qt_gui/main_window.cpp
src/qt_gui/main_window.h
@ -757,7 +762,7 @@ else()
endif()
if (ENABLE_QT_GUI)
target_link_libraries(shadps4 PRIVATE Qt6::Widgets Qt6::Concurrent Qt6::Network)
target_link_libraries(shadps4 PRIVATE Qt6::Widgets Qt6::Concurrent Qt6::Network Qt6::Multimedia)
add_definitions(-DENABLE_QT_GUI)
endif()

View File

@ -51,7 +51,7 @@ For those who'd like to donate to the project, we now have a [Kofi page!](https:
> [!IMPORTANT]
> 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 *somewhat* run [**Bloodborne**](https://www.youtube.com/watch?v=wC6s0avpQRE).
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).
# Why
@ -71,7 +71,8 @@ Check the build instructions for [**Linux**](https://github.com/shadps4-emu/shad
Check the build instructions for [**macOS**](https://github.com/shadps4-emu/shadPS4/blob/main/documents/building-macos.md).
Note that macOS users need at least macOS 15 on an Apple Silicon Mac, or at least macOS 11 on an Intel Mac.
> [!IMPORTANT]
> macOS users need at least macOS 15 on Apple Silicon-based Mac devices and at least macOS 11 on Intel-based Mac devices.
## Building status

View File

@ -80,7 +80,7 @@ Normal x86-based computers, follow:
1. Open "MSYS2 MINGW64" from your new applications
2. Run `pacman -Syu`, let it complete;
3. Run `pacman -S --needed git mingw-w64-x86_64-binutils mingw-w64-x86_64-clang mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja mingw-w64-x86_64-ffmpeg`
1. Optional (Qt only): run `pacman -S --needed mingw-w64-x86_64-qt6-base mingw-w64-x86_64-qt6-tools`
1. Optional (Qt only): run `pacman -S --needed mingw-w64-x86_64-qt6-base mingw-w64-x86_64-qt6-tools mingw-w64-x86_64-qt6-multimedia`
4. Run `git clone --depth 1 --recursive https://github.com/shadps4-emu/shadPS4`
5. Run `cd shadPS4`
6. Run `cmake -S . -B build -DCMAKE_C_COMPILER="clang.exe" -DCMAKE_CXX_COMPILER="clang++.exe" -DCMAKE_CXX_FLAGS="-O2 -march=native"`
@ -94,7 +94,7 @@ ARM64-based computers, follow:
1. Open "MSYS2 CLANGARM64" from your new applications
2. Run `pacman -Syu`, let it complete;
3. Run `pacman -S --needed git mingw-w64-clang-aarch64-binutils mingw-w64-clang-aarch64-clang mingw-w64-clang-aarch64-cmake mingw-w64-clang-aarch64-ninja mingw-w64-clang-aarch64-ffmpeg`
1. Optional (Qt only): run `pacman -S --needed mingw-w64-clang-aarch64-qt6-base mingw-w64-clang-aarch64-qt6-tools`
1. Optional (Qt only): run `pacman -S --needed mingw-w64-clang-aarch64-qt6-base mingw-w64-clang-aarch64-qt6-tools mingw-w64-clang-aarch64-qt6-multimedia`
4. Run `git clone --depth 1 --recursive https://github.com/shadps4-emu/shadPS4`
5. Run `cd shadPS4`
6. Run `cmake -S . -B build -DCMAKE_C_COMPILER="clang.exe" -DCMAKE_CXX_COMPILER="clang++.exe" -DCMAKE_CXX_FLAGS="-O2 -march=native"`

View File

@ -27,16 +27,19 @@ namespace Config {
static bool isNeo = false;
static bool isFullscreen = false;
static bool playBGM = false;
static u32 screenWidth = 1280;
static u32 screenHeight = 720;
static s32 gpuId = -1; // Vulkan physical device index. Set to negative for auto select
static std::string logFilter;
static std::string logType = "async";
static std::string userName = "shadPS4";
static std::string updateChannel = "stable";
static bool useSpecialPad = false;
static int specialPadClass = 1;
static bool isDebugDump = false;
static bool isShowSplash = false;
static bool isAutoUpdate = false;
static bool isNullGpu = false;
static bool shouldCopyGPUBuffers = false;
static bool shouldDumpShaders = false;
@ -78,6 +81,10 @@ bool isFullscreenMode() {
return isFullscreen;
}
bool getPlayBGM() {
return playBGM;
}
u32 getScreenWidth() {
return screenWidth;
}
@ -102,6 +109,10 @@ std::string getUserName() {
return userName;
}
std::string getUpdateChannel() {
return updateChannel;
}
bool getUseSpecialPad() {
return useSpecialPad;
}
@ -118,6 +129,10 @@ bool showSplash() {
return isShowSplash;
}
bool autoUpdate() {
return isAutoUpdate;
}
bool nullGpu() {
return isNullGpu;
}
@ -186,6 +201,10 @@ void setShowSplash(bool enable) {
isShowSplash = enable;
}
void setAutoUpdate(bool enable) {
isAutoUpdate = enable;
}
void setNullGpu(bool enable) {
isNullGpu = enable;
}
@ -222,6 +241,10 @@ void setFullscreenMode(bool enable) {
isFullscreen = enable;
}
void setPlayBGM(bool enable) {
playBGM = enable;
}
void setLanguage(u32 language) {
m_language = language;
}
@ -242,6 +265,10 @@ void setUserName(const std::string& type) {
userName = type;
}
void setUpdateChannel(const std::string& type) {
updateChannel = type;
}
void setUseSpecialPad(bool use) {
useSpecialPad = use;
}
@ -380,10 +407,13 @@ void load(const std::filesystem::path& path) {
isNeo = toml::find_or<bool>(general, "isPS4Pro", false);
isFullscreen = toml::find_or<bool>(general, "Fullscreen", false);
playBGM = toml::find_or<bool>(general, "playBGM", false);
logFilter = toml::find_or<std::string>(general, "logFilter", "");
logType = toml::find_or<std::string>(general, "logType", "sync");
userName = toml::find_or<std::string>(general, "userName", "shadPS4");
updateChannel = toml::find_or<std::string>(general, "updateChannel", "stable");
isShowSplash = toml::find_or<bool>(general, "showSplash", true);
isAutoUpdate = toml::find_or<bool>(general, "autoUpdate", false);
}
if (data.contains("Input")) {
@ -474,10 +504,13 @@ void save(const std::filesystem::path& path) {
data["General"]["isPS4Pro"] = isNeo;
data["General"]["Fullscreen"] = isFullscreen;
data["General"]["playBGM"] = playBGM;
data["General"]["logFilter"] = logFilter;
data["General"]["logType"] = logType;
data["General"]["userName"] = userName;
data["General"]["updateChannel"] = updateChannel;
data["General"]["showSplash"] = isShowSplash;
data["General"]["autoUpdate"] = isAutoUpdate;
data["Input"]["useSpecialPad"] = useSpecialPad;
data["Input"]["specialPadClass"] = specialPadClass;
data["GPU"]["screenWidth"] = screenWidth;
@ -523,15 +556,18 @@ void save(const std::filesystem::path& path) {
void setDefaultValues() {
isNeo = false;
isFullscreen = false;
playBGM = false;
screenWidth = 1280;
screenHeight = 720;
logFilter = "";
logType = "async";
userName = "shadPS4";
updateChannel = "stable";
useSpecialPad = false;
specialPadClass = 1;
isDebugDump = false;
isShowSplash = false;
isAutoUpdate = false;
isNullGpu = false;
shouldDumpShaders = false;
shouldDumpPM4 = false;

View File

@ -13,9 +13,11 @@ void save(const std::filesystem::path& path);
bool isNeoMode();
bool isFullscreenMode();
bool getPlayBGM();
std::string getLogFilter();
std::string getLogType();
std::string getUserName();
std::string getUpdateChannel();
bool getUseSpecialPad();
int getSpecialPadClass();
@ -26,6 +28,7 @@ s32 getGpuId();
bool debugDump();
bool showSplash();
bool autoUpdate();
bool nullGpu();
bool copyGPUCmdBuffers();
bool dumpShaders();
@ -35,6 +38,7 @@ u32 vblankDiv();
void setDebugDump(bool enable);
void setShowSplash(bool enable);
void setAutoUpdate(bool enable);
void setNullGpu(bool enable);
void setCopyGPUCmdBuffers(bool enable);
void setDumpShaders(bool enable);
@ -44,9 +48,11 @@ void setGpuId(s32 selectedGpuId);
void setScreenWidth(u32 width);
void setScreenHeight(u32 height);
void setFullscreenMode(bool enable);
void setPlayBGM(bool enable);
void setLanguage(u32 language);
void setNeoMode(bool enable);
void setUserName(const std::string& type);
void setUpdateChannel(const std::string& type);
void setUseSpecialPad(bool use);
void setSpecialPadClass(int type);

View File

@ -6,12 +6,14 @@
#define GIT_REV "@GIT_REV@"
#define GIT_BRANCH "@GIT_BRANCH@"
#define GIT_DESC "@GIT_DESC@"
#define BUILD_DATE "@BUILD_DATE@"
namespace Common {
const char g_scm_rev[] = GIT_REV;
const char g_scm_branch[] = GIT_BRANCH;
const char g_scm_desc[] = GIT_DESC;
const char g_scm_date[] = BUILD_DATE;
} // namespace

View File

@ -8,5 +8,6 @@ namespace Common {
extern const char g_scm_rev[];
extern const char g_scm_branch[];
extern const char g_scm_desc[];
extern const char g_scm_date[];
} // namespace Common

View File

@ -1,40 +1,166 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <utility>
#include <imgui.h>
#include <magic_enum.hpp>
#include "common/assert.h"
#include "common/logging/log.h"
#include "core/libraries/error_codes.h"
#include "core/libraries/libs.h"
#include "error_codes.h"
#include "core/libraries/system/commondialog.h"
#include "error_dialog.h"
#include "imgui/imgui_layer.h"
#include "imgui/imgui_std.h"
static constexpr ImVec2 BUTTON_SIZE{100.0f, 30.0f};
namespace Libraries::ErrorDialog {
static OrbisErrorDialogStatus g_error_dlg_status =
OrbisErrorDialogStatus::ORBIS_ERROR_DIALOG_STATUS_NONE;
using CommonDialog::Error;
using CommonDialog::Result;
using CommonDialog::Status;
int PS4_SYSV_ABI sceErrorDialogClose() {
g_error_dlg_status = OrbisErrorDialogStatus::ORBIS_ERROR_DIALOG_STATUS_FINISHED;
return ORBIS_OK;
}
class ErrorDialogUi final : public ImGui::Layer {
bool first_render{false};
OrbisErrorDialogStatus PS4_SYSV_ABI sceErrorDialogGetStatus() {
return g_error_dlg_status;
}
Status* status{nullptr};
std::string err_message{};
int PS4_SYSV_ABI sceErrorDialogInitialize(OrbisErrorDialogParam* param) {
if (g_error_dlg_status == OrbisErrorDialogStatus::ORBIS_ERROR_DIALOG_STATUS_INITIALIZED) {
LOG_ERROR(Lib_ErrorDialog, "Error dialog is already at init mode");
return ORBIS_ERROR_DIALOG_ERROR_ALREADY_INITIALIZED;
public:
explicit ErrorDialogUi(Status* status = nullptr, std::string err_message = "")
: status(status), err_message(std::move(err_message)) {
if (status && *status == Status::RUNNING) {
first_render = true;
AddLayer(this);
}
g_error_dlg_status = OrbisErrorDialogStatus::ORBIS_ERROR_DIALOG_STATUS_INITIALIZED;
return ORBIS_OK;
}
~ErrorDialogUi() override {
Finish();
}
ErrorDialogUi(const ErrorDialogUi& other) = delete;
ErrorDialogUi(ErrorDialogUi&& other) noexcept
: Layer(other), status(other.status), err_message(std::move(other.err_message)) {
other.status = nullptr;
}
ErrorDialogUi& operator=(ErrorDialogUi other) {
using std::swap;
swap(status, other.status);
swap(err_message, other.err_message);
if (status && *status == Status::RUNNING) {
first_render = true;
AddLayer(this);
}
return *this;
}
void Finish() {
if (status) {
*status = Status::FINISHED;
}
status = nullptr;
RemoveLayer(this);
}
void Draw() override {
using namespace ImGui;
if (status == nullptr || *status != Status::RUNNING) {
return;
}
const auto& io = GetIO();
const ImVec2 window_size{
std::min(io.DisplaySize.x, 500.0f),
std::min(io.DisplaySize.y, 300.0f),
};
CentralizeWindow();
SetNextWindowSize(window_size);
SetNextWindowCollapsed(false);
if (first_render || !io.NavActive) {
SetNextWindowFocus();
}
KeepNavHighlight();
if (Begin("Error Dialog##ErrorDialog", nullptr,
ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings)) {
const auto ws = GetWindowSize();
DrawPrettyBackground();
const char* begin = &err_message.front();
const char* end = &err_message.back() + 1;
SetWindowFontScale(1.3f);
DrawCenteredText(begin, end,
GetContentRegionAvail() - ImVec2{0.0f, 15.0f + BUTTON_SIZE.y});
SetWindowFontScale(1.0f);
SetCursorPos({
ws.x / 2.0f - BUTTON_SIZE.x / 2.0f,
ws.y - 10.0f - BUTTON_SIZE.y,
});
if (Button("OK", BUTTON_SIZE)) {
Finish();
}
if (first_render) {
SetItemCurrentNavFocus();
}
}
End();
first_render = false;
}
};
static auto g_status = Status::NONE;
static ErrorDialogUi g_dialog_ui;
struct Param {
s32 size;
s32 errorCode;
OrbisUserServiceUserId userId;
s32 _reserved;
};
Error PS4_SYSV_ABI sceErrorDialogClose() {
LOG_DEBUG(Lib_ErrorDialog, "called");
if (g_status != Status::RUNNING) {
return Error::NOT_RUNNING;
}
g_dialog_ui.Finish();
return Error::OK;
}
int PS4_SYSV_ABI sceErrorDialogOpen(OrbisErrorDialogParam* param) {
LOG_ERROR(Lib_ErrorDialog, "size = {} errorcode = {:#x} userid = {}", param->size,
param->errorCode, param->userId);
g_error_dlg_status = OrbisErrorDialogStatus::ORBIS_ERROR_DIALOG_STATUS_RUNNING;
return ORBIS_OK;
Status PS4_SYSV_ABI sceErrorDialogGetStatus() {
LOG_TRACE(Lib_ErrorDialog, "called status={}", magic_enum::enum_name(g_status));
return g_status;
}
Error PS4_SYSV_ABI sceErrorDialogInitialize() {
LOG_DEBUG(Lib_ErrorDialog, "called");
if (g_status != Status::NONE) {
return Error::ALREADY_INITIALIZED;
}
g_status = Status::INITIALIZED;
return Error::OK;
}
Error PS4_SYSV_ABI sceErrorDialogOpen(const Param* param) {
if (g_status != Status::INITIALIZED && g_status != Status::FINISHED) {
LOG_INFO(Lib_ErrorDialog, "called without initialize");
return Error::INVALID_STATE;
}
if (param == nullptr) {
LOG_DEBUG(Lib_ErrorDialog, "called param:(NULL)");
return Error::ARG_NULL;
}
const auto err = static_cast<u32>(param->errorCode);
LOG_DEBUG(Lib_ErrorDialog, "called param->errorCode = {:#x}", err);
ASSERT(param->size == sizeof(Param));
const std::string err_message = fmt::format("An error has occurred. \nCode: {:#X}", err);
g_status = Status::RUNNING;
g_dialog_ui = ErrorDialogUi{&g_status, err_message};
return Error::OK;
}
int PS4_SYSV_ABI sceErrorDialogOpenDetail() {
@ -47,20 +173,21 @@ int PS4_SYSV_ABI sceErrorDialogOpenWithReport() {
return ORBIS_OK;
}
int PS4_SYSV_ABI sceErrorDialogTerminate() {
if (g_error_dlg_status == OrbisErrorDialogStatus::ORBIS_ERROR_DIALOG_STATUS_NONE) {
LOG_ERROR(Lib_ErrorDialog, "Error dialog hasn't initialized");
return ORBIS_ERROR_DIALOG_ERROR_NOT_INITIALIZED;
Error PS4_SYSV_ABI sceErrorDialogTerminate() {
LOG_DEBUG(Lib_ErrorDialog, "called");
if (g_status == Status::RUNNING) {
sceErrorDialogClose();
}
g_error_dlg_status = OrbisErrorDialogStatus::ORBIS_ERROR_DIALOG_STATUS_NONE;
return ORBIS_OK;
if (g_status == Status::NONE) {
return Error::NOT_INITIALIZED;
}
g_status = Status::NONE;
return Error::OK;
}
OrbisErrorDialogStatus PS4_SYSV_ABI sceErrorDialogUpdateStatus() {
// TODO when imgui dialog is done this will loop until ORBIS_ERROR_DIALOG_STATUS_FINISHED
// This should be done calling sceErrorDialogClose but since we don't have a dialog we finish it
// here
return OrbisErrorDialogStatus::ORBIS_ERROR_DIALOG_STATUS_FINISHED;
Status PS4_SYSV_ABI sceErrorDialogUpdateStatus() {
LOG_TRACE(Lib_ErrorDialog, "called status={}", magic_enum::enum_name(g_status));
return g_status;
}
void RegisterlibSceErrorDialog(Core::Loader::SymbolsResolver* sym) {

View File

@ -4,34 +4,25 @@
#pragma once
#include "common/types.h"
#include "core/libraries/system/commondialog.h"
namespace Core::Loader {
class SymbolsResolver;
}
namespace Libraries::ErrorDialog {
enum OrbisErrorDialogStatus {
ORBIS_ERROR_DIALOG_STATUS_NONE = 0,
ORBIS_ERROR_DIALOG_STATUS_INITIALIZED = 1,
ORBIS_ERROR_DIALOG_STATUS_RUNNING = 2,
ORBIS_ERROR_DIALOG_STATUS_FINISHED = 3
};
using OrbisUserServiceUserId = s32;
struct OrbisErrorDialogParam {
s32 size;
u32 errorCode;
s32 userId;
s32 reserved;
};
struct Param;
int PS4_SYSV_ABI sceErrorDialogClose();
OrbisErrorDialogStatus PS4_SYSV_ABI sceErrorDialogGetStatus();
int PS4_SYSV_ABI sceErrorDialogInitialize(OrbisErrorDialogParam* param);
int PS4_SYSV_ABI sceErrorDialogOpen(OrbisErrorDialogParam* param);
CommonDialog::Error PS4_SYSV_ABI sceErrorDialogClose();
CommonDialog::Status PS4_SYSV_ABI sceErrorDialogGetStatus();
CommonDialog::Error PS4_SYSV_ABI sceErrorDialogInitialize();
CommonDialog::Error PS4_SYSV_ABI sceErrorDialogOpen(const Param* param);
int PS4_SYSV_ABI sceErrorDialogOpenDetail();
int PS4_SYSV_ABI sceErrorDialogOpenWithReport();
int PS4_SYSV_ABI sceErrorDialogTerminate();
OrbisErrorDialogStatus PS4_SYSV_ABI sceErrorDialogUpdateStatus();
CommonDialog::Error PS4_SYSV_ABI sceErrorDialogTerminate();
CommonDialog::Status PS4_SYSV_ABI sceErrorDialogUpdateStatus();
void RegisterlibSceErrorDialog(Core::Loader::SymbolsResolver* sym);
} // namespace Libraries::ErrorDialog

View File

@ -1506,6 +1506,10 @@ int PS4_SYSV_ABI scePthreadGetprio(ScePthread thread, int* prio) {
return ORBIS_OK;
}
int PS4_SYSV_ABI scePthreadSetprio(ScePthread thread, int prio) {
if (thread == nullptr) {
LOG_ERROR(Kernel_Pthread, "scePthreadSetprio: thread is nullptr");
return ORBIS_KERNEL_ERROR_EINVAL;
}
thread->prio = prio;
return ORBIS_OK;
}

View File

@ -79,6 +79,7 @@ SaveDialogState::SaveDialogState(const OrbisSaveDataDialogParam& param) {
this->title_id = item->titleId->data.to_string();
}
if (item->dirName != nullptr) {
for (u32 i = 0; i < item->dirNameNum; i++) {
const auto dir_name = item->dirName[i].data.to_view();
@ -119,7 +120,8 @@ SaveDialogState::SaveDialogState(const OrbisSaveDataDialogParam& param) {
.dir_name = std::string{dir_name},
.icon = icon,
.title = std::string{param_sfo.GetString(SaveParams::MAINTITLE).value_or("Unknown")},
.title =
std::string{param_sfo.GetString(SaveParams::MAINTITLE).value_or("Unknown")},
.subtitle = std::string{param_sfo.GetString(SaveParams::SUBTITLE).value_or("")},
.details = std::string{param_sfo.GetString(SaveParams::DETAIL).value_or("")},
.date = date_str,
@ -129,6 +131,7 @@ SaveDialogState::SaveDialogState(const OrbisSaveDataDialogParam& param) {
.is_corrupted = is_corrupted,
});
}
}
if (type == DialogType::SAVE && item->newItem != nullptr) {
RefCountedTexture icon;
@ -299,7 +302,7 @@ SaveDialogState::ProgressBarState::ProgressBarState(const SaveDialogState& state
} else {
switch (bar.sysMsgType) {
case ProgressSystemMessageType::INVALID:
this->msg = "INVALID";
this->msg = "";
break;
case ProgressSystemMessageType::PROGRESS:
switch (state.type) {

View File

@ -269,9 +269,6 @@ bool TriggerSave() {
void ReadMemory(void* buf, size_t buf_size, int64_t offset) {
std::scoped_lock lk{g_saving_memory_mutex};
if (offset > g_save_memory.size()) {
UNREACHABLE_MSG("ReadMemory out of bounds");
}
if (offset + buf_size > g_save_memory.size()) {
UNREACHABLE_MSG("ReadMemory out of bounds");
}
@ -280,11 +277,8 @@ void ReadMemory(void* buf, size_t buf_size, int64_t offset) {
void WriteMemory(void* buf, size_t buf_size, int64_t offset) {
std::scoped_lock lk{g_saving_memory_mutex};
if (offset > g_save_memory.size()) {
UNREACHABLE_MSG("WriteMemory out of bounds");
}
if (offset + buf_size > g_save_memory.size()) {
UNREACHABLE_MSG("WriteMemory out of bounds");
g_save_memory.resize(offset + buf_size);
}
std::memcpy(g_save_memory.data() + offset, buf, buf_size);
g_memory_dirty = true;

View File

@ -1,7 +1,9 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "common/config.h"
#include "common/logging/log.h"
#include "core/libraries/error_codes.h"
#include "core/libraries/libs.h"
#include "core/libraries/system/userservice.h"
@ -1071,7 +1073,7 @@ s32 PS4_SYSV_ABI sceUserServiceGetUserName(int user_id, char* user_name, std::si
LOG_ERROR(Lib_UserService, "user_name is null");
return ORBIS_USER_SERVICE_ERROR_INVALID_ARGUMENT;
}
std::string name = "shadps4"; // TODO onfigurable username
std::string name = Config::getUserName();
if (size < name.length()) {
LOG_ERROR(Lib_UserService, "buffer is too short");
return ORBIS_USER_SERVICE_ERROR_BUFFER_TOO_SHORT;

BIN
src/images/dump_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
src/images/update_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 780 B

View File

@ -106,7 +106,11 @@ void OnResize() {
}
void Shutdown(const vk::Device& device) {
device.waitIdle();
auto result = device.waitIdle();
if (result != vk::Result::eSuccess) {
LOG_WARNING(ImGui, "Failed to wait for Vulkan device idle on shutdown: {}",
vk::to_string(result));
}
TextureManager::StopWorker();

View File

@ -5,7 +5,6 @@
#pragma once
#define VULKAN_HPP_NO_EXCEPTIONS
#include "common/types.h"
#include "video_core/renderer_vulkan/vk_common.h"

View File

@ -0,0 +1,32 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "background_music_player.h"
BackgroundMusicPlayer::BackgroundMusicPlayer(QObject* parent) : QObject(parent) {
m_mediaPlayer = new QMediaPlayer(this);
m_audioOutput = new QAudioOutput(this);
m_mediaPlayer->setAudioOutput(m_audioOutput);
m_mediaPlayer->setLoops(QMediaPlayer::Infinite);
}
void BackgroundMusicPlayer::playMusic(const QString& snd0path) {
if (snd0path.isEmpty()) {
stopMusic();
return;
}
const auto newMusic = QUrl::fromLocalFile(snd0path);
if (m_mediaPlayer->playbackState() == QMediaPlayer::PlayingState &&
m_currentMusic == newMusic) {
// already playing the correct music
return;
}
m_currentMusic = newMusic;
m_mediaPlayer->setSource(newMusic);
m_mediaPlayer->play();
}
void BackgroundMusicPlayer::stopMusic() {
m_mediaPlayer->stop();
}

View File

@ -0,0 +1,28 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <QAudioOutput>
#include <QMediaPlayer>
#include <QObject>
class BackgroundMusicPlayer : public QObject {
Q_OBJECT
public:
static BackgroundMusicPlayer& getInstance() {
static BackgroundMusicPlayer instance;
return instance;
}
void playMusic(const QString& snd0path);
void stopMusic();
private:
BackgroundMusicPlayer(QObject* parent = nullptr);
QMediaPlayer* m_mediaPlayer;
QAudioOutput* m_audioOutput;
QUrl m_currentMusic;
};

View File

@ -681,7 +681,7 @@ void CheatsPatches::downloadPatches(const QString repository, const bool showMes
request.setRawHeader("Accept", "application/vnd.github.v3+json");
QNetworkReply* reply = manager->get(request);
connect(reply, &QNetworkReply::finished, [=]() {
connect(reply, &QNetworkReply::finished, [=, this]() {
if (reply->error() == QNetworkReply::NoError) {
QByteArray jsonData = reply->readAll();
reply->deleteLater();
@ -714,7 +714,7 @@ void CheatsPatches::downloadPatches(const QString repository, const bool showMes
QNetworkRequest fileRequest(downloadUrl);
QNetworkReply* fileReply = manager->get(fileRequest);
connect(fileReply, &QNetworkReply::finished, [=]() {
connect(fileReply, &QNetworkReply::finished, [=, this]() {
if (fileReply->error() == QNetworkReply::NoError) {
QByteArray fileData = fileReply->readAll();
QFile localFile(dir.filePath(fileName));

499
src/qt_gui/check_update.cpp Normal file
View File

@ -0,0 +1,499 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <filesystem>
#include <QDateTime>
#include <QDir>
#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QLabel>
#include <QMessageBox>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QProcess>
#include <QPushButton>
#include <QString>
#include <QStringList>
#include <QTextEdit>
#include <QVBoxLayout>
#include <common/config.h>
#include <common/path_util.h>
#include <common/scm_rev.h>
#include "check_update.h"
using namespace Common::FS;
namespace fs = std::filesystem;
CheckUpdate::CheckUpdate(const bool showMessage, QWidget* parent)
: QDialog(parent), networkManager(new QNetworkAccessManager(this)) {
setWindowTitle(tr("Auto Updater"));
setFixedSize(0, 0);
CheckForUpdates(showMessage);
}
CheckUpdate::~CheckUpdate() {}
void CheckUpdate::CheckForUpdates(const bool showMessage) {
QString updateChannel = QString::fromStdString(Config::getUpdateChannel());
QUrl url;
if (updateChannel == "unstable") {
url = QUrl("https://api.github.com/repos/shadps4-emu/shadPS4/releases");
} else if (updateChannel == "stable") {
url = QUrl("https://api.github.com/repos/shadps4-emu/shadPS4/releases/latest");
} else {
QMessageBox::warning(
this, tr("Error"),
QString(tr("Invalid update channel: ") + updateChannel + "\n" +
tr("In updateChannel in config.tml file must contain 'stable' or 'unstable'")
.arg(updateChannel)));
return;
}
QNetworkRequest request(url);
QNetworkReply* reply = networkManager->get(request);
connect(reply, &QNetworkReply::finished, this, [this, reply, showMessage, updateChannel]() {
if (reply->error() != QNetworkReply::NoError) {
QMessageBox::warning(this, tr("Error"),
QString(tr("Network error:") + "\n" + reply->errorString()));
reply->deleteLater();
return;
}
QByteArray response = reply->readAll();
QJsonDocument jsonDoc(QJsonDocument::fromJson(response));
if (jsonDoc.isNull()) {
QMessageBox::warning(this, tr("Error"), tr("Failed to parse update information."));
reply->deleteLater();
return;
}
QString downloadUrl;
QString latestVersion;
QString latestRev;
QString latestDate;
QString platformString;
#ifdef Q_OS_WIN
platformString = "win64-qt";
#elif defined(Q_OS_LINUX)
platformString = "linux-qt";
#elif defined(Q_OS_MAC)
platformString = "macos-qt";
#endif
QJsonObject jsonObj;
if (updateChannel == "unstable") {
QJsonArray jsonArray = jsonDoc.array();
for (const QJsonValue& value : jsonArray) {
jsonObj = value.toObject();
if (jsonObj.contains("prerelease") && jsonObj["prerelease"].toBool()) {
break;
}
}
if (!jsonObj.isEmpty()) {
latestVersion = jsonObj["tag_name"].toString();
} else {
QMessageBox::warning(this, tr("Error"), tr("No pre-releases found."));
reply->deleteLater();
return;
}
} else {
jsonObj = jsonDoc.object();
if (jsonObj.contains("tag_name")) {
latestVersion = jsonObj["tag_name"].toString();
} else {
QMessageBox::warning(this, tr("Error"), tr("Invalid release data."));
reply->deleteLater();
return;
}
}
latestRev = latestVersion.right(7);
latestDate = jsonObj["published_at"].toString();
QJsonArray assets = jsonObj["assets"].toArray();
bool found = false;
for (const QJsonValue& assetValue : assets) {
QJsonObject assetObj = assetValue.toObject();
if (assetObj["name"].toString().contains(platformString)) {
downloadUrl = assetObj["browser_download_url"].toString();
found = true;
break;
}
}
if (!found) {
QMessageBox::warning(this, tr("Error"),
tr("No download URL found for the specified asset."));
reply->deleteLater();
return;
}
QString currentRev = QString::fromStdString(Common::g_scm_rev).left(7);
QString currentDate = Common::g_scm_date;
QDateTime dateTime = QDateTime::fromString(latestDate, Qt::ISODate);
latestDate = dateTime.isValid() ? dateTime.toString("yyyy-MM-dd HH:mm:ss") : "Unknown date";
if (latestRev == currentRev) {
if (showMessage) {
QMessageBox::information(this, tr("Auto Updater"),
tr("Your version is already up to date!"));
}
close();
return;
} else {
setupUI(downloadUrl, latestDate, latestRev, currentDate, currentRev);
}
reply->deleteLater();
});
}
void CheckUpdate::setupUI(const QString& downloadUrl, const QString& latestDate,
const QString& latestRev, const QString& currentDate,
const QString& currentRev) {
QVBoxLayout* layout = new QVBoxLayout(this);
QHBoxLayout* titleLayout = new QHBoxLayout();
QLabel* imageLabel = new QLabel(this);
QPixmap pixmap(":/images/shadps4.ico");
imageLabel->setPixmap(pixmap);
imageLabel->setScaledContents(true);
imageLabel->setFixedSize(50, 50);
QLabel* titleLabel = new QLabel("<h1>" + tr("Update Available") + "</h1>", this);
titleLayout->addWidget(imageLabel);
titleLayout->addWidget(titleLabel);
layout->addLayout(titleLayout);
QString updateText = QString("<p><b><br>" + tr("Current Version") + ":</b> %1 (%2)<br><b>" +
tr("Latest Version") + ":</b> %3 (%4)</p><p>" +
tr("Do you want to update?") + "</p>")
.arg(currentRev, currentDate, latestRev, latestDate);
QLabel* updateLabel = new QLabel(updateText, this);
layout->addWidget(updateLabel);
// Setup bottom layout with action buttons
QHBoxLayout* bottomLayout = new QHBoxLayout();
autoUpdateCheckBox = new QCheckBox(tr("Check for Updates at Startup"), this);
yesButton = new QPushButton(tr("Update"), this);
noButton = new QPushButton(tr("No"), this);
yesButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
noButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
bottomLayout->addWidget(autoUpdateCheckBox);
QSpacerItem* spacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
bottomLayout->addItem(spacer);
bottomLayout->addWidget(yesButton);
bottomLayout->addWidget(noButton);
layout->addLayout(bottomLayout);
QString updateChannel = QString::fromStdString(Config::getUpdateChannel());
// Don't show changelog button if:
// The current version is a pre-release and the version to be downloaded is a release.
bool current_isRelease = currentRev.startsWith('v', Qt::CaseInsensitive);
bool latest_isRelease = latestRev.startsWith('v', Qt::CaseInsensitive);
if (!current_isRelease && latest_isRelease) {
} else {
QTextEdit* textField = new QTextEdit(this);
textField->setReadOnly(true);
textField->setFixedWidth(500);
textField->setFixedHeight(200);
textField->setVisible(false);
layout->addWidget(textField);
QPushButton* toggleButton = new QPushButton(tr("Show Changelog"), this);
layout->addWidget(toggleButton);
connect(toggleButton, &QPushButton::clicked,
[this, textField, toggleButton, currentRev, latestRev, downloadUrl, latestDate,
currentDate]() {
QString updateChannel = QString::fromStdString(Config::getUpdateChannel());
if (!textField->isVisible()) {
requestChangelog(currentRev, latestRev, downloadUrl, latestDate,
currentDate);
textField->setVisible(true);
toggleButton->setText(tr("Hide Changelog"));
adjustSize();
} else {
textField->setVisible(false);
toggleButton->setText(tr("Show Changelog"));
adjustSize();
}
});
}
connect(yesButton, &QPushButton::clicked, this, [this, downloadUrl]() {
yesButton->setEnabled(false);
noButton->setEnabled(false);
DownloadUpdate(downloadUrl);
});
connect(noButton, &QPushButton::clicked, this, [this]() { close(); });
autoUpdateCheckBox->setChecked(Config::autoUpdate());
connect(autoUpdateCheckBox, &QCheckBox::stateChanged, this, [](int state) {
const auto user_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir);
Config::setAutoUpdate(state == Qt::Checked);
Config::save(user_dir / "config.toml");
});
setLayout(layout);
}
void CheckUpdate::requestChangelog(const QString& currentRev, const QString& latestRev,
const QString& downloadUrl, const QString& latestDate,
const QString& currentDate) {
QString compareUrlString =
QString("https://api.github.com/repos/shadps4-emu/shadPS4/compare/%1...%2")
.arg(currentRev)
.arg(latestRev);
QUrl compareUrl(compareUrlString);
QNetworkRequest compareRequest(compareUrl);
QNetworkReply* compareReply = networkManager->get(compareRequest);
connect(compareReply, &QNetworkReply::finished, this,
[this, compareReply, downloadUrl, latestDate, latestRev, currentDate, currentRev]() {
if (compareReply->error() != QNetworkReply::NoError) {
QMessageBox::warning(
this, tr("Error"),
QString(tr("Network error:") + "\n%1").arg(compareReply->errorString()));
compareReply->deleteLater();
return;
}
QByteArray compareResponse = compareReply->readAll();
QJsonDocument compareJsonDoc(QJsonDocument::fromJson(compareResponse));
QJsonObject compareJsonObj = compareJsonDoc.object();
QJsonArray commits = compareJsonObj["commits"].toArray();
QString changes;
for (const QJsonValue& commitValue : commits) {
QJsonObject commitObj = commitValue.toObject();
QString message = commitObj["commit"].toObject()["message"].toString();
// Remove texts after first line break, if any, to make it cleaner
int newlineIndex = message.indexOf('\n');
if (newlineIndex != -1) {
message = message.left(newlineIndex);
}
if (!changes.isEmpty()) {
changes += "<br>";
}
changes += "&nbsp;&nbsp;&nbsp;&nbsp;• " + message;
}
// Update the text field with the changelog
QTextEdit* textField = findChild<QTextEdit*>();
if (textField) {
textField->setHtml("<h2>" + tr("Changes") + ":</h2>" + changes);
}
compareReply->deleteLater();
});
}
void CheckUpdate::DownloadUpdate(const QString& url) {
QNetworkRequest request(url);
QNetworkReply* reply = networkManager->get(request);
connect(reply, &QNetworkReply::finished, this, [this, reply, url]() {
if (reply->error() != QNetworkReply::NoError) {
QMessageBox::warning(this, tr("Error"),
tr("Network error occurred while trying to access the URL") +
":\n" + url + "\n" + reply->errorString());
reply->deleteLater();
return;
}
QString userPath =
QString::fromStdString(Common::FS::GetUserPath(Common::FS::PathType::UserDir).string());
QString tempDownloadPath = userPath + "/temp_download_update";
QDir dir(tempDownloadPath);
if (!dir.exists()) {
dir.mkpath(".");
}
QString downloadPath = tempDownloadPath + "/temp_download_update.zip";
QFile file(downloadPath);
if (file.open(QIODevice::WriteOnly)) {
file.write(reply->readAll());
file.close();
QMessageBox::information(this, tr("Download Complete"),
tr("The update has been downloaded, press OK to install."));
Install();
} else {
QMessageBox::warning(
this, tr("Error"),
QString(tr("Failed to save the update file at") + ":\n" + downloadPath));
}
reply->deleteLater();
});
}
void CheckUpdate::Install() {
QString userPath =
QString::fromStdString(Common::FS::GetUserPath(Common::FS::PathType::UserDir).string());
QString startingUpdate = tr("Starting Update...");
QString tempDirPath = userPath + "/temp_download_update";
QString rootPath = QString::fromStdString(std::filesystem::current_path().string());
QString scriptContent;
QString scriptFileName;
QStringList arguments;
QString processCommand;
#ifdef Q_OS_WIN
// Windows Batch Script
scriptFileName = tempDirPath + "/update.ps1";
scriptContent = QStringLiteral(
"Set-ExecutionPolicy Bypass -Scope Process -Force\n"
"Write-Output '%1'\n"
"Expand-Archive -Path '%2\\temp_download_update.zip' -DestinationPath '%2' -Force\n"
"Start-Sleep -Seconds 3\n"
"Copy-Item -Recurse -Force '%2\\*' '%3\\'\n"
"Start-Sleep -Seconds 2\n"
"Remove-Item -Force '%3\\update.ps1'\n"
"Remove-Item -Force '%3\\temp_download_update.zip'\n"
"Start-Process '%3\\shadps4.exe'\n"
"Remove-Item -Recurse -Force '%2'\n");
arguments << "-ExecutionPolicy"
<< "Bypass"
<< "-File" << scriptFileName;
processCommand = "powershell.exe";
#elif defined(Q_OS_LINUX)
// Linux Shell Script
scriptFileName = tempDirPath + "/update.sh";
scriptContent = QStringLiteral(
"#!/bin/bash\n"
"check_unzip() {\n"
" if ! command -v unzip &> /dev/null && ! command -v 7z &> /dev/null; then\n"
" echo \"Neither 'unzip' nor '7z' is installed.\"\n"
" read -p \"Would you like to install 'unzip'? (y/n): \" response\n"
" if [[ \"$response\" == \"y\" || \"$response\" == \"Y\" ]]; then\n"
" if [[ -f /etc/os-release ]]; then\n"
" . /etc/os-release\n"
" case \"$ID\" in\n"
" ubuntu|debian)\n"
" sudo apt-get install unzip -y\n"
" ;;\n"
" fedora|redhat)\n"
" sudo dnf install unzip -y\n"
" ;;\n"
" *)\n"
" echo \"Unsupported distribution for automatic installation.\"\n"
" exit 1\n"
" ;;\n"
" esac\n"
" else\n"
" echo \"Could not identify the distribution.\"\n"
" exit 1\n"
" fi\n"
" else\n"
" echo \"At least one of 'unzip' or '7z' is required to continue. The process "
"will be terminated.\"\n"
" exit 1\n"
" fi\n"
" fi\n"
"}\n"
"extract_file() {\n"
" if command -v unzip &> /dev/null; then\n"
" unzip -o \"%2/temp_download_update.zip\" -d \"%2/\"\n"
" elif command -v 7z &> /dev/null; then\n"
" 7z x \"%2/temp_download_update.zip\" -o\"%2/\" -y\n"
" else\n"
" echo \"No suitable extraction tool found.\"\n"
" exit 1\n"
" fi\n"
"}\n"
"main() {\n"
" check_unzip\n"
" echo \"%1\"\n"
" sleep 2\n"
" extract_file\n"
" sleep 2\n"
" cp -r \"%2/\"* \"%3/\"\n"
" sleep 2\n"
" rm \"%3/update.sh\"\n"
" rm \"%3/temp_download_update.zip\"\n"
" chmod +x \"%3/Shadps4-qt.AppImage\"\n"
" rm -r \"%2\"\n"
" cd \"%3\" && ./Shadps4-qt.AppImage\n"
"}\n"
"main\n");
arguments << scriptFileName;
processCommand = "bash";
#elif defined(Q_OS_MAC)
// macOS Shell Script
scriptFileName = tempDirPath + "/update.sh";
scriptContent = QStringLiteral(
"#!/bin/bash\n"
"check_tools() {\n"
" if ! command -v unzip &> /dev/null && ! command -v tar &> /dev/null; then\n"
" echo \"Neither 'unzip' nor 'tar' is installed.\"\n"
" read -p \"Would you like to install 'unzip'? (y/n): \" response\n"
" if [[ \"$response\" == \"y\" || \"$response\" == \"Y\" ]]; then\n"
" echo \"Please install 'unzip' using Homebrew or another package manager.\"\n"
" exit 1\n"
" else\n"
" echo \"At least one of 'unzip' or 'tar' is required to continue. The process "
"will be terminated.\"\n"
" exit 1\n"
" fi\n"
" fi\n"
"}\n"
"check_tools\n"
"echo \"%1\"\n"
"sleep 2\n"
"unzip -o \"%2/temp_download_update.zip\" -d \"%2/\"\n"
"sleep 2\n"
"tar -xzf \"%2/shadps4-macos-qt.tar.gz\" -C \"%3\"\n"
"sleep 2\n"
"rm \"%3/update.sh\"\n"
"chmod +x \"%3/shadps4.app/Contents/MacOS/shadps4\"\n"
"open \"%3/shadps4.app\"\n"
"rm -r \"%2\"\n");
arguments << scriptFileName;
processCommand = "bash";
#else
QMessageBox::warning(this, tr("Error"), "Unsupported operating system.");
return;
#endif
QFile scriptFile(scriptFileName);
if (scriptFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&scriptFile);
out << scriptContent.arg(startingUpdate).arg(tempDirPath).arg(rootPath);
scriptFile.close();
// Make the script executable on Unix-like systems
#if defined(Q_OS_LINUX) || defined(Q_OS_MAC)
scriptFile.setPermissions(QFileDevice::ExeOwner | QFileDevice::ReadOwner |
QFileDevice::WriteOwner);
#endif
QProcess::startDetached(processCommand, arguments);
exit(EXIT_SUCCESS);
} else {
QMessageBox::warning(
this, tr("Error"),
QString(tr("Failed to create the update script file") + ":\n" + scriptFileName));
}
}

40
src/qt_gui/check_update.h Normal file
View File

@ -0,0 +1,40 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#ifndef CHECKUPDATE_H
#define CHECKUPDATE_H
#include <QCheckBox>
#include <QDialog>
#include <QNetworkAccessManager>
#include <QPushButton>
class CheckUpdate : public QDialog {
Q_OBJECT
public:
explicit CheckUpdate(const bool showMessage, QWidget* parent = nullptr);
~CheckUpdate();
private slots:
void CheckForUpdates(const bool showMessage);
void DownloadUpdate(const QString& url);
void Install();
private:
void setupUI(const QString& downloadUrl, const QString& latestDate, const QString& latestRev,
const QString& currentDate, const QString& currentRev);
void requestChangelog(const QString& currentRev, const QString& latestRev,
const QString& downloadUrl, const QString& latestDate,
const QString& currentDate);
QCheckBox* autoUpdateCheckBox;
QPushButton* yesButton;
QPushButton* noButton;
QString updateDownloadUrl;
QNetworkAccessManager* networkManager;
};
#endif // CHECKUPDATE_H

View File

@ -39,6 +39,15 @@ GameGridFrame::GameGridFrame(std::shared_ptr<GameInfoClass> game_info_get, QWidg
});
}
void GameGridFrame::PlayBackgroundMusic(QTableWidgetItem* item) {
if (!item) {
BackgroundMusicPlayer::getInstance().stopMusic();
return;
}
const auto snd0path = QString::fromStdString(m_game_info->m_games[item->row()].snd0_path);
BackgroundMusicPlayer::getInstance().playMusic(snd0path);
}
void GameGridFrame::PopulateGameGrid(QVector<GameInfo> m_games_search, bool fromSearch) {
QVector<GameInfo> m_games_;
this->clearContents();

View File

@ -5,6 +5,7 @@
#include <QScrollBar>
#include "background_music_player.h"
#include "common/config.h"
#include "game_info.h"
#include "game_list_utils.h"
@ -19,6 +20,7 @@ Q_SIGNALS:
public Q_SLOTS:
void SetGridBackgroundImage(int row, int column);
void RefreshGridBackgroundImage();
void PlayBackgroundMusic(QTableWidgetItem* item);
private:
QImage backgroundImage;

View File

@ -33,6 +33,8 @@ public:
Common::FS::PathToQString(iconpath, game.icon_path);
game.icon = QImage(iconpath);
game.pic_path = game.path / "sce_sys" / "pic1.png";
game.snd0_path = game.path / "sce_sys" / "snd0.at9";
if (const auto title = psf.GetString("TITLE"); title.has_value()) {
game.name = *title;
}

View File

@ -69,6 +69,15 @@ GameListFrame::GameListFrame(std::shared_ptr<GameInfoClass> game_info_get, QWidg
});
}
void GameListFrame::PlayBackgroundMusic(QTableWidgetItem* item) {
if (!item) {
BackgroundMusicPlayer::getInstance().stopMusic();
return;
}
const auto snd0path = QString::fromStdString(m_game_info->m_games[item->row()].snd0_path);
BackgroundMusicPlayer::getInstance().playMusic(snd0path);
}
void GameListFrame::PopulateGameList() {
this->setRowCount(m_game_info->m_games.size());
ResizeIcons(icon_size);

View File

@ -5,6 +5,7 @@
#include <QScrollBar>
#include "background_music_player.h"
#include "game_info.h"
#include "game_list_utils.h"
#include "gui_context_menus.h"
@ -21,6 +22,7 @@ public Q_SLOTS:
void RefreshListBackgroundImage();
void SortNameAscending(int columnIndex);
void SortNameDescending(int columnIndex);
void PlayBackgroundMusic(QTableWidgetItem* item);
private:
void SetTableItem(int row, int column, QString itemStr);

View File

@ -10,6 +10,7 @@ struct GameInfo {
// (normally directory that contains eboot.bin)
std::filesystem::path icon_path; // path of icon0.png
std::filesystem::path pic_path; // path of pic1.png
std::filesystem::path snd0_path; // path of snd0.at9
QImage icon;
std::string size;
// variables extracted from param.sfo

View File

@ -20,6 +20,7 @@
#include <objbase.h>
#include <shlguid.h>
#include <shobjidl.h>
#include <wrl/client.h>
#endif
#include "common/path_util.h"
@ -348,9 +349,9 @@ private:
CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
// Create the ShellLink object
IShellLink* pShellLink = nullptr;
Microsoft::WRL::ComPtr<IShellLink> pShellLink;
HRESULT hres = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER,
IID_IShellLink, (LPVOID*)&pShellLink);
IID_PPV_ARGS(&pShellLink));
if (SUCCEEDED(hres)) {
// Defines the path to the program executable
pShellLink->SetPath((LPCWSTR)exePath.utf16());
@ -366,13 +367,11 @@ private:
pShellLink->SetIconLocation((LPCWSTR)iconPath.utf16(), 0);
// Save the shortcut
IPersistFile* pPersistFile = nullptr;
hres = pShellLink->QueryInterface(IID_IPersistFile, (LPVOID*)&pPersistFile);
Microsoft::WRL::ComPtr<IPersistFile> pPersistFile;
hres = pShellLink.As(&pPersistFile);
if (SUCCEEDED(hres)) {
hres = pPersistFile->Save((LPCWSTR)linkPath.utf16(), TRUE);
pPersistFile->Release();
}
pShellLink->Release();
}
CoUninitialize();

View File

@ -6,6 +6,7 @@
#include "about_dialog.h"
#include "cheats_patches.h"
#include "check_update.h"
#include "common/io_file.h"
#include "common/string_util.h"
#include "common/version.h"
@ -46,6 +47,7 @@ bool MainWindow::Init() {
this->show();
// load game list
LoadGameLists();
CheckUpdateMain(true);
auto end = std::chrono::steady_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
@ -160,6 +162,16 @@ void MainWindow::LoadGameLists() {
}
}
void MainWindow::CheckUpdateMain(bool checkSave) {
if (checkSave) {
if (!Config::autoUpdate()) {
return;
}
}
auto checkUpdate = new CheckUpdate(false);
checkUpdate->exec();
}
void MainWindow::GetPhysicalDevices() {
Vulkan::Instance instance(false, false);
auto physical_devices = instance.GetPhysicalDevices();
@ -221,6 +233,11 @@ void MainWindow::CreateConnects() {
settingsDialog->exec();
});
connect(ui->updaterAct, &QAction::triggered, this, [this]() {
auto checkUpdate = new CheckUpdate(true);
checkUpdate->exec();
});
connect(ui->aboutAct, &QAction::triggered, this, [this]() {
auto aboutDialog = new AboutDialog(this);
aboutDialog->exec();
@ -486,9 +503,29 @@ void MainWindow::CreateConnects() {
isIconBlack = false;
}
});
connect(m_game_grid_frame.get(), &QTableWidget::cellClicked, this,
&MainWindow::PlayBackgroundMusic);
connect(m_game_list_frame.get(), &QTableWidget::cellClicked, this,
&MainWindow::PlayBackgroundMusic);
}
void MainWindow::PlayBackgroundMusic() {
if (isGameRunning || !Config::getPlayBGM()) {
BackgroundMusicPlayer::getInstance().stopMusic();
return;
}
int itemID = isTableList ? m_game_list_frame->currentItem()->row()
: m_game_grid_frame->crtRow * m_game_grid_frame->columnCnt +
m_game_grid_frame->crtColumn;
const auto snd0path = QString::fromStdString(m_game_info->m_games[itemID].snd0_path);
BackgroundMusicPlayer::getInstance().playMusic(snd0path);
}
void MainWindow::StartGame() {
isGameRunning = true;
BackgroundMusicPlayer::getInstance().stopMusic();
QString gamePath = "";
int table_mode = Config::getTableMode();
if (table_mode == 0) {
@ -882,6 +919,10 @@ void MainWindow::SetUiIcons(bool isWhite) {
ui->bootInstallPkgAct->setIcon(RecolorIcon(ui->bootInstallPkgAct->icon(), isWhite));
ui->bootGameAct->setIcon(RecolorIcon(ui->bootGameAct->icon(), isWhite));
ui->exitAct->setIcon(RecolorIcon(ui->exitAct->icon(), isWhite));
ui->updaterAct->setIcon(RecolorIcon(ui->updaterAct->icon(), isWhite));
ui->downloadCheatsPatchesAct->setIcon(
RecolorIcon(ui->downloadCheatsPatchesAct->icon(), isWhite));
ui->dumpGameListAct->setIcon(RecolorIcon(ui->dumpGameListAct->icon(), isWhite));
ui->aboutAct->setIcon(RecolorIcon(ui->aboutAct->icon(), isWhite));
ui->setlistModeListAct->setIcon(RecolorIcon(ui->setlistModeListAct->icon(), isWhite));
ui->setlistModeGridAct->setIcon(RecolorIcon(ui->setlistModeGridAct->icon(), isWhite));

View File

@ -7,6 +7,7 @@
#include <QDragEnterEvent>
#include <QTranslator>
#include "background_music_player.h"
#include "common/config.h"
#include "common/path_util.h"
#include "core/file_format/psf.h"
@ -54,6 +55,7 @@ private:
void CreateDockWindows();
void GetPhysicalDevices();
void LoadGameLists();
void CheckUpdateMain(bool checkSave);
void CreateConnects();
void SetLastUsedTheme();
void SetLastIconSizeBullet();
@ -62,9 +64,11 @@ private:
void BootGame();
void AddRecentFiles(QString filePath);
void LoadTranslation();
void PlayBackgroundMusic();
QIcon RecolorIcon(const QIcon& icon, bool isWhite);
bool isIconBlack = false;
bool isTableList = true;
bool isGameRunning = false;
QActionGroup* m_icon_size_act_group = nullptr;
QActionGroup* m_list_mode_act_group = nullptr;
QActionGroup* m_theme_act_group = nullptr;

View File

@ -26,6 +26,7 @@ public:
QAction* downloadCheatsPatchesAct;
QAction* dumpGameListAct;
QAction* pkgViewerAct;
QAction* updaterAct;
QAction* aboutAct;
QAction* configureAct;
QAction* setThemeDark;
@ -54,7 +55,7 @@ public:
QMenu* menuSettings;
QMenu* menuUtils;
QMenu* menuThemes;
QMenu* menuAbout;
QMenu* menuHelp;
QToolBar* toolBar;
void setupUi(QMainWindow* MainWindow) {
@ -122,11 +123,16 @@ public:
gameInstallPathAct->setIcon(QIcon(":images/folder_icon.png"));
downloadCheatsPatchesAct = new QAction(MainWindow);
downloadCheatsPatchesAct->setObjectName("downloadCheatsPatchesAct");
downloadCheatsPatchesAct->setIcon(QIcon(":images/update_icon.png"));
dumpGameListAct = new QAction(MainWindow);
dumpGameListAct->setObjectName("dumpGameList");
dumpGameListAct->setIcon(QIcon(":images/dump_icon.png"));
pkgViewerAct = new QAction(MainWindow);
pkgViewerAct->setObjectName("pkgViewer");
pkgViewerAct->setIcon(QIcon(":images/file_icon.png"));
updaterAct = new QAction(MainWindow);
updaterAct->setObjectName("updaterAct");
updaterAct->setIcon(QIcon(":images/update_icon.png"));
aboutAct = new QAction(MainWindow);
aboutAct->setObjectName("aboutAct");
aboutAct->setIcon(QIcon(":images/about_icon.png"));
@ -243,8 +249,8 @@ public:
menuThemes = new QMenu(menuView);
menuThemes->setObjectName("menuThemes");
menuThemes->setIcon(QIcon(":images/themes_icon.png"));
menuAbout = new QMenu(menuBar);
menuAbout->setObjectName("menuAbout");
menuHelp = new QMenu(menuBar);
menuHelp->setObjectName("menuHelp");
MainWindow->setMenuBar(menuBar);
toolBar = new QToolBar(MainWindow);
toolBar->setObjectName("toolBar");
@ -253,7 +259,7 @@ public:
menuBar->addAction(menuFile->menuAction());
menuBar->addAction(menuView->menuAction());
menuBar->addAction(menuSettings->menuAction());
menuBar->addAction(menuAbout->menuAction());
menuBar->addAction(menuHelp->menuAction());
menuFile->addAction(bootInstallPkgAct);
menuFile->addAction(bootGameAct);
menuFile->addAction(addElfFolderAct);
@ -285,7 +291,8 @@ public:
menuUtils->addAction(downloadCheatsPatchesAct);
menuUtils->addAction(dumpGameListAct);
menuUtils->addAction(pkgViewerAct);
menuAbout->addAction(aboutAct);
menuHelp->addAction(updaterAct);
menuHelp->addAction(aboutAct);
retranslateUi(MainWindow);
@ -299,6 +306,8 @@ public:
bootInstallPkgAct->setText(
QCoreApplication::translate("MainWindow", "Install Packages (PKG)", nullptr));
bootGameAct->setText(QCoreApplication::translate("MainWindow", "Boot Game", nullptr));
updaterAct->setText(
QCoreApplication::translate("MainWindow", "Check for Updates", nullptr));
aboutAct->setText(QCoreApplication::translate("MainWindow", "About shadPS4", nullptr));
configureAct->setText(QCoreApplication::translate("MainWindow", "Configure...", nullptr));
#if QT_CONFIG(tooltip)
@ -345,7 +354,7 @@ public:
menuSettings->setTitle(QCoreApplication::translate("MainWindow", "Settings", nullptr));
menuUtils->setTitle(QCoreApplication::translate("MainWindow", "Utils", nullptr));
menuThemes->setTitle(QCoreApplication::translate("MainWindow", "Themes", nullptr));
menuAbout->setTitle(QCoreApplication::translate("MainWindow", "About", nullptr));
menuHelp->setTitle(QCoreApplication::translate("MainWindow", "Help", nullptr));
setThemeDark->setText(QCoreApplication::translate("MainWindow", "Dark", nullptr));
setThemeLight->setText(QCoreApplication::translate("MainWindow", "Light", nullptr));
setThemeGreen->setText(QCoreApplication::translate("MainWindow", "Green", nullptr));

View File

@ -4,6 +4,7 @@
#include <QCompleter>
#include <QDirIterator>
#include "check_update.h"
#include "common/logging/backend.h"
#include "common/logging/filter.h"
#include "main_window.h"
@ -122,6 +123,20 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices, QWidge
connect(ui->logFilterLineEdit, &QLineEdit::textChanged, this,
[](const QString& text) { Config::setLogFilter(text.toStdString()); });
connect(ui->updateCheckBox, &QCheckBox::stateChanged, this,
[](int state) { Config::setAutoUpdate(state == Qt::Checked); });
connect(ui->updateComboBox, &QComboBox::currentTextChanged, this,
[](const QString& channel) { Config::setUpdateChannel(channel.toStdString()); });
connect(ui->checkUpdateButton, &QPushButton::clicked, this, []() {
auto checkUpdate = new CheckUpdate(true);
checkUpdate->exec();
});
connect(ui->playBGMCheckBox, &QCheckBox::stateChanged, this,
[](int val) { Config::setPlayBGM(val); });
}
// GPU TAB
@ -180,7 +195,7 @@ void SettingsDialog::LoadValuesFromConfig() {
ui->dumpShadersCheckBox->setChecked(Config::dumpShaders());
ui->nullGpuCheckBox->setChecked(Config::nullGpu());
ui->dumpPM4CheckBox->setChecked(Config::dumpPM4());
ui->playBGMCheckBox->setChecked(Config::getPlayBGM());
ui->fullscreenCheckBox->setChecked(Config::isFullscreenMode());
ui->showSplashCheckBox->setChecked(Config::showSplash());
ui->ps4proCheckBox->setChecked(Config::isNeoMode());
@ -192,6 +207,9 @@ void SettingsDialog::LoadValuesFromConfig() {
ui->vkValidationCheckBox->setChecked(Config::vkValidationEnabled());
ui->vkSyncValidationCheckBox->setChecked(Config::vkValidationSyncEnabled());
ui->rdocCheckBox->setChecked(Config::isRdocEnabled());
ui->updateCheckBox->setChecked(Config::autoUpdate());
ui->updateComboBox->setCurrentText(QString::fromStdString(Config::getUpdateChannel()));
}
void SettingsDialog::InitializeEmulatorLanguages() {

View File

@ -52,7 +52,7 @@
<x>0</x>
<y>0</y>
<width>836</width>
<height>428</height>
<height>432</height>
</rect>
</property>
<property name="sizePolicy">
@ -70,7 +70,7 @@
</attribute>
<layout class="QVBoxLayout" name="generalTabVLayout" stretch="0,0">
<item>
<layout class="QHBoxLayout" name="generalTabHLayout" stretch="1,1,1">
<layout class="QHBoxLayout" name="generalTabHLayoutTop" stretch="1,1,1">
<item>
<layout class="QVBoxLayout" name="systemTabLayoutLeft">
<item>
@ -255,19 +255,146 @@
</layout>
</item>
<item>
<spacer name="generalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
<layout class="QHBoxLayout" name="generalTabHLayout_2">
<item>
<layout class="QVBoxLayout" name="updaterTabLayoutLeft">
<property name="leftMargin">
<number>0</number>
</property>
<property name="sizeHint" stdset="0">
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="updaterGroupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>20</width>
<height>40</height>
<width>265</width>
<height>0</height>
</size>
</property>
<property name="title">
<string>Update</string>
</property>
<widget class="QCheckBox" name="updateCheckBox">
<property name="geometry">
<rect>
<x>12</x>
<y>115</y>
<width>251</width>
<height>22</height>
</rect>
</property>
<property name="text">
<string>Check for Updates at Startup</string>
</property>
</widget>
<widget class="QComboBox" name="updateComboBox">
<property name="geometry">
<rect>
<x>12</x>
<y>35</y>
<width>241</width>
<height>28</height>
</rect>
</property>
<property name="currentText">
<string>stable</string>
</property>
<item>
<property name="text">
<string>stable</string>
</property>
</item>
<item>
<property name="text">
<string>unstable</string>
</property>
</item>
</widget>
<widget class="QPushButton" name="checkUpdateButton">
<property name="geometry">
<rect>
<x>12</x>
<y>70</y>
<width>241</width>
<height>24</height>
</rect>
</property>
<property name="text">
<string>Check for Updates</string>
</property>
</widget>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="GUITabLayoutMiddle" stretch="1">
<item>
<widget class="QGroupBox" name="GUIgroupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>GUI Settings</string>
</property>
<widget class="QWidget" name="verticalLayoutWidget_3">
<property name="geometry">
<rect>
<x>10</x>
<y>30</y>
<width>241</width>
<height>41</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QCheckBox" name="playBGMCheckBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Play title music</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Policy::Expanding</enum>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="grphicsTab">
<attribute name="title">

View File

@ -1,6 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ar_AR">
<?xml version="1.0" ?><!DOCTYPE TS><TS version="2.1" language="ar_AR">
<!-- SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
SPDX-License-Identifier: GPL-2.0-or-later -->
<context>
@ -170,6 +168,11 @@
<source>Boot Game</source>
<translation>تشغيل اللعبة</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>تحقق من التحديثات</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -312,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>حول</translation>
<source>Help</source>
<translation>مساعدة</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -499,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>RenderDoc تمكين تصحيح أخطاء</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>تحديث</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>تحقق من التحديثات عند بدء التشغيل</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>التحقق من التحديثات</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -663,17 +681,7 @@
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>الغش والتصحيحات هي ميزات تجريبية.
استخدمها بحذر.
قم بتنزيل الغش بشكل فردي عن طريق اختيار المستودع والنقر على زر التنزيل.
في علامة تبويب التصحيحات، يمكنك تنزيل جميع التصحيحات دفعة واحدة، واختيار ما تريد استخدامه، وحفظ اختياراتك.
نظرًا لأننا لا نقوم بتطوير الغش/التصحيحات،
يرجى الإبلاغ عن أي مشاكل إلى مؤلف الغش.
هل قمت بإنشاء غش جديد؟ قم بزيارة:
https://github.com/shadps4-emu/ps4_cheats</translation>
<translation>الغش والتصحيحات هي ميزات تجريبية.\nاستخدمها بحذر.\n\nقم بتنزيل الغش بشكل فردي عن طريق اختيار المستودع والنقر على زر التنزيل.\nفي علامة تبويب التصحيحات، يمكنك تنزيل جميع التصحيحات دفعة واحدة، واختيار ما تريد استخدامه، وحفظ اختياراتك.\n\nنظرًا لأننا لا نقوم بتطوير الغش/التصحيحات،\nيرجى الإبلاغ عن أي مشاكل إلى مؤلف الغش.\n\nهل قمت بإنشاء غش جديد؟ قم بزيارة:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
@ -728,8 +736,7 @@
<message>
<location filename="../cheats_patches.cpp" line="178"/>
<source>Do you want to delete the selected file?\n%1</source>
<translation>هل تريد حذف الملف المحدد؟
%1</translation>
<translation>هل تريد حذف الملف المحدد؟\n%1</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="213"/>
@ -988,4 +995,177 @@
<translation>مسار</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>محدث تلقائي</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>خطأ</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>قناة تحديث غير صالحة: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>يجب أن يحتوي updateChannel في ملف config.tml على 'stable' أو 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>خطأ في الشبكة:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>فشل في تحليل معلومات التحديث.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>لم يتم العثور على أي إصدارات مسبقة.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>بيانات الإصدار غير صالحة.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>لم يتم العثور على عنوان URL للتنزيل للأصل المحدد.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>نسختك محدثة بالفعل!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>تحديث متاح</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>الإصدار الحالي</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>آخر إصدار</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>هل تريد التحديث؟</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>عرض سجل التغييرات</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>تحقق من التحديثات عند بدء التشغيل</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>تحديث</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>لا</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>إخفاء سجل التغييرات</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>تغييرات</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>حدث خطأ في الشبكة أثناء محاولة الوصول إلى عنوان URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>اكتمل التنزيل</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>تم تنزيل التحديث، اضغط على OK للتثبيت.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>فشل في حفظ ملف التحديث في</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>فشل في فتح ملف ZIP</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>اسم الملف فارغ. قد يكون ZIP تالفًا.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>فشل في إنشاء الدليل</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>خطأ أثناء فك ضغط الملف</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>فشل في فتح ملف الإخراج</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>طريقة الضغط غير مدعومة للملف:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>فشل في إنشاء دليل استخراج TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>فشل في استخراج ملف TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>بدء التحديث...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>فشل في إنشاء ملف سكريبت التحديث</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Boot Game</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Tjek for opdateringer</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>About</translation>
<source>Help</source>
<translation>Hjælp</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Opdatering</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Tjek for opdateringer ved start</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Tjek for opdateringer</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Sti</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Automatisk opdatering</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Fejl</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Ugyldig opdateringskanal: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>I updateChannel i config.tml filen skal der være 'stable' eller 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Netsværksfejl:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Kunne ikke analysere opdateringsoplysninger.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Ingen forhåndsudgivelser fundet.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Ugyldige udgivelsesdata.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Ingen download-URL fundet for den specificerede aktiver.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Din version er allerede opdateret!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Opdatering tilgængelig</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Nuværende version</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Nyeste version</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Vil du opdatere?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Vis ændringslog</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Tjek for opdateringer ved start</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Opdater</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Nej</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Skjul ændringslog</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Ændringer</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Netsværksfejl opstod, mens der blev forsøgt at adgang til URL'en</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Download fuldført</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>Opdateringen er blevet downloadet, tryk OK for at installere.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Kunne ikke gemme opdateringsfilen </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Kunne ikke åbne ZIP-filen</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>Filnavnet er tomt. Måske er ZIP'en beskadiget.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Kunne ikke oprette biblioteket</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Fejl under dekomprimering af filen</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Kunne ikke åbne outputfilen</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Ikke understøttet komprimeringsmetode for filen:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Kunne ikke oprette TAR-udtrækningsbibliotek</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Kunne ikke udtrække TAR-filen</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Starter opdatering...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Kunne ikke oprette opdateringsscriptfilen</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Spiel starten</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Nach Updates suchen</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>Über</translation>
<source>Help</source>
<translation>Hilfe</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>RenderDoc-Debugging aktivieren</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Aktualisieren</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Beim Start nach Updates suchen</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Nach Updates suchen</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Pfad</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Automatischer Aktualisierer</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Fehler</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Ungültiger Aktualisierungskanal: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>Im updateChannel in der config.tml-Datei muss 'stable' oder 'unstable' enthalten sein</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Netzwerkfehler:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Fehler beim Parsen der Aktualisierungsinformationen.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Keine Vorabveröffentlichungen gefunden.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Ungültige Versionsdaten.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Keine Download-URL für das angegebene Asset gefunden.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Ihre Version ist bereits aktuell!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Aktualisierung verfügbar</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Aktuelle Version</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Neueste Version</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Möchten Sie aktualisieren?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Änderungsprotokoll anzeigen</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Beim Start nach Updates suchen</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Aktualisieren</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Nein</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Änderungsprotokoll ausblenden</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Änderungen</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Beim Zugriff auf die URL ist ein Netzwerkfehler aufgetreten</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Download abgeschlossen</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>Die Aktualisierung wurde heruntergeladen, drücken Sie OK, um zu installieren.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Fehler beim Speichern der Aktualisierungsdatei in</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Fehler beim Öffnen der ZIP-Datei</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>Dateiname ist leer. Möglicherweise beschädigte ZIP.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Fehler beim Erstellen des Verzeichnisses</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Fehler beim Dekomprimieren der Datei</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Fehler beim Öffnen der Ausgabedatei</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Nicht unterstützte Komprimierungsmethode für die Datei:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Fehler beim Erstellen des TAR-Extraktionsverzeichnisses</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Fehler beim Extrahieren der TAR-Datei</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Aktualisierung wird gestartet...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Fehler beim Erstellen der Aktualisierungs-Skriptdatei</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Boot Game</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Έλεγχος για ενημερώσεις</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>About</translation>
<source>Help</source>
<translation>Βοήθεια</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Ενημέρωση</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Έλεγχος για ενημερώσεις κατά την εκκίνηση</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Έλεγχος για ενημερώσεις</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Διαδρομή</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Αυτόματος Ενημερωτής</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Σφάλμα</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Μη έγκυρο κανάλι ενημέρωσης: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>Στο updateChannel του αρχείου config.tml πρέπει να περιέχει 'stable' ή 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Σφάλμα δικτύου:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Αποτυχία ανάλυσης πληροφοριών ενημέρωσης.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Δεν βρέθηκαν προ-κυκλοφορίες.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Μη έγκυρα δεδομένα έκδοσης.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Δεν βρέθηκε URL λήψης για το συγκεκριμένο στοιχείο.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Η έκδοσή σας είναι ήδη ενημερωμένη!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Διαθέσιμη Ενημέρωση</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Τρέχουσα Έκδοση</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Τελευταία Έκδοση</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Θέλετε να ενημερώσετε;</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Εμφάνιση Ιστορικού Αλλαγών</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Έλεγχος για ενημερώσεις κατά την εκκίνηση</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Ενημέρωση</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Όχι</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Απόκρυψη Ιστορικού Αλλαγών</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Αλλαγές</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Σφάλμα δικτύου κατά την προσπάθεια πρόσβασης στη διεύθυνση URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Λήψη ολοκληρώθηκε</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>Η ενημέρωση έχει ληφθεί, πατήστε OK για να εγκαταστήσετε.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Αποτυχία αποθήκευσης του αρχείου ενημέρωσης στο</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Αποτυχία ανοίγματος του αρχείου ZIP</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>Το όνομα αρχείου είναι κενό. Ενδεχομένως κατεστραμμένο ZIP.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Αποτυχία δημιουργίας καταλόγου</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Σφάλμα κατά την αποσυμπίεση του αρχείου</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Αποτυχία ανοίγματος του αρχείου εξόδου</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Μη υποστηριζόμενη μέθοδος συμπίεσης για το αρχείο:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Αποτυχία δημιουργίας καταλόγου εξαγωγής TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Αποτυχία εξαγωγής του αρχείου TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Εκκίνηση Ενημέρωσης...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Αποτυχία δημιουργίας του αρχείου σεναρίου ενημέρωσης</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Boot Game</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Check for Updates</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>About</translation>
<source>Help</source>
<translation>Help</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Update</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Check for Updates at Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Check for Updates</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Path</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Auto Updater</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Invalid update channel: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>In updateChannel in config.tml file must contain 'stable' or 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Network error:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Failed to parse update information.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>No pre-releases found.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Invalid release data.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>No download URL found for the specified asset.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Your version is already up to date!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Update Available</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Current Version</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Latest Version</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Do you want to update?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Show Changelog</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Check for Updates at Startup</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Update</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>No</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Hide Changelog</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Changes</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Network error occurred while trying to access the URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Download Complete</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>The update has been downloaded, press OK to install.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Failed to save the update file at</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Failed to open the ZIP file</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>File name is empty. Possibly corrupted ZIP.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Failed to create directory</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Error decompressing file</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Failed to open output file</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Unsupported compression method for file:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Failed to create TAR extraction directory</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Failed to extract the TAR file</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Starting Update...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Failed to create the update script file</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Iniciar juego</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Buscar actualizaciones</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,7 +315,7 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<source>Help</source>
<translation>Ayuda</translation>
</message>
<message>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Habilitar depuración de RenderDoc</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Actualización</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Buscar actualizaciones al iniciar</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Verificar actualizaciones</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Ruta</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Actualizador Automático</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Canal de actualización no válido: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>En updateChannel en el archivo config.tml debe contener 'stable' o 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Error de red:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Error al analizar la información de actualización.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>No se encontraron prelanzamientos.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Datos de versión no válidos.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>No se encontró URL de descarga para el activo especificado.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>¡Su versión ya está actualizada!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Actualización disponible</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Versión actual</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Última versión</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>¿Quieres actualizar?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Mostrar registro de cambios</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Buscar actualizaciones al iniciar</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Actualizar</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>No</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Ocultar registro de cambios</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Cambios</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Se produjo un error de red al intentar acceder a la URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Descarga completa</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>La actualización se ha descargado, presione Aceptar para instalar.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>No se pudo guardar el archivo de actualización en</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>No se pudo abrir el archivo ZIP</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>El nombre del archivo está vacío. Posiblemente ZIP dañado.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>No se pudo crear el directorio</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Error al descomprimir el archivo</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>No se pudo abrir el archivo de salida</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Método de compresión no soportado para el archivo:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>No se pudo crear el directorio de extracción TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>No se pudo extraer el archivo TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Iniciando actualización...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>No se pudo crear el archivo del script de actualización</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>اجرای بازی</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>به روز رسانی را بررسی کنید</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>درباره ما</translation>
<source>Help</source>
<translation>کمک</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>RenderDoc Debugging</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>بروزرسانی</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>بررسی بروزرسانی هنگام شروع</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>به روز رسانی را بررسی کنید</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>مسیر</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>به روز رسانی خودکار</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>خطا</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>کانال به روز رسانی نامعتبر: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>در فایل config.tml، updateChannel باید فقط شامل 'stable' یا 'unstable' باشد</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>خطای شبکه:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>خطا در تجزیه اطلاعات بهروزرسانی.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>هیچ پیش انتشاری یافت نشد.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>داده های نسخه نامعتبر است.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>هیچ URL دانلودی برای دارایی مشخص شده پیدا نشد.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>نسخه شما اکنون به روز شده است!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>به روز رسانی موجود است</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>نسخه فعلی</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>جدیدترین نسخه</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>آیا می خواهید به روز رسانی کنید؟</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>نمایش تغییرات</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>بررسی بروزرسانی هنگام شروع</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>به روز رسانی</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>خیر</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>مخفی کردن تغییرات</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>تغییرات</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>در حین تلاش برای دسترسی به URL خطای شبکه رخ داد</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>دانلود کامل شد</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>به روز رسانی دانلود شده است، برای نصب OK را فشار دهید.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>فایل به روز رسانی ذخیره نشد</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>خطا در باز کردن فایل ZIP</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>نام فایل خالی است. ممکن است ZIP خراب باشد.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>خطا در ایجاد دایرکتوری</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>خطا در استخراج فایل</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>خطا در باز کردن فایل خروجی</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>روش فشرده سازی پشتیبانی نشده برای فایل:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>خطا در ایجاد دایرکتوری استخراج TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>خطا در استخراج فایل TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>شروع به روز رسانی...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>فایل اسکریپت به روز رسانی ایجاد نشد</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Boot Game</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Tarkista päivitykset</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>About</translation>
<source>Help</source>
<translation>Apua</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Päivitys</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Tarkista päivitykset alussa</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Tarkista päivitykset</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Polku</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Automaattinen päivitys</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Virhe</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Virheellinen päivityskanava: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>config.tml-tiedoston updateChannelin on sisällettävä 'stable' tai 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Verkkovirhe:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Päivitysinformaation jäsentäminen epäonnistui.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Ennakkojulkaisuja ei löytynyt.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Virheelliset julkaisutiedot.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Ei lataus-URL:ia löytynyt määritetylle omaisuudelle.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Versiosi on jo ajan tasalla!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Päivitys saatavilla</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Nykyinen versio</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Uusin versio</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Haluatko päivittää?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Näytä muutospäiväkirja</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Tarkista päivitykset alussa</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Päivitä</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Ei</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Piilota muutospäiväkirja</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Muutos</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Verkkovirhe tapahtui yrittäessäsi päästä URL-osoitteeseen</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Download valmis</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>Päivitys on ladattu, paina OK asentaaksesi.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Päivitystiedoston tallentaminen epäonnistui osoitteeseen</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>ZIP-tiedoston avaaminen epäonnistui</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>Tiedostonimi on tyhjö. Mahdollisesti rikkinäinen ZIP.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Kansion luominen epäonnistui</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Virhe tiedoston purkamisessa</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Uloskirjoitustiedoston avaaminen epäonnistui</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Tiedostolle tuettamaton pakkausmenetelmä:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>TAR-purkuhakemiston luominen epäonnistui</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>TAR-tiedoston purkaminen epäonnistui</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Aloitetaan päivitys...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Päivitysskripttitiedoston luominen epäonnistui</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Démarrer un jeu</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Vérifier les mises à jour</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>À propos</translation>
<source>Help</source>
<translation>Aide</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Activer le débogage RenderDoc</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Mise à jour</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Vérif. maj au démarrage</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Vérifier les mises à jour</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Répertoire</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Mise à jour automatique</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Erreur</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Canal de mise à jour invalide : </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>Dans le fichier config.tml, updateChannel doit contenir 'stable' ou 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Erreur réseau :</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Échec de l'analyse des informations de mise à jour.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Aucune pré-version trouvée.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Données de version invalides.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Aucune URL de téléchargement trouvée pour l'élément spécifié.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Votre version est déjà à jour !</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Mise à jour disponible</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Version actuelle</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Dernière version</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Voulez-vous mettre à jour ?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Afficher le journal des modifications</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Vérif. maj au démarrage</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Mettre à jour</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Non</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Cacher le journal des modifications</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Modifications</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Une erreur réseau s'est produite en essayant d'accéder à l'URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Téléchargement terminé</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>La mise à jour a é téléchargée, appuyez sur OK pour l'installer.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Échec de la sauvegarde du fichier de mise à jour à</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Échec de l'ouverture du fichier ZIP</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>Le nom du fichier est vide. ZIP potentiellement corrompu.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Échec de la création du répertoire</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Erreur lors de la décompression du fichier</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Échec de l'ouverture du fichier de sortie</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Méthode de compression non prise en charge pour le fichier :</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Échec de la création du répertoire d'extraction TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Échec de l'extraction du fichier TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Démarrage de la mise à jour...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Échec de la création du fichier de script de mise à jour</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Játék Bootolása</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Frissítések keresése</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,7 +315,7 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<source>Help</source>
<translation>Segítség</translation>
</message>
<message>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>RenderDoc Debugolás Engedélyezése</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Frissítés</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Frissítések keresése indításkor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Frissítések keresése</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Útvonal</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Automatikus frissítő</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Hiba</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Érvénytelen frissítési csatorna: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>A config.tml fájlban az updateChannel-nek 'stable' vagy 'unstable' értéket kell tartalmaznia</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Hálózati hiba:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>A frissítési információk elemzése sikertelen.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Nem található előzetes kiadás.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Érvénytelen kiadási adatok.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Nincs letöltési URL a megadott eszközhöz.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>A verziód már naprakész!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Frissítés elérhető</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Jelenlegi verzió</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Legújabb verzió</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Szeretnéd frissíteni?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Módosítások megjelenítése</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Frissítések keresése indításkor</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Frissítés</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Nem</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Módosítások elrejtése</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Módosítások</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Hálózati hiba történt az URL elérésekor</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Letöltés kész</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>A frissítés letöltődött, nyomja meg az OK gombot az telepítéshez.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>A frissítési fájl mentése nem sikerült a következő helyre</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>A ZIP fájl megnyitása nem sikerült</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>A fájlnév üres. Lehetséges, hogy a ZIP sérült.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>A mappa létrehozása nem sikerült</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Hiba a fájl kicsomagolásakor</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>A kimeneti fájl megnyitása nem sikerült</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Támogatott tömörítési módszer a fájlhoz:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>A TAR kicsomagolási mappa létrehozása nem sikerült</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>A TAR fájl kicsomagolása nem sikerült</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Frissítés indítása...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>A frissítési szkript fájl létrehozása nem sikerült</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Boot Game</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Periksa pembaruan</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>About</translation>
<source>Help</source>
<translation>Bantuan</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Pembaruan</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Periksa pembaruan saat mulai</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Periksa pembaruan</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Jalur</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Pembaruan Otomatis</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Kesalahan</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Saluran pembaruan tidak valid: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>Di updateChannel dalam file config.tml harus berisi 'stable' atau 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Kesalahan jaringan:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Gagal memparse informasi pembaruan.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Tidak ada pra-rilis yang ditemukan.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Data rilis tidak valid.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Tidak ada URL unduhan ditemukan untuk aset yang ditentukan.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Versi Anda sudah terbaru!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Pembaruan Tersedia</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Versi Saat Ini</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Versi Terbaru</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Apakah Anda ingin memperbarui?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Tampilkan Catatan Perubahan</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Periksa pembaruan saat mulai</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Perbarui</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Tidak</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Sembunyikan Catatan Perubahan</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Perubahan</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Kesalahan jaringan terjadi saat mencoba mengakses URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Unduhan Selesai</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>Pembaruan telah diunduh, tekan OK untuk menginstal.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Gagal menyimpan file pembaruan di</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Gagal membuka file ZIP</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>Nama file kosong. ZIP mungkin korup.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Gagal membuat direktori</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Kesalahan saat mengekstrak file</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Gagal membuka file keluaran</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Metode kompresi tidak didukung untuk file:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Gagal membuat direktori ekstraksi TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Gagal mengekstrak file TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Memulai Pembaruan...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Gagal membuat file skrip pembaruan</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Avvia Gioco</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Controlla aggiornamenti</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>Info su</translation>
<source>Help</source>
<translation>Aiuto</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Abilita Debugging RenderDoc</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Aggiornamento</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Verifica aggiornamenti allavvio</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Controlla aggiornamenti</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Percorso</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Aggiornamento automatico</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Canale di aggiornamento non valido: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>Nel file config.tml, l'updateChannel deve contenere 'stable' o 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Errore di rete:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Impossibile analizzare le informazioni di aggiornamento.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Nessuna anteprima trovata.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Dati della release non validi.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Nessun URL di download trovato per l'asset specificato.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>La tua versione è già aggiornata!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Aggiornamento disponibile</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Versione attuale</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Ultima versione</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Vuoi aggiornare?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Mostra il Changelog</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Verifica aggiornamenti allavvio</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Aggiorna</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>No</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Nascondi il Changelog</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Modifiche</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Si è verificato un errore di rete durante il tentativo di accesso all'URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Download completato</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>L'aggiornamento è stato scaricato, premi OK per installare.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Impossibile salvare il file di aggiornamento in</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Impossibile aprire il file ZIP</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>Il nome del file è vuoto. ZIP potrebbe essere danneggiato.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Impossibile creare la directory</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Errore durante la decompressione del file</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Impossibile aprire il file di output</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Metodo di compressione non supportato per il file:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Impossibile creare la directory di estrazione TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Impossibile estrarre il file TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Inizio aggiornamento...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Impossibile creare il file di script di aggiornamento</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation></translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation></translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation></translation>
<source>Help</source>
<translation></translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>RenderDocデバッグを有効にする</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation></translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation></translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>config.tmlファイルのupdateChannelにはstableunstable</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>URLが見つかりませんでした</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>URLにアクセス中にネットワークエラーが発生しました</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>OKを押してください</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>ZIPファイルを開くことに失敗しました</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>ZIPが壊れている可能性があります</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>TAR抽出ディレクトリの作成に失敗しました</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>TARファイルの抽出に失敗しました</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation></translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Boot Game</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Check for Updates</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>About</translation>
<source>Help</source>
<translation>Help</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Update</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Check for Updates at Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Check for Updates</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Path</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Auto Updater</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Invalid update channel: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>In updateChannel in config.tml file must contain 'stable' or 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Network error:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Failed to parse update information.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>No pre-releases found.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Invalid release data.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>No download URL found for the specified asset.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Your version is already up to date!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Update Available</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Current Version</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Latest Version</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Do you want to update?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Show Changelog</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Check for Updates at Startup</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Update</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>No</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Hide Changelog</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Changes</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Network error occurred while trying to access the URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Download Complete</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>The update has been downloaded, press OK to install.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Failed to save the update file at</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Failed to open the ZIP file</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>File name is empty. Possibly corrupted ZIP.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Failed to create directory</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Error decompressing file</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Failed to open output file</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Unsupported compression method for file:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Failed to create TAR extraction directory</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Failed to extract the TAR file</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Starting Update...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Failed to create the update script file</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Boot Game</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Patikrinti atnaujinimus</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>About</translation>
<source>Help</source>
<translation>Pagalba</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Atnaujinimas</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Tikrinti naujinimus paleidus</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Patikrinkite atnaujinimus</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Kelias</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Automatinis atnaujinimas</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Klaida</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Neteisingas atnaujinimo kanalas: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>config.tml faile updateChannel turi būti 'stable' arba 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Tinklo klaida:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Nepavyko išanalizuoti atnaujinimo informacijos.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Išankstinių leidimų nerasta.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Neteisingi leidimo duomenys.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Nerasta atsisiuntimo URL nurodytam turtui.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Jūsų versija jau atnaujinta!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Prieinama atnaujinimas</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Esama versija</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Paskutinė versija</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Ar norite atnaujinti?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Rodyti pakeitimų sąrašą</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Tikrinti naujinimus paleidus</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Atnaujinti</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Ne</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Slėpti pakeitimų sąrašą</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Pokyčiai</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Tinklo klaida bandant pasiekti URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Atsisiuntimas baigtas</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>Atnaujinimas buvo atsisiųstas, paspauskite OK, kad įdiegtumėte.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Nepavyko išsaugoti atnaujinimo failo</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Nepavyko atidaryti ZIP failo</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>Failo pavadinimas tuščias. Galbūt ZIP sugadintas.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Nepavyko sukurti katalogo</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Klaida išpakuojant failą</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Nepavyko atidaryti išvesties failo</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Nepalaikomas failo suspaudimo metodas:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Nepavyko sukurti TAR ištraukimų katalogo</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Nepavyko ištraukti TAR failo</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Pradedama atnaujinimas...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Nepavyko sukurti atnaujinimo scenarijaus failo</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Boot Game</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Sjekk etter oppdateringer</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>About</translation>
<source>Help</source>
<translation>Hjelp</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Oppdatering</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Sjekk etter oppdateringer ved oppstart</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Sjekk for oppdateringer</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Sti</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Automatisk oppdaterer</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Feil</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Ugyldig oppdateringskanal: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>I updateChannel i config.tml-filen inneholde 'stable' eller 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Nettverksfeil:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Kunne ikke analysere oppdateringsinformasjonen.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Fant ingen forhåndsutgivelser.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Ugyldige utgivelsesdata.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Ingen nedlastings-URL funnet for den spesifiserte ressursen.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Din versjon er allerede oppdatert!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Oppdatering tilgjengelig</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Gjeldende versjon</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Nyeste versjon</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Vil du oppdatere?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Vis endringslogg</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Sjekk etter oppdateringer ved oppstart</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Oppdater</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Nei</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Skjul endringslogg</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Endringer</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Nettverksfeil oppstod mens du prøvde å tilgang til URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Nedlasting fullført</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>Oppdateringen har blitt lastet ned, trykk OK for å installere.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Kunne ikke lagre oppdateringsfilen </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Kunne ikke åpne ZIP-filen</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>Filnavnet er tomt. Muligens ødelagt ZIP.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Kunne ikke opprette katalog</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Feil ved dekomprimering av fil</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Kunne ikke åpne utdatafil</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Ikke støttet kompresjonsmetode for fil:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Kunne ikke opprette TAR-uttrekkskatalog</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Kunne ikke trekke ut TAR-filen</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Starter oppdatering...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Kunne ikke opprette oppdateringsskriptfilen</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Boot Game</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Controleren op updates</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>About</translation>
<source>Help</source>
<translation>Help</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Bijwerken</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Bij opstart op updates controleren</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Controleren op updates</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Pad</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Automatische updater</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Fout</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Ongeldig updatekanaal: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>In updateChannel in het config.tml-bestand moet 'stable' of 'unstable' staan</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Netwerkfout:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Kon update-informatie niet parseren.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Geen pre-releases gevonden.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Ongeldige releasegegevens.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Geen download-URL gevonden voor het opgegeven bestand.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Uw versie is al up-to-date!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Update beschikbaar</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Huidige versie</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Laatste versie</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Wilt u updaten?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Toon changelog</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Bij opstart op updates controleren</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Bijwerken</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Nee</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Verberg changelog</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Wijzigingen</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Netwerkfout opgetreden tijdens toegang tot de URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Download compleet</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>De update is gedownload, druk op OK om te installeren.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Kon het updatebestand niet opslaan op</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Kon het ZIP-bestand niet openen</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>Bestandsnaam is leeg. Mogelijk beschadigde ZIP.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Kon de directory niet maken</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Fout bij het decomprimeren van het bestand</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Kon het uitvoerbestand niet openen</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Ongesteunde compressiemethode voor bestand:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Kon de TAR-uitpakdirectory niet maken</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Kon het TAR-bestand niet uitpakken</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Starten van update...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Kon het update-scriptbestand niet maken</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Uruchom grę</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Sprawdź aktualizacje</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>O programie</translation>
<source>Help</source>
<translation>Pomoc</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Włącz debugowanie RenderDoc</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Aktualizacja</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Sprawdź aktualizacje przy starcie</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Sprawdź aktualizacje</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Ścieżka</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Automatyczne aktualizacje</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Błąd</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Nieprawidłowy kanał aktualizacji: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>W pliku config.tml, updateChannel musi zawierać 'stable' lub 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Błąd sieci:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Nie udało się sparsować informacji o aktualizacji.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Nie znaleziono wersji przedpremierowych.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Nieprawidłowe dane wydania.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Nie znaleziono adresu URL do pobrania dla określonego zasobu.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Twoja wersja jest już aktualna!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Dostępna aktualizacja</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Aktualna wersja</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Ostatnia wersja</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Czy chcesz zaktualizować?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Pokaż zmiany</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Sprawdź aktualizacje przy starcie</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Aktualizuj</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Nie</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Ukryj zmiany</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Zmiany</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Błąd sieci wystąpił podczas próby uzyskania dostępu do URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Pobieranie zakończone</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>Aktualizacja została pobrana, naciśnij OK, aby zainstalować.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Nie udało się zapisać pliku aktualizacji w</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Nie udało się otworzyć pliku ZIP</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>Nazwa pliku jest pusta. Możliwe, że ZIP jest uszkodzony.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Nie udało się utworzyć katalogu</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Błąd podczas dekompresji pliku</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Nie udało się otworzyć pliku wyjściowego</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Nieobsługiwana metoda kompresji dla pliku:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Nie udało się utworzyć katalogu do rozpakowania TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Nie udało się wyodrębnić pliku TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Rozpoczynanie aktualizacji...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Nie udało się utworzyć pliku skryptu aktualizacji</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Iniciar Jogo</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Verificar atualizações</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>Sobre</translation>
<source>Help</source>
<translation>Ajuda</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Ativar Depuração por RenderDoc</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Atualização</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Verificar Atualizações ao Iniciar</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Verificar atualizações</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Diretório</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Atualizador automático</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Erro</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Canal de atualização inválido: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>No arquivo config.tml, updateChannel deve conter apenas 'stable' ou 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Erro de rede:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Falha ao analisar as informações de atualização.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Nenhuma pre-release encontrada.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Dados da release inválidos.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Nenhuma URL de download encontrada para o asset especificado.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Sua versão está atualizada!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Atualização disponível</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Versão atual</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Última versão</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Você quer atualizar?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Mostrar Changelog</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Verificar Atualizações ao Iniciar</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Atualizar</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Não</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Ocultar Changelog</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Alterações</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Ocorreu um erro de rede ao tentar acessar o URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Download Completo</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>A atualização foi baixada, pressione OK para instalar.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Falha ao salvar o arquivo de atualização em</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Falha ao abrir o arquivo ZIP</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>O nome do arquivo está vazio. Possivelmente ZIP corrompido.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Falha ao criar o diretório</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Erro ao descompactar arquivo</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Falha ao abrir o arquivo de saída</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Método de compactação não suportado para arquivo:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Falha ao criar diretório de extração TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Falha ao extrair o arquivo TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Iniciando atualização...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Falha ao criar o arquivo de script de atualização</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Boot Game</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Verifică actualizările</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>About</translation>
<source>Help</source>
<translation>Ajutor</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,14 +502,29 @@
<source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Actualizare</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Verifică actualizări la pornire</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Verifică actualizări</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="106"/>
<source>Game List</source>
<translation>Lista jocurilor</translation>
</message>
<name>MainWindow</name>
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
@ -975,4 +995,177 @@
<translation>Drum</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Actualizator automat</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Eroare</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Canal de actualizare invalid: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>În fișierul config.tml, updateChannel trebuie conțină 'stable' sau 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Eroare de rețea:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Nu s-au putut analiza informațiile de actualizare.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Nu au fost găsite pre-lansări.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Datele versiunii sunt invalide.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Nu s-a găsit URL de descărcare pentru resursa specificată.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Versiunea ta este deja actualizată!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Actualizare disponibilă</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Versiunea curentă</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Ultima versiune</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Doriți actualizați?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Afișați jurnalul de modificări</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Verifică actualizări la pornire</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Actualizare</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Nu</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Ascunde jurnalul de modificări</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Modificări</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>A apărut o eroare de rețea în timpul încercării de a accesa URL-ul</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Descărcare completă</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>Actualizarea a fost descărcată, apăsați OK pentru a instala.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Nu s-a putut salva fișierul de actualizare la</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Nu s-a putut deschide fișierul ZIP</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>Numele fișierului este gol. Posibil ZIP corupt.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Nu s-a putut crea directorul</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Eroare la decompresarea fișierului</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Nu s-a putut deschide fișierul de ieșire</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Metodă de compresie nesuportată pentru fișier:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Nu s-a putut crea directorul de extragere TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Nu s-a putut extrage fișierul TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Încep actualizarea...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Nu s-a putut crea fișierul script de actualizare</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Запустить игру</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Проверить обновления</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>Справка</translation>
<source>Help</source>
<translation>Помощь</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Включить отладку RenderDoc</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Обновление</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Проверка обновлений при запуске</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Проверить обновления</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Путь</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Автообновление</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Недопустимый канал обновления: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>В файле config.tml параметр updateChannel должен содержать 'stable' или 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Ошибка сети:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Не удалось разобрать информацию об обновлении.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Предварительных версий не найдено.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Недопустимые данные релиза.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Не найден URL для загрузки указанного ресурса.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Ваша версия уже обновлена!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Доступно обновление</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Текущая версия</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Последняя версия</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Вы хотите обновить?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Показать изменения</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Проверка обновлений при запуске</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Обновить</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Нет</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Скрыть изменения</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Изменения</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Произошла ошибка сети при попытке доступа к URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Скачивание завершено</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>Обновление загружено, нажмите OK для установки.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Не удалось сохранить файл обновления в</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Не удалось открыть ZIP файл</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>Имя файла пустое. Возможно, ZIP поврежден.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Не удалось создать директорию</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Ошибка при разархивировании файла</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Не удалось открыть выходной файл</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Неподдерживаемый метод сжатия для файла:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Не удалось создать каталог для извлечения TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Не удалось извлечь TAR файл</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Начало обновления...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Не удалось создать файл скрипта обновления</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Nis Lojën</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Kontrollo për përditësime</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>Rreth</translation>
<source>Help</source>
<translation>Ndihmë</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Aktivizo Korrigjimin RenderDoc</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Përditëso</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Kontrollo për përditësime nisje</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Kontrollo për përditësime</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Shtegu</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Përditësues automatik</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Gabim</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Kanal përditësimi i pavlefshëm: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation> skedarin config.tml, updateChannel duhet përmbajë 'stable' ose 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Gabim rrjeti:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Analizimi i informacionit përditësimit deshtoi.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Nuk u gjetën botime paraprake.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation> dhënat e lëshimit janë pavlefshme.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Nuk u gjet URL-ja e shkarkimit për burimin e specifikuar.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Versioni jotë është i përditësuar tashmë!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Ofrohet një përditësim</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Versioni i tanishëm</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Versioni i fundit</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Do përditësosh?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Trego ndryshimet</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Kontrollo për përditësime nisje</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Përditëso</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Jo</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Fshih ndryshimet</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Ndryshimet</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Ka ndodhur një gabim rrjeti gjatë përpjekjes për qasur URL-</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Shkarkimi përfundoi</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>Përditësimi është shkarkuar, shtyp OK për ta instaluar.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Dështoi ruajtja e skedarit përditësimit </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Hapja e skedarit ZIP dështoi</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>Emri i skedarit është bosh. Mund jetë ZIP i korruptuar.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Krijimi i dosjes dështoi</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Gabim gjatë shpaketimit skedarit</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Hapja e skedarit dalës dështoi</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Mënyra e ngjeshjes nuk mbështetet për skedarin:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Krijimi i dosjes për shpaketimin TAR dështoi</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Shpaketimi i skedarit TAR dështoi</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Po fillon përditësimi...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Krijimi i skedarit skript përditësimit dështoi</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Oyunu Başlat</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Güncellemeleri kontrol et</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>Hakkında</translation>
<source>Help</source>
<translation>Yardım</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>RenderDoc Hata Ayıklamayı Etkinleştir</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Güncelle</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Başlangıçta güncellemeleri kontrol et</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Güncellemeleri kontrol et</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -700,13 +720,13 @@
</message>
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Confirm Delete</source>
<translation>Silme Onayı</translation>
<source>Delete File</source>
<translation>Dosyayı Sil</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="156"/>
<source>Are you sure you want to delete the selected cheat?\n%1</source>
<translation>Seçilen hileyi silmek istediğinizden emin misiniz?\n%1</translation>
<location filename="../cheats_patches.cpp" line="169"/>
<source>No files selected.</source>
<translation>Hiçbir dosya seçilmedi.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="170"/>
@ -902,77 +922,6 @@
<location filename="../cheats_patches.cpp" line="1006"/>
<source>Name:</source>
<translation>İsim:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1007"/>
<source>Version:</source>
<translation>Sürüm:</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1008"/>
<source>Size:</source>
<translation>Boyut:</translation>
</message>
</context>
<context>
<name>LangDialog</name>
<message>
<location filename="../lang_dialog.cpp" line="23"/>
<source>Language Settings</source>
<translation>Dil Ayarları</translation>
</message>
<message>
<location filename="../lang_dialog.cpp" line="30"/>
<source>Select Language:</source>
<translation>Dil Seçin:</translation>
</message>
<message>
<location filename="../lang_dialog.cpp" line="50"/>
<source>Restart Required</source>
<translation>Yeniden Başlatma Gerekiyor</translation>
</message>
<message>
<location filename="../lang_dialog.cpp" line="51"/>
<source>Changes will take effect after restarting the application.</source>
<translation>Değişiklikler uygulama yeniden başlatıldığında geçerli olacaktır.</translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<location filename="../settings_dialog.cpp" line="40"/>
<source>Settings</source>
<translation>Ayarlar</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="45"/>
<source>General</source>
<translation>Genel</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="49"/>
<source>Cheats</source>
<translation>Hileler</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="52"/>
<source>Update</source>
<translation>Güncelleme</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="55"/>
<source>Save</source>
<translation>Kaydet</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="66"/>
<source>Reset to Default</source>
<translation>Varsayılana Sıfırla</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="73"/>
<source>Apply Changes</source>
<translation>Değişiklikleri Uygula</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="1163"/>
@ -1046,4 +995,177 @@
<translation>Yol</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Otomatik Güncelleyici</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Hata</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Geçersiz güncelleme kanalı: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>config.tml dosyasındaki updateChannel 'stable' veya 'unstable' içermelidir</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation> hatası:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Güncelleme bilgilerini ayrıştırma başarısız oldu.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Ön sürüm bulunamadı.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Geçersiz sürüm verisi.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Belirtilen varlık için hiçbir indirme URL'si bulunamadı.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Versiyonunuz zaten güncel!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation>Güncelleme Mevcut</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Mevcut Versiyon</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Son Versiyon</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Güncellemek istiyor musunuz?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Değişiklik Günlüğünü Göster</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Başlangıçta güncellemeleri kontrol et</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Güncelle</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Hayır</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>Değişiklik Günlüğünü Gizle</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Değişiklikler</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>URL'ye erişmeye çalışırken bir hatası oluştu</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>İndirme Tamamlandı</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>Güncelleme indirildi, yüklemek için Tamam'a basın.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Güncelleme dosyası kaydedilemedi</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>ZIP dosyası ılamadı</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>Dosya adı boş. Muhtemelen ZIP bozuk.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Direktör oluşturulamadı</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Dosyayı açarken hata</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Çıktı dosyası ılamadı</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Dosya için desteklenmeyen sıkıştırma yöntemi:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>TAR çıkartma dizini oluşturulamadı</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>TAR dosyası çıkarılamadı</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Güncelleme Başlatılıyor...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Güncelleme betiği dosyası oluşturulamadı</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Boot Game</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation>Kiểm tra bản cập nhật</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>About</translation>
<source>Help</source>
<translation>Giúp đ</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>Cập nhật</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>Kiểm tra cập nhật khi khởi đng</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>Kiểm tra cập nhật</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation>Đưng dẫn</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Trình cập nhật tự đng</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation>Lỗi</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation>Kênh cập nhật không hợp lệ: </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>Trong updateChannel trong tệp config.tml phải chứa 'stable' hoặc 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation>Lỗi mạng:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Không thể phân tích thông tin cập nhật.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation>Không tìm thấy bản phát hành trước.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation>Dữ liệu bản phát hành không hợp lệ.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation>Không tìm thấy URL tải xuống cho tài sản đã chỉ đnh.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation>Phiên bản của bạn đã đưc cập nhật!</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation> bản cập nhật</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation>Phiên bản hiện tại</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation>Phiên bản mới nhất</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation>Bạn muốn cập nhật không?</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation>Hiện nhật thay đi</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>Kiểm tra cập nhật khi khởi đng</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation>Cập nhật</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation>Không</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation>n nhật thay đi</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation>Thay đi</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Xảy ra lỗi mạng khi cố gắng truy cập URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation>Tải xuống hoàn tất</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation>Bản cập nhật đã đưc tải xuống, nhấn OK đ cài đt.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation>Không thể lưu tệp cập nhật tại</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation>Không thể mở tệp ZIP</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation>Tên tệp trống. thể ZIP bị hỏng.</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation>Không thể tạo thư mục</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation>Lỗi khi giải nén tệp</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation>Không thể mở tệp đu ra</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation>Phương pháp nén không đưc hỗ trợ cho tệp:</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation>Không thể tạo thư mục giải nén TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation>Không thể giải nén tệp TAR</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>Đang bắt đu cập nhật...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation>Không thể tạo tệp kịch bản cập nhật</translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation></translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation></translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation></translation>
<source>Help</source>
<translation></translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation> RenderDoc </translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation></translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation></translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation>config.tml updateChannel 'stable' 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation> URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>访 URL </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation> OK </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation> ZIP </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation> ZIP</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation> TAR </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation> TAR </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation></translation>
</message>
</context>
</TS>

View File

@ -168,6 +168,11 @@
<source>Boot Game</source>
<translation>Boot Game</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
<source>Check for Updates</source>
<translation></translation>
</message>
<message>
<location filename="../main_window_ui.h" line="314"/>
<source>About shadPS4</source>
@ -310,8 +315,8 @@
</message>
<message>
<location filename="../main_window_ui.h" line="358"/>
<source>About</source>
<translation>About</translation>
<source>Help</source>
<translation></translation>
</message>
<message>
<location filename="../main_window_ui.h" line="359"/>
@ -497,6 +502,21 @@
<source>Enable RenderDoc Debugging</source>
<translation>Enable RenderDoc Debugging</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation></translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -975,4 +995,177 @@
<translation></translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
<message>
<location filename="../checkUpdate.cpp" line="34"/>
<source>Auto Updater</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="51"/>
<source>Error</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="52"/>
<source>Invalid update channel: </source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="53"/>
<source>In updateChannel in config.tml file must contain 'stable' or 'unstable'</source>
<translation> config.tml updateChannel 'stable' 'unstable'</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="64"/>
<source>Network error:</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="89"/>
<source>No pre-releases found.</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="102"/>
<source>Invalid release data.</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="142"/>
<source>No download URL found for the specified asset.</source>
<translation> URL</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="148"/>
<source>Your version is already up to date!</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="172"/>
<source>Update Available</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="177"/>
<source>Current Version</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="178"/>
<source>Latest Version</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="179"/>
<source>Do you want to update?</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="193"/>
<source>Show Changelog</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="199"/>
<source>Update</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="200"/>
<source>No</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="223"/>
<source>Hide Changelog</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="296"/>
<source>Changes</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation> URL </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="330"/>
<source>Download Complete</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="331"/>
<source>The update has been downloaded, press OK to install.</source>
<translation> OK </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="336"/>
<source>Failed to save the update file at</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="352"/>
<source>Failed to open the ZIP file</source>
<translation> ZIP </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="420"/>
<source>File name is empty. Possibly corrupted ZIP.</source>
<translation> ZIP</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="445"/>
<source>Failed to create directory</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="464"/>
<source>Error decompressing file</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="487"/>
<source>Failed to open output file</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="497"/>
<source>Unsupported compression method for file:</source>
<translation></translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="510"/>
<source>Failed to create TAR extraction directory</source>
<translation> TAR </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="525"/>
<source>Failed to extract the TAR file</source>
<translation> TAR </translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="545"/>
<source>Starting Update...</source>
<translation>...</translation>
</message>
<message>
<location filename="../checkUpdate.cpp" line="619"/>
<source>Failed to create the update script file</source>
<translation></translation>
</message>
</context>
</TS>

View File

@ -36,6 +36,7 @@ WindowSDL::WindowSDL(s32 width_, s32 height_, Input::GameController* controller_
SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_WIDTH_NUMBER, width);
SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER, height);
SDL_SetNumberProperty(props, "flags", SDL_WINDOW_VULKAN);
SDL_SetBooleanProperty(props, SDL_PROP_WINDOW_CREATE_RESIZABLE_BOOLEAN, true);
window = SDL_CreateWindowWithProperties(props);
SDL_DestroyProperties(props);
if (window == nullptr) {

View File

@ -76,77 +76,89 @@ Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, u32 handle, Id c
const IR::Value& offset) {
const auto& texture = ctx.images[handle & 0xFFFF];
const Id image = ctx.OpLoad(texture.image_type, texture.id);
const Id result_type = texture.data_types->Get(4);
const Id sampler = ctx.OpLoad(ctx.sampler_type, ctx.samplers[handle >> 16]);
const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler);
ImageOperands operands;
operands.Add(spv::ImageOperandsMask::Bias, bias);
operands.AddOffset(ctx, offset);
return ctx.OpImageSampleImplicitLod(ctx.F32[4], sampled_image, coords, operands.mask,
operands.operands);
const Id sample = ctx.OpImageSampleImplicitLod(result_type, sampled_image, coords,
operands.mask, operands.operands);
return texture.is_integer ? ctx.OpBitcast(ctx.F32[4], sample) : sample;
}
Id EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id lod,
const IR::Value& offset) {
const auto& texture = ctx.images[handle & 0xFFFF];
const Id image = ctx.OpLoad(texture.image_type, texture.id);
const Id result_type = texture.data_types->Get(4);
const Id sampler = ctx.OpLoad(ctx.sampler_type, ctx.samplers[handle >> 16]);
const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler);
ImageOperands operands;
operands.Add(spv::ImageOperandsMask::Lod, lod);
operands.AddOffset(ctx, offset);
return ctx.OpImageSampleExplicitLod(ctx.F32[4], sampled_image, coords, operands.mask,
operands.operands);
const Id sample = ctx.OpImageSampleExplicitLod(result_type, sampled_image, coords,
operands.mask, operands.operands);
return texture.is_integer ? ctx.OpBitcast(ctx.F32[4], sample) : sample;
}
Id EmitImageSampleDrefImplicitLod(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id dref,
Id bias, const IR::Value& offset) {
const auto& texture = ctx.images[handle & 0xFFFF];
const Id image = ctx.OpLoad(texture.image_type, texture.id);
const Id result_type = texture.data_types->Get(1);
const Id sampler = ctx.OpLoad(ctx.sampler_type, ctx.samplers[handle >> 16]);
const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler);
ImageOperands operands;
operands.Add(spv::ImageOperandsMask::Bias, bias);
operands.AddOffset(ctx, offset);
return ctx.OpImageSampleDrefImplicitLod(ctx.F32[1], sampled_image, coords, dref, operands.mask,
operands.operands);
const Id sample = ctx.OpImageSampleDrefImplicitLod(result_type, sampled_image, coords, dref,
operands.mask, operands.operands);
return texture.is_integer ? ctx.OpBitcast(ctx.F32[1], sample) : sample;
}
Id EmitImageSampleDrefExplicitLod(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id dref,
Id lod, const IR::Value& offset) {
const auto& texture = ctx.images[handle & 0xFFFF];
const Id image = ctx.OpLoad(texture.image_type, texture.id);
const Id result_type = texture.data_types->Get(1);
const Id sampler = ctx.OpLoad(ctx.sampler_type, ctx.samplers[handle >> 16]);
const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler);
ImageOperands operands;
operands.AddOffset(ctx, offset);
operands.Add(spv::ImageOperandsMask::Lod, lod);
return ctx.OpImageSampleDrefExplicitLod(ctx.F32[1], sampled_image, coords, dref, operands.mask,
operands.operands);
const Id sample = ctx.OpImageSampleDrefExplicitLod(result_type, sampled_image, coords, dref,
operands.mask, operands.operands);
return texture.is_integer ? ctx.OpBitcast(ctx.F32[1], sample) : sample;
}
Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords,
const IR::Value& offset) {
const auto& texture = ctx.images[handle & 0xFFFF];
const Id image = ctx.OpLoad(texture.image_type, texture.id);
const Id result_type = texture.data_types->Get(4);
const Id sampler = ctx.OpLoad(ctx.sampler_type, ctx.samplers[handle >> 16]);
const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler);
const u32 comp = inst->Flags<IR::TextureInstInfo>().gather_comp.Value();
ImageOperands operands;
operands.AddOffset(ctx, offset, true);
return ctx.OpImageGather(ctx.F32[4], sampled_image, coords, ctx.ConstU32(comp), operands.mask,
operands.operands);
const Id texels = ctx.OpImageGather(result_type, sampled_image, coords, ctx.ConstU32(comp),
operands.mask, operands.operands);
return texture.is_integer ? ctx.OpBitcast(ctx.F32[4], texels) : texels;
}
Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords,
const IR::Value& offset, Id dref) {
const auto& texture = ctx.images[handle & 0xFFFF];
const Id image = ctx.OpLoad(texture.image_type, texture.id);
const Id result_type = texture.data_types->Get(4);
const Id sampler = ctx.OpLoad(ctx.sampler_type, ctx.samplers[handle >> 16]);
const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler);
ImageOperands operands;
operands.AddOffset(ctx, offset, true);
return ctx.OpImageDrefGather(ctx.F32[4], sampled_image, coords, dref, operands.mask,
const Id texels = ctx.OpImageDrefGather(result_type, sampled_image, coords, dref, operands.mask,
operands.operands);
return texture.is_integer ? ctx.OpBitcast(ctx.F32[4], texels) : texels;
}
Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, const IR::Value& offset,
@ -161,7 +173,7 @@ Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, const
texture.is_storage
? ctx.OpImageRead(result_type, image, coords, operands.mask, operands.operands)
: ctx.OpImageFetch(result_type, image, coords, operands.mask, operands.operands);
return ctx.OpBitcast(ctx.F32[4], texel);
return texture.is_integer ? ctx.OpBitcast(ctx.F32[4], texel) : texel;
}
Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, u32 handle, Id lod, bool has_mips) {
@ -204,13 +216,15 @@ Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id
const IR::Value& offset, Id lod_clamp) {
const auto& texture = ctx.images[handle & 0xFFFF];
const Id image = ctx.OpLoad(texture.image_type, texture.id);
const Id result_type = texture.data_types->Get(4);
const Id sampler = ctx.OpLoad(ctx.sampler_type, ctx.samplers[handle >> 16]);
const Id sampled_image = ctx.OpSampledImage(texture.sampled_type, image, sampler);
ImageOperands operands;
operands.AddDerivatives(ctx, derivatives);
operands.AddOffset(ctx, offset);
return ctx.OpImageSampleExplicitLod(ctx.F32[4], sampled_image, coords, operands.mask,
operands.operands);
const Id sample = ctx.OpImageSampleExplicitLod(result_type, sampled_image, coords,
operands.mask, operands.operands);
return texture.is_integer ? ctx.OpBitcast(ctx.F32[4], sample) : sample;
}
Id EmitImageRead(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords) {

View File

@ -532,6 +532,8 @@ Id ImageType(EmitContext& ctx, const ImageResource& desc, Id sampled_type) {
void EmitContext::DefineImagesAndSamplers() {
for (const auto& image_desc : info.images) {
const bool is_integer = image_desc.nfmt == AmdGpu::NumberFormat::Uint ||
image_desc.nfmt == AmdGpu::NumberFormat::Sint;
const VectorIds& data_types = GetAttributeType(*this, image_desc.nfmt);
const Id sampled_type = data_types[1];
const Id image_type{ImageType(*this, image_desc, sampled_type)};
@ -547,6 +549,7 @@ void EmitContext::DefineImagesAndSamplers() {
.sampled_type = image_desc.is_storage ? sampled_type : TypeSampledImage(image_type),
.pointer_type = pointer_type,
.image_type = image_type,
.is_integer = is_integer,
.is_storage = image_desc.is_storage,
});
interfaces.push_back(id);

View File

@ -201,6 +201,7 @@ public:
Id sampled_type;
Id pointer_type;
Id image_type;
bool is_integer = false;
bool is_storage = false;
};

View File

@ -242,6 +242,8 @@ void Translator::EmitVectorAlu(const GcnInst& inst) {
return V_CMP_U32(ConditionOp::LG, true, false, inst);
case Opcode::V_CMP_GE_I32:
return V_CMP_U32(ConditionOp::GE, true, false, inst);
case Opcode::V_CMPX_LE_I32:
return V_CMP_U32(ConditionOp::LE, true, true, inst);
// V_CMPX_{OP8}_I32
case Opcode::V_CMPX_LT_I32:

View File

@ -2,6 +2,7 @@
<qresource prefix="/">
<file>images/shadps4.ico</file>
<file>images/about_icon.png</file>
<file>images/dump_icon.png</file>
<file>images/play_icon.png</file>
<file>images/pause_icon.png</file>
<file>images/stop_icon.png</file>
@ -15,6 +16,7 @@
<file>images/settings_icon.png</file>
<file>images/controller_icon.png</file>
<file>images/refresh_icon.png</file>
<file>images/update_icon.png</file>
<file>images/list_mode_icon.png</file>
<file>images/flag_jp.png</file>
<file>images/flag_eu.png</file>

View File

@ -43,6 +43,23 @@ enum class DataFormat : u32 {
FormatBc5 = 39,
FormatBc6 = 40,
FormatBc7 = 41,
FormatFmask8_1 = 47,
FormatFmask8_2 = 48,
FormatFmask8_4 = 49,
FormatFmask16_1 = 50,
FormatFmask16_2 = 51,
FormatFmask32_2 = 52,
FormatFmask32_4 = 53,
FormatFmask32_8 = 54,
FormatFmask64_4 = 55,
FormatFmask64_8 = 56,
Format4_4 = 57,
Format6_5_5 = 58,
Format1 = 59,
Format1_Reversed = 60,
Format32_As_8 = 61,
Format32_As_8_8 = 62,
Format32_As_32_32_32_32 = 63,
};
enum class NumberFormat : u32 {

View File

@ -23,7 +23,7 @@ enum class CompSwizzle : u32 {
// Table 8.5 Buffer Resource Descriptor [Sea Islands Series Instruction Set Architecture]
struct Buffer {
u64 base_address : 44;
u64 : 4;
u64 _padding0 : 4;
u64 stride : 14;
u64 cache_swizzle : 1;
u64 swizzle_enable : 1;
@ -37,7 +37,7 @@ struct Buffer {
u32 element_size : 2;
u32 index_stride : 2;
u32 add_tid_enable : 1;
u32 : 6;
u32 _padding1 : 6;
u32 type : 2; // overlaps with T# type, so should be 0 for buffer
bool Valid() const {

View File

@ -9,10 +9,7 @@
#include "video_core/renderer_vulkan/vk_platform.h"
#include "video_core/renderer_vulkan/vk_scheduler.h"
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wnullability-completeness"
#include <vk_mem_alloc.h>
#pragma GCC diagnostic pop
namespace VideoCore {
@ -128,7 +125,9 @@ vk::BufferView Buffer::View(u32 offset, u32 size, bool is_written, AmdGpu::DataF
.offset = offset,
.range = size,
};
const auto view = instance->GetDevice().createBufferView(view_ci);
const auto [view_result, view] = instance->GetDevice().createBufferView(view_ci);
ASSERT_MSG(view_result == vk::Result::eSuccess, "Failed to create buffer view: {}",
vk::to_string(view_result));
scheduler->DeferOperation(
[view, device = instance->GetDevice()] { device.destroyBufferView(view); });
return view;

View File

@ -294,302 +294,336 @@ vk::BorderColor BorderColor(AmdGpu::BorderColor color) {
}
}
std::span<const vk::Format> GetAllFormats() {
static constexpr vk::FormatFeatureFlags2 BufferRead =
vk::FormatFeatureFlagBits2::eUniformTexelBuffer | vk::FormatFeatureFlagBits2::eVertexBuffer;
static constexpr vk::FormatFeatureFlags2 BufferWrite =
vk::FormatFeatureFlagBits2::eStorageTexelBuffer |
vk::FormatFeatureFlagBits2::eStorageReadWithoutFormat |
vk::FormatFeatureFlagBits2::eStorageWriteWithoutFormat;
static constexpr vk::FormatFeatureFlags2 ImageRead = vk::FormatFeatureFlagBits2::eTransferSrc |
vk::FormatFeatureFlagBits2::eTransferDst |
vk::FormatFeatureFlagBits2::eSampledImage;
static constexpr vk::FormatFeatureFlags2 ImageWrite =
vk::FormatFeatureFlagBits2::eStorageImage |
vk::FormatFeatureFlagBits2::eStorageReadWithoutFormat |
vk::FormatFeatureFlagBits2::eStorageWriteWithoutFormat;
static constexpr vk::FormatFeatureFlags2 Mrt = vk::FormatFeatureFlagBits2::eColorAttachment;
// Table 8.13 Data and Image Formats [Sea Islands Series Instruction Set Architecture]
static constexpr vk::FormatFeatureFlags2 GetDataFormatFeatureFlags(
const AmdGpu::DataFormat data_format) {
switch (data_format) {
case AmdGpu::DataFormat::FormatInvalid:
case AmdGpu::DataFormat::Format8:
case AmdGpu::DataFormat::Format16:
case AmdGpu::DataFormat::Format8_8:
case AmdGpu::DataFormat::Format32:
case AmdGpu::DataFormat::Format16_16:
case AmdGpu::DataFormat::Format10_11_11:
case AmdGpu::DataFormat::Format11_11_10:
case AmdGpu::DataFormat::Format10_10_10_2:
case AmdGpu::DataFormat::Format2_10_10_10:
case AmdGpu::DataFormat::Format8_8_8_8:
case AmdGpu::DataFormat::Format32_32:
case AmdGpu::DataFormat::Format16_16_16_16:
case AmdGpu::DataFormat::Format32_32_32_32:
return BufferRead | BufferWrite | ImageRead | ImageWrite | Mrt;
case AmdGpu::DataFormat::Format32_32_32:
return BufferRead | BufferWrite | ImageRead;
case AmdGpu::DataFormat::Format5_6_5:
case AmdGpu::DataFormat::Format1_5_5_5:
case AmdGpu::DataFormat::Format5_5_5_1:
case AmdGpu::DataFormat::Format4_4_4_4:
return ImageRead | ImageWrite | Mrt;
case AmdGpu::DataFormat::Format8_24:
case AmdGpu::DataFormat::Format24_8:
case AmdGpu::DataFormat::FormatX24_8_32:
return ImageRead | Mrt;
case AmdGpu::DataFormat::FormatGB_GR:
case AmdGpu::DataFormat::FormatBG_RG:
case AmdGpu::DataFormat::Format5_9_9_9:
case AmdGpu::DataFormat::FormatBc1:
case AmdGpu::DataFormat::FormatBc2:
case AmdGpu::DataFormat::FormatBc3:
case AmdGpu::DataFormat::FormatBc4:
case AmdGpu::DataFormat::FormatBc5:
case AmdGpu::DataFormat::FormatBc6:
case AmdGpu::DataFormat::FormatBc7:
case AmdGpu::DataFormat::Format4_4:
case AmdGpu::DataFormat::Format6_5_5:
case AmdGpu::DataFormat::Format1:
case AmdGpu::DataFormat::Format1_Reversed:
case AmdGpu::DataFormat::Format32_As_8:
case AmdGpu::DataFormat::Format32_As_8_8:
case AmdGpu::DataFormat::Format32_As_32_32_32_32:
return ImageRead;
case AmdGpu::DataFormat::FormatFmask8_1:
case AmdGpu::DataFormat::FormatFmask8_2:
case AmdGpu::DataFormat::FormatFmask8_4:
case AmdGpu::DataFormat::FormatFmask16_1:
case AmdGpu::DataFormat::FormatFmask16_2:
case AmdGpu::DataFormat::FormatFmask32_2:
case AmdGpu::DataFormat::FormatFmask32_4:
case AmdGpu::DataFormat::FormatFmask32_8:
case AmdGpu::DataFormat::FormatFmask64_4:
case AmdGpu::DataFormat::FormatFmask64_8:
return ImageRead | ImageWrite;
}
UNREACHABLE_MSG("Missing feature flags for data format {}", static_cast<u32>(data_format));
}
// Table 8.13 Data and Image Formats [Sea Islands Series Instruction Set Architecture]
static constexpr vk::FormatFeatureFlags2 GetNumberFormatFeatureFlags(
const AmdGpu::NumberFormat number_format) {
switch (number_format) {
case AmdGpu::NumberFormat::Unorm:
case AmdGpu::NumberFormat::Snorm:
case AmdGpu::NumberFormat::Uint:
case AmdGpu::NumberFormat::Sint:
case AmdGpu::NumberFormat::Float:
return BufferRead | BufferWrite | ImageRead | ImageWrite;
case AmdGpu::NumberFormat::Uscaled:
case AmdGpu::NumberFormat::Sscaled:
case AmdGpu::NumberFormat::SnormNz:
return BufferRead | ImageRead;
case AmdGpu::NumberFormat::Srgb:
case AmdGpu::NumberFormat::Ubnorm:
case AmdGpu::NumberFormat::UbnromNz:
case AmdGpu::NumberFormat::Ubint:
case AmdGpu::NumberFormat::Ubscaled:
return ImageRead;
}
UNREACHABLE_MSG("Missing feature flags for number format {}", static_cast<u32>(number_format));
}
static constexpr SurfaceFormatInfo CreateSurfaceFormatInfo(const AmdGpu::DataFormat data_format,
const AmdGpu::NumberFormat number_format,
const vk::Format vk_format) {
return {
.data_format = data_format,
.number_format = number_format,
.vk_format = vk_format,
.flags =
GetDataFormatFeatureFlags(data_format) & GetNumberFormatFeatureFlags(number_format),
};
}
std::span<const SurfaceFormatInfo> SurfaceFormats() {
static constexpr std::array formats{
vk::Format::eA2B10G10R10SnormPack32,
vk::Format::eA2B10G10R10UnormPack32,
vk::Format::eA2R10G10B10UnormPack32,
vk::Format::eB5G6R5UnormPack16,
vk::Format::eB8G8R8A8Srgb,
vk::Format::eB8G8R8A8Unorm,
vk::Format::eB10G11R11UfloatPack32,
vk::Format::eBc1RgbaSrgbBlock,
vk::Format::eBc1RgbaUnormBlock,
vk::Format::eBc2SrgbBlock,
vk::Format::eBc2UnormBlock,
vk::Format::eBc3SrgbBlock,
vk::Format::eBc3UnormBlock,
vk::Format::eBc4UnormBlock,
vk::Format::eBc5UnormBlock,
vk::Format::eBc5SnormBlock,
vk::Format::eBc7SrgbBlock,
vk::Format::eBc7UnormBlock,
vk::Format::eD16Unorm,
vk::Format::eD16UnormS8Uint,
vk::Format::eD24UnormS8Uint,
vk::Format::eD32Sfloat,
vk::Format::eD32SfloatS8Uint,
vk::Format::eR4G4B4A4UnormPack16,
vk::Format::eR5G6B5UnormPack16,
vk::Format::eR5G5B5A1UnormPack16,
vk::Format::eR8G8B8A8Srgb,
vk::Format::eR8G8B8A8Uint,
vk::Format::eR8G8B8A8Unorm,
vk::Format::eR8G8B8A8Snorm,
vk::Format::eR8G8B8A8Uscaled,
vk::Format::eR8G8Snorm,
vk::Format::eR8G8Uint,
vk::Format::eR8G8Unorm,
vk::Format::eR8Sint,
vk::Format::eR8Snorm,
vk::Format::eR8Uint,
vk::Format::eR8Unorm,
vk::Format::eR8Srgb,
vk::Format::eR16G16B16A16Sfloat,
vk::Format::eR16G16B16A16Sint,
vk::Format::eR16G16B16A16Snorm,
vk::Format::eR16G16B16A16Uint,
vk::Format::eR16G16B16A16Unorm,
vk::Format::eR16G16Sfloat,
vk::Format::eR16G16Sint,
vk::Format::eR16G16Snorm,
vk::Format::eR16Sfloat,
vk::Format::eR16Uint,
vk::Format::eR16Unorm,
vk::Format::eR32G32B32A32Sfloat,
vk::Format::eR32G32B32A32Sint,
vk::Format::eR32G32B32A32Uint,
vk::Format::eR32G32B32Sfloat,
vk::Format::eR32G32B32Uint,
vk::Format::eR32G32Sfloat,
vk::Format::eR32G32Uint,
vk::Format::eR32Sfloat,
vk::Format::eR32Sint,
vk::Format::eR32Uint,
vk::Format::eBc6HUfloatBlock,
vk::Format::eBc6HSfloatBlock,
vk::Format::eR16G16Unorm,
vk::Format::eR16G16B16A16Sscaled,
vk::Format::eR16G16Sscaled,
vk::Format::eE5B9G9R9UfloatPack32,
// Invalid
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Unorm,
vk::Format::eUndefined),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Snorm,
vk::Format::eUndefined),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Uscaled,
vk::Format::eUndefined),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Sscaled,
vk::Format::eUndefined),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Uint,
vk::Format::eUndefined),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Sint,
vk::Format::eUndefined),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::SnormNz,
vk::Format::eUndefined),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Float,
vk::Format::eUndefined),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Srgb,
vk::Format::eUndefined),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Ubnorm,
vk::Format::eUndefined),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::UbnromNz,
vk::Format::eUndefined),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Ubint,
vk::Format::eUndefined),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Ubscaled,
vk::Format::eUndefined),
// 8
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8, AmdGpu::NumberFormat::Unorm,
vk::Format::eR8Unorm),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8, AmdGpu::NumberFormat::Snorm,
vk::Format::eR8Snorm),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8, AmdGpu::NumberFormat::Uint,
vk::Format::eR8Uint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8, AmdGpu::NumberFormat::Sint,
vk::Format::eR8Sint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8, AmdGpu::NumberFormat::Srgb,
vk::Format::eR8Srgb),
// 16
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16, AmdGpu::NumberFormat::Unorm,
vk::Format::eR16Unorm),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16, AmdGpu::NumberFormat::Snorm,
vk::Format::eR16Snorm),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16, AmdGpu::NumberFormat::Uint,
vk::Format::eR16Uint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16, AmdGpu::NumberFormat::Sint,
vk::Format::eR16Sint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16, AmdGpu::NumberFormat::Float,
vk::Format::eR16Sfloat),
// 8_8
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8, AmdGpu::NumberFormat::Unorm,
vk::Format::eR8G8Unorm),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8, AmdGpu::NumberFormat::Snorm,
vk::Format::eR8G8Snorm),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8, AmdGpu::NumberFormat::Uint,
vk::Format::eR8G8Uint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8, AmdGpu::NumberFormat::Sint,
vk::Format::eR8G8Sint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8, AmdGpu::NumberFormat::Srgb,
vk::Format::eR8G8Srgb),
// 32
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32, AmdGpu::NumberFormat::Uint,
vk::Format::eR32Uint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32, AmdGpu::NumberFormat::Sint,
vk::Format::eR32Sint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32, AmdGpu::NumberFormat::Float,
vk::Format::eR32Sfloat),
// 16_16
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Unorm,
vk::Format::eR16G16Unorm),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Snorm,
vk::Format::eR16G16Snorm),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Uscaled,
vk::Format::eR16G16Uscaled),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Sscaled,
vk::Format::eR16G16Sscaled),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Uint,
vk::Format::eR16G16Uint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Sint,
vk::Format::eR16G16Sint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Float,
vk::Format::eR16G16Sfloat),
// 10_11_11
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format10_11_11, AmdGpu::NumberFormat::Float,
vk::Format::eB10G11R11UfloatPack32),
// 11_11_10
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format11_11_10, AmdGpu::NumberFormat::Float,
vk::Format::eB10G11R11UfloatPack32),
// 10_10_10_2
// 2_10_10_10
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format2_10_10_10, AmdGpu::NumberFormat::Unorm,
vk::Format::eA2B10G10R10UnormPack32),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format2_10_10_10, AmdGpu::NumberFormat::Snorm,
vk::Format::eA2B10G10R10SnormPack32),
// 8_8_8_8
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Unorm,
vk::Format::eR8G8B8A8Unorm),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Snorm,
vk::Format::eR8G8B8A8Snorm),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Uscaled,
vk::Format::eR8G8B8A8Uscaled),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Sscaled,
vk::Format::eR8G8B8A8Sscaled),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Uint,
vk::Format::eR8G8B8A8Uint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Sint,
vk::Format::eR8G8B8A8Sint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Srgb,
vk::Format::eR8G8B8A8Srgb),
// 32_32
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32, AmdGpu::NumberFormat::Uint,
vk::Format::eR32G32Uint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32, AmdGpu::NumberFormat::Sint,
vk::Format::eR32G32Sint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32, AmdGpu::NumberFormat::Float,
vk::Format::eR32G32Sfloat),
// 16_16_16_16
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, AmdGpu::NumberFormat::Unorm,
vk::Format::eR16G16B16A16Unorm),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, AmdGpu::NumberFormat::Snorm,
vk::Format::eR16G16B16A16Snorm),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16,
AmdGpu::NumberFormat::Uscaled, vk::Format::eR16G16B16A16Uscaled),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16,
AmdGpu::NumberFormat::Sscaled, vk::Format::eR16G16B16A16Sscaled),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, AmdGpu::NumberFormat::Uint,
vk::Format::eR16G16B16A16Uint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, AmdGpu::NumberFormat::Sint,
vk::Format::eR16G16B16A16Sint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16,
AmdGpu::NumberFormat::SnormNz, vk::Format::eR16G16B16A16Snorm),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, AmdGpu::NumberFormat::Float,
vk::Format::eR16G16B16A16Sfloat),
// 32_32_32
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32_32, AmdGpu::NumberFormat::Uint,
vk::Format::eR32G32B32Uint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32_32, AmdGpu::NumberFormat::Sint,
vk::Format::eR32G32B32Sint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32_32, AmdGpu::NumberFormat::Float,
vk::Format::eR32G32B32Sfloat),
// 32_32_32_32
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32_32_32, AmdGpu::NumberFormat::Uint,
vk::Format::eR32G32B32A32Uint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32_32_32, AmdGpu::NumberFormat::Sint,
vk::Format::eR32G32B32A32Sint),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format32_32_32_32, AmdGpu::NumberFormat::Float,
vk::Format::eR32G32B32A32Sfloat),
// 5_6_5
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format5_6_5, AmdGpu::NumberFormat::Unorm,
vk::Format::eB5G6R5UnormPack16),
// 1_5_5_5
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format1_5_5_5, AmdGpu::NumberFormat::Unorm,
vk::Format::eR5G5B5A1UnormPack16),
// 5_5_5_1
// 4_4_4_4
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format4_4_4_4, AmdGpu::NumberFormat::Unorm,
vk::Format::eR4G4B4A4UnormPack16),
// 8_24
// 24_8
// X24_8_32
// GB_GR
// BG_RG
// 5_9_9_9
CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format5_9_9_9, AmdGpu::NumberFormat::Float,
vk::Format::eE5B9G9R9UfloatPack32),
// BC1
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc1, AmdGpu::NumberFormat::Unorm,
vk::Format::eBc1RgbaUnormBlock),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc1, AmdGpu::NumberFormat::Srgb,
vk::Format::eBc1RgbaSrgbBlock),
// BC2
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc2, AmdGpu::NumberFormat::Unorm,
vk::Format::eBc2UnormBlock),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc2, AmdGpu::NumberFormat::Srgb,
vk::Format::eBc2SrgbBlock),
// BC3
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc3, AmdGpu::NumberFormat::Unorm,
vk::Format::eBc3UnormBlock),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc3, AmdGpu::NumberFormat::Srgb,
vk::Format::eBc3SrgbBlock),
// BC4
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc4, AmdGpu::NumberFormat::Unorm,
vk::Format::eBc4UnormBlock),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc4, AmdGpu::NumberFormat::Snorm,
vk::Format::eBc4SnormBlock),
// BC5
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc5, AmdGpu::NumberFormat::Unorm,
vk::Format::eBc5UnormBlock),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc5, AmdGpu::NumberFormat::Snorm,
vk::Format::eBc5SnormBlock),
// BC6
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc6, AmdGpu::NumberFormat::Unorm,
vk::Format::eBc6HUfloatBlock),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc6, AmdGpu::NumberFormat::Snorm,
vk::Format::eBc6HSfloatBlock),
// BC7
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc7, AmdGpu::NumberFormat::Unorm,
vk::Format::eBc7UnormBlock),
CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatBc7, AmdGpu::NumberFormat::Srgb,
vk::Format::eBc7SrgbBlock),
};
return formats;
}
vk::Format SurfaceFormat(AmdGpu::DataFormat data_format, AmdGpu::NumberFormat num_format) {
if (data_format == AmdGpu::DataFormat::Format32_32_32_32 &&
num_format == AmdGpu::NumberFormat::Float) {
return vk::Format::eR32G32B32A32Sfloat;
}
if (data_format == AmdGpu::DataFormat::Format32_32_32 &&
num_format == AmdGpu::NumberFormat::Uint) {
return vk::Format::eR32G32B32Uint;
}
if (data_format == AmdGpu::DataFormat::Format8_8_8_8 &&
num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eR8G8B8A8Unorm;
}
if (data_format == AmdGpu::DataFormat::Format8_8_8_8 &&
num_format == AmdGpu::NumberFormat::Srgb) {
return vk::Format::eR8G8B8A8Srgb;
}
if (data_format == AmdGpu::DataFormat::Format32_32_32 &&
num_format == AmdGpu::NumberFormat::Float) {
return vk::Format::eR32G32B32Sfloat;
}
if (data_format == AmdGpu::DataFormat::Format32_32 &&
num_format == AmdGpu::NumberFormat::Float) {
return vk::Format::eR32G32Sfloat;
}
if (data_format == AmdGpu::DataFormat::Format5_6_5 &&
num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eB5G6R5UnormPack16;
}
if (data_format == AmdGpu::DataFormat::Format1_5_5_5 &&
num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eR5G5B5A1UnormPack16;
}
if (data_format == AmdGpu::DataFormat::Format8 && num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eR8Unorm;
}
if (data_format == AmdGpu::DataFormat::FormatBc3 && num_format == AmdGpu::NumberFormat::Srgb) {
return vk::Format::eBc3SrgbBlock;
}
if (data_format == AmdGpu::DataFormat::FormatBc3 && num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eBc3UnormBlock;
}
if (data_format == AmdGpu::DataFormat::FormatBc4 && num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eBc4UnormBlock;
}
if (data_format == AmdGpu::DataFormat::FormatBc5 && num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eBc5UnormBlock;
}
if (data_format == AmdGpu::DataFormat::FormatBc5 && num_format == AmdGpu::NumberFormat::Snorm) {
return vk::Format::eBc5SnormBlock;
}
if (data_format == AmdGpu::DataFormat::Format16_16_16_16 &&
num_format == AmdGpu::NumberFormat::Sint) {
return vk::Format::eR16G16B16A16Sint;
}
if (data_format == AmdGpu::DataFormat::Format16_16_16_16 &&
num_format == AmdGpu::NumberFormat::Sscaled) {
return vk::Format::eR16G16B16A16Sscaled;
}
if (data_format == AmdGpu::DataFormat::Format16_16 &&
num_format == AmdGpu::NumberFormat::Float) {
return vk::Format::eR16G16Sfloat;
}
if (data_format == AmdGpu::DataFormat::Format16_16 &&
num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eR16G16Unorm;
}
if (data_format == AmdGpu::DataFormat::Format2_10_10_10 &&
num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eA2B10G10R10UnormPack32;
}
if (data_format == AmdGpu::DataFormat::Format2_10_10_10 &&
num_format == AmdGpu::NumberFormat::Snorm) {
return vk::Format::eA2B10G10R10SnormPack32;
}
if (data_format == AmdGpu::DataFormat::FormatBc7 && num_format == AmdGpu::NumberFormat::Srgb) {
return vk::Format::eBc7SrgbBlock;
}
if (data_format == AmdGpu::DataFormat::FormatBc1 && num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eBc1RgbaUnormBlock;
}
if (data_format == AmdGpu::DataFormat::Format8_8_8_8 &&
num_format == AmdGpu::NumberFormat::Uint) {
return vk::Format::eR8G8B8A8Uint;
}
if (data_format == AmdGpu::DataFormat::Format16 && num_format == AmdGpu::NumberFormat::Float) {
return vk::Format::eR16Sfloat;
}
if (data_format == AmdGpu::DataFormat::Format32 && num_format == AmdGpu::NumberFormat::Float) {
return vk::Format::eR32Sfloat;
}
if (data_format == AmdGpu::DataFormat::Format16_16_16_16 &&
num_format == AmdGpu::NumberFormat::Float) {
return vk::Format::eR16G16B16A16Sfloat;
}
if (data_format == AmdGpu::DataFormat::Format32 && num_format == AmdGpu::NumberFormat::Uint) {
return vk::Format::eR32Uint;
}
if (data_format == AmdGpu::DataFormat::Format32 && num_format == AmdGpu::NumberFormat::Sint) {
return vk::Format::eR32Sint;
}
if (data_format == AmdGpu::DataFormat::Format8_8 && num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eR8G8Unorm;
}
if (data_format == AmdGpu::DataFormat::Format8_8 && num_format == AmdGpu::NumberFormat::Uint) {
return vk::Format::eR8G8Uint;
}
if (data_format == AmdGpu::DataFormat::Format8_8 && num_format == AmdGpu::NumberFormat::Snorm) {
return vk::Format::eR8G8Snorm;
}
if (data_format == AmdGpu::DataFormat::FormatBc7 && num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eBc7UnormBlock;
}
if (data_format == AmdGpu::DataFormat::FormatBc2 && num_format == AmdGpu::NumberFormat::Srgb) {
return vk::Format::eBc2SrgbBlock;
}
if (data_format == AmdGpu::DataFormat::FormatBc2 && num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eBc2UnormBlock;
}
if (data_format == AmdGpu::DataFormat::Format16_16 &&
num_format == AmdGpu::NumberFormat::Snorm) {
return vk::Format::eR16G16Snorm;
}
if (data_format == AmdGpu::DataFormat::Format10_11_11 &&
num_format == AmdGpu::NumberFormat::Float) {
return vk::Format::eB10G11R11UfloatPack32;
}
if (data_format == AmdGpu::DataFormat::Format16_16 &&
num_format == AmdGpu::NumberFormat::Float) {
return vk::Format::eR16G16Sfloat;
}
if (data_format == AmdGpu::DataFormat::Format16_16_16_16 &&
num_format == AmdGpu::NumberFormat::Snorm) {
return vk::Format::eR16G16B16A16Snorm;
}
if (data_format == AmdGpu::DataFormat::Format32_32 &&
num_format == AmdGpu::NumberFormat::Uint) {
return vk::Format::eR32G32Uint;
}
if (data_format == AmdGpu::DataFormat::Format4_4_4_4 &&
num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eR4G4B4A4UnormPack16;
}
if (data_format == AmdGpu::DataFormat::Format16_16_16_16 &&
num_format == AmdGpu::NumberFormat::Uint) {
return vk::Format::eR16G16B16A16Uint;
}
if (data_format == AmdGpu::DataFormat::Format32_32_32_32 &&
num_format == AmdGpu::NumberFormat::Uint) {
return vk::Format::eR32G32B32A32Uint;
}
if (data_format == AmdGpu::DataFormat::Format32_32_32_32 &&
num_format == AmdGpu::NumberFormat::Sint) {
return vk::Format::eR32G32B32A32Sint;
}
if (data_format == AmdGpu::DataFormat::Format8 && num_format == AmdGpu::NumberFormat::Sint) {
return vk::Format::eR8Sint;
}
if (data_format == AmdGpu::DataFormat::FormatBc1 && num_format == AmdGpu::NumberFormat::Srgb) {
return vk::Format::eBc1RgbaSrgbBlock;
}
if (data_format == AmdGpu::DataFormat::Format16_16 &&
num_format == AmdGpu::NumberFormat::Sint) {
return vk::Format::eR16G16Sint;
}
if (data_format == AmdGpu::DataFormat::Format16_16 &&
num_format == AmdGpu::NumberFormat::Sscaled) {
return vk::Format::eR16G16Sscaled;
}
if (data_format == AmdGpu::DataFormat::Format8_8_8_8 &&
num_format == AmdGpu::NumberFormat::Uscaled) {
return vk::Format::eR8G8B8A8Uscaled;
}
if (data_format == AmdGpu::DataFormat::Format16 && num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eR16Unorm;
}
if (data_format == AmdGpu::DataFormat::Format16_16_16_16 &&
num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eR16G16B16A16Unorm;
}
if (data_format == AmdGpu::DataFormat::Format16_16 &&
num_format == AmdGpu::NumberFormat::Uint) {
return vk::Format::eR16G16Uint;
}
if (data_format == AmdGpu::DataFormat::Format8 && num_format == AmdGpu::NumberFormat::Uint) {
return vk::Format::eR8Uint;
}
if (data_format == AmdGpu::DataFormat::Format16_16_16_16 &&
num_format == AmdGpu::NumberFormat::SnormNz) {
return vk::Format::eR16G16B16A16Snorm;
}
if (data_format == AmdGpu::DataFormat::Format8_8_8_8 &&
num_format == AmdGpu::NumberFormat::Snorm) {
return vk::Format::eR8G8B8A8Snorm;
}
if (data_format == AmdGpu::DataFormat::FormatBc6 && num_format == AmdGpu::NumberFormat::Unorm) {
return vk::Format::eBc6HUfloatBlock;
}
if (data_format == AmdGpu::DataFormat::FormatBc6 && num_format == AmdGpu::NumberFormat::Snorm) {
return vk::Format::eBc6HSfloatBlock;
}
if (data_format == AmdGpu::DataFormat::Format8_8_8_8 &&
num_format == AmdGpu::NumberFormat::Sint) {
return vk::Format::eR8G8B8A8Sint;
}
if (data_format == AmdGpu::DataFormat::Format8 && num_format == AmdGpu::NumberFormat::Srgb) {
return vk::Format::eR8Srgb;
}
if (data_format == AmdGpu::DataFormat::Format11_11_10 &&
num_format == AmdGpu::NumberFormat::Float) {
return vk::Format::eB10G11R11UfloatPack32;
}
if (data_format == AmdGpu::DataFormat::Format16 && num_format == AmdGpu::NumberFormat::Uint) {
return vk::Format::eR16Uint;
}
if (data_format == AmdGpu::DataFormat::Format5_9_9_9 &&
num_format == AmdGpu::NumberFormat::Float) {
return vk::Format::eE5B9G9R9UfloatPack32;
}
if (data_format == AmdGpu::DataFormat::Format8 && num_format == AmdGpu::NumberFormat::Snorm) {
return vk::Format::eR8Snorm;
}
UNREACHABLE_MSG("Unknown data_format={} and num_format={}", u32(data_format), u32(num_format));
const auto& formats = SurfaceFormats();
const auto format =
std::find_if(formats.begin(), formats.end(), [&](const SurfaceFormatInfo& format_info) {
return format_info.data_format == data_format &&
format_info.number_format == num_format;
});
ASSERT_MSG(format != formats.end(), "Unknown data_format={} and num_format={}",
static_cast<u32>(data_format), static_cast<u32>(num_format));
return format->vk_format;
}
vk::Format AdjustColorBufferFormat(vk::Format base_format,
@ -636,30 +670,45 @@ vk::Format AdjustColorBufferFormat(vk::Format base_format,
return base_format;
}
vk::Format DepthFormat(DepthBuffer::ZFormat z_format, DepthBuffer::StencilFormat stencil_format) {
static constexpr DepthFormatInfo CreateDepthFormatInfo(
const DepthBuffer::ZFormat z_format, const DepthBuffer::StencilFormat stencil_format,
const vk::Format vk_format) {
return {
.z_format = z_format,
.stencil_format = stencil_format,
.vk_format = vk_format,
.flags = vk::FormatFeatureFlagBits2::eDepthStencilAttachment,
};
}
std::span<const DepthFormatInfo> DepthFormats() {
using ZFormat = DepthBuffer::ZFormat;
using StencilFormat = DepthBuffer::StencilFormat;
static constexpr std::array formats{
// Invalid
CreateDepthFormatInfo(ZFormat::Invalid, StencilFormat::Invalid, vk::Format::eUndefined),
CreateDepthFormatInfo(ZFormat::Invalid, StencilFormat::Stencil8,
vk::Format::eD32SfloatS8Uint),
// 16
CreateDepthFormatInfo(ZFormat::Z16, StencilFormat::Invalid, vk::Format::eD16Unorm),
CreateDepthFormatInfo(ZFormat::Z16, StencilFormat::Stencil8, vk::Format::eD16UnormS8Uint),
// 32_Float
CreateDepthFormatInfo(ZFormat::Z32Float, StencilFormat::Invalid, vk::Format::eD32Sfloat),
CreateDepthFormatInfo(ZFormat::Z32Float, StencilFormat::Stencil8,
vk::Format::eD32SfloatS8Uint),
};
return formats;
}
if (z_format == ZFormat::Z32Float && stencil_format == StencilFormat::Stencil8) {
return vk::Format::eD32SfloatS8Uint;
}
if (z_format == ZFormat::Z32Float && stencil_format == StencilFormat::Invalid) {
return vk::Format::eD32Sfloat;
}
if (z_format == ZFormat::Z16 && stencil_format == StencilFormat::Invalid) {
return vk::Format::eD16Unorm;
}
if (z_format == ZFormat::Z16 && stencil_format == StencilFormat::Stencil8) {
return vk::Format::eD16UnormS8Uint;
}
if (z_format == ZFormat::Invalid && stencil_format == StencilFormat::Stencil8) {
return vk::Format::eD32SfloatS8Uint;
}
if (z_format == ZFormat::Invalid && stencil_format == StencilFormat::Invalid) {
return vk::Format::eUndefined;
}
UNREACHABLE_MSG("Unsupported depth/stencil format. depth = {} stencil = {}",
magic_enum::enum_name(z_format), magic_enum::enum_name(stencil_format));
vk::Format DepthFormat(DepthBuffer::ZFormat z_format, DepthBuffer::StencilFormat stencil_format) {
const auto& formats = DepthFormats();
const auto format =
std::find_if(formats.begin(), formats.end(), [&](const DepthFormatInfo& format_info) {
return format_info.z_format == z_format && format_info.stencil_format == stencil_format;
});
ASSERT_MSG(format != formats.end(), "Unknown z_format={} and stencil_format={}",
static_cast<u32>(z_format), static_cast<u32>(stencil_format));
return format->vk_format;
}
void EmitQuadToTriangleListIndices(u8* out_ptr, u32 num_vertices) {

View File

@ -40,13 +40,27 @@ vk::SamplerMipmapMode MipFilter(AmdGpu::MipFilter filter);
vk::BorderColor BorderColor(AmdGpu::BorderColor color);
std::span<const vk::Format> GetAllFormats();
struct SurfaceFormatInfo {
AmdGpu::DataFormat data_format;
AmdGpu::NumberFormat number_format;
vk::Format vk_format;
vk::FormatFeatureFlags2 flags;
};
std::span<const SurfaceFormatInfo> SurfaceFormats();
vk::Format SurfaceFormat(AmdGpu::DataFormat data_format, AmdGpu::NumberFormat num_format);
vk::Format AdjustColorBufferFormat(vk::Format base_format,
Liverpool::ColorBuffer::SwapMode comp_swap, bool is_vo_surface);
struct DepthFormatInfo {
Liverpool::DepthBuffer::ZFormat z_format;
Liverpool::DepthBuffer::StencilFormat stencil_format;
vk::Format vk_format;
vk::FormatFeatureFlags2 flags;
};
std::span<const DepthFormatInfo> DepthFormats();
vk::Format DepthFormat(Liverpool::DepthBuffer::ZFormat z_format,
Liverpool::DepthBuffer::StencilFormat stencil_format);

View File

@ -12,10 +12,7 @@
#include "video_core/renderer_vulkan/vk_rasterizer.h"
#include "video_core/texture_cache/image.h"
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wnullability-completeness"
#include <vk_mem_alloc.h>
#pragma GCC diagnostic pop
namespace Vulkan {
@ -33,8 +30,8 @@ bool CanBlitToSwapchain(const vk::PhysicalDevice physical_device, vk::Format for
};
}
[[nodiscard]] vk::ImageBlit MakeImageBlit(s32 frame_width, s32 frame_height, s32 swapchain_width,
s32 swapchain_height) {
[[nodiscard]] vk::ImageBlit MakeImageBlit(s32 frame_width, s32 frame_height, s32 dst_width,
s32 dst_height, s32 offset_x, s32 offset_y) {
return vk::ImageBlit{
.srcSubresource = MakeImageSubresourceLayers(),
.srcOffsets =
@ -54,19 +51,44 @@ bool CanBlitToSwapchain(const vk::PhysicalDevice physical_device, vk::Format for
.dstOffsets =
std::array{
vk::Offset3D{
.x = 0,
.y = 0,
.x = offset_x,
.y = offset_y,
.z = 0,
},
vk::Offset3D{
.x = swapchain_width,
.y = swapchain_height,
.x = offset_x + dst_width,
.y = offset_y + dst_height,
.z = 1,
},
},
};
}
[[nodiscard]] vk::ImageBlit MakeImageBlitStretch(s32 frame_width, s32 frame_height,
s32 swapchain_width, s32 swapchain_height) {
return MakeImageBlit(frame_width, frame_height, swapchain_width, swapchain_height, 0, 0);
}
[[nodiscard]] vk::ImageBlit MakeImageBlitFit(s32 frame_width, s32 frame_height, s32 swapchain_width,
s32 swapchain_height) {
float frame_aspect = static_cast<float>(frame_width) / frame_height;
float swapchain_aspect = static_cast<float>(swapchain_width) / swapchain_height;
s32 dst_width = swapchain_width;
s32 dst_height = swapchain_height;
if (frame_aspect > swapchain_aspect) {
dst_height = static_cast<s32>(swapchain_width / frame_aspect);
} else {
dst_width = static_cast<s32>(swapchain_height * frame_aspect);
}
s32 offset_x = (swapchain_width - dst_width) / 2;
s32 offset_y = (swapchain_height - dst_height) / 2;
return MakeImageBlit(frame_width, frame_height, dst_width, dst_height, offset_x, offset_y);
}
RendererVulkan::RendererVulkan(Frontend::WindowSDL& window_, AmdGpu::Liverpool* liverpool_)
: window{window_}, liverpool{liverpool_},
instance{window, Config::getGpuId(), Config::vkValidationEnabled(),
@ -82,7 +104,11 @@ RendererVulkan::RendererVulkan(Frontend::WindowSDL& window_, AmdGpu::Liverpool*
present_frames.resize(num_images);
for (u32 i = 0; i < num_images; i++) {
Frame& frame = present_frames[i];
frame.present_done = device.createFence({.flags = vk::FenceCreateFlagBits::eSignaled});
auto [fence_result, fence] =
device.createFence({.flags = vk::FenceCreateFlagBits::eSignaled});
ASSERT_MSG(fence_result == vk::Result::eSuccess, "Failed to create present done fence: {}",
vk::to_string(fence_result));
frame.present_done = fence;
free_queue.push(&frame);
}
@ -157,7 +183,10 @@ void RendererVulkan::RecreateFrame(Frame* frame, u32 width, u32 height) {
.layerCount = 1,
},
};
frame->image_view = device.createImageView(view_info);
auto [view_result, view] = device.createImageView(view_info);
ASSERT_MSG(view_result == vk::Result::eSuccess, "Failed to create frame image view: {}",
vk::to_string(view_result));
frame->image_view = view;
frame->width = width;
frame->height = height;
}
@ -205,6 +234,13 @@ Frame* RendererVulkan::PrepareFrameInternal(VideoCore::Image& image, bool is_eop
image.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead, {},
cmdbuf);
const auto frame_subresources = vk::ImageSubresourceRange{
.aspectMask = vk::ImageAspectFlagBits::eColor,
.baseMipLevel = 0,
.levelCount = 1,
.baseArrayLayer = 0,
.layerCount = VK_REMAINING_ARRAY_LAYERS,
};
const std::array pre_barrier{
vk::ImageMemoryBarrier{
.srcAccessMask = vk::AccessFlagBits::eTransferRead,
@ -214,23 +250,38 @@ Frame* RendererVulkan::PrepareFrameInternal(VideoCore::Image& image, bool is_eop
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = frame->image,
.subresourceRange{
.aspectMask = vk::ImageAspectFlagBits::eColor,
.baseMipLevel = 0,
.levelCount = 1,
.baseArrayLayer = 0,
.layerCount = VK_REMAINING_ARRAY_LAYERS,
},
.subresourceRange{frame_subresources},
},
};
cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer,
vk::PipelineStageFlagBits::eTransfer, vk::DependencyFlagBits::eByRegion,
{}, {}, pre_barrier);
// Clear the frame image before blitting to avoid artifacts.
const vk::ClearColorValue clear_color{std::array{0.0f, 0.0f, 0.0f, 1.0f}};
cmdbuf.clearColorImage(frame->image, vk::ImageLayout::eTransferDstOptimal, clear_color,
frame_subresources);
const auto blitBarrier =
vk::ImageMemoryBarrier2{.srcStageMask = vk::PipelineStageFlagBits2::eTransfer,
.srcAccessMask = vk::AccessFlagBits2::eTransferWrite,
.dstStageMask = vk::PipelineStageFlagBits2::eTransfer,
.dstAccessMask = vk::AccessFlagBits2::eTransferWrite,
.oldLayout = vk::ImageLayout::eTransferDstOptimal,
.newLayout = vk::ImageLayout::eTransferDstOptimal,
.image = frame->image,
.subresourceRange{frame_subresources}};
cmdbuf.pipelineBarrier2(vk::DependencyInfo{
.imageMemoryBarrierCount = 1,
.pImageMemoryBarriers = &blitBarrier,
});
// Post-processing (Anti-aliasing, FSR etc) goes here. For now just blit to the frame image.
cmdbuf.blitImage(
image.image, image.last_state.layout, frame->image, vk::ImageLayout::eTransferDstOptimal,
MakeImageBlit(image.info.size.width, image.info.size.height, frame->width, frame->height),
cmdbuf.blitImage(image.image, image.last_state.layout, frame->image,
vk::ImageLayout::eTransferDstOptimal,
MakeImageBlitFit(image.info.size.width, image.info.size.height, frame->width,
frame->height),
vk::Filter::eLinear);
const vk::ImageMemoryBarrier post_barrier{
@ -241,13 +292,7 @@ Frame* RendererVulkan::PrepareFrameInternal(VideoCore::Image& image, bool is_eop
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = frame->image,
.subresourceRange{
.aspectMask = vk::ImageAspectFlagBits::eColor,
.baseMipLevel = 0,
.levelCount = 1,
.baseArrayLayer = 0,
.layerCount = VK_REMAINING_ARRAY_LAYERS,
},
.subresourceRange{frame_subresources},
};
cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eAllCommands,
vk::PipelineStageFlagBits::eAllCommands,
@ -262,6 +307,12 @@ Frame* RendererVulkan::PrepareFrameInternal(VideoCore::Image& image, bool is_eop
}
void RendererVulkan::Present(Frame* frame) {
// Recreate the swapchain if the window was resized.
if (window.getWidth() != swapchain.GetExtent().width ||
window.getHeight() != swapchain.GetExtent().height) {
swapchain.Recreate(window.getWidth(), window.getHeight());
}
ImGui::Core::NewFrame();
swapchain.AcquireNextImage();
@ -334,9 +385,10 @@ void RendererVulkan::Present(Frame* frame) {
vk::PipelineStageFlagBits::eTransfer,
vk::DependencyFlagBits::eByRegion, {}, {}, pre_barriers);
cmdbuf.blitImage(frame->image, vk::ImageLayout::eTransferSrcOptimal, swapchain_image,
cmdbuf.blitImage(
frame->image, vk::ImageLayout::eTransferSrcOptimal, swapchain_image,
vk::ImageLayout::eTransferDstOptimal,
MakeImageBlit(frame->width, frame->height, extent.width, extent.height),
MakeImageBlitStretch(frame->width, frame->height, extent.width, extent.height),
vk::Filter::eLinear);
cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eAllCommands,

View File

@ -5,10 +5,10 @@
// Implement vma functions
#define VMA_IMPLEMENTATION
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wnullability-completeness"
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnullability-completeness"
#include <vk_mem_alloc.h>
#pragma GCC diagnostic pop
#pragma clang diagnostic pop
// Store the dispatch loader here
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE

View File

@ -14,6 +14,9 @@
#define VULKAN_HPP_NO_CONSTRUCTORS
#define VULKAN_HPP_NO_STRUCT_SETTERS
#define VULKAN_HPP_HAS_SPACESHIP_OPERATOR
#define VULKAN_HPP_NO_EXCEPTIONS
// Define assert-on-result to nothing to instead return the result for our handling.
#define VULKAN_HPP_ASSERT_ON_RESULT
#include <vulkan/vulkan.hpp>
#define VMA_STATIC_VULKAN_FUNCTIONS 0

View File

@ -78,7 +78,12 @@ ComputePipeline::ComputePipeline(const Instance& instance_, Scheduler& scheduler
.bindingCount = static_cast<u32>(bindings.size()),
.pBindings = bindings.data(),
};
desc_layout = instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci);
auto [descriptor_set_result, descriptor_set] =
instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci);
ASSERT_MSG(descriptor_set_result == vk::Result::eSuccess,
"Failed to create compute descriptor set layout: {}",
vk::to_string(descriptor_set_result));
desc_layout = std::move(descriptor_set);
const vk::DescriptorSetLayout set_layout = *desc_layout;
const vk::PipelineLayoutCreateInfo layout_info = {
@ -87,19 +92,20 @@ ComputePipeline::ComputePipeline(const Instance& instance_, Scheduler& scheduler
.pushConstantRangeCount = 1U,
.pPushConstantRanges = &push_constants,
};
pipeline_layout = instance.GetDevice().createPipelineLayoutUnique(layout_info);
auto [layout_result, layout] = instance.GetDevice().createPipelineLayoutUnique(layout_info);
ASSERT_MSG(layout_result == vk::Result::eSuccess,
"Failed to create compute pipeline layout: {}", vk::to_string(layout_result));
pipeline_layout = std::move(layout);
const vk::ComputePipelineCreateInfo compute_pipeline_ci = {
.stage = shader_ci,
.layout = *pipeline_layout,
};
auto result =
auto [pipeline_result, pipe] =
instance.GetDevice().createComputePipelineUnique(pipeline_cache, compute_pipeline_ci);
if (result.result == vk::Result::eSuccess) {
pipeline = std::move(result.value);
} else {
UNREACHABLE_MSG("Graphics pipeline creation failed!");
}
ASSERT_MSG(pipeline_result == vk::Result::eSuccess, "Failed to create compute pipeline: {}",
vk::to_string(pipeline_result));
pipeline = std::move(pipe);
}
ComputePipeline::~ComputePipeline() = default;

View File

@ -39,7 +39,10 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul
.pushConstantRangeCount = 1,
.pPushConstantRanges = &push_constants,
};
pipeline_layout = instance.GetDevice().createPipelineLayoutUnique(layout_info);
auto [layout_result, layout] = instance.GetDevice().createPipelineLayoutUnique(layout_info);
ASSERT_MSG(layout_result == vk::Result::eSuccess,
"Failed to create graphics pipeline layout: {}", vk::to_string(layout_result));
pipeline_layout = std::move(layout);
boost::container::static_vector<vk::VertexInputBindingDescription, 32> vertex_bindings;
boost::container::static_vector<vk::VertexInputAttributeDescription, 32> vertex_attributes;
@ -281,12 +284,11 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul
.layout = *pipeline_layout,
};
auto result = device.createGraphicsPipelineUnique(pipeline_cache, pipeline_info);
if (result.result == vk::Result::eSuccess) {
pipeline = std::move(result.value);
} else {
UNREACHABLE_MSG("Graphics pipeline creation failed!");
}
auto [pipeline_result, pipe] =
device.createGraphicsPipelineUnique(pipeline_cache, pipeline_info);
ASSERT_MSG(pipeline_result == vk::Result::eSuccess, "Failed to create graphics pipeline: {}",
vk::to_string(pipeline_result));
pipeline = std::move(pipe);
}
GraphicsPipeline::~GraphicsPipeline() = default;
@ -345,7 +347,11 @@ void GraphicsPipeline::BuildDescSetLayout() {
.bindingCount = static_cast<u32>(bindings.size()),
.pBindings = bindings.data(),
};
desc_layout = instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci);
auto [layout_result, layout] =
instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci);
ASSERT_MSG(layout_result == vk::Result::eSuccess,
"Failed to create graphics descriptor set layout: {}", vk::to_string(layout_result));
desc_layout = std::move(layout);
}
void GraphicsPipeline::BindResources(const Liverpool::Regs& regs,

View File

@ -14,17 +14,26 @@
#include "video_core/renderer_vulkan/vk_instance.h"
#include "video_core/renderer_vulkan/vk_platform.h"
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wnullability-completeness"
#include <vk_mem_alloc.h>
#pragma GCC diagnostic pop
namespace Vulkan {
namespace {
std::vector<vk::PhysicalDevice> EnumeratePhysicalDevices(vk::UniqueInstance& instance) {
auto [devices_result, devices] = instance->enumeratePhysicalDevices();
ASSERT_MSG(devices_result == vk::Result::eSuccess, "Failed to enumerate physical devices: {}",
vk::to_string(devices_result));
return std::move(devices);
}
std::vector<std::string> GetSupportedExtensions(vk::PhysicalDevice physical) {
const std::vector extensions = physical.enumerateDeviceExtensionProperties();
const auto [extensions_result, extensions] = physical.enumerateDeviceExtensionProperties();
if (extensions_result != vk::Result::eSuccess) {
LOG_ERROR(Render_Vulkan, "Could not query supported extensions: {}",
vk::to_string(extensions_result));
return {};
}
std::vector<std::string> supported_extensions;
supported_extensions.reserve(extensions.size());
for (const auto& extension : extensions) {
@ -33,16 +42,41 @@ std::vector<std::string> GetSupportedExtensions(vk::PhysicalDevice physical) {
return supported_extensions;
}
std::unordered_map<vk::Format, vk::FormatProperties3> GetFormatProperties(
vk::PhysicalDevice physical) {
std::unordered_map<vk::Format, vk::FormatProperties3> format_properties;
for (const auto& format : LiverpoolToVK::GetAllFormats()) {
vk::FormatProperties3 GetFormatProperties(vk::PhysicalDevice physical, vk::Format format) {
vk::FormatProperties3 properties3{};
vk::FormatProperties2 properties2 = {
.pNext = &properties3,
};
physical.getFormatProperties2(format, &properties2);
format_properties.emplace(format, properties3);
return properties3;
}
std::unordered_map<vk::Format, vk::FormatProperties3> GetFormatProperties(
vk::PhysicalDevice physical) {
std::unordered_map<vk::Format, vk::FormatProperties3> format_properties;
for (const auto& format_info : LiverpoolToVK::SurfaceFormats()) {
const auto format = format_info.vk_format;
if (!format_properties.contains(format)) {
format_properties.emplace(format, GetFormatProperties(physical, format));
}
}
for (const auto& format_info : LiverpoolToVK::DepthFormats()) {
const auto format = format_info.vk_format;
if (!format_properties.contains(format)) {
format_properties.emplace(format, GetFormatProperties(physical, format));
}
}
// Other miscellaneous formats, e.g. for color buffers, swizzles, or compatibility
static constexpr std::array misc_formats = {
vk::Format::eA2R10G10B10UnormPack32, vk::Format::eA8B8G8R8UnormPack32,
vk::Format::eA8B8G8R8SrgbPack32, vk::Format::eB8G8R8A8Unorm,
vk::Format::eB8G8R8A8Srgb, vk::Format::eR5G6B5UnormPack16,
vk::Format::eD24UnormS8Uint,
};
for (const auto& format : misc_formats) {
if (!format_properties.contains(format)) {
format_properties.emplace(format, GetFormatProperties(physical, format));
}
}
return format_properties;
}
@ -57,13 +91,13 @@ std::string GetReadableVersion(u32 version) {
Instance::Instance(bool enable_validation, bool enable_crash_diagnostic)
: instance{CreateInstance(Frontend::WindowSystemType::Headless, enable_validation,
enable_crash_diagnostic)},
physical_devices{instance->enumeratePhysicalDevices()} {}
physical_devices{EnumeratePhysicalDevices(instance)} {}
Instance::Instance(Frontend::WindowSDL& window, s32 physical_device_index,
bool enable_validation /*= false*/, bool enable_crash_diagnostic /*= false*/)
: instance{CreateInstance(window.getWindowInfo().type, enable_validation,
enable_crash_diagnostic)},
physical_devices{instance->enumeratePhysicalDevices()} {
physical_devices{EnumeratePhysicalDevices(instance)} {
if (enable_validation) {
debug_callback = CreateDebugCallback(*instance);
}
@ -125,23 +159,24 @@ Instance::Instance(Frontend::WindowSDL& window, s32 physical_device_index,
CollectToolingInfo();
// Check and log format support details.
for (const auto& key : format_properties | std::views::keys) {
const auto format = key;
if (!IsImageFormatSupported(format)) {
const auto alternative = GetAlternativeFormat(format);
if (IsImageFormatSupported(alternative)) {
for (const auto& format : LiverpoolToVK::SurfaceFormats()) {
if (!IsFormatSupported(GetSupportedFormat(format.vk_format, format.flags), format.flags)) {
LOG_WARNING(Render_Vulkan,
"Format {} is not supported for images, falling back to {}.",
vk::to_string(format), vk::to_string(alternative));
} else if (IsVertexFormatSupported(format)) {
LOG_WARNING(Render_Vulkan, "Format {} is only supported for vertex buffers.",
vk::to_string(format));
} else {
LOG_ERROR(Render_Vulkan,
"Format {} is not supported and no suitable alternative is supported.",
vk::to_string(format));
"Surface format data_format={}, number_format={} is not fully supported "
"(vk_format={}, requested flags={})",
static_cast<u32>(format.data_format),
static_cast<u32>(format.number_format), vk::to_string(format.vk_format),
vk::to_string(format.flags));
}
}
for (const auto& format : LiverpoolToVK::DepthFormats()) {
if (!IsFormatSupported(GetSupportedFormat(format.vk_format, format.flags), format.flags)) {
LOG_WARNING(Render_Vulkan,
"Depth format z_format={}, stencil_format={} is not fully supported "
"(vk_format={}, requested flags={})",
static_cast<u32>(format.z_format), static_cast<u32>(format.stencil_format),
vk::to_string(format.vk_format), vk::to_string(format.flags));
}
}
}
@ -395,15 +430,12 @@ bool Instance::CreateDevice() {
device_chain.unlink<vk::PhysicalDeviceVertexInputDynamicStateFeaturesEXT>();
}
try {
device = physical_device.createDeviceUnique(device_chain.get());
} catch (vk::ExtensionNotPresentError& err) {
LOG_CRITICAL(Render_Vulkan, "Some required extensions are not available {}", err.what());
return false;
} catch (vk::FeatureNotPresentError& err) {
LOG_CRITICAL(Render_Vulkan, "Some required features are not available {}", err.what());
auto [device_result, dev] = physical_device.createDeviceUnique(device_chain.get());
if (device_result != vk::Result::eSuccess) {
LOG_CRITICAL(Render_Vulkan, "Failed to create device: {}", vk::to_string(device_result));
return false;
}
device = std::move(dev);
VULKAN_HPP_DEFAULT_DISPATCHER.init(*device);
@ -411,7 +443,9 @@ bool Instance::CreateDevice() {
present_queue = device->getQueue(queue_family_index, 0);
if (calibrated_timestamps) {
const auto& time_domains = physical_device.getCalibrateableTimeDomainsEXT();
const auto [time_domains_result, time_domains] =
physical_device.getCalibrateableTimeDomainsEXT();
if (time_domains_result == vk::Result::eSuccess) {
#if _WIN64
const bool has_host_time_domain =
std::find(time_domains.cbegin(), time_domains.cend(),
@ -427,12 +461,16 @@ bool Instance::CreateDevice() {
#endif
if (has_host_time_domain) {
static constexpr std::string_view context_name{"vk_rasterizer"};
profiler_context =
TracyVkContextHostCalibrated(*instance, physical_device, *device,
profiler_context = TracyVkContextHostCalibrated(
*instance, physical_device, *device,
VULKAN_HPP_DEFAULT_DISPATCHER.vkGetInstanceProcAddr,
VULKAN_HPP_DEFAULT_DISPATCHER.vkGetDeviceProcAddr);
TracyVkContextName(profiler_context, context_name.data(), context_name.size());
}
} else {
LOG_WARNING(Render_Vulkan, "Could not query calibrated time domains for profiling: {}",
vk::to_string(time_domains_result));
}
}
CreateAllocator();
@ -487,7 +525,12 @@ void Instance::CollectToolingInfo() {
if (!tooling_info) {
return;
}
const auto tools = physical_device.getToolPropertiesEXT();
const auto [tools_result, tools] = physical_device.getToolPropertiesEXT();
if (tools_result != vk::Result::eSuccess) {
LOG_ERROR(Render_Vulkan, "Could not get Vulkan tool properties: {}",
vk::to_string(tools_result));
return;
}
for (const vk::PhysicalDeviceToolProperties& tool : tools) {
const std::string_view name = tool.name;
LOG_INFO(Render_Vulkan, "Attached debugging tool: {}", name);
@ -496,7 +539,8 @@ void Instance::CollectToolingInfo() {
}
}
bool Instance::IsImageFormatSupported(const vk::Format format) const {
bool Instance::IsFormatSupported(const vk::Format format,
const vk::FormatFeatureFlags2 flags) const {
if (format == vk::Format::eUndefined) [[unlikely]] {
return true;
}
@ -506,49 +550,36 @@ bool Instance::IsImageFormatSupported(const vk::Format format) const {
UNIMPLEMENTED_MSG("Properties of format {} have not been queried.", vk::to_string(format));
}
constexpr vk::FormatFeatureFlags2 optimal_flags = vk::FormatFeatureFlagBits2::eTransferSrc |
vk::FormatFeatureFlagBits2::eTransferDst |
vk::FormatFeatureFlagBits2::eSampledImage;
return (it->second.optimalTilingFeatures & optimal_flags) == optimal_flags;
return ((it->second.optimalTilingFeatures | it->second.bufferFeatures) & flags) == flags;
}
bool Instance::IsVertexFormatSupported(const vk::Format format) const {
if (format == vk::Format::eUndefined) [[unlikely]] {
return true;
}
const auto it = format_properties.find(format);
if (it == format_properties.end()) {
UNIMPLEMENTED_MSG("Properties of format {} have not been queried.", vk::to_string(format));
}
constexpr vk::FormatFeatureFlags2 optimal_flags = vk::FormatFeatureFlagBits2::eVertexBuffer;
return (it->second.bufferFeatures & optimal_flags) == optimal_flags;
}
vk::Format Instance::GetAlternativeFormat(const vk::Format format) const {
if (format == vk::Format::eB5G6R5UnormPack16) {
static vk::Format GetAlternativeFormat(const vk::Format format) {
switch (format) {
case vk::Format::eB5G6R5UnormPack16:
return vk::Format::eR5G6B5UnormPack16;
} else if (format == vk::Format::eD16UnormS8Uint) {
case vk::Format::eD16UnormS8Uint:
return vk::Format::eD24UnormS8Uint;
}
default:
return format;
}
}
vk::Format Instance::GetSupportedFormat(const vk::Format format) const {
if (IsImageFormatSupported(format)) [[likely]] {
vk::Format Instance::GetSupportedFormat(const vk::Format format,
const vk::FormatFeatureFlags2 flags) const {
if (IsFormatSupported(format, flags)) [[likely]] {
return format;
}
const vk::Format alternative = GetAlternativeFormat(format);
if (IsImageFormatSupported(alternative)) [[likely]] {
if (IsFormatSupported(alternative, flags)) [[likely]] {
return alternative;
}
return format;
}
vk::ComponentMapping Instance::GetSupportedComponentSwizzle(vk::Format format,
vk::ComponentMapping swizzle) const {
if (IsImageFormatSupported(format)) [[likely]] {
vk::ComponentMapping Instance::GetSupportedComponentSwizzle(
const vk::Format format, const vk::ComponentMapping swizzle,
const vk::FormatFeatureFlags2 flags) const {
if (IsFormatSupported(format, flags)) [[likely]] {
return swizzle;
}

View File

@ -30,11 +30,12 @@ public:
std::string GetDriverVersionName();
/// Gets a compatibility format if the format is not supported.
[[nodiscard]] vk::Format GetSupportedFormat(vk::Format format) const;
[[nodiscard]] vk::Format GetSupportedFormat(vk::Format format,
vk::FormatFeatureFlags2 flags) const;
/// Re-orders a component swizzle for format compatibility, if needed.
[[nodiscard]] vk::ComponentMapping GetSupportedComponentSwizzle(
vk::Format format, vk::ComponentMapping swizzle) const;
vk::Format format, vk::ComponentMapping swizzle, vk::FormatFeatureFlags2 flags) const;
/// Returns the Vulkan instance
vk::Instance GetInstance() const {
@ -245,14 +246,8 @@ private:
void CollectDeviceParameters();
void CollectToolingInfo();
/// Determines if a format is supported for images.
[[nodiscard]] bool IsImageFormatSupported(vk::Format format) const;
/// Determines if a format is supported for vertex buffers.
[[nodiscard]] bool IsVertexFormatSupported(vk::Format format) const;
/// Gets a commonly available alternative for an unsupported pixel format.
vk::Format GetAlternativeFormat(const vk::Format format) const;
/// Determines if a format is supported for a set of feature flags.
[[nodiscard]] bool IsFormatSupported(vk::Format format, vk::FormatFeatureFlags2 flags) const;
private:
vk::UniqueInstance instance;

View File

@ -5,6 +5,8 @@
#include "video_core/renderer_vulkan/vk_instance.h"
#include "video_core/renderer_vulkan/vk_master_semaphore.h"
#include "common/assert.h"
namespace Vulkan {
constexpr u64 WAIT_TIMEOUT = std::numeric_limits<u64>::max();
@ -17,7 +19,11 @@ MasterSemaphore::MasterSemaphore(const Instance& instance_) : instance{instance_
.initialValue = 0,
},
};
semaphore = instance.GetDevice().createSemaphoreUnique(semaphore_chain.get());
auto [semaphore_result, sem] =
instance.GetDevice().createSemaphoreUnique(semaphore_chain.get());
ASSERT_MSG(semaphore_result == vk::Result::eSuccess, "Failed to create master semaphore: {}",
vk::to_string(semaphore_result));
semaphore = std::move(sem);
}
MasterSemaphore::~MasterSemaphore() = default;
@ -27,7 +33,10 @@ void MasterSemaphore::Refresh() {
u64 counter{};
do {
this_tick = gpu_tick.load(std::memory_order_acquire);
counter = instance.GetDevice().getSemaphoreCounterValue(*semaphore);
auto [counter_result, cntr] = instance.GetDevice().getSemaphoreCounterValue(*semaphore);
ASSERT_MSG(counter_result == vk::Result::eSuccess,
"Failed to get master semaphore value: {}", vk::to_string(counter_result));
counter = cntr;
if (counter < this_tick) {
return;
}

View File

@ -136,7 +136,10 @@ PipelineCache::PipelineCache(const Instance& instance_, Scheduler& scheduler_,
.subgroup_size = instance.SubgroupSize(),
.support_explicit_workgroup_layout = true,
};
pipeline_cache = instance.GetDevice().createPipelineCacheUnique({});
auto [cache_result, cache] = instance.GetDevice().createPipelineCacheUnique({});
ASSERT_MSG(cache_result == vk::Result::eSuccess, "Failed to create pipeline cache: {}",
vk::to_string(cache_result));
pipeline_cache = std::move(cache);
}
PipelineCache::~PipelineCache() = default;

View File

@ -134,9 +134,10 @@ vk::SurfaceKHR CreateSurface(vk::Instance instance, const Frontend::WindowSDL& e
std::vector<const char*> GetInstanceExtensions(Frontend::WindowSystemType window_type,
bool enable_debug_utils) {
const auto properties = vk::enumerateInstanceExtensionProperties();
if (properties.empty()) {
LOG_ERROR(Render_Vulkan, "Failed to query extension properties");
const auto [properties_result, properties] = vk::enumerateInstanceExtensionProperties();
if (properties_result != vk::Result::eSuccess || properties.empty()) {
LOG_ERROR(Render_Vulkan, "Failed to query extension properties: {}",
vk::to_string(properties_result));
return {};
}
@ -207,10 +208,12 @@ vk::UniqueInstance CreateInstance(Frontend::WindowSystemType window_type, bool e
#endif
VULKAN_HPP_DEFAULT_DISPATCHER.init(vkGetInstanceProcAddr);
const u32 available_version = VULKAN_HPP_DEFAULT_DISPATCHER.vkEnumerateInstanceVersion
const auto [available_version_result, available_version] =
VULKAN_HPP_DEFAULT_DISPATCHER.vkEnumerateInstanceVersion
? vk::enumerateInstanceVersion()
: VK_API_VERSION_1_0;
: vk::ResultValue(vk::Result::eSuccess, VK_API_VERSION_1_0);
ASSERT_MSG(available_version_result == vk::Result::eSuccess,
"Failed to query Vulkan API version: {}", vk::to_string(available_version_result));
ASSERT_MSG(available_version >= TargetVulkanApiVersion,
"Vulkan {}.{} is required, but only {}.{} is supported by instance!",
VK_VERSION_MAJOR(TargetVulkanApiVersion), VK_VERSION_MINOR(TargetVulkanApiVersion),
@ -341,11 +344,13 @@ vk::UniqueInstance CreateInstance(Frontend::WindowSystemType window_type, bool e
},
};
auto instance = vk::createInstanceUnique(instance_ci_chain.get());
auto [instance_result, instance] = vk::createInstanceUnique(instance_ci_chain.get());
ASSERT_MSG(instance_result == vk::Result::eSuccess, "Failed to create instance: {}",
vk::to_string(instance_result));
VULKAN_HPP_DEFAULT_DISPATCHER.init(*instance);
return instance;
return std::move(instance);
}
vk::UniqueDebugUtilsMessengerEXT CreateDebugCallback(vk::Instance instance) {
@ -359,7 +364,10 @@ vk::UniqueDebugUtilsMessengerEXT CreateDebugCallback(vk::Instance instance) {
vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance,
.pfnUserCallback = DebugUtilsCallback,
};
return instance.createDebugUtilsMessengerEXTUnique(msg_ci);
auto [messenger_result, messenger] = instance.createDebugUtilsMessengerEXTUnique(msg_ci);
ASSERT_MSG(messenger_result == vk::Result::eSuccess, "Failed to create debug callback: {}",
vk::to_string(messenger_result));
return std::move(messenger);
}
} // namespace Vulkan

View File

@ -7,6 +7,7 @@
#include <variant>
#include <fmt/format.h>
#include "common/logging/log.h"
#include "common/types.h"
#include "video_core/renderer_vulkan/vk_common.h"
@ -36,7 +37,10 @@ void SetObjectName(vk::Device device, const HandleType& handle, std::string_view
.objectHandle = reinterpret_cast<u64>(static_cast<typename HandleType::NativeType>(handle)),
.pObjectName = debug_name.data(),
};
device.setDebugUtilsObjectNameEXT(name_info);
auto result = device.setDebugUtilsObjectNameEXT(name_info);
if (result != vk::Result::eSuccess) {
LOG_DEBUG(Render_Vulkan, "Could not set object debug name: {}", vk::to_string(result));
}
}
template <VulkanHandleType HandleType, typename... Args>

View File

@ -24,7 +24,6 @@ Rasterizer::Rasterizer(const Instance& instance_, Scheduler& scheduler_,
liverpool->BindRasterizer(this);
}
memory->SetRasterizer(this);
wfi_event = instance.GetDevice().createEventUnique({});
}
Rasterizer::~Rasterizer() = default;
@ -350,7 +349,10 @@ void Rasterizer::UpdateViewportScissorState() {
boost::container::static_vector<vk::Rect2D, Liverpool::NumViewports> scissors;
const float reduce_z =
regs.clipper_control.clip_space == AmdGpu::Liverpool::ClipSpace::MinusWToW ? 1.0f : 0.0f;
instance.IsDepthClipControlSupported() &&
regs.clipper_control.clip_space == AmdGpu::Liverpool::ClipSpace::MinusWToW
? 1.0f
: 0.0f;
for (u32 i = 0; i < Liverpool::NumViewports; i++) {
const auto& vp = regs.viewports[i];
const auto& vp_d = regs.viewport_depths[i];

View File

@ -67,7 +67,6 @@ private:
AmdGpu::Liverpool* liverpool;
Core::MemoryManager* memory;
PipelineCache pipeline_cache;
vk::UniqueEvent wfi_event;
};
} // namespace Vulkan

View File

@ -69,7 +69,10 @@ CommandPool::CommandPool(const Instance& instance, MasterSemaphore* master_semap
.queueFamilyIndex = instance.GetGraphicsQueueFamilyIndex(),
};
const vk::Device device = instance.GetDevice();
cmd_pool = device.createCommandPoolUnique(pool_create_info);
auto [pool_result, pool] = device.createCommandPoolUnique(pool_create_info);
ASSERT_MSG(pool_result == vk::Result::eSuccess, "Failed to create command pool: {}",
vk::to_string(pool_result));
cmd_pool = std::move(pool);
if (instance.HasDebuggingToolAttached()) {
SetObjectName(device, *cmd_pool, "CommandPool");
}
@ -182,7 +185,10 @@ void DescriptorHeap::CreateDescriptorPool() {
.poolSizeCount = static_cast<u32>(pool_sizes.size()),
.pPoolSizes = pool_sizes.data(),
};
curr_pool = device.createDescriptorPool(pool_info);
auto [pool_result, pool] = device.createDescriptorPool(pool_info);
ASSERT_MSG(pool_result == vk::Result::eSuccess, "Failed to create descriptor pool: {}",
vk::to_string(pool_result));
curr_pool = pool;
}
} // namespace Vulkan

View File

@ -89,7 +89,9 @@ void Scheduler::AllocateWorkerCommandBuffers() {
};
current_cmdbuf = command_pool.Commit();
current_cmdbuf.begin(begin_info);
auto begin_result = current_cmdbuf.begin(begin_info);
ASSERT_MSG(begin_result == vk::Result::eSuccess, "Failed to begin command buffer: {}",
vk::to_string(begin_result));
auto* profiler_ctx = instance.GetProfilerContext();
if (profiler_ctx) {
@ -110,7 +112,9 @@ void Scheduler::SubmitExecution(SubmitInfo& info) {
}
EndRendering();
current_cmdbuf.end();
auto end_result = current_cmdbuf.end();
ASSERT_MSG(end_result == vk::Result::eSuccess, "Failed to end command buffer: {}",
vk::to_string(end_result));
const vk::Semaphore timeline = master_semaphore.Handle();
info.AddSignal(timeline, signal_value);
@ -138,12 +142,9 @@ void Scheduler::SubmitExecution(SubmitInfo& info) {
.pSignalSemaphores = info.signal_semas.data(),
};
try {
ImGui::Core::TextureManager::Submit();
instance.GetGraphicsQueue().submit(submit_info, info.fence);
} catch (vk::DeviceLostError& err) {
UNREACHABLE_MSG("Device lost during submit: {}", err.what());
}
auto submit_result = instance.GetGraphicsQueue().submit(submit_info, info.fence);
ASSERT_MSG(submit_result != vk::Result::eErrorDeviceLost, "Device lost during submit");
master_semaphore.Refresh();
AllocateWorkerCommandBuffers();

View File

@ -218,13 +218,10 @@ vk::ShaderModule CompileSPV(std::span<const u32> code, vk::Device device) {
.pCode = code.data(),
};
try {
return device.createShaderModule(shader_info);
} catch (vk::SystemError& err) {
UNREACHABLE_MSG("{}", err.what());
}
return {};
auto [module_result, module] = device.createShaderModule(shader_info);
ASSERT_MSG(module_result == vk::Result::eSuccess, "Failed to compile SPIR-V shader: {}",
vk::to_string(module_result));
return module;
}
} // namespace Vulkan

View File

@ -37,8 +37,12 @@ void Swapchain::Create(u32 width_, u32 height_, vk::SurfaceKHR surface_) {
instance.GetPresentQueueFamilyIndex(),
};
const auto modes = instance.GetPhysicalDevice().getSurfacePresentModesKHR(surface);
const auto find_mode = [&modes](vk::PresentModeKHR requested) {
const auto [modes_result, modes] =
instance.GetPhysicalDevice().getSurfacePresentModesKHR(surface);
const auto find_mode = [&modes_result, &modes](vk::PresentModeKHR requested) {
if (modes_result != vk::Result::eSuccess) {
return false;
}
const auto it =
std::find_if(modes.begin(), modes.end(),
[&requested](vk::PresentModeKHR mode) { return mode == requested; });
@ -70,17 +74,19 @@ void Swapchain::Create(u32 width_, u32 height_, vk::SurfaceKHR surface_) {
.oldSwapchain = nullptr,
};
try {
swapchain = instance.GetDevice().createSwapchainKHR(swapchain_info);
} catch (vk::SystemError& err) {
LOG_CRITICAL(Render_Vulkan, "{}", err.what());
UNREACHABLE();
}
auto [swapchain_result, chain] = instance.GetDevice().createSwapchainKHR(swapchain_info);
ASSERT_MSG(swapchain_result == vk::Result::eSuccess, "Failed to create swapchain: {}",
vk::to_string(swapchain_result));
swapchain = chain;
SetupImages();
RefreshSemaphores();
}
void Swapchain::Recreate(u32 width_, u32 height_) {
Create(width_, height_, surface);
}
bool Swapchain::AcquireNextImage() {
vk::Device device = instance.GetDevice();
vk::Result result =
@ -107,9 +113,6 @@ bool Swapchain::AcquireNextImage() {
}
void Swapchain::Present() {
if (needs_recreation) {
return;
}
const vk::PresentInfoKHR present_info = {
.waitSemaphoreCount = 1,
@ -119,20 +122,22 @@ void Swapchain::Present() {
.pImageIndices = &image_index,
};
try {
[[maybe_unused]] vk::Result result = instance.GetPresentQueue().presentKHR(present_info);
} catch (vk::OutOfDateKHRError&) {
auto result = instance.GetPresentQueue().presentKHR(present_info);
if (result == vk::Result::eErrorOutOfDateKHR) {
needs_recreation = true;
} catch (const vk::SystemError& err) {
LOG_CRITICAL(Render_Vulkan, "Swapchain presentation failed {}", err.what());
UNREACHABLE();
} else {
ASSERT_MSG(result == vk::Result::eSuccess, "Swapchain presentation failed: {}",
vk::to_string(result));
}
frame_index = (frame_index + 1) % image_count;
}
void Swapchain::FindPresentFormat() {
const auto formats = instance.GetPhysicalDevice().getSurfaceFormatsKHR(surface);
const auto [formats_result, formats] =
instance.GetPhysicalDevice().getSurfaceFormatsKHR(surface);
ASSERT_MSG(formats_result == vk::Result::eSuccess, "Failed to query surface formats: {}",
vk::to_string(formats_result));
// If there is a single undefined surface format, the device doesn't care, so we'll just use
// RGBA sRGB.
@ -158,8 +163,10 @@ void Swapchain::FindPresentFormat() {
}
void Swapchain::SetSurfaceProperties() {
const vk::SurfaceCapabilitiesKHR capabilities =
const auto [capabilities_result, capabilities] =
instance.GetPhysicalDevice().getSurfaceCapabilitiesKHR(surface);
ASSERT_MSG(capabilities_result == vk::Result::eSuccess,
"Failed to query surface capabilities: {}", vk::to_string(capabilities_result));
extent = capabilities.currentExtent;
if (capabilities.currentExtent.width == std::numeric_limits<u32>::max()) {
@ -207,10 +214,17 @@ void Swapchain::RefreshSemaphores() {
present_ready.resize(image_count);
for (vk::Semaphore& semaphore : image_acquired) {
semaphore = device.createSemaphore({});
auto [semaphore_result, sem] = device.createSemaphore({});
ASSERT_MSG(semaphore_result == vk::Result::eSuccess,
"Failed to create image acquired semaphore: {}",
vk::to_string(semaphore_result));
semaphore = sem;
}
for (vk::Semaphore& semaphore : present_ready) {
semaphore = device.createSemaphore({});
auto [semaphore_result, sem] = device.createSemaphore({});
ASSERT_MSG(semaphore_result == vk::Result::eSuccess,
"Failed to create present ready semaphore: {}", vk::to_string(semaphore_result));
semaphore = sem;
}
if (instance.HasDebuggingToolAttached()) {
@ -223,7 +237,10 @@ void Swapchain::RefreshSemaphores() {
void Swapchain::SetupImages() {
vk::Device device = instance.GetDevice();
images = device.getSwapchainImagesKHR(swapchain);
auto [images_result, imgs] = device.getSwapchainImagesKHR(swapchain);
ASSERT_MSG(images_result == vk::Result::eSuccess, "Failed to create swapchain images: {}",
vk::to_string(images_result));
images = std::move(imgs);
image_count = static_cast<u32>(images.size());
if (instance.HasDebuggingToolAttached()) {

View File

@ -25,6 +25,9 @@ public:
/// Creates (or recreates) the swapchain with a given size.
void Create(u32 width, u32 height, vk::SurfaceKHR surface);
/// Recreates the swapchain with a given size and current surface.
void Recreate(u32 width, u32 height);
/// Acquires the next image in the swapchain.
bool AcquireNextImage();

View File

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#define VULKAN_HPP_NO_EXCEPTIONS
#include <ranges>
#include "common/assert.h"
#include "video_core/renderer_vulkan/liverpool_to_vk.h"
@ -9,10 +8,7 @@
#include "video_core/renderer_vulkan/vk_scheduler.h"
#include "video_core/texture_cache/image.h"
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wnullability-completeness"
#include <vk_mem_alloc.h>
#pragma GCC diagnostic pop
namespace VideoCore {
@ -86,6 +82,28 @@ static vk::ImageUsageFlags ImageUsageFlags(const ImageInfo& info) {
return usage;
}
static vk::FormatFeatureFlags2 FormatFeatureFlags(const vk::ImageUsageFlags usage_flags) {
vk::FormatFeatureFlags2 feature_flags{};
if (usage_flags & vk::ImageUsageFlagBits::eTransferSrc) {
feature_flags |= vk::FormatFeatureFlagBits2::eTransferSrc;
}
if (usage_flags & vk::ImageUsageFlagBits::eTransferDst) {
feature_flags |= vk::FormatFeatureFlagBits2::eTransferDst;
}
if (usage_flags & vk::ImageUsageFlagBits::eSampled) {
feature_flags |= vk::FormatFeatureFlagBits2::eSampledImage;
}
if (usage_flags & vk::ImageUsageFlagBits::eColorAttachment) {
feature_flags |= vk::FormatFeatureFlagBits2::eColorAttachment;
}
if (usage_flags & vk::ImageUsageFlagBits::eDepthStencilAttachment) {
feature_flags |= vk::FormatFeatureFlagBits2::eDepthStencilAttachment;
}
// Note: StorageImage is intentionally ignored for now since it is always set, and can mess up
// compatibility checks.
return feature_flags;
}
UniqueImage::UniqueImage(vk::Device device_, VmaAllocator allocator_)
: device{device_}, allocator{allocator_} {}
@ -132,6 +150,7 @@ Image::Image(const Vulkan::Instance& instance_, Vulkan::Scheduler& scheduler_,
}
usage = ImageUsageFlags(info);
format_features = FormatFeatureFlags(usage);
switch (info.pixel_format) {
case vk::Format::eD16Unorm:
@ -149,7 +168,7 @@ Image::Image(const Vulkan::Instance& instance_, Vulkan::Scheduler& scheduler_,
}
constexpr auto tiling = vk::ImageTiling::eOptimal;
const auto supported_format = instance->GetSupportedFormat(info.pixel_format);
const auto supported_format = instance->GetSupportedFormat(info.pixel_format, format_features);
const auto properties = instance->GetPhysicalDevice().getImageFormatProperties(
supported_format, info.type, tiling, usage, flags);
const auto supported_samples = properties.result == vk::Result::eSuccess

View File

@ -114,6 +114,7 @@ struct Image {
// Resource state tracking
vk::ImageUsageFlags usage;
vk::FormatFeatureFlags2 format_features;
struct State {
vk::Flags<vk::PipelineStageFlagBits2> pl_stage = vk::PipelineStageFlagBits2::eAllCommands;
vk::Flags<vk::AccessFlagBits2> access_mask = vk::AccessFlagBits2::eNone;

View File

@ -164,8 +164,9 @@ ImageView::ImageView(const Vulkan::Instance& instance, const ImageViewInfo& info
.pNext = &usage_ci,
.image = image.image,
.viewType = info.type,
.format = instance.GetSupportedFormat(format),
.components = instance.GetSupportedComponentSwizzle(format, info.mapping),
.format = instance.GetSupportedFormat(format, image.format_features),
.components =
instance.GetSupportedComponentSwizzle(format, info.mapping, image.format_features),
.subresourceRange{
.aspectMask = aspect,
.baseMipLevel = info.range.base.level,
@ -174,7 +175,10 @@ ImageView::ImageView(const Vulkan::Instance& instance, const ImageViewInfo& info
.layerCount = info.range.extent.layers,
},
};
image_view = instance.GetDevice().createImageViewUnique(image_view_ci);
auto [view_result, view] = instance.GetDevice().createImageViewUnique(image_view_ci);
ASSERT_MSG(view_result == vk::Result::eSuccess, "Failed to create image view: {}",
vk::to_string(view_result));
image_view = std::move(view);
}
ImageView::~ImageView() = default;

View File

@ -24,7 +24,10 @@ Sampler::Sampler(const Vulkan::Instance& instance, const AmdGpu::Sampler& sample
.borderColor = LiverpoolToVK::BorderColor(sampler.border_color_type),
.unnormalizedCoordinates = bool(sampler.force_unnormalized),
};
handle = instance.GetDevice().createSamplerUnique(sampler_ci);
auto [sampler_result, smplr] = instance.GetDevice().createSamplerUnique(sampler_ci);
ASSERT_MSG(sampler_result == vk::Result::eSuccess, "Failed to create sampler: {}",
vk::to_string(sampler_result));
handle = std::move(smplr);
}
Sampler::~Sampler() = default;

View File

@ -15,10 +15,7 @@
#include <boost/container/static_vector.hpp>
#include <magic_enum.hpp>
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wnullability-completeness"
#include <vk_mem_alloc.h>
#pragma GCC diagnostic pop
namespace VideoCore {
@ -298,8 +295,10 @@ TileManager::TileManager(const Vulkan::Instance& instance, Vulkan::Scheduler& sc
.bindingCount = static_cast<u32>(bindings.size()),
.pBindings = bindings.data(),
};
static auto desc_layout =
static auto [desc_layout_result, desc_layout] =
instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci);
ASSERT_MSG(desc_layout_result == vk::Result::eSuccess,
"Failed to create descriptor set layout: {}", vk::to_string(desc_layout_result));
const vk::PushConstantRange push_constants = {
.stageFlags = vk::ShaderStageFlagBits::eCompute,
@ -314,7 +313,10 @@ TileManager::TileManager(const Vulkan::Instance& instance, Vulkan::Scheduler& sc
.pushConstantRangeCount = 1,
.pPushConstantRanges = &push_constants,
};
ctx.pl_layout = instance.GetDevice().createPipelineLayoutUnique(layout_info);
auto [layout_result, layout] = instance.GetDevice().createPipelineLayoutUnique(layout_info);
ASSERT_MSG(layout_result == vk::Result::eSuccess, "Failed to create pipeline layout: {}",
vk::to_string(layout_result));
ctx.pl_layout = std::move(layout);
const vk::ComputePipelineCreateInfo compute_pipeline_ci = {
.stage = shader_ci,