mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-04 16:32:39 +00:00
Merge branch 'main' into gpu-mem
This commit is contained in:
commit
f4ae6b63ff
@ -10,7 +10,7 @@ if grep -nrI '\s$' src *.yml *.txt *.md Doxyfile .gitignore .gitmodules .ci* dis
|
||||
fi
|
||||
|
||||
# Default clang-format points to default 3.5 version one
|
||||
CLANG_FORMAT=clang-format-18
|
||||
CLANG_FORMAT=clang-format-19
|
||||
$CLANG_FORMAT --version
|
||||
|
||||
if [ "$GITHUB_EVENT_NAME" = "pull_request" ]; then
|
||||
|
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@ -30,9 +30,9 @@ jobs:
|
||||
- name: Install
|
||||
run: |
|
||||
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
|
||||
sudo add-apt-repository 'deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-18 main'
|
||||
sudo add-apt-repository 'deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-19 main'
|
||||
sudo apt update
|
||||
sudo apt install clang-format-18
|
||||
sudo apt install clang-format-19
|
||||
- name: Build
|
||||
env:
|
||||
COMMIT_RANGE: ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }}
|
||||
|
3
.github/workflows/update_translation.yml
vendored
3
.github/workflows/update_translation.yml
vendored
@ -22,10 +22,9 @@ jobs:
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v7
|
||||
with:
|
||||
token: ${{ secrets.SHADPS4_TOKEN_REPO }}
|
||||
title: "Qt GUI: Update Translation"
|
||||
commit-message: "[ci skip] Qt GUI: Update Translation."
|
||||
committer: "shadPS4 Bot <Shadps4Boot@users.noreply.github.com>"
|
||||
author: "shadPS4 Bot <Shadps4Boot@users.noreply.github.com>"
|
||||
body: "Daily update of translation sources."
|
||||
branch: update-translation
|
||||
delete-branch: true
|
@ -13,33 +13,49 @@ First and foremost, Clang 18 is the **recommended compiler** as it is used for o
|
||||
|
||||
#### Debian & Ubuntu
|
||||
|
||||
```
|
||||
sudo apt install build-essential clang git cmake libasound2-dev libpulse-dev libopenal-dev libssl-dev zlib1g-dev libedit-dev libudev-dev libevdev-dev libsdl2-dev libjack-dev libsndio-dev qt6-base-dev qt6-tools-dev qt6-multimedia-dev libvulkan-dev vulkan-validationlayers
|
||||
```bash
|
||||
sudo apt install build-essential clang git cmake libasound2-dev \
|
||||
libpulse-dev libopenal-dev libssl-dev zlib1g-dev libedit-dev \
|
||||
libudev-dev libevdev-dev libsdl2-dev libjack-dev libsndio-dev \
|
||||
qt6-base-dev qt6-tools-dev qt6-multimedia-dev libvulkan-dev \
|
||||
vulkan-validationlayers libpng-dev
|
||||
```
|
||||
|
||||
#### Fedora
|
||||
|
||||
```
|
||||
sudo dnf install clang git cmake libatomic alsa-lib-devel pipewire-jack-audio-connection-kit-devel openal-devel openssl-devel libevdev-devel libudev-devel libXext-devel qt6-qtbase-devel qt6-qtbase-private-devel qt6-qtmultimedia-devel qt6-qtsvg-devel qt6-qttools-devel vulkan-devel vulkan-validation-layers
|
||||
```bash
|
||||
sudo dnf install clang git cmake libatomic alsa-lib-devel \
|
||||
pipewire-jack-audio-connection-kit-devel openal-devel \
|
||||
openssl-devel libevdev-devel libudev-devel libXext-devel \
|
||||
qt6-qtbase-devel qt6-qtbase-private-devel \
|
||||
qt6-qtmultimedia-devel qt6-qtsvg-devel qt6-qttools-devel \
|
||||
vulkan-devel vulkan-validation-layers libpng-devel
|
||||
```
|
||||
|
||||
#### Arch Linux
|
||||
|
||||
```
|
||||
sudo pacman -S base-devel clang git cmake sndio jack2 openal qt6-base qt6-declarative qt6-multimedia sdl2 vulkan-validation-layers
|
||||
```bash
|
||||
sudo pacman -S base-devel clang git cmake sndio jack2 openal \
|
||||
qt6-base qt6-declarative qt6-multimedia sdl2 \
|
||||
vulkan-validation-layers libpng
|
||||
```
|
||||
|
||||
**Note**: The `shadps4-git` AUR package is not maintained by any of the developers, and it uses the default compiler, which is often set to GCC. Use at your own discretion.
|
||||
|
||||
#### OpenSUSE
|
||||
|
||||
```
|
||||
sudo zypper install clang git cmake libasound2 libpulse-devel libsndio7 libjack-devel openal-soft-devel libopenssl-devel zlib-devel libedit-devel systemd-devel libevdev-devel qt6-base-devel qt6-multimedia-devel qt6-svg-devel qt6-linguist-devel qt6-gui-private-devel vulkan-devel vulkan-validationlayers
|
||||
```bash
|
||||
sudo zypper install clang git cmake libasound2 libpulse-devel \
|
||||
libsndio7 libjack-devel openal-soft-devel libopenssl-devel \
|
||||
zlib-devel libedit-devel systemd-devel libevdev-devel \
|
||||
qt6-base-devel qt6-multimedia-devel qt6-svg-devel \
|
||||
qt6-linguist-devel qt6-gui-private-devel vulkan-devel \
|
||||
vulkan-validationlayers libpng-devel
|
||||
```
|
||||
|
||||
#### NixOS
|
||||
|
||||
```
|
||||
```bash
|
||||
nix-shell shell.nix
|
||||
```
|
||||
|
||||
@ -50,7 +66,7 @@ You can try one of two methods:
|
||||
- Search the packages by name and install them with your package manager, or
|
||||
- Install [distrobox](https://distrobox.it/), create a container using any of the distributions cited above as a base, for Arch Linux you'd do:
|
||||
|
||||
```
|
||||
```bash
|
||||
distrobox create --name archlinux --init --image archlinux:latest
|
||||
```
|
||||
|
||||
@ -59,7 +75,7 @@ This option is **highly recommended** for distributions with immutable/atomic fi
|
||||
|
||||
### Cloning
|
||||
|
||||
```
|
||||
```bash
|
||||
git clone --recursive https://github.com/shadps4-emu/shadPS4.git
|
||||
cd shadPS4
|
||||
```
|
||||
@ -72,7 +88,7 @@ There are 3 options you can choose from. Option 1 is **highly recommended**.
|
||||
|
||||
1. Generate the build directory in the shadPS4 directory.
|
||||
|
||||
```
|
||||
```bash
|
||||
cmake -S . -B build/ -DENABLE_QT_GUI=ON -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
|
||||
```
|
||||
|
||||
@ -80,7 +96,7 @@ To disable the Qt GUI, remove the `-DENABLE_QT_GUI=ON` flag. To change the build
|
||||
|
||||
2. Use CMake to build the project:
|
||||
|
||||
```
|
||||
```bash
|
||||
cmake --build ./build --parallel$(nproc)
|
||||
```
|
||||
|
||||
@ -88,13 +104,13 @@ If your computer freezes during this step, this could be caused by excessive sys
|
||||
|
||||
Now run the emulator. If Qt was enabled at configure time:
|
||||
|
||||
```
|
||||
```bash
|
||||
./build/shadps4
|
||||
```
|
||||
|
||||
Otherwise, specify the path to your PKG's boot file:
|
||||
|
||||
```
|
||||
```bash
|
||||
./build/shadps4 /"PATH"/"TO"/"GAME"/"FOLDER"/eboot.bin
|
||||
```
|
||||
|
||||
|
@ -46,6 +46,7 @@ pkgs.mkShell {
|
||||
pkgs.stb
|
||||
pkgs.qt6.qtwayland
|
||||
pkgs.wayland-protocols
|
||||
pkgs.libpng
|
||||
];
|
||||
|
||||
shellHook = ''
|
||||
|
@ -144,37 +144,39 @@ void OnGameLoaded() {
|
||||
std::string type = patchLineIt->attribute("Type").value();
|
||||
std::string address = patchLineIt->attribute("Address").value();
|
||||
std::string patchValue = patchLineIt->attribute("Value").value();
|
||||
std::string maskOffsetStr = patchLineIt->attribute("type").value();
|
||||
|
||||
std::string maskOffsetStr = patchLineIt->attribute("Offset").value();
|
||||
std::string targetStr = "";
|
||||
std::string sizeStr = "";
|
||||
if (type == "mask_jump32") {
|
||||
std::string patchValue = patchLineIt->attribute("Value").value();
|
||||
targetStr = patchLineIt->attribute("Target").value();
|
||||
sizeStr = patchLineIt->attribute("Size").value();
|
||||
} else {
|
||||
patchValue = convertValueToHex(type, patchValue);
|
||||
}
|
||||
|
||||
bool littleEndian = false;
|
||||
|
||||
if (type == "bytes16") {
|
||||
littleEndian = true;
|
||||
} else if (type == "bytes32") {
|
||||
littleEndian = true;
|
||||
} else if (type == "bytes64") {
|
||||
if (type == "bytes16" || type == "bytes32" || type == "bytes64") {
|
||||
littleEndian = true;
|
||||
}
|
||||
|
||||
MemoryPatcher::PatchMask patchMask = MemoryPatcher::PatchMask::None;
|
||||
int maskOffsetValue = 0;
|
||||
|
||||
if (type == "mask") {
|
||||
if (type == "mask")
|
||||
patchMask = MemoryPatcher::PatchMask::Mask;
|
||||
|
||||
// im not sure if this works, there is no games to test the mask
|
||||
// offset on yet
|
||||
if (!maskOffsetStr.empty())
|
||||
maskOffsetValue = std::stoi(maskOffsetStr, 0, 10);
|
||||
}
|
||||
|
||||
if (type == "mask_jump32")
|
||||
patchMask = MemoryPatcher::PatchMask::Mask_Jump32;
|
||||
|
||||
MemoryPatcher::PatchMemory(currentPatchName, address, patchValue, false,
|
||||
littleEndian, patchMask, maskOffsetValue);
|
||||
if (type == "mask" || type == "mask_jump32" && !maskOffsetStr.empty()) {
|
||||
maskOffsetValue = std::stoi(maskOffsetStr, 0, 10);
|
||||
}
|
||||
|
||||
MemoryPatcher::PatchMemory(currentPatchName, address, patchValue,
|
||||
targetStr, sizeStr, false, littleEndian,
|
||||
patchMask, maskOffsetValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -279,6 +281,10 @@ void OnGameLoaded() {
|
||||
lineObject["Address"] = attributes.value("Address").toString();
|
||||
lineObject["Value"] = attributes.value("Value").toString();
|
||||
lineObject["Offset"] = attributes.value("Offset").toString();
|
||||
if (lineObject["Type"].toString() == "mask_jump32") {
|
||||
lineObject["Target"] = attributes.value("Target").toString();
|
||||
lineObject["Size"] = attributes.value("Size").toString();
|
||||
}
|
||||
linesArray.append(lineObject);
|
||||
}
|
||||
}
|
||||
@ -292,37 +298,40 @@ void OnGameLoaded() {
|
||||
QString patchValue = lineObject["Value"].toString();
|
||||
QString maskOffsetStr = lineObject["Offset"].toString();
|
||||
|
||||
patchValue = QString::fromStdString(
|
||||
convertValueToHex(type.toStdString(), patchValue.toStdString()));
|
||||
QString targetStr;
|
||||
QString sizeStr;
|
||||
if (type == "mask_jump32") {
|
||||
QString valueAttributeStr = lineObject["Value"].toString();
|
||||
targetStr = lineObject["Value"].toString();
|
||||
sizeStr = lineObject["Size"].toString();
|
||||
} else {
|
||||
patchValue = QString::fromStdString(convertValueToHex(
|
||||
type.toStdString(), patchValue.toStdString()));
|
||||
}
|
||||
|
||||
bool littleEndian = false;
|
||||
|
||||
if (type == "bytes16") {
|
||||
if (type == "bytes16" || type == "bytes32" || type == "bytes64")
|
||||
littleEndian = true;
|
||||
} else if (type == "bytes32") {
|
||||
littleEndian = true;
|
||||
} else if (type == "bytes64") {
|
||||
littleEndian = true;
|
||||
}
|
||||
|
||||
MemoryPatcher::PatchMask patchMask = MemoryPatcher::PatchMask::None;
|
||||
int maskOffsetValue = 0;
|
||||
|
||||
if (type == "mask") {
|
||||
if (type == "mask")
|
||||
patchMask = MemoryPatcher::PatchMask::Mask;
|
||||
|
||||
// im not sure if this works, there is no games to test the mask
|
||||
// offset on yet
|
||||
if (!maskOffsetStr.toStdString().empty())
|
||||
maskOffsetValue = std::stoi(maskOffsetStr.toStdString(), 0, 10);
|
||||
}
|
||||
|
||||
if (type == "mask_jump32")
|
||||
patchMask = MemoryPatcher::PatchMask::Mask_Jump32;
|
||||
|
||||
MemoryPatcher::PatchMemory(currentPatchName, address.toStdString(),
|
||||
patchValue.toStdString(), false,
|
||||
littleEndian, patchMask, maskOffsetValue);
|
||||
if (type == "mask" ||
|
||||
type == "mask_jump32" && !maskOffsetStr.toStdString().empty()) {
|
||||
maskOffsetValue = std::stoi(maskOffsetStr.toStdString(), 0, 10);
|
||||
}
|
||||
|
||||
MemoryPatcher::PatchMemory(
|
||||
currentPatchName, address.toStdString(), patchValue.toStdString(),
|
||||
targetStr.toStdString(), sizeStr.toStdString(), false, littleEndian,
|
||||
patchMask, maskOffsetValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -351,7 +360,7 @@ void ApplyPendingPatches() {
|
||||
if (currentPatch.gameSerial != g_game_serial)
|
||||
continue;
|
||||
|
||||
PatchMemory(currentPatch.modNameStr, currentPatch.offsetStr, currentPatch.valueStr,
|
||||
PatchMemory(currentPatch.modNameStr, currentPatch.offsetStr, currentPatch.valueStr, "", "",
|
||||
currentPatch.isOffset, currentPatch.littleEndian, currentPatch.patchMask,
|
||||
currentPatch.maskOffset);
|
||||
}
|
||||
@ -359,8 +368,9 @@ void ApplyPendingPatches() {
|
||||
pending_patches.clear();
|
||||
}
|
||||
|
||||
void PatchMemory(std::string modNameStr, std::string offsetStr, std::string valueStr, bool isOffset,
|
||||
bool littleEndian, PatchMask patchMask, int maskOffset) {
|
||||
void PatchMemory(std::string modNameStr, std::string offsetStr, std::string valueStr,
|
||||
std::string targetStr, std::string sizeStr, bool isOffset, bool littleEndian,
|
||||
PatchMask patchMask, int maskOffset) {
|
||||
// Send a request to modify the process memory.
|
||||
void* cheatAddress = nullptr;
|
||||
|
||||
@ -377,7 +387,83 @@ void PatchMemory(std::string modNameStr, std::string offsetStr, std::string valu
|
||||
cheatAddress = reinterpret_cast<void*>(PatternScan(offsetStr) + maskOffset);
|
||||
}
|
||||
|
||||
// TODO: implement mask_jump32
|
||||
if (patchMask == PatchMask::Mask_Jump32) {
|
||||
int jumpSize = std::stoi(sizeStr);
|
||||
|
||||
constexpr int MAX_PATTERN_LENGTH = 256;
|
||||
if (jumpSize < 5) {
|
||||
LOG_ERROR(Loader, "Jump size must be at least 5 bytes");
|
||||
return;
|
||||
}
|
||||
if (jumpSize > MAX_PATTERN_LENGTH) {
|
||||
LOG_ERROR(Loader, "Jump size must be no more than {} bytes.", MAX_PATTERN_LENGTH);
|
||||
return;
|
||||
}
|
||||
|
||||
// Find the base address using "Address"
|
||||
uintptr_t baseAddress = PatternScan(offsetStr);
|
||||
if (baseAddress == 0) {
|
||||
LOG_ERROR(Loader, "PatternScan failed for mask_jump32 with pattern: {}", offsetStr);
|
||||
return;
|
||||
}
|
||||
uintptr_t patchAddress = baseAddress + maskOffset;
|
||||
|
||||
// Fills the original region (jumpSize bytes) with NOPs
|
||||
std::vector<u8> nopBytes(jumpSize, 0x90);
|
||||
std::memcpy(reinterpret_cast<void*>(patchAddress), nopBytes.data(), nopBytes.size());
|
||||
|
||||
// Use "Target" to locate the start of the code cave
|
||||
uintptr_t jump_target = PatternScan(targetStr);
|
||||
if (jump_target == 0) {
|
||||
LOG_ERROR(Loader, "PatternScan failed to Target with pattern: {}", targetStr);
|
||||
return;
|
||||
}
|
||||
|
||||
// Converts the Value attribute to a byte array (payload)
|
||||
std::vector<u8> payload;
|
||||
for (size_t i = 0; i < valueStr.length(); i += 2) {
|
||||
|
||||
std::string tempStr = valueStr.substr(i, 2);
|
||||
const char* byteStr = tempStr.c_str();
|
||||
char* endPtr;
|
||||
unsigned int byteVal = std::strtoul(byteStr, &endPtr, 16);
|
||||
|
||||
if (endPtr != byteStr + 2) {
|
||||
LOG_ERROR(Loader, "Invalid byte in Value: {}", valueStr.substr(i, 2));
|
||||
return;
|
||||
}
|
||||
payload.push_back(static_cast<u8>(byteVal));
|
||||
}
|
||||
|
||||
// Calculates the end of the code cave (where the return jump will be inserted)
|
||||
uintptr_t code_cave_end = jump_target + payload.size();
|
||||
|
||||
// Write the payload to the code cave, from jump_target
|
||||
std::memcpy(reinterpret_cast<void*>(jump_target), payload.data(), payload.size());
|
||||
|
||||
// Inserts the initial jump in the original region to divert to the code cave
|
||||
u8 jumpInstruction[5];
|
||||
jumpInstruction[0] = 0xE9;
|
||||
s32 relJump = static_cast<s32>(jump_target - patchAddress - 5);
|
||||
std::memcpy(&jumpInstruction[1], &relJump, sizeof(relJump));
|
||||
std::memcpy(reinterpret_cast<void*>(patchAddress), jumpInstruction,
|
||||
sizeof(jumpInstruction));
|
||||
|
||||
// Inserts jump back at the end of the code cave to resume execution after patching
|
||||
u8 jumpBack[5];
|
||||
jumpBack[0] = 0xE9;
|
||||
// Calculates the relative offset to return to the instruction immediately following the
|
||||
// overwritten region
|
||||
s32 target_return = static_cast<s32>((patchAddress + jumpSize) - (code_cave_end + 5));
|
||||
std::memcpy(&jumpBack[1], &target_return, sizeof(target_return));
|
||||
std::memcpy(reinterpret_cast<void*>(code_cave_end), jumpBack, sizeof(jumpBack));
|
||||
|
||||
LOG_INFO(Loader,
|
||||
"Applied Patch mask_jump32: {}, PatchAddress: {:#x}, JumpTarget: {:#x}, "
|
||||
"CodeCaveEnd: {:#x}, JumpSize: {}",
|
||||
modNameStr, patchAddress, jump_target, code_cave_end, jumpSize);
|
||||
return;
|
||||
}
|
||||
|
||||
if (cheatAddress == nullptr) {
|
||||
LOG_ERROR(Loader, "Failed to get address for patch {}", modNameStr);
|
||||
|
@ -38,8 +38,9 @@ void OnGameLoaded();
|
||||
void AddPatchToQueue(patchInfo patchToAdd);
|
||||
void ApplyPendingPatches();
|
||||
|
||||
void PatchMemory(std::string modNameStr, std::string offsetStr, std::string valueStr, bool isOffset,
|
||||
bool littleEndian, PatchMask patchMask = PatchMask::None, int maskOffset = 0);
|
||||
void PatchMemory(std::string modNameStr, std::string offsetStr, std::string valueStr,
|
||||
std::string targetStr, std::string sizeStr, bool isOffset, bool littleEndian,
|
||||
PatchMask patchMask = PatchMask::None, int maskOffset = 0);
|
||||
|
||||
static std::vector<int32_t> PatternToByte(const std::string& pattern);
|
||||
uintptr_t PatternScan(const std::string& signature);
|
||||
|
@ -339,7 +339,9 @@ void CondvarWait(Condvar& cv, std::unique_lock<Lock>& lk, std::stop_token token,
|
||||
}
|
||||
|
||||
std::stop_callback callback(token, [&] {
|
||||
{ std::scoped_lock lk2{*lk.mutex()}; }
|
||||
{
|
||||
std::scoped_lock lk2{*lk.mutex()};
|
||||
}
|
||||
cv.notify_all();
|
||||
});
|
||||
|
||||
|
@ -57,7 +57,7 @@
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>shadPS4</string>
|
||||
<string notr="true">shadPS4</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QLabel" name="shad_text">
|
||||
|
@ -1346,7 +1346,7 @@ void CheatsPatches::applyCheat(const QString& modName, bool enabled) {
|
||||
|
||||
// Determine if the hint field is present
|
||||
bool isHintPresent = m_cheats[modName].hasHint;
|
||||
MemoryPatcher::PatchMemory(modNameStr, offsetStr, valueStr, !isHintPresent, false);
|
||||
MemoryPatcher::PatchMemory(modNameStr, offsetStr, valueStr, "", "", !isHintPresent, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1368,28 +1368,23 @@ void CheatsPatches::applyPatch(const QString& patchName, bool enabled) {
|
||||
|
||||
bool littleEndian = false;
|
||||
|
||||
if (type == "bytes16") {
|
||||
littleEndian = true;
|
||||
} else if (type == "bytes32") {
|
||||
littleEndian = true;
|
||||
} else if (type == "bytes64") {
|
||||
if (type == "bytes16" || type == "bytes32" || type == "bytes64") {
|
||||
littleEndian = true;
|
||||
}
|
||||
|
||||
MemoryPatcher::PatchMask patchMask = MemoryPatcher::PatchMask::None;
|
||||
int maskOffsetValue = 0;
|
||||
|
||||
if (type == "mask") {
|
||||
if (type == "mask")
|
||||
patchMask = MemoryPatcher::PatchMask::Mask;
|
||||
|
||||
// im not sure if this works, there is no games to test the mask offset on yet
|
||||
if (!maskOffsetStr.toStdString().empty())
|
||||
maskOffsetValue = std::stoi(maskOffsetStr.toStdString(), 0, 10);
|
||||
}
|
||||
|
||||
if (type == "mask_jump32")
|
||||
patchMask = MemoryPatcher::PatchMask::Mask_Jump32;
|
||||
|
||||
if (type == "mask" || type == "mask_jump32" && !maskOffsetStr.toStdString().empty()) {
|
||||
maskOffsetValue = std::stoi(maskOffsetStr.toStdString(), 0, 10);
|
||||
}
|
||||
|
||||
if (MemoryPatcher::g_eboot_address == 0) {
|
||||
MemoryPatcher::patchInfo addingPatch;
|
||||
addingPatch.gameSerial = patchInfo.serial.toStdString();
|
||||
@ -1405,7 +1400,8 @@ void CheatsPatches::applyPatch(const QString& patchName, bool enabled) {
|
||||
continue;
|
||||
}
|
||||
MemoryPatcher::PatchMemory(patchName.toStdString(), address.toStdString(),
|
||||
patchValue.toStdString(), false, littleEndian, patchMask);
|
||||
patchValue.toStdString(), "", "", false, littleEndian,
|
||||
patchMask);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -60,21 +60,21 @@ ControlSettings::ControlSettings(std::shared_ptr<GameInfoClass> game_info_get, Q
|
||||
|
||||
connect(ui->RSlider, &QSlider::valueChanged, this, [this](int value) {
|
||||
QString RedValue = QString("%1").arg(value, 3, 10, QChar('0'));
|
||||
QString RValue = "R: " + RedValue;
|
||||
QString RValue = tr("R:") + " " + RedValue;
|
||||
ui->RLabel->setText(RValue);
|
||||
UpdateLightbarColor();
|
||||
});
|
||||
|
||||
connect(ui->GSlider, &QSlider::valueChanged, this, [this](int value) {
|
||||
QString GreenValue = QString("%1").arg(value, 3, 10, QChar('0'));
|
||||
QString GValue = "G: " + GreenValue;
|
||||
QString GValue = tr("G:") + " " + GreenValue;
|
||||
ui->GLabel->setText(GValue);
|
||||
UpdateLightbarColor();
|
||||
});
|
||||
|
||||
connect(ui->BSlider, &QSlider::valueChanged, this, [this](int value) {
|
||||
QString BlueValue = QString("%1").arg(value, 3, 10, QChar('0'));
|
||||
QString BValue = "B: " + BlueValue;
|
||||
QString BValue = tr("B:") + " " + BlueValue;
|
||||
ui->BLabel->setText(BValue);
|
||||
UpdateLightbarColor();
|
||||
});
|
||||
@ -483,7 +483,7 @@ void ControlSettings::SetUIValuestoMappings() {
|
||||
std::string Rstring = lightbarstring.substr(0, comma_pos2);
|
||||
ui->RSlider->setValue(std::stoi(Rstring));
|
||||
QString RedValue = QString("%1").arg(std::stoi(Rstring), 3, 10, QChar('0'));
|
||||
QString RValue = "R: " + RedValue;
|
||||
QString RValue = tr("R:") + " " + RedValue;
|
||||
ui->RLabel->setText(RValue);
|
||||
}
|
||||
|
||||
@ -494,14 +494,14 @@ void ControlSettings::SetUIValuestoMappings() {
|
||||
ui->GSlider->setValue(std::stoi(Gstring));
|
||||
QString GreenValue =
|
||||
QString("%1").arg(std::stoi(Gstring), 3, 10, QChar('0'));
|
||||
QString GValue = "G: " + GreenValue;
|
||||
QString GValue = tr("G:") + " " + GreenValue;
|
||||
ui->GLabel->setText(GValue);
|
||||
|
||||
std::string Bstring = GBstring.substr(comma_pos3 + 1);
|
||||
ui->BSlider->setValue(std::stoi(Bstring));
|
||||
QString BlueValue =
|
||||
QString("%1").arg(std::stoi(Bstring), 3, 10, QChar('0'));
|
||||
QString BValue = "B: " + BlueValue;
|
||||
QString BValue = tr("B:") + " " + BlueValue;
|
||||
ui->BLabel->setText(BValue);
|
||||
}
|
||||
}
|
||||
|
@ -912,7 +912,7 @@
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>R: 000</string>
|
||||
<string notr="true">R: 000</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -944,7 +944,7 @@
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>G: 000</string>
|
||||
<string notr="true">G: 000</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -976,7 +976,7 @@
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>B: 255</string>
|
||||
<string notr="true">B: 255</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -161,6 +161,7 @@ public:
|
||||
|
||||
if (selected == &openSfoViewer) {
|
||||
PSF psf;
|
||||
QString gameName = QString::fromStdString(m_games[itemID].name);
|
||||
std::filesystem::path game_folder_path = m_games[itemID].path;
|
||||
std::filesystem::path game_update_path = game_folder_path;
|
||||
game_update_path += "-UPDATE";
|
||||
@ -234,7 +235,7 @@ public:
|
||||
tableWidget->horizontalHeader()->setVisible(false);
|
||||
|
||||
tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
|
||||
tableWidget->setWindowTitle(tr("SFO Viewer"));
|
||||
tableWidget->setWindowTitle(tr("SFO Viewer for ") + gameName);
|
||||
tableWidget->show();
|
||||
}
|
||||
}
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>حول shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4 هو محاكي تجريبي مفتوح المصدر لجهاز PlayStation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished">Configure Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation type="unfinished">About shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation type="unfinished">shadPS4 is an experimental open-source emulator for the PlayStation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished">Configure Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>Über shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4 ist ein experimenteller Open-Source-Emulator für die Playstation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished">Configure Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation type="unfinished">About shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation type="unfinished">shadPS4 is an experimental open-source emulator for the PlayStation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished">Configure Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>About shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation>shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4 is an experimental open-source emulator for the PlayStation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished"></translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished"></translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>Acerca de shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4 es un emulador experimental de código abierto para la PlayStation 4.</translation>
|
||||
@ -98,7 +94,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished">Error</translation>
|
||||
<translation>Error</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No patch selected.</source>
|
||||
@ -257,7 +253,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished">Error</translation>
|
||||
<translation>Error</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Network error:</source>
|
||||
@ -321,7 +317,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>No</source>
|
||||
<translation type="unfinished">No</translation>
|
||||
<translation>No</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide Changelog</source>
|
||||
@ -372,7 +368,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished">Error</translation>
|
||||
<translation>Error</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to update compatibility data! Try again later.</source>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation>Configurar Controles</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation>Editor KBM</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>درباره ShadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation>ShadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>یک شبیه ساز متن باز برای پلی استیشن 4 است. </translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished">Configure Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>Tietoa shadPS4:sta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4 on kokeellinen avoimen lähdekoodin PlayStation 4 emulaattori.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished">Configure Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>À propos de shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation>shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4 est un émulateur open-source expérimental de la PlayStation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation>Configurer les Commandes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation>Paramètres de Contrôle</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation>Croix directionnelle</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation>L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation>Commandes KBM</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation>Éditeur KBM</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation>Retour</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation>Joystick Droit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation>Enregistrer les Données</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation>Visionneuse SFO pour </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
@ -1721,7 +1733,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Data Path:\nThe folder where game save data will be saved.</source>
|
||||
<translation type="unfinished">Save Data Path:\nThe folder where game save data will be saved.</translation>
|
||||
<translation>Chemin de sauvegarde :\nLe dossier où les sauvegardes du jeu sont enregistré.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
|
||||
@ -1745,11 +1757,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the volume of the background music.</source>
|
||||
<translation type="unfinished">Set the volume of the background music.</translation>
|
||||
<translation>Volume de la musique de fond.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Motion Controls</source>
|
||||
<translation type="unfinished">Enable Motion Controls</translation>
|
||||
<translation>Activer les Mouvements</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Data Path</source>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>A shadPS4-ről</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>A shadPS4 egy kezdetleges, open-source PlayStation 4 emulátor.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished">Configure Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation type="unfinished">About shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation type="unfinished">shadPS4 is an experimental open-source emulator for the PlayStation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished">Configure Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>Riguardo shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation>shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4 è un emulatore sperimentale open-source per PlayStation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation>Configura Comandi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation>Impostazioni dei Comandi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation>Croce direzionale</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation>L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation>Controlli Tastiera/Mouse</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation>Editor Tastiera/Mouse</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation>Indietro</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation>Levetta Destra</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation>Regolazione Colore</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation>R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation>V:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation>B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation>Sostituisci Colore Lightbar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation>Sostituisci Colore</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation>Dati Salvataggio</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation>Visualizzatore SFO per </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
@ -1581,7 +1593,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable.</source>
|
||||
<translation>Aggiornamento:\nRelease: Versioni ufficiali rilasciate ogni mese che potrebbero essere molto datate, ma sono più affidabili e testate.\nNightly: Versioni di sviluppo che hanno tutte le ultime funzionalità e correzioni, ma potrebbero contenere bug e sono meno stabili.</translation>
|
||||
<translation>Aggiornamento:\nRilascio: Versioni ufficiali rilasciate ogni mese che possono essere molto obsolete, ma sono più affidabili e testati.\nNotturno: Le versioni di sviluppo che hanno tutte le ultime funzionalità e correzioni, ma possono contenere bug e sono meno stabili.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Background Image:\nControl the opacity of the game background image.</source>
|
||||
@ -1649,7 +1661,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it.</source>
|
||||
<translation>Dispositivo Grafico:\nIn sistemi con più GPU, seleziona la GPU che l'emulatore utilizzerà dall'elenco a discesa,\no seleziona "Auto Select" per determinarlo automaticamente.</translation>
|
||||
<translation>Dispositivo Grafico:\nIn sistemi con più GPU, seleziona la GPU che l'emulatore utilizzerà dall'elenco a discesa,\no seleziona "Selezione Automatica" per determinarlo automaticamente.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution.</source>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>shadPS4について</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation>shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4は、PlayStation 4の実験的なオープンソースエミュレーターです。</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation>コントロール設定</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation>操作設定</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation>十字キー</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation>L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation>右スティック</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation type="unfinished">About shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation type="unfinished">shadPS4 is an experimental open-source emulator for the PlayStation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished">Configure Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation type="unfinished">About shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation type="unfinished">shadPS4 is an experimental open-source emulator for the PlayStation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished">Configure Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>Om shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4 er en eksperimentell åpen kildekode-emulator for PlayStation 4.</translation>
|
||||
@ -230,7 +226,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Directory does not exist:</source>
|
||||
<translation>Mappen eksisterer ikke:</translation>
|
||||
<translation>Mappa eksisterer ikke:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to open files.json for reading.</source>
|
||||
@ -411,87 +407,75 @@
|
||||
<name>ControlSettings</name>
|
||||
<message>
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished">Configure Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
<translation>Sett opp kontroller</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
<translation>D-Pad</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Up</source>
|
||||
<translation type="unfinished">Up</translation>
|
||||
<translation>Opp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Left</source>
|
||||
<translation type="unfinished">Left</translation>
|
||||
<translation>Venstre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Right</source>
|
||||
<translation type="unfinished">Right</translation>
|
||||
<translation>Høyre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Down</source>
|
||||
<translation type="unfinished">Down</translation>
|
||||
<translation>Ned</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Left Stick Deadzone (def:2 max:127)</source>
|
||||
<translation type="unfinished">Left Stick Deadzone (def:2 max:127)</translation>
|
||||
<translation>Venstre analog dødsone (def:2, maks:127)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Left Deadzone</source>
|
||||
<translation type="unfinished">Left Deadzone</translation>
|
||||
<translation>Venstre dødsone</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Left Stick</source>
|
||||
<translation type="unfinished">Left Stick</translation>
|
||||
<translation>Venstre analog</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Config Selection</source>
|
||||
<translation type="unfinished">Config Selection</translation>
|
||||
<translation>Utvalg av oppsett</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Common Config</source>
|
||||
<translation type="unfinished">Common Config</translation>
|
||||
<translation>Felles oppsett</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use per-game configs</source>
|
||||
<translation type="unfinished">Use per-game configs</translation>
|
||||
<translation>Bruk oppsett per spill</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>L1 / LB</source>
|
||||
<translation type="unfinished">L1 / LB</translation>
|
||||
<translation>L1 / LB</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
<translation>L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
<translation>Tilbake</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R1 / RB</source>
|
||||
<translation type="unfinished">R1 / RB</translation>
|
||||
<translation>R1 / RB</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R2 / RT</source>
|
||||
<translation type="unfinished">R2 / RT</translation>
|
||||
<translation>R2 / RT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>L3</source>
|
||||
<translation type="unfinished">L3</translation>
|
||||
<translation>L3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Options / Start</source>
|
||||
@ -499,39 +483,63 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>R3</source>
|
||||
<translation type="unfinished">R3</translation>
|
||||
<translation>R3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Face Buttons</source>
|
||||
<translation type="unfinished">Face Buttons</translation>
|
||||
<translation>Handlingsknapper</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Triangle / Y</source>
|
||||
<translation type="unfinished">Triangle / Y</translation>
|
||||
<translation>Triangel / Y</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Square / X</source>
|
||||
<translation type="unfinished">Square / X</translation>
|
||||
<translation>Firkant / X</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Circle / B</source>
|
||||
<translation type="unfinished">Circle / B</translation>
|
||||
<translation>Sirkel / B</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cross / A</source>
|
||||
<translation type="unfinished">Cross / A</translation>
|
||||
<translation>Kryss / A</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Right Stick Deadzone (def:2, max:127)</source>
|
||||
<translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation>
|
||||
<translation>Høyre analog dødsone (def:2, maks:127)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Right Deadzone</source>
|
||||
<translation type="unfinished">Right Deadzone</translation>
|
||||
<translation>Høyre dødsone</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
<translation>Høyre analog</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -576,7 +584,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Directory to install DLC</source>
|
||||
<translation type="unfinished">Directory to install DLC</translation>
|
||||
<translation>Mappe for å installere DLC</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -599,7 +607,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Region</source>
|
||||
<translation type="unfinished">Region</translation>
|
||||
<translation>Region</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Firmware</source>
|
||||
@ -627,15 +635,15 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>h</source>
|
||||
<translation type="unfinished">h</translation>
|
||||
<translation>h</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>m</source>
|
||||
<translation type="unfinished">m</translation>
|
||||
<translation>m</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>s</source>
|
||||
<translation type="unfinished">s</translation>
|
||||
<translation>s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Compatibility is untested</source>
|
||||
@ -674,23 +682,23 @@
|
||||
<name>GameListUtils</name>
|
||||
<message>
|
||||
<source>B</source>
|
||||
<translation type="unfinished">B</translation>
|
||||
<translation>B</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KB</source>
|
||||
<translation type="unfinished">KB</translation>
|
||||
<translation>KB</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>MB</source>
|
||||
<translation type="unfinished">MB</translation>
|
||||
<translation>MB</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>GB</source>
|
||||
<translation type="unfinished">GB</translation>
|
||||
<translation>GB</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>TB</source>
|
||||
<translation type="unfinished">TB</translation>
|
||||
<translation>TB</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -717,15 +725,15 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Game Folder</source>
|
||||
<translation>Åpne spillmappen</translation>
|
||||
<translation>Åpne spillmappa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Save Data Folder</source>
|
||||
<translation>Åpne lagrede datamappen</translation>
|
||||
<translation>Åpne lagrede datamappa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Log Folder</source>
|
||||
<translation>Åpne loggmappen</translation>
|
||||
<translation>Åpne loggmappa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy info...</source>
|
||||
@ -821,7 +829,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>DLC</source>
|
||||
<translation type="unfinished">DLC</translation>
|
||||
<translation>DLC</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete %1</source>
|
||||
@ -833,27 +841,31 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Update Folder</source>
|
||||
<translation type="unfinished">Open Update Folder</translation>
|
||||
<translation>Åpne oppdateringsmappa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete Save Data</source>
|
||||
<translation type="unfinished">Delete Save Data</translation>
|
||||
<translation>Slett lagret data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This game has no update folder to open!</source>
|
||||
<translation type="unfinished">This game has no update folder to open!</translation>
|
||||
<translation>Dette spillet har ingen oppdateringsmappe å åpne!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to convert icon.</source>
|
||||
<translation type="unfinished">Failed to convert icon.</translation>
|
||||
<translation>Klarte ikke konvertere ikon.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This game has no save data to delete!</source>
|
||||
<translation type="unfinished">This game has no save data to delete!</translation>
|
||||
<translation>Dette spillet har ingen lagret data å slette!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
<translation>Lagret data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -868,11 +880,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Install All Queued to Selected Folder</source>
|
||||
<translation type="unfinished">Install All Queued to Selected Folder</translation>
|
||||
<translation>Installer alle i kø til den valgte mappa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete PKG File on Install</source>
|
||||
<translation type="unfinished">Delete PKG File on Install</translation>
|
||||
<translation>Slett PKG-fila ved installering</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -899,7 +911,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Configure...</source>
|
||||
<translation>Konfigurer...</translation>
|
||||
<translation>Sett opp...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Install application from a .pkg file</source>
|
||||
@ -911,7 +923,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Open shadPS4 Folder</source>
|
||||
<translation type="unfinished">Open shadPS4 Folder</translation>
|
||||
<translation>Åpne shadPS4 mappa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exit</source>
|
||||
@ -943,7 +955,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Medium</source>
|
||||
<translation type="unfinished">Medium</translation>
|
||||
<translation>Middels</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Large</source>
|
||||
@ -1151,27 +1163,27 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Run Game</source>
|
||||
<translation type="unfinished">Run Game</translation>
|
||||
<translation>Kjør spill</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Eboot.bin file not found</source>
|
||||
<translation type="unfinished">Eboot.bin file not found</translation>
|
||||
<translation>Klarte ikke finne Eboot.bin-fila</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>PKG File (*.PKG *.pkg)</source>
|
||||
<translation type="unfinished">PKG File (*.PKG *.pkg)</translation>
|
||||
<translation>PKG-fil (*.PKG *.pkg)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>PKG is a patch or DLC, please install the game first!</source>
|
||||
<translation type="unfinished">PKG is a patch or DLC, please install the game first!</translation>
|
||||
<translation>PKG er en programrettelse eller DLC. Installer spillet først!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game is already running!</source>
|
||||
<translation type="unfinished">Game is already running!</translation>
|
||||
<translation>Spillet kjører allerede!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
<translation>shadPS4</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -1194,7 +1206,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Installed</source>
|
||||
<translation type="unfinished">Installed</translation>
|
||||
<translation>Installert</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Size</source>
|
||||
@ -1202,27 +1214,27 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Category</source>
|
||||
<translation type="unfinished">Category</translation>
|
||||
<translation>Kategori</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type</source>
|
||||
<translation type="unfinished">Type</translation>
|
||||
<translation>Type</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>App Ver</source>
|
||||
<translation type="unfinished">App Ver</translation>
|
||||
<translation>Programversjon</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>FW</source>
|
||||
<translation type="unfinished">FW</translation>
|
||||
<translation>FV</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Region</source>
|
||||
<translation type="unfinished">Region</translation>
|
||||
<translation>Region</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Flags</source>
|
||||
<translation type="unfinished">Flags</translation>
|
||||
<translation>Flagg</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Path</source>
|
||||
@ -1238,7 +1250,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Package</source>
|
||||
<translation type="unfinished">Package</translation>
|
||||
<translation>Pakke</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -1253,7 +1265,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>System</source>
|
||||
<translation type="unfinished">System</translation>
|
||||
<translation>System</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Console Language</source>
|
||||
@ -1265,11 +1277,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Emulator</source>
|
||||
<translation type="unfinished">Emulator</translation>
|
||||
<translation>Emulator</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Fullscreen</source>
|
||||
<translation>Aktiver fullskjerm</translation>
|
||||
<translation>Bruk fullskjerm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Fullscreen Mode</source>
|
||||
@ -1277,7 +1289,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Separate Update Folder</source>
|
||||
<translation>Aktiver seperat oppdateringsmappe</translation>
|
||||
<translation>Bruk seperat oppdateringsmappe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Default tab when opening settings</source>
|
||||
@ -1293,7 +1305,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Discord Rich Presence</source>
|
||||
<translation>Aktiver Discord Rich Presence</translation>
|
||||
<translation>Bruk Discord Rich Presence</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Username</source>
|
||||
@ -1309,7 +1321,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Logger</source>
|
||||
<translation type="unfinished">Logger</translation>
|
||||
<translation>Loggføring</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Log Type</source>
|
||||
@ -1341,7 +1353,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>s</source>
|
||||
<translation type="unfinished">s</translation>
|
||||
<translation>s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Controller</source>
|
||||
@ -1385,15 +1397,15 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Shaders Dumping</source>
|
||||
<translation>Aktiver skyggeleggerdumping</translation>
|
||||
<translation>Bruk skyggeleggerdumping</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable NULL GPU</source>
|
||||
<translation>Aktiver NULL GPU</translation>
|
||||
<translation>Bruk NULL GPU</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable HDR</source>
|
||||
<translation type="unfinished">Enable HDR</translation>
|
||||
<translation>Bruk HDR</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Paths</source>
|
||||
@ -1417,23 +1429,23 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Debug Dumping</source>
|
||||
<translation>Aktiver feilrettingsdumping</translation>
|
||||
<translation>Bruk feilrettingsdumping</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Vulkan Validation Layers</source>
|
||||
<translation>Aktiver Vulkan Validation Layers</translation>
|
||||
<translation>Bruk Vulkan Validation Layers</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Vulkan Synchronization Validation</source>
|
||||
<translation>Aktiver Vulkan synkroniseringslag</translation>
|
||||
<translation>Bruk Vulkan Validation Layers</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable RenderDoc Debugging</source>
|
||||
<translation>Aktiver RenderDoc feilretting</translation>
|
||||
<translation>Bruk RenderDoc feilsøking</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Crash Diagnostics</source>
|
||||
<translation>Aktiver krasjdiagnostikk</translation>
|
||||
<translation>Bruk krasjdiagnostikk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Collect Shaders</source>
|
||||
@ -1461,7 +1473,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Always Show Changelog</source>
|
||||
<translation type="unfinished">Always Show Changelog</translation>
|
||||
<translation>Vis alltid endringsloggen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update Channel</source>
|
||||
@ -1549,11 +1561,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</source>
|
||||
<translation>Aktiver fullskjerm:\nSetter spillvinduet automatisk i fullskjermmodus.\nDette kan slås av ved å trykke på F11-tasten.</translation>
|
||||
<translation>Bruk fullskjerm:\nSetter spillvinduet automatisk i fullskjermmodus.\nDette kan slås av ved å trykke på F11-tasten.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID.</source>
|
||||
<translation>Aktiver separat oppdateringsmappe:\nAktiverer installering av spill i en egen mappe for enkel administrasjon.</translation>
|
||||
<translation>Bruk separat oppdateringsmappe:\n Gjør det mulig å installere spilloppdateringer i en egen mappe for enkel administrasjon.\nDette kan gjøres manuelt ved å legge til den utpakkede oppdateringen, til spillmappa med navnet "CUSA00000-UPDATE" der CUSA-ID-en samsvarer med spillets-ID.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting.</source>
|
||||
@ -1561,7 +1573,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile.</source>
|
||||
<translation>Aktiver Discord Rich Presence:\nViser emulatorikonet og relevant informasjon på Discord-profilen din.</translation>
|
||||
<translation>Bruk Discord Rich Presence:\nViser emulatorikonet og relevant informasjon på Discord-profilen din.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Username:\nSets the PS4's account username, which may be displayed by some games.</source>
|
||||
@ -1589,7 +1601,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI.</source>
|
||||
<translation>Spille tittelmusikk:\nHvis et spill støtter det, så aktiveres det spesiell musikk når du velger spillet i menyen.</translation>
|
||||
<translation>Spill av tittelmusikk:\nHvis et spill støtter det, så brukes det spesiell musikk når du velger spillet i menyen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</source>
|
||||
@ -1609,7 +1621,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</source>
|
||||
<translation>Vis kompatibilitets-data:\nViser informasjon om spillkompatibilitet i tabellvisning. Aktiver "Oppdater kompatibilitets-data ved oppstart" for oppdatert informasjon.</translation>
|
||||
<translation>Vis kompatibilitets-data:\nViser informasjon om spillkompatibilitet i tabellvisning. Bruk "Oppdater kompatibilitets-data ved oppstart" for oppdatert informasjon.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</source>
|
||||
@ -1649,7 +1661,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it.</source>
|
||||
<translation>Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlisten,\neller velg "Auto Select" for å velge automatisk.</translation>
|
||||
<translation>Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlisten,\neller "Velg automatisk".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution.</source>
|
||||
@ -1661,15 +1673,15 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render.</source>
|
||||
<translation>Aktiver skyggeleggerdumping:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis.</translation>
|
||||
<translation>Bruk skyggeleggerdumping:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card.</source>
|
||||
<translation>Aktiver Null GPU:\nFor teknisk feilsøking deaktiverer spillets-gjengivelse som om det ikke var noe grafikkort.</translation>
|
||||
<translation>Bruk Null GPU:\nFor teknisk feilsøking deaktiverer spillets-gjengivelse som om det ikke var noen grafikkort.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format.</source>
|
||||
<translation type="unfinished">Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format.</translation>
|
||||
<translation>Bruk HDR:\nTillater bruk av HDR i spill som støtter det.\nSkjermen din må ha støtte for BT2020 PQ fargerom og RGB10A2 swapchain-format.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game Folders:\nThe list of folders to check for installed games.</source>
|
||||
@ -1685,27 +1697,27 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory.</source>
|
||||
<translation>Aktiver feilrettingsdumping:\nLagrer import- og eksport-symbolene og filoverskriftsinformasjonen til det nåværende kjørende PS4-programmet i en katalog.</translation>
|
||||
<translation>Bruk feilrettingsdumping:\nLagrer import- og eksport-symbolene og filoverskrifts-informasjonen til det nåværende kjørende PS4-programmet i en mappe.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation.</source>
|
||||
<translation>Aktiver Vulkan Validation Layers:\nAktiverer et system som validerer tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd.</translation>
|
||||
<translation>Bruk Vulkan Validation Layers:\nAktiverer et system som bekrefter tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand.\n Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation.</source>
|
||||
<translation>Aktiver Vulkan synkronisering validering:\nAktiverer et system som validerer frekvens tiden av Vulkan-gjengivelsensoppgaver. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd.</translation>
|
||||
<translation>Bruk Vulkan synkronisering validering:\nEt system som bekrefter frekvens tiden av Vulkan-gjengivelseoppgaver.\nDette vil redusere ytelsen og sannsynligvis endre emulatorens atferd.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame.</source>
|
||||
<translation>Aktiver RenderDoc feilsøking:\nHvis aktivert, vil emulatoren gi kompatibilitet med RenderDoc for å tillate opptak og analyse av det nåværende gjengitte bildet.</translation>
|
||||
<translation>Bruk RenderDoc feilsøking:\nHvis brukt, vil emulatoren gi kompatibilitet med RenderDoc for å tillate opptak og analyse av det nåværende gjengitte bildet.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10).</source>
|
||||
<translation>Lagre skyggeleggere:\nDu trenger dette aktivert for å redigere skyggeleggerne med feilsøkingsmenyen (Ctrl + F10).</translation>
|
||||
<translation>Lagre skyggeleggere:\nDu trenger dette for å redigere skyggeleggerne med feilsøkingsmenyen (Ctrl + F10).</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work.</source>
|
||||
<translation>Krasjdiagnostikk:\nOppretter en .yaml-fil med informasjon om Vulkan-tilstanden ved krasj.\nNyttig for feilsøking 'Device lost' feil. Hvis du har dette aktivert, burde du aktivere vert OG gjestefeilsøkingsmarkører.\nFunker ikke med Intel GPU-er.\nDu trenger Vulkan Validation Layers og Vulkan SDK for at dette skal fungere.</translation>
|
||||
<translation>Krasjdiagnostikk:\nOppretter en .yaml-fil med informasjon om Vulkan-tilstanden ved krasj.\nNyttig for feilsøking 'Device lost' feil. Hvis dette brukes, burde du aktivere vert OG gjestefeilsøkingsmarkører.\nFunker ikke med Intel GPU-er.\nDu trenger Vulkan Validation Layers og Vulkan SDK for at dette skal fungere.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes.</source>
|
||||
@ -1713,11 +1725,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc.</source>
|
||||
<translation>Vertsfeilsøkingsmarkører:\nSetter inn emulator-side informasjon som markører for spesifikke AMDGPU-kommandoer rundt Vulkan-kommandoer, i tillegg til å gi ressurser feilrettingsnavn.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc.</translation>
|
||||
<translation>Vertsfeilsøkingsmarkører:\nSetter inn emulator-side informasjon som markører for spesifikke AMDGPU-kommandoer rundt Vulkan-kommandoer, i tillegg til å gi ressurser feilrettingsnavn.\nHvis dette brukes, burde du også bruke krasjdiagnostikk.\nNyttig for programmer som RenderDoc.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc.</source>
|
||||
<translation>Gjestefeilsøkingsmarkører:\nSetter inn eventuelle feilsøkingsmarkører spillet selv har lagt til kommandobufferen.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc.</translation>
|
||||
<translation>Gjestefeilsøkingsmarkører:\nSetter inn eventuelle feilsøkingsmarkører spillet selv har lagt til kommandobufferen.\nHvis dette brukes, burde du også bruke krasjdiagnostikk.\nNyttig for programmer som RenderDoc.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Data Path:\nThe folder where game save data will be saved.</source>
|
||||
@ -1729,11 +1741,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Borderless</source>
|
||||
<translation type="unfinished">Borderless</translation>
|
||||
<translation>Kantløs</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>True</source>
|
||||
<translation type="unfinished">True</translation>
|
||||
<translation>Sant</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Release</source>
|
||||
@ -1745,11 +1757,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the volume of the background music.</source>
|
||||
<translation type="unfinished">Set the volume of the background music.</translation>
|
||||
<translation>Sett volumet til bakgrunnsmusikken.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Motion Controls</source>
|
||||
<translation type="unfinished">Enable Motion Controls</translation>
|
||||
<translation>Bruk bevegelseskontroller</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Data Path</source>
|
||||
@ -1769,7 +1781,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto Select</source>
|
||||
<translation type="unfinished">Auto Select</translation>
|
||||
<translation>Velg automatisk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Directory to install games</source>
|
||||
@ -1777,7 +1789,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Directory to save data</source>
|
||||
<translation type="unfinished">Directory to save data</translation>
|
||||
<translation>Mappe for lagring av data</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation type="unfinished">About shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation type="unfinished">shadPS4 is an experimental open-source emulator for the PlayStation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished">Configure Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>O programie</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4 to eksperymentalny otwartoźródłowy emulator konsoli PlayStation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished">Configure Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,17 +9,13 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>Sobre o shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation>shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4 é um emulador experimental de código-fonte aberto para o PlayStation 4.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This software should not be used to play games you have not legally obtained.</source>
|
||||
<translation>Este programa não deve ser usado para jogar jogos piratas.</translation>
|
||||
<translation>Este programa não deve ser usado para jogar jogos que tenham sido obtidos ilegalmente.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -281,7 +277,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>No download URL found for the specified asset.</source>
|
||||
<translation>Nenhuma URL de download encontrada para o asset especificado.</translation>
|
||||
<translation>Nenhuma URL de download encontrada para o recurso especificado.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Your version is already up to date!</source>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation>Configurar Controles</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation>Configurações do Controle</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation>Direcional</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation>L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation>Controles T/M</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation>Editor T/M</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation>Voltar</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation>Analógico Direito</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation>Ajuste de Cores</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation>R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation>G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation>B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation>Substituir cor da Lightbar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation>Substituir a Cor</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation>Dados Salvos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation>Visualizador de SFO para </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
@ -1585,7 +1597,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Background Image:\nControl the opacity of the game background image.</source>
|
||||
<translation>Imagem de Fundo:\nControla a opacidade da imagem de fundo do jogo.</translation>
|
||||
<translation>Imagem de Fundo:\nControla a transparência da imagem de fundo do jogo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI.</source>
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation type="unfinished">About shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation type="unfinished">shadPS4 is an experimental open-source emulator for the PlayStation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished">Configure Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>О shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation>shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4 это экспериментальный эмулятор с открытым исходным кодом для PlayStation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation>Настроить управление</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation>Настройки управления</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation>Крестовина</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation>L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation>Управление KBM</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation>Редактор KBM</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation>Назад</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation>Правый стик</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation>Настройка цвета</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation>R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation>G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation>B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation>Заменить цвет световой панели</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation>Заменить цвет</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation>Сохранения</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation>Просмотр SFO для</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>Rreth shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation>shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4 është një emulator eksperimental me burim të hapur për PlayStation 4.</translation>
|
||||
@ -325,7 +321,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide Changelog</source>
|
||||
<translation>Fshih ndryshimet</translation>
|
||||
<translation>Fshih Ndryshimet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changes</source>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation>Konfiguro kontrollet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation>Cilësimet e kontrollit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation>D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation>L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation>Kontrollet Tastierë/Mi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation>Redaktues Tastierë/Mi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation>Mbrapa</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation>Leva e djathtë</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation>Rregullimi i Ngjyrave</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation>R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation>G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation>B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation>Zëvendëso Ngjyrën e Shiritit të ndriçimit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation>Zëvendëso Ngjyrën</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -757,11 +765,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete Game</source>
|
||||
<translation>Fshi lojën</translation>
|
||||
<translation>Fshi Lojën</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete Update</source>
|
||||
<translation>Fshi përditësimin</translation>
|
||||
<translation>Fshi Përditësimin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete DLC</source>
|
||||
@ -837,7 +845,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete Save Data</source>
|
||||
<translation>Fshi të dhënat e ruajtjes</translation>
|
||||
<translation>Fshi të Dhënat e Ruajtjes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This game has no update folder to open!</source>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation>Të dhënat e ruajtjes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation>Shikuesi SFO për </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
@ -911,7 +923,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Open shadPS4 Folder</source>
|
||||
<translation>Hap dosjen e shadPS4</translation>
|
||||
<translation>Hap Dosjen e shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exit</source>
|
||||
@ -1261,7 +1273,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Emulator Language</source>
|
||||
<translation>Gjuha e emulatorit</translation>
|
||||
<translation>Gjuha e Emulatorit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Emulator</source>
|
||||
@ -1737,7 +1749,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Release</source>
|
||||
<translation>Botimi</translation>
|
||||
<translation>Release</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Nightly</source>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>Om shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation>shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4 är en experimentell emulator för PlayStation 4 baserad på öppen källkod.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation>Konfigurera kontroller</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation>Kontrollerinställningar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation>Riktningsknappar</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation>L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation>KBM-kontroller</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation>KBM-redigerare</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation>Bakåt</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation>Höger spak</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation>Färgjustering</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation>R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation>G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation>B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation>Åsidosätt ljusrampens färg</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation>Åsidosätt färg</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation>Sparat data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation>SFO-visare för </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>shadPS4 Hakkında</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation>shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4, PlayStation 4 için deneysel bir açık kaynak kodlu emülatördür.</translation>
|
||||
@ -26,7 +22,7 @@
|
||||
<name>CheatsPatches</name>
|
||||
<message>
|
||||
<source>Cheats / Patches for </source>
|
||||
<translation type="unfinished">Cheats / Patches for </translation>
|
||||
<translation>Hileler / Yamalar: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n</source>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation>Kontrolleri Yapılandır</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation>Kontrol Ayarları</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation>Yön Düğmeleri</translation>
|
||||
@ -439,7 +431,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Left Stick Deadzone (def:2 max:127)</source>
|
||||
<translation type="unfinished">Left Stick Deadzone (def:2 max:127)</translation>
|
||||
<translation>Sol Analog Ölü Bölgesi (şu an:2, en çok:127)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Left Deadzone</source>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation>L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation>Geri</translation>
|
||||
@ -523,7 +507,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Right Stick Deadzone (def:2, max:127)</source>
|
||||
<translation type="unfinished">Right Stick Deadzone (def:2, max:127)</translation>
|
||||
<translation>Sağ Analog Ölü Bölgesi (şu an:2, en çok:127)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Right Deadzone</source>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation>Sağ Analog</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation>Renk Ayarları</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation>K:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation>Y:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation>M:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation>Işıklı Çubuk Rengini Geçersiz Kıl</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation>Rengi Geçersiz Kıl</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -825,11 +833,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete %1</source>
|
||||
<translation type="unfinished">Delete %1</translation>
|
||||
<translation>Sil: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Are you sure you want to delete %1's %2 directory?</source>
|
||||
<translation type="unfinished">Are you sure you want to delete %1's %2 directory?</translation>
|
||||
<translation>%1%2 adlı oyunun dizinini silmek istediğinize emin misiniz?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Update Folder</source>
|
||||
@ -845,7 +853,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to convert icon.</source>
|
||||
<translation type="unfinished">Failed to convert icon.</translation>
|
||||
<translation>Simge dönüştürülemedi.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This game has no save data to delete!</source>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation>Kayıt Verisi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation>SFO Görüntüleyici: </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
@ -864,7 +876,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Select which directory you want to install to.</source>
|
||||
<translation type="unfinished">Select which directory you want to install to.</translation>
|
||||
<translation>Hangi dizine yüklemek istediğinizi seçin.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Install All Queued to Selected Folder</source>
|
||||
@ -872,7 +884,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete PKG File on Install</source>
|
||||
<translation type="unfinished">Delete PKG File on Install</translation>
|
||||
<translation>Yüklemede PKG Dosyasını Sil</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -1163,7 +1175,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>PKG is a patch or DLC, please install the game first!</source>
|
||||
<translation type="unfinished">PKG is a patch or DLC, please install the game first!</translation>
|
||||
<translation>PKG bir yama ya da indirilebilir içerik, lütfen önce oyunu yükleyin!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Game is already running!</source>
|
||||
@ -1194,7 +1206,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Installed</source>
|
||||
<translation type="unfinished">Installed</translation>
|
||||
<translation>Yüklü</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Size</source>
|
||||
@ -1433,7 +1445,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Crash Diagnostics</source>
|
||||
<translation type="unfinished">Enable Crash Diagnostics</translation>
|
||||
<translation>Çökme Tanılamalarını Etkinleştir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Collect Shaders</source>
|
||||
@ -1593,7 +1605,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</source>
|
||||
<translation type="unfinished">Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
|
||||
<translation>Kupa Açılır Pencerelerini Devre Dışı Bırak:\nOyun için kupa bildirimlerini devre dışı bırakın. Kupa ilerlemesi hala Kupa Görüntüleyicisi kullanılarak takip edilebilir (ana menüde oyuna sağ tıklayın).</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse.</source>
|
||||
@ -1609,7 +1621,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</source>
|
||||
<translation type="unfinished">Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
|
||||
<translation>Uyumluluk Verilerini Göster:\nOyun uyumluluk bilgilerini tablo görünümünde görüntüler. Güncel bilgileri almak için "Başlangıçta Uyumluluk Veritabanını Güncelle"yi etkinleştirin.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</source>
|
||||
@ -1701,7 +1713,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10).</source>
|
||||
<translation type="unfinished">Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10).</translation>
|
||||
<translation>Gölgelendiricileri Topla:\nHata ayıklama menüsüyle (Ctrl + F10) gölgelendiricileri düzenlemek için bunun etkinleştirilmesi gerekir.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work.</source>
|
||||
@ -1709,7 +1721,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes.</source>
|
||||
<translation type="unfinished">Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes.</translation>
|
||||
<translation>GPU Arabelleklerini Kopyala:\nGPU gönderimlerini içeren yarış koşullarının etrafından dolaşır.\nPM4 tip 0 çökmelerine yardımcı olabilir veya olmayabilir.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc.</source>
|
||||
@ -1717,7 +1729,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc.</source>
|
||||
<translation type="unfinished">Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc.</translation>
|
||||
<translation>Konuk Hata Ayıklama İşaretleyicileri\nOyunun kendisinin komut arabelleğine eklediği tüm hata ayıklama işaretlerini ekler.\nBunu etkinleştirdiyseniz, Çökme Tanılamalarını etkinleştirmeniz gerekir.\nRenderDoc gibi programlar için kullanışlıdır.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Data Path:\nThe folder where game save data will be saved.</source>
|
||||
@ -1725,7 +1737,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse:\nBrowse for a folder to set as the save data path.</source>
|
||||
<translation type="unfinished">Browse:\nBrowse for a folder to set as the save data path.</translation>
|
||||
<translation>Gözat:\nVerileri kaydetme yolu olarak ayarlamak için bir klasöre göz atın.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Borderless</source>
|
||||
@ -1733,7 +1745,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>True</source>
|
||||
<translation type="unfinished">True</translation>
|
||||
<translation>Gerçek Ekran</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Release</source>
|
||||
@ -1741,7 +1753,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Nightly</source>
|
||||
<translation type="unfinished">Nightly</translation>
|
||||
<translation>Günlük</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the volume of the background music.</source>
|
||||
@ -1749,7 +1761,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Motion Controls</source>
|
||||
<translation type="unfinished">Enable Motion Controls</translation>
|
||||
<translation>Hareket Kontrollerini Etkinleştir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Data Path</source>
|
||||
@ -1769,7 +1781,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto Select</source>
|
||||
<translation type="unfinished">Auto Select</translation>
|
||||
<translation>Otomatik Seç</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Directory to install games</source>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>Про shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4 - це експериментальний емулятор з відкритим вихідним кодом для PlayStation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished">Configure Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation>Збереження</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>Về shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4 là một trình giả lập thử nghiệm mã nguồn mở cho PlayStation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation>Cấu hình điều khiển</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation>Cài đặt điều khiển</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation>关于 shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation>shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation>shadPS4 是一款实验性质的开源 PlayStation 4 模拟器软件。</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation>配置按键</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation>按键配置</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation>D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation>L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation>键鼠</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation>键鼠配置</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation>Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation>右摇杆</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation>颜色调整</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation>红:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation>绿:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation>蓝:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation>覆盖灯条颜色</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation>覆盖颜色</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation>存档数据</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation>SFO 查看器 - </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -9,10 +9,6 @@
|
||||
<source>About shadPS4</source>
|
||||
<translation type="unfinished">About shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4</source>
|
||||
<translation type="unfinished">shadPS4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>shadPS4 is an experimental open-source emulator for the PlayStation 4.</source>
|
||||
<translation type="unfinished">shadPS4 is an experimental open-source emulator for the PlayStation 4.</translation>
|
||||
@ -413,10 +409,6 @@
|
||||
<source>Configure Controls</source>
|
||||
<translation type="unfinished">Configure Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Control Settings</source>
|
||||
<translation type="unfinished">Control Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>D-Pad</source>
|
||||
<translation type="unfinished">D-Pad</translation>
|
||||
@ -469,14 +461,6 @@
|
||||
<source>L2 / LT</source>
|
||||
<translation type="unfinished">L2 / LT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Controls</source>
|
||||
<translation type="unfinished">KBM Controls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KBM Editor</source>
|
||||
<translation type="unfinished">KBM Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Back</source>
|
||||
<translation type="unfinished">Back</translation>
|
||||
@ -533,6 +517,30 @@
|
||||
<source>Right Stick</source>
|
||||
<translation type="unfinished">Right Stick</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Color Adjustment</source>
|
||||
<translation type="unfinished">Color Adjustment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>R:</source>
|
||||
<translation type="unfinished">R:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>G:</source>
|
||||
<translation type="unfinished">G:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>B:</source>
|
||||
<translation type="unfinished">B:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Lightbar Color</source>
|
||||
<translation type="unfinished">Override Lightbar Color</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Override Color</source>
|
||||
<translation type="unfinished">Override Color</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ElfViewer</name>
|
||||
@ -855,6 +863,10 @@
|
||||
<source>Save Data</source>
|
||||
<translation type="unfinished">Save Data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SFO Viewer for </source>
|
||||
<translation type="unfinished">SFO Viewer for </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InstallDirSelect</name>
|
||||
|
@ -21,6 +21,28 @@ Id SharedAtomicU32(EmitContext& ctx, Id offset, Id value,
|
||||
return (ctx.*atomic_func)(ctx.U32[1], pointer, scope, semantics, value);
|
||||
}
|
||||
|
||||
Id BufferAtomicU32BoundsCheck(EmitContext& ctx, Id index, Id buffer_size, auto emit_func) {
|
||||
if (Sirit::ValidId(buffer_size)) {
|
||||
// Bounds checking enabled, wrap in a conditional branch to make sure that
|
||||
// the atomic is not mistakenly executed when the index is out of bounds.
|
||||
const Id in_bounds = ctx.OpULessThan(ctx.U1[1], index, buffer_size);
|
||||
const Id ib_label = ctx.OpLabel();
|
||||
const Id oob_label = ctx.OpLabel();
|
||||
const Id end_label = ctx.OpLabel();
|
||||
ctx.OpBranchConditional(in_bounds, ib_label, oob_label);
|
||||
ctx.AddLabel(ib_label);
|
||||
const Id ib_result = emit_func();
|
||||
ctx.OpBranch(end_label);
|
||||
ctx.AddLabel(oob_label);
|
||||
const Id oob_result = ctx.u32_zero_value;
|
||||
ctx.OpBranch(end_label);
|
||||
ctx.AddLabel(end_label);
|
||||
return ctx.OpPhi(ctx.U32[1], ib_result, ib_label, oob_result, oob_label);
|
||||
}
|
||||
// Bounds checking not enabled, just perform the atomic operation.
|
||||
return emit_func();
|
||||
}
|
||||
|
||||
Id BufferAtomicU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value,
|
||||
Id (Sirit::Module::*atomic_func)(Id, Id, Id, Id, Id)) {
|
||||
const auto& buffer = ctx.buffers[handle];
|
||||
@ -31,7 +53,9 @@ Id BufferAtomicU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id
|
||||
const auto [id, pointer_type] = buffer[EmitContext::BufferAlias::U32];
|
||||
const Id ptr = ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index);
|
||||
const auto [scope, semantics]{AtomicArgs(ctx)};
|
||||
return BufferAtomicU32BoundsCheck(ctx, index, buffer.size_dwords, [&] {
|
||||
return (ctx.*atomic_func)(ctx.U32[1], ptr, scope, semantics, value);
|
||||
});
|
||||
}
|
||||
|
||||
Id ImageAtomicU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value,
|
||||
|
@ -178,14 +178,21 @@ Id EmitReadConstBuffer(EmitContext& ctx, u32 handle, Id index) {
|
||||
index = ctx.OpIAdd(ctx.U32[1], index, buffer.offset_dwords);
|
||||
const auto [id, pointer_type] = buffer[BufferAlias::U32];
|
||||
const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index)};
|
||||
return ctx.OpLoad(ctx.U32[1], ptr);
|
||||
const Id result{ctx.OpLoad(ctx.U32[1], ptr)};
|
||||
|
||||
if (Sirit::ValidId(buffer.size_dwords)) {
|
||||
const Id in_bounds = ctx.OpULessThan(ctx.U1[1], index, buffer.size_dwords);
|
||||
return ctx.OpSelect(ctx.U32[1], in_bounds, result, ctx.u32_zero_value);
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
Id EmitReadStepRate(EmitContext& ctx, int rate_idx) {
|
||||
const auto index{rate_idx == 0 ? PushData::Step0Index : PushData::Step1Index};
|
||||
return ctx.OpLoad(
|
||||
ctx.U32[1], ctx.OpAccessChain(ctx.TypePointer(spv::StorageClass::PushConstant, ctx.U32[1]),
|
||||
ctx.push_data_block,
|
||||
rate_idx == 0 ? ctx.u32_zero_value : ctx.u32_one_value));
|
||||
ctx.push_data_block, ctx.ConstU32(index)));
|
||||
}
|
||||
|
||||
static Id EmitGetAttributeForGeometry(EmitContext& ctx, IR::Attribute attr, u32 comp, Id index) {
|
||||
@ -402,8 +409,30 @@ void EmitSetPatch(EmitContext& ctx, IR::Patch patch, Id value) {
|
||||
ctx.OpStore(pointer, value);
|
||||
}
|
||||
|
||||
template <u32 N>
|
||||
static Id EmitLoadBufferBoundsCheck(EmitContext& ctx, Id index, Id buffer_size, Id result,
|
||||
bool is_float) {
|
||||
if (Sirit::ValidId(buffer_size)) {
|
||||
// Bounds checking enabled, wrap in a select.
|
||||
const auto result_type = is_float ? ctx.F32[N] : ctx.U32[N];
|
||||
auto compare_index = index;
|
||||
auto zero_value = is_float ? ctx.f32_zero_value : ctx.u32_zero_value;
|
||||
if (N > 1) {
|
||||
compare_index = ctx.OpIAdd(ctx.U32[1], index, ctx.ConstU32(N - 1));
|
||||
std::array<Id, N> zero_ids;
|
||||
zero_ids.fill(zero_value);
|
||||
zero_value = ctx.ConstantComposite(result_type, zero_ids);
|
||||
}
|
||||
const Id in_bounds = ctx.OpULessThan(ctx.U1[1], compare_index, buffer_size);
|
||||
return ctx.OpSelect(result_type, in_bounds, result, zero_value);
|
||||
}
|
||||
// Bounds checking not enabled, just return the plain value.
|
||||
return result;
|
||||
}
|
||||
|
||||
template <u32 N, BufferAlias alias>
|
||||
static Id EmitLoadBufferB32xN(EmitContext& ctx, u32 handle, Id address) {
|
||||
static Id EmitLoadBufferB32xN(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
|
||||
const auto flags = inst->Flags<IR::BufferInstInfo>();
|
||||
const auto& spv_buffer = ctx.buffers[handle];
|
||||
if (Sirit::ValidId(spv_buffer.offset)) {
|
||||
address = ctx.OpIAdd(ctx.U32[1], address, spv_buffer.offset);
|
||||
@ -411,31 +440,42 @@ static Id EmitLoadBufferB32xN(EmitContext& ctx, u32 handle, Id address) {
|
||||
const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(2u));
|
||||
const auto& data_types = alias == BufferAlias::U32 ? ctx.U32 : ctx.F32;
|
||||
const auto [id, pointer_type] = spv_buffer[alias];
|
||||
if constexpr (N == 1) {
|
||||
const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index)};
|
||||
return ctx.OpLoad(data_types[1], ptr);
|
||||
} else {
|
||||
|
||||
boost::container::static_vector<Id, N> ids;
|
||||
for (u32 i = 0; i < N; i++) {
|
||||
const Id index_i = ctx.OpIAdd(ctx.U32[1], index, ctx.ConstU32(i));
|
||||
const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index_i)};
|
||||
ids.push_back(ctx.OpLoad(data_types[1], ptr));
|
||||
}
|
||||
return ctx.OpCompositeConstruct(data_types[N], ids);
|
||||
const Id index_i = i == 0 ? index : ctx.OpIAdd(ctx.U32[1], index, ctx.ConstU32(i));
|
||||
const Id ptr_i = ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index_i);
|
||||
const Id result_i = ctx.OpLoad(data_types[1], ptr_i);
|
||||
if (!flags.typed) {
|
||||
// Untyped loads have bounds checking per-component.
|
||||
ids.push_back(EmitLoadBufferBoundsCheck<1>(ctx, index_i, spv_buffer.size_dwords,
|
||||
result_i, alias == BufferAlias::F32));
|
||||
} else {
|
||||
ids.push_back(result_i);
|
||||
}
|
||||
}
|
||||
|
||||
Id EmitLoadBufferU8(EmitContext& ctx, IR::Inst*, u32 handle, Id address) {
|
||||
const Id result = N == 1 ? ids[0] : ctx.OpCompositeConstruct(data_types[N], ids);
|
||||
if (flags.typed) {
|
||||
// Typed loads have single bounds check for the whole load.
|
||||
return EmitLoadBufferBoundsCheck<N>(ctx, index, spv_buffer.size_dwords, result,
|
||||
alias == BufferAlias::F32);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
Id EmitLoadBufferU8(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
|
||||
const auto& spv_buffer = ctx.buffers[handle];
|
||||
if (Sirit::ValidId(spv_buffer.offset)) {
|
||||
address = ctx.OpIAdd(ctx.U32[1], address, spv_buffer.offset);
|
||||
}
|
||||
const auto [id, pointer_type] = spv_buffer[BufferAlias::U8];
|
||||
const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, address)};
|
||||
return ctx.OpUConvert(ctx.U32[1], ctx.OpLoad(ctx.U8, ptr));
|
||||
const Id result{ctx.OpUConvert(ctx.U32[1], ctx.OpLoad(ctx.U8, ptr))};
|
||||
return EmitLoadBufferBoundsCheck<1>(ctx, address, spv_buffer.size, result, false);
|
||||
}
|
||||
|
||||
Id EmitLoadBufferU16(EmitContext& ctx, IR::Inst*, u32 handle, Id address) {
|
||||
Id EmitLoadBufferU16(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
|
||||
const auto& spv_buffer = ctx.buffers[handle];
|
||||
if (Sirit::ValidId(spv_buffer.offset)) {
|
||||
address = ctx.OpIAdd(ctx.U32[1], address, spv_buffer.offset);
|
||||
@ -443,47 +483,73 @@ Id EmitLoadBufferU16(EmitContext& ctx, IR::Inst*, u32 handle, Id address) {
|
||||
const auto [id, pointer_type] = spv_buffer[BufferAlias::U16];
|
||||
const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(1u));
|
||||
const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index)};
|
||||
return ctx.OpUConvert(ctx.U32[1], ctx.OpLoad(ctx.U16, ptr));
|
||||
const Id result{ctx.OpUConvert(ctx.U32[1], ctx.OpLoad(ctx.U16, ptr))};
|
||||
return EmitLoadBufferBoundsCheck<1>(ctx, index, spv_buffer.size_shorts, result, false);
|
||||
}
|
||||
|
||||
Id EmitLoadBufferU32(EmitContext& ctx, IR::Inst*, u32 handle, Id address) {
|
||||
return EmitLoadBufferB32xN<1, BufferAlias::U32>(ctx, handle, address);
|
||||
Id EmitLoadBufferU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
|
||||
return EmitLoadBufferB32xN<1, BufferAlias::U32>(ctx, inst, handle, address);
|
||||
}
|
||||
|
||||
Id EmitLoadBufferU32x2(EmitContext& ctx, IR::Inst*, u32 handle, Id address) {
|
||||
return EmitLoadBufferB32xN<2, BufferAlias::U32>(ctx, handle, address);
|
||||
Id EmitLoadBufferU32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
|
||||
return EmitLoadBufferB32xN<2, BufferAlias::U32>(ctx, inst, handle, address);
|
||||
}
|
||||
|
||||
Id EmitLoadBufferU32x3(EmitContext& ctx, IR::Inst*, u32 handle, Id address) {
|
||||
return EmitLoadBufferB32xN<3, BufferAlias::U32>(ctx, handle, address);
|
||||
Id EmitLoadBufferU32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
|
||||
return EmitLoadBufferB32xN<3, BufferAlias::U32>(ctx, inst, handle, address);
|
||||
}
|
||||
|
||||
Id EmitLoadBufferU32x4(EmitContext& ctx, IR::Inst*, u32 handle, Id address) {
|
||||
return EmitLoadBufferB32xN<4, BufferAlias::U32>(ctx, handle, address);
|
||||
Id EmitLoadBufferU32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
|
||||
return EmitLoadBufferB32xN<4, BufferAlias::U32>(ctx, inst, handle, address);
|
||||
}
|
||||
|
||||
Id EmitLoadBufferF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
|
||||
return EmitLoadBufferB32xN<1, BufferAlias::F32>(ctx, handle, address);
|
||||
return EmitLoadBufferB32xN<1, BufferAlias::F32>(ctx, inst, handle, address);
|
||||
}
|
||||
|
||||
Id EmitLoadBufferF32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
|
||||
return EmitLoadBufferB32xN<2, BufferAlias::F32>(ctx, handle, address);
|
||||
return EmitLoadBufferB32xN<2, BufferAlias::F32>(ctx, inst, handle, address);
|
||||
}
|
||||
|
||||
Id EmitLoadBufferF32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
|
||||
return EmitLoadBufferB32xN<3, BufferAlias::F32>(ctx, handle, address);
|
||||
return EmitLoadBufferB32xN<3, BufferAlias::F32>(ctx, inst, handle, address);
|
||||
}
|
||||
|
||||
Id EmitLoadBufferF32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
|
||||
return EmitLoadBufferB32xN<4, BufferAlias::F32>(ctx, handle, address);
|
||||
return EmitLoadBufferB32xN<4, BufferAlias::F32>(ctx, inst, handle, address);
|
||||
}
|
||||
|
||||
Id EmitLoadBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) {
|
||||
UNREACHABLE_MSG("SPIR-V instruction");
|
||||
}
|
||||
|
||||
template <u32 N>
|
||||
void EmitStoreBufferBoundsCheck(EmitContext& ctx, Id index, Id buffer_size, auto emit_func) {
|
||||
if (Sirit::ValidId(buffer_size)) {
|
||||
// Bounds checking enabled, wrap in a conditional branch.
|
||||
auto compare_index = index;
|
||||
if (N > 1) {
|
||||
index = ctx.OpIAdd(ctx.U32[1], index, ctx.ConstU32(N - 1));
|
||||
}
|
||||
const Id in_bounds = ctx.OpULessThan(ctx.U1[1], compare_index, buffer_size);
|
||||
const Id in_bounds_label = ctx.OpLabel();
|
||||
const Id merge_label = ctx.OpLabel();
|
||||
ctx.OpSelectionMerge(merge_label, spv::SelectionControlMask::MaskNone);
|
||||
ctx.OpBranchConditional(in_bounds, in_bounds_label, merge_label);
|
||||
ctx.AddLabel(in_bounds_label);
|
||||
emit_func();
|
||||
ctx.OpBranch(merge_label);
|
||||
ctx.AddLabel(merge_label);
|
||||
return;
|
||||
}
|
||||
// Bounds checking not enabled, just perform the store.
|
||||
emit_func();
|
||||
}
|
||||
|
||||
template <u32 N, BufferAlias alias>
|
||||
static void EmitStoreBufferB32xN(EmitContext& ctx, u32 handle, Id address, Id value) {
|
||||
static void EmitStoreBufferB32xN(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address,
|
||||
Id value) {
|
||||
const auto flags = inst->Flags<IR::BufferInstInfo>();
|
||||
const auto& spv_buffer = ctx.buffers[handle];
|
||||
if (Sirit::ValidId(spv_buffer.offset)) {
|
||||
address = ctx.OpIAdd(ctx.U32[1], address, spv_buffer.offset);
|
||||
@ -491,16 +557,28 @@ static void EmitStoreBufferB32xN(EmitContext& ctx, u32 handle, Id address, Id va
|
||||
const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(2u));
|
||||
const auto& data_types = alias == BufferAlias::U32 ? ctx.U32 : ctx.F32;
|
||||
const auto [id, pointer_type] = spv_buffer[alias];
|
||||
if constexpr (N == 1) {
|
||||
const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index)};
|
||||
ctx.OpStore(ptr, value);
|
||||
} else {
|
||||
|
||||
auto store = [&] {
|
||||
for (u32 i = 0; i < N; i++) {
|
||||
const Id index_i = ctx.OpIAdd(ctx.U32[1], index, ctx.ConstU32(i));
|
||||
const Id ptr = ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index_i);
|
||||
ctx.OpStore(ptr, ctx.OpCompositeExtract(data_types[1], value, i));
|
||||
const Id index_i = i == 0 ? index : ctx.OpIAdd(ctx.U32[1], index, ctx.ConstU32(i));
|
||||
const Id ptr_i = ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index_i);
|
||||
const Id value_i = N == 1 ? value : ctx.OpCompositeExtract(data_types[1], value, i);
|
||||
auto store_i = [&]() { ctx.OpStore(ptr_i, value_i); };
|
||||
if (!flags.typed) {
|
||||
// Untyped stores have bounds checking per-component.
|
||||
EmitStoreBufferBoundsCheck<1>(ctx, index_i, spv_buffer.size_dwords, store_i);
|
||||
} else {
|
||||
store_i();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (flags.typed) {
|
||||
// Typed stores have single bounds check for the whole store.
|
||||
EmitStoreBufferBoundsCheck<N>(ctx, index, spv_buffer.size_dwords, store);
|
||||
} else {
|
||||
store();
|
||||
}
|
||||
}
|
||||
|
||||
void EmitStoreBufferU8(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) {
|
||||
@ -510,7 +588,8 @@ void EmitStoreBufferU8(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id v
|
||||
}
|
||||
const auto [id, pointer_type] = spv_buffer[BufferAlias::U8];
|
||||
const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, address)};
|
||||
ctx.OpStore(ptr, ctx.OpUConvert(ctx.U8, value));
|
||||
const Id result{ctx.OpUConvert(ctx.U8, value)};
|
||||
EmitStoreBufferBoundsCheck<1>(ctx, address, spv_buffer.size, [&] { ctx.OpStore(ptr, result); });
|
||||
}
|
||||
|
||||
void EmitStoreBufferU16(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) {
|
||||
@ -521,39 +600,41 @@ void EmitStoreBufferU16(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id
|
||||
const auto [id, pointer_type] = spv_buffer[BufferAlias::U16];
|
||||
const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(1u));
|
||||
const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index)};
|
||||
ctx.OpStore(ptr, ctx.OpUConvert(ctx.U16, value));
|
||||
const Id result{ctx.OpUConvert(ctx.U16, value)};
|
||||
EmitStoreBufferBoundsCheck<1>(ctx, index, spv_buffer.size_shorts,
|
||||
[&] { ctx.OpStore(ptr, result); });
|
||||
}
|
||||
|
||||
void EmitStoreBufferU32(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) {
|
||||
EmitStoreBufferB32xN<1, BufferAlias::U32>(ctx, handle, address, value);
|
||||
void EmitStoreBufferU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) {
|
||||
EmitStoreBufferB32xN<1, BufferAlias::U32>(ctx, inst, handle, address, value);
|
||||
}
|
||||
|
||||
void EmitStoreBufferU32x2(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) {
|
||||
EmitStoreBufferB32xN<2, BufferAlias::U32>(ctx, handle, address, value);
|
||||
void EmitStoreBufferU32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) {
|
||||
EmitStoreBufferB32xN<2, BufferAlias::U32>(ctx, inst, handle, address, value);
|
||||
}
|
||||
|
||||
void EmitStoreBufferU32x3(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) {
|
||||
EmitStoreBufferB32xN<3, BufferAlias::U32>(ctx, handle, address, value);
|
||||
void EmitStoreBufferU32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) {
|
||||
EmitStoreBufferB32xN<3, BufferAlias::U32>(ctx, inst, handle, address, value);
|
||||
}
|
||||
|
||||
void EmitStoreBufferU32x4(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) {
|
||||
EmitStoreBufferB32xN<4, BufferAlias::U32>(ctx, handle, address, value);
|
||||
void EmitStoreBufferU32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) {
|
||||
EmitStoreBufferB32xN<4, BufferAlias::U32>(ctx, inst, handle, address, value);
|
||||
}
|
||||
|
||||
void EmitStoreBufferF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) {
|
||||
EmitStoreBufferB32xN<1, BufferAlias::F32>(ctx, handle, address, value);
|
||||
EmitStoreBufferB32xN<1, BufferAlias::F32>(ctx, inst, handle, address, value);
|
||||
}
|
||||
|
||||
void EmitStoreBufferF32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) {
|
||||
EmitStoreBufferB32xN<2, BufferAlias::F32>(ctx, handle, address, value);
|
||||
EmitStoreBufferB32xN<2, BufferAlias::F32>(ctx, inst, handle, address, value);
|
||||
}
|
||||
|
||||
void EmitStoreBufferF32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) {
|
||||
EmitStoreBufferB32xN<3, BufferAlias::F32>(ctx, handle, address, value);
|
||||
EmitStoreBufferB32xN<3, BufferAlias::F32>(ctx, inst, handle, address, value);
|
||||
}
|
||||
|
||||
void EmitStoreBufferF32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) {
|
||||
EmitStoreBufferB32xN<4, BufferAlias::F32>(ctx, handle, address, value);
|
||||
EmitStoreBufferB32xN<4, BufferAlias::F32>(ctx, inst, handle, address, value);
|
||||
}
|
||||
|
||||
void EmitStoreBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) {
|
||||
|
@ -14,7 +14,7 @@ void EmitPrologue(EmitContext& ctx) {
|
||||
if (ctx.info.loads.Get(IR::Attribute::WorkgroupIndex)) {
|
||||
ctx.DefineWorkgroupIndex();
|
||||
}
|
||||
ctx.DefineBufferOffsets();
|
||||
ctx.DefineBufferProperties();
|
||||
}
|
||||
|
||||
void ConvertDepthMode(EmitContext& ctx) {
|
||||
|
@ -192,8 +192,27 @@ EmitContext::SpirvAttribute EmitContext::GetAttributeInfo(AmdGpu::NumberFormat f
|
||||
UNREACHABLE_MSG("Invalid attribute type {}", fmt);
|
||||
}
|
||||
|
||||
void EmitContext::DefineBufferOffsets() {
|
||||
for (BufferDefinition& buffer : buffers) {
|
||||
Id EmitContext::GetBufferSize(const u32 sharp_idx) {
|
||||
const auto& srt_flatbuf = buffers.back();
|
||||
ASSERT(srt_flatbuf.buffer_type == BufferType::ReadConstUbo);
|
||||
const auto [id, pointer_type] = srt_flatbuf[BufferAlias::U32];
|
||||
|
||||
const auto rsrc1{
|
||||
OpLoad(U32[1], OpAccessChain(pointer_type, id, u32_zero_value, ConstU32(sharp_idx + 1)))};
|
||||
const auto rsrc2{
|
||||
OpLoad(U32[1], OpAccessChain(pointer_type, id, u32_zero_value, ConstU32(sharp_idx + 2)))};
|
||||
|
||||
const auto stride{OpBitFieldUExtract(U32[1], rsrc1, ConstU32(16u), ConstU32(14u))};
|
||||
const auto num_records{rsrc2};
|
||||
|
||||
const auto stride_zero{OpIEqual(U1[1], stride, u32_zero_value)};
|
||||
const auto stride_size{OpIMul(U32[1], num_records, stride)};
|
||||
return OpSelect(U32[1], stride_zero, num_records, stride_size);
|
||||
}
|
||||
|
||||
void EmitContext::DefineBufferProperties() {
|
||||
for (u32 i = 0; i < buffers.size(); i++) {
|
||||
BufferDefinition& buffer = buffers[i];
|
||||
if (buffer.buffer_type != BufferType::Guest) {
|
||||
continue;
|
||||
}
|
||||
@ -208,6 +227,22 @@ void EmitContext::DefineBufferOffsets() {
|
||||
Name(buffer.offset, fmt::format("buf{}_off", binding));
|
||||
buffer.offset_dwords = OpShiftRightLogical(U32[1], buffer.offset, ConstU32(2U));
|
||||
Name(buffer.offset_dwords, fmt::format("buf{}_dword_off", binding));
|
||||
|
||||
// Only need to load size if performing bounds checks and the buffer is both guest and not
|
||||
// inline.
|
||||
if (!profile.supports_robust_buffer_access && buffer.buffer_type == BufferType::Guest) {
|
||||
const BufferResource& desc = info.buffers[i];
|
||||
if (desc.sharp_idx == std::numeric_limits<u32>::max()) {
|
||||
buffer.size = ConstU32(desc.inline_cbuf.GetSize());
|
||||
} else {
|
||||
buffer.size = GetBufferSize(desc.sharp_idx);
|
||||
}
|
||||
Name(buffer.size, fmt::format("buf{}_size", binding));
|
||||
buffer.size_shorts = OpShiftRightLogical(U32[1], buffer.size, ConstU32(1U));
|
||||
Name(buffer.size_shorts, fmt::format("buf{}_short_size", binding));
|
||||
buffer.size_dwords = OpShiftRightLogical(U32[1], buffer.size, ConstU32(2U));
|
||||
Name(buffer.size_dwords, fmt::format("buf{}_dword_size", binding));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -589,34 +624,34 @@ void EmitContext::DefineOutputs() {
|
||||
|
||||
void EmitContext::DefinePushDataBlock() {
|
||||
// Create push constants block for instance steps rates
|
||||
const Id struct_type{Name(TypeStruct(U32[1], U32[1], U32[4], U32[4], U32[4], U32[4], U32[4],
|
||||
U32[4], F32[1], F32[1], F32[1], F32[1]),
|
||||
const Id struct_type{Name(TypeStruct(U32[1], U32[1], F32[1], F32[1], F32[1], F32[1], U32[4],
|
||||
U32[4], U32[4], U32[4], U32[4], U32[4]),
|
||||
"AuxData")};
|
||||
Decorate(struct_type, spv::Decoration::Block);
|
||||
MemberName(struct_type, 0, "sr0");
|
||||
MemberName(struct_type, 1, "sr1");
|
||||
MemberName(struct_type, Shader::PushData::BufOffsetIndex + 0, "buf_offsets0");
|
||||
MemberName(struct_type, Shader::PushData::BufOffsetIndex + 1, "buf_offsets1");
|
||||
MemberName(struct_type, Shader::PushData::UdRegsIndex + 0, "ud_regs0");
|
||||
MemberName(struct_type, Shader::PushData::UdRegsIndex + 1, "ud_regs1");
|
||||
MemberName(struct_type, Shader::PushData::UdRegsIndex + 2, "ud_regs2");
|
||||
MemberName(struct_type, Shader::PushData::UdRegsIndex + 3, "ud_regs3");
|
||||
MemberName(struct_type, Shader::PushData::XOffsetIndex, "xoffset");
|
||||
MemberName(struct_type, Shader::PushData::YOffsetIndex, "yoffset");
|
||||
MemberName(struct_type, Shader::PushData::XScaleIndex, "xscale");
|
||||
MemberName(struct_type, Shader::PushData::YScaleIndex, "yscale");
|
||||
MemberDecorate(struct_type, 0, spv::Decoration::Offset, 0U);
|
||||
MemberDecorate(struct_type, 1, spv::Decoration::Offset, 4U);
|
||||
MemberDecorate(struct_type, Shader::PushData::BufOffsetIndex + 0, spv::Decoration::Offset, 8U);
|
||||
MemberDecorate(struct_type, Shader::PushData::BufOffsetIndex + 1, spv::Decoration::Offset, 24U);
|
||||
MemberDecorate(struct_type, Shader::PushData::UdRegsIndex + 0, spv::Decoration::Offset, 40U);
|
||||
MemberDecorate(struct_type, Shader::PushData::UdRegsIndex + 1, spv::Decoration::Offset, 56U);
|
||||
MemberDecorate(struct_type, Shader::PushData::UdRegsIndex + 2, spv::Decoration::Offset, 72U);
|
||||
MemberDecorate(struct_type, Shader::PushData::UdRegsIndex + 3, spv::Decoration::Offset, 88U);
|
||||
MemberDecorate(struct_type, Shader::PushData::XOffsetIndex, spv::Decoration::Offset, 104U);
|
||||
MemberDecorate(struct_type, Shader::PushData::YOffsetIndex, spv::Decoration::Offset, 108U);
|
||||
MemberDecorate(struct_type, Shader::PushData::XScaleIndex, spv::Decoration::Offset, 112U);
|
||||
MemberDecorate(struct_type, Shader::PushData::YScaleIndex, spv::Decoration::Offset, 116U);
|
||||
MemberName(struct_type, PushData::Step0Index, "sr0");
|
||||
MemberName(struct_type, PushData::Step1Index, "sr1");
|
||||
MemberName(struct_type, PushData::XOffsetIndex, "xoffset");
|
||||
MemberName(struct_type, PushData::YOffsetIndex, "yoffset");
|
||||
MemberName(struct_type, PushData::XScaleIndex, "xscale");
|
||||
MemberName(struct_type, PushData::YScaleIndex, "yscale");
|
||||
MemberName(struct_type, PushData::UdRegsIndex + 0, "ud_regs0");
|
||||
MemberName(struct_type, PushData::UdRegsIndex + 1, "ud_regs1");
|
||||
MemberName(struct_type, PushData::UdRegsIndex + 2, "ud_regs2");
|
||||
MemberName(struct_type, PushData::UdRegsIndex + 3, "ud_regs3");
|
||||
MemberName(struct_type, PushData::BufOffsetIndex + 0, "buf_offsets0");
|
||||
MemberName(struct_type, PushData::BufOffsetIndex + 1, "buf_offsets1");
|
||||
MemberDecorate(struct_type, PushData::Step0Index, spv::Decoration::Offset, 0U);
|
||||
MemberDecorate(struct_type, PushData::Step1Index, spv::Decoration::Offset, 4U);
|
||||
MemberDecorate(struct_type, PushData::XOffsetIndex, spv::Decoration::Offset, 8U);
|
||||
MemberDecorate(struct_type, PushData::YOffsetIndex, spv::Decoration::Offset, 12U);
|
||||
MemberDecorate(struct_type, PushData::XScaleIndex, spv::Decoration::Offset, 16U);
|
||||
MemberDecorate(struct_type, PushData::YScaleIndex, spv::Decoration::Offset, 20U);
|
||||
MemberDecorate(struct_type, PushData::UdRegsIndex + 0, spv::Decoration::Offset, 24U);
|
||||
MemberDecorate(struct_type, PushData::UdRegsIndex + 1, spv::Decoration::Offset, 40U);
|
||||
MemberDecorate(struct_type, PushData::UdRegsIndex + 2, spv::Decoration::Offset, 56U);
|
||||
MemberDecorate(struct_type, PushData::UdRegsIndex + 3, spv::Decoration::Offset, 72U);
|
||||
MemberDecorate(struct_type, PushData::BufOffsetIndex + 0, spv::Decoration::Offset, 88U);
|
||||
MemberDecorate(struct_type, PushData::BufOffsetIndex + 1, spv::Decoration::Offset, 104U);
|
||||
push_data_block = DefineVar(struct_type, spv::StorageClass::PushConstant);
|
||||
Name(push_data_block, "push_data");
|
||||
interfaces.push_back(push_data_block);
|
||||
@ -661,12 +696,22 @@ EmitContext::BufferSpv EmitContext::DefineBuffer(bool is_storage, bool is_writte
|
||||
break;
|
||||
default:
|
||||
Name(id, fmt::format("{}_{}", is_storage ? "ssbo" : "ubo", binding.buffer));
|
||||
break;
|
||||
}
|
||||
interfaces.push_back(id);
|
||||
return {id, pointer_type};
|
||||
};
|
||||
|
||||
void EmitContext::DefineBuffers() {
|
||||
if (!profile.supports_robust_buffer_access && !info.has_readconst) {
|
||||
// In case ReadConstUbo has not already been bound by IR and is needed
|
||||
// to query buffer sizes, bind it now.
|
||||
info.buffers.push_back({
|
||||
.used_types = IR::Type::U32,
|
||||
.inline_cbuf = AmdGpu::Buffer::Null(),
|
||||
.buffer_type = BufferType::ReadConstUbo,
|
||||
});
|
||||
}
|
||||
for (const auto& desc : info.buffers) {
|
||||
const auto buf_sharp = desc.GetSharp(info);
|
||||
const bool is_storage = desc.IsStorage(buf_sharp, profile);
|
||||
|
@ -43,7 +43,7 @@ public:
|
||||
|
||||
Id Def(const IR::Value& value);
|
||||
|
||||
void DefineBufferOffsets();
|
||||
void DefineBufferProperties();
|
||||
void DefineInterpolatedAttribs();
|
||||
void DefineWorkgroupIndex();
|
||||
|
||||
@ -248,6 +248,9 @@ public:
|
||||
BufferType buffer_type;
|
||||
Id offset;
|
||||
Id offset_dwords;
|
||||
Id size;
|
||||
Id size_shorts;
|
||||
Id size_dwords;
|
||||
std::array<BufferSpv, u32(BufferAlias::NumAlias)> aliases;
|
||||
|
||||
const BufferSpv& operator[](BufferAlias alias) const {
|
||||
@ -307,6 +310,8 @@ private:
|
||||
|
||||
Id DefineFloat32ToUfloatM5(u32 mantissa_bits, std::string_view name);
|
||||
Id DefineUfloatM5ToFloat32(u32 mantissa_bits, std::string_view name);
|
||||
|
||||
Id GetBufferSize(u32 sharp_idx);
|
||||
};
|
||||
|
||||
} // namespace Shader::Backend::SPIRV
|
||||
|
@ -9,6 +9,12 @@
|
||||
|
||||
namespace Shader::Gcn {
|
||||
|
||||
const u32* GetFetchShaderCode(const Info& info, u32 sgpr_base) {
|
||||
const u32* code;
|
||||
std::memcpy(&code, &info.user_data[sgpr_base], sizeof(code));
|
||||
return code;
|
||||
}
|
||||
|
||||
/**
|
||||
* s_load_dwordx4 s[8:11], s[2:3], 0x00
|
||||
* s_load_dwordx4 s[12:15], s[2:3], 0x04
|
||||
@ -38,9 +44,8 @@ std::optional<FetchShaderData> ParseFetchShader(const Shader::Info& info) {
|
||||
if (!info.has_fetch_shader) {
|
||||
return std::nullopt;
|
||||
}
|
||||
const u32* code;
|
||||
std::memcpy(&code, &info.user_data[info.fetch_shader_sgpr_base], sizeof(code));
|
||||
|
||||
const auto* code = GetFetchShaderCode(info, info.fetch_shader_sgpr_base);
|
||||
FetchShaderData data{.code = code};
|
||||
GcnCodeSlice code_slice(code, code + std::numeric_limits<u32>::max());
|
||||
GcnDecodeContext decoder;
|
||||
|
@ -64,6 +64,8 @@ struct FetchShaderData {
|
||||
}
|
||||
};
|
||||
|
||||
const u32* GetFetchShaderCode(const Info& info, u32 sgpr_base);
|
||||
|
||||
std::optional<FetchShaderData> ParseFetchShader(const Shader::Info& info);
|
||||
|
||||
} // namespace Shader::Gcn
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include "common/config.h"
|
||||
#include "common/io_file.h"
|
||||
#include "common/path_util.h"
|
||||
#include "shader_recompiler/frontend/decode.h"
|
||||
#include "shader_recompiler/frontend/fetch_shader.h"
|
||||
#include "shader_recompiler/frontend/translate/translate.h"
|
||||
#include "shader_recompiler/info.h"
|
||||
@ -470,8 +471,29 @@ void Translator::SetDst64(const InstOperand& operand, const IR::U64F64& value_ra
|
||||
|
||||
void Translator::EmitFetch(const GcnInst& inst) {
|
||||
// Read the pointer to the fetch shader assembly.
|
||||
const auto code_sgpr_base = inst.src[0].code;
|
||||
if (!profile.supports_robust_buffer_access) {
|
||||
// The fetch shader must be inlined to access as regular buffers, so that
|
||||
// bounds checks can be emitted to emulate robust buffer access.
|
||||
const auto* code = GetFetchShaderCode(info, code_sgpr_base);
|
||||
GcnCodeSlice slice(code, code + std::numeric_limits<u32>::max());
|
||||
GcnDecodeContext decoder;
|
||||
|
||||
// Decode and save instructions
|
||||
u32 sub_pc = 0;
|
||||
while (!slice.atEnd()) {
|
||||
const auto sub_inst = decoder.decodeInstruction(slice);
|
||||
if (sub_inst.opcode == Opcode::S_SETPC_B64) {
|
||||
// Assume we're swapping back to the main shader.
|
||||
break;
|
||||
}
|
||||
TranslateInstruction(sub_inst, sub_pc++);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
info.has_fetch_shader = true;
|
||||
info.fetch_shader_sgpr_base = inst.src[0].code;
|
||||
info.fetch_shader_sgpr_base = code_sgpr_base;
|
||||
|
||||
const auto fetch_data = ParseFetchShader(info);
|
||||
ASSERT(fetch_data.has_value());
|
||||
@ -520,6 +542,40 @@ void Translator::LogMissingOpcode(const GcnInst& inst) {
|
||||
info.translation_failed = true;
|
||||
}
|
||||
|
||||
void Translator::TranslateInstruction(const GcnInst& inst, const u32 pc) {
|
||||
// Emit instructions for each category.
|
||||
switch (inst.category) {
|
||||
case InstCategory::DataShare:
|
||||
EmitDataShare(inst);
|
||||
break;
|
||||
case InstCategory::VectorInterpolation:
|
||||
EmitVectorInterpolation(inst);
|
||||
break;
|
||||
case InstCategory::ScalarMemory:
|
||||
EmitScalarMemory(inst);
|
||||
break;
|
||||
case InstCategory::VectorMemory:
|
||||
EmitVectorMemory(inst);
|
||||
break;
|
||||
case InstCategory::Export:
|
||||
EmitExport(inst);
|
||||
break;
|
||||
case InstCategory::FlowControl:
|
||||
EmitFlowControl(pc, inst);
|
||||
break;
|
||||
case InstCategory::ScalarALU:
|
||||
EmitScalarAlu(inst);
|
||||
break;
|
||||
case InstCategory::VectorALU:
|
||||
EmitVectorAlu(inst);
|
||||
break;
|
||||
case InstCategory::DebugProfile:
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE();
|
||||
}
|
||||
}
|
||||
|
||||
void Translate(IR::Block* block, u32 pc, std::span<const GcnInst> inst_list, Info& info,
|
||||
const RuntimeInfo& runtime_info, const Profile& profile) {
|
||||
if (inst_list.empty()) {
|
||||
@ -537,37 +593,7 @@ void Translate(IR::Block* block, u32 pc, std::span<const GcnInst> inst_list, Inf
|
||||
continue;
|
||||
}
|
||||
|
||||
// Emit instructions for each category.
|
||||
switch (inst.category) {
|
||||
case InstCategory::DataShare:
|
||||
translator.EmitDataShare(inst);
|
||||
break;
|
||||
case InstCategory::VectorInterpolation:
|
||||
translator.EmitVectorInterpolation(inst);
|
||||
break;
|
||||
case InstCategory::ScalarMemory:
|
||||
translator.EmitScalarMemory(inst);
|
||||
break;
|
||||
case InstCategory::VectorMemory:
|
||||
translator.EmitVectorMemory(inst);
|
||||
break;
|
||||
case InstCategory::Export:
|
||||
translator.EmitExport(inst);
|
||||
break;
|
||||
case InstCategory::FlowControl:
|
||||
translator.EmitFlowControl(pc, inst);
|
||||
break;
|
||||
case InstCategory::ScalarALU:
|
||||
translator.EmitScalarAlu(inst);
|
||||
break;
|
||||
case InstCategory::VectorALU:
|
||||
translator.EmitVectorAlu(inst);
|
||||
break;
|
||||
case InstCategory::DebugProfile:
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE();
|
||||
}
|
||||
translator.TranslateInstruction(inst, pc);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -58,6 +58,8 @@ public:
|
||||
explicit Translator(IR::Block* block_, Info& info, const RuntimeInfo& runtime_info,
|
||||
const Profile& profile);
|
||||
|
||||
void TranslateInstruction(const GcnInst& inst, u32 pc);
|
||||
|
||||
// Instruction categories
|
||||
void EmitPrologue();
|
||||
void EmitFetch(const GcnInst& inst);
|
||||
|
@ -195,6 +195,7 @@ void Translator::BUFFER_LOAD(u32 num_dwords, bool is_typed, const GcnInst& inst)
|
||||
buffer_info.inst_offset.Assign(mubuf.offset);
|
||||
buffer_info.globally_coherent.Assign(mubuf.glc);
|
||||
buffer_info.system_coherent.Assign(mubuf.slc);
|
||||
buffer_info.typed.Assign(is_typed);
|
||||
if (is_typed) {
|
||||
const auto& mtbuf = inst.control.mtbuf;
|
||||
const auto dmft = static_cast<AmdGpu::DataFormat>(mtbuf.dfmt);
|
||||
@ -241,6 +242,7 @@ void Translator::BUFFER_LOAD_FORMAT(u32 num_dwords, const GcnInst& inst) {
|
||||
buffer_info.inst_offset.Assign(mubuf.offset);
|
||||
buffer_info.globally_coherent.Assign(mubuf.glc);
|
||||
buffer_info.system_coherent.Assign(mubuf.slc);
|
||||
buffer_info.typed.Assign(true);
|
||||
|
||||
const IR::Value handle =
|
||||
ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1),
|
||||
@ -283,6 +285,7 @@ void Translator::BUFFER_STORE(u32 num_dwords, bool is_typed, const GcnInst& inst
|
||||
buffer_info.inst_offset.Assign(mubuf.offset);
|
||||
buffer_info.globally_coherent.Assign(mubuf.glc);
|
||||
buffer_info.system_coherent.Assign(mubuf.slc);
|
||||
buffer_info.typed.Assign(is_typed);
|
||||
if (is_typed) {
|
||||
const auto& mtbuf = inst.control.mtbuf;
|
||||
const auto dmft = static_cast<AmdGpu::DataFormat>(mtbuf.dfmt);
|
||||
@ -339,6 +342,7 @@ void Translator::BUFFER_STORE_FORMAT(u32 num_dwords, const GcnInst& inst) {
|
||||
buffer_info.inst_offset.Assign(mubuf.offset);
|
||||
buffer_info.globally_coherent.Assign(mubuf.glc);
|
||||
buffer_info.system_coherent.Assign(mubuf.slc);
|
||||
buffer_info.typed.Assign(true);
|
||||
|
||||
const IR::VectorReg src_reg{inst.src[1].code};
|
||||
|
||||
|
@ -23,6 +23,10 @@
|
||||
namespace Shader {
|
||||
|
||||
static constexpr size_t NumUserDataRegs = 16;
|
||||
static constexpr size_t NumImages = 64;
|
||||
static constexpr size_t NumBuffers = 32;
|
||||
static constexpr size_t NumSamplers = 16;
|
||||
static constexpr size_t NumFMasks = 8;
|
||||
|
||||
enum class TextureType : u32 {
|
||||
Color1D,
|
||||
@ -63,7 +67,7 @@ struct BufferResource {
|
||||
|
||||
[[nodiscard]] constexpr AmdGpu::Buffer GetSharp(const Info& info) const noexcept;
|
||||
};
|
||||
using BufferResourceList = boost::container::small_vector<BufferResource, 16>;
|
||||
using BufferResourceList = boost::container::small_vector<BufferResource, NumBuffers>;
|
||||
|
||||
struct ImageResource {
|
||||
u32 sharp_idx;
|
||||
@ -74,7 +78,7 @@ struct ImageResource {
|
||||
|
||||
[[nodiscard]] constexpr AmdGpu::Image GetSharp(const Info& info) const noexcept;
|
||||
};
|
||||
using ImageResourceList = boost::container::small_vector<ImageResource, 16>;
|
||||
using ImageResourceList = boost::container::small_vector<ImageResource, NumImages>;
|
||||
|
||||
struct SamplerResource {
|
||||
u32 sharp_idx;
|
||||
@ -84,31 +88,33 @@ struct SamplerResource {
|
||||
|
||||
constexpr AmdGpu::Sampler GetSharp(const Info& info) const noexcept;
|
||||
};
|
||||
using SamplerResourceList = boost::container::small_vector<SamplerResource, 16>;
|
||||
using SamplerResourceList = boost::container::small_vector<SamplerResource, NumSamplers>;
|
||||
|
||||
struct FMaskResource {
|
||||
u32 sharp_idx;
|
||||
|
||||
constexpr AmdGpu::Image GetSharp(const Info& info) const noexcept;
|
||||
};
|
||||
using FMaskResourceList = boost::container::small_vector<FMaskResource, 16>;
|
||||
using FMaskResourceList = boost::container::small_vector<FMaskResource, NumFMasks>;
|
||||
|
||||
struct PushData {
|
||||
static constexpr u32 BufOffsetIndex = 2;
|
||||
static constexpr u32 UdRegsIndex = 4;
|
||||
static constexpr u32 XOffsetIndex = 8;
|
||||
static constexpr u32 YOffsetIndex = 9;
|
||||
static constexpr u32 XScaleIndex = 10;
|
||||
static constexpr u32 YScaleIndex = 11;
|
||||
static constexpr u32 Step0Index = 0;
|
||||
static constexpr u32 Step1Index = 1;
|
||||
static constexpr u32 XOffsetIndex = 2;
|
||||
static constexpr u32 YOffsetIndex = 3;
|
||||
static constexpr u32 XScaleIndex = 4;
|
||||
static constexpr u32 YScaleIndex = 5;
|
||||
static constexpr u32 UdRegsIndex = 6;
|
||||
static constexpr u32 BufOffsetIndex = UdRegsIndex + NumUserDataRegs / 4;
|
||||
|
||||
u32 step0;
|
||||
u32 step1;
|
||||
std::array<u8, 32> buf_offsets;
|
||||
std::array<u32, NumUserDataRegs> ud_regs;
|
||||
float xoffset;
|
||||
float yoffset;
|
||||
float xscale;
|
||||
float yscale;
|
||||
std::array<u32, NumUserDataRegs> ud_regs;
|
||||
std::array<u8, NumBuffers> buf_offsets;
|
||||
|
||||
void AddOffset(u32 binding, u32 offset) {
|
||||
ASSERT(offset < 256 && binding < buf_offsets.size());
|
||||
|
@ -14,8 +14,8 @@ namespace Shader::IR {
|
||||
// Use typename Instruction so the function can be used to return either const or mutable
|
||||
// Insts depending on the context.
|
||||
template <typename Instruction, typename Pred>
|
||||
auto BreadthFirstSearch(Instruction* inst,
|
||||
Pred&& pred) -> std::invoke_result_t<Pred, Instruction*> {
|
||||
auto BreadthFirstSearch(Instruction* inst, Pred&& pred)
|
||||
-> std::invoke_result_t<Pred, Instruction*> {
|
||||
// Most often case the instruction is the desired already.
|
||||
if (std::optional result = pred(inst)) {
|
||||
return result;
|
||||
@ -53,8 +53,8 @@ auto BreadthFirstSearch(Instruction* inst,
|
||||
}
|
||||
|
||||
template <typename Pred>
|
||||
auto BreadthFirstSearch(const Value& value,
|
||||
Pred&& pred) -> std::invoke_result_t<Pred, const Inst*> {
|
||||
auto BreadthFirstSearch(const Value& value, Pred&& pred)
|
||||
-> std::invoke_result_t<Pred, const Inst*> {
|
||||
if (value.IsImmediate()) {
|
||||
// Nothing to do with immediates
|
||||
return std::nullopt;
|
||||
|
@ -51,6 +51,7 @@ union BufferInstInfo {
|
||||
BitField<2, 12, u32> inst_offset;
|
||||
BitField<14, 1, u32> system_coherent;
|
||||
BitField<15, 1, u32> globally_coherent;
|
||||
BitField<16, 1, u32> typed;
|
||||
};
|
||||
|
||||
enum class ScalarReg : u32 {
|
||||
|
@ -25,6 +25,7 @@ struct Profile {
|
||||
bool support_legacy_vertex_attributes{};
|
||||
bool supports_image_load_store_lod{};
|
||||
bool supports_native_cube_calc{};
|
||||
bool supports_robust_buffer_access{};
|
||||
bool has_broken_spirv_clamp{};
|
||||
bool lower_left_origin_mode{};
|
||||
bool needs_manual_interpolation{};
|
||||
|
@ -608,7 +608,11 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr,
|
||||
return false;
|
||||
}
|
||||
Image& image = texture_cache.GetImage(image_id);
|
||||
if (False(image.flags & ImageFlagBits::GpuModified)) {
|
||||
// Only perform sync if image is:
|
||||
// - GPU modified; otherwise there are no changes to synchronize.
|
||||
// - Not CPU modified; otherwise we could overwrite CPU changes with stale GPU changes.
|
||||
if (False(image.flags & ImageFlagBits::GpuModified) ||
|
||||
True(image.flags & ImageFlagBits::CpuDirty)) {
|
||||
return false;
|
||||
}
|
||||
ASSERT_MSG(device_addr == image.info.guest_address,
|
||||
|
@ -210,9 +210,6 @@ bool Instance::CreateDevice() {
|
||||
vk::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT,
|
||||
vk::PhysicalDevicePortabilitySubsetFeaturesKHR>();
|
||||
features = feature_chain.get().features;
|
||||
#ifdef __APPLE__
|
||||
portability_features = feature_chain.get<vk::PhysicalDevicePortabilitySubsetFeaturesKHR>();
|
||||
#endif
|
||||
|
||||
const vk::StructureChain properties_chain = physical_device.getProperties2<
|
||||
vk::PhysicalDeviceProperties2, vk::PhysicalDeviceVulkan11Properties,
|
||||
@ -258,16 +255,19 @@ bool Instance::CreateDevice() {
|
||||
add_extension(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
|
||||
add_extension(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
|
||||
add_extension(VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME);
|
||||
dynamic_color_write_mask = add_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME);
|
||||
if (dynamic_color_write_mask) {
|
||||
dynamic_color_write_mask =
|
||||
feature_chain.get<vk::PhysicalDeviceExtendedDynamicState3FeaturesEXT>()
|
||||
.extendedDynamicState3ColorWriteMask;
|
||||
dynamic_state_3 = add_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME);
|
||||
if (dynamic_state_3) {
|
||||
dynamic_state_3_features =
|
||||
feature_chain.get<vk::PhysicalDeviceExtendedDynamicState3FeaturesEXT>();
|
||||
LOG_INFO(Render_Vulkan, "- extendedDynamicState3ColorWriteMask: {}",
|
||||
dynamic_state_3_features.extendedDynamicState3ColorWriteMask);
|
||||
}
|
||||
null_descriptor = add_extension(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
|
||||
if (null_descriptor) {
|
||||
null_descriptor =
|
||||
feature_chain.get<vk::PhysicalDeviceRobustness2FeaturesEXT>().nullDescriptor;
|
||||
robustness2 = add_extension(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
|
||||
if (robustness2) {
|
||||
robustness2_features = feature_chain.get<vk::PhysicalDeviceRobustness2FeaturesEXT>();
|
||||
LOG_INFO(Render_Vulkan, "- robustBufferAccess2: {}",
|
||||
robustness2_features.robustBufferAccess2);
|
||||
LOG_INFO(Render_Vulkan, "- nullDescriptor: {}", robustness2_features.nullDescriptor);
|
||||
}
|
||||
custom_border_color = add_extension(VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME);
|
||||
depth_clip_control = add_extension(VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME);
|
||||
@ -284,6 +284,9 @@ bool Instance::CreateDevice() {
|
||||
#ifdef __APPLE__
|
||||
// Required by Vulkan spec if supported.
|
||||
portability_subset = add_extension(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME);
|
||||
if (portability_subset) {
|
||||
portability_features = feature_chain.get<vk::PhysicalDevicePortabilitySubsetFeaturesKHR>();
|
||||
}
|
||||
#endif
|
||||
|
||||
const auto family_properties = physical_device.getQueueFamilyProperties();
|
||||
@ -387,13 +390,15 @@ bool Instance::CreateDevice() {
|
||||
.customBorderColorWithoutFormat = true,
|
||||
},
|
||||
vk::PhysicalDeviceExtendedDynamicState3FeaturesEXT{
|
||||
.extendedDynamicState3ColorWriteMask = true,
|
||||
.extendedDynamicState3ColorWriteMask =
|
||||
dynamic_state_3_features.extendedDynamicState3ColorWriteMask,
|
||||
},
|
||||
vk::PhysicalDeviceDepthClipControlFeaturesEXT{
|
||||
.depthClipControl = true,
|
||||
},
|
||||
vk::PhysicalDeviceRobustness2FeaturesEXT{
|
||||
.nullDescriptor = true,
|
||||
.robustBufferAccess2 = robustness2_features.robustBufferAccess2,
|
||||
.nullDescriptor = robustness2_features.nullDescriptor,
|
||||
},
|
||||
vk::PhysicalDeviceVertexInputDynamicStateFeaturesEXT{
|
||||
.vertexInputDynamicState = true,
|
||||
@ -420,13 +425,13 @@ bool Instance::CreateDevice() {
|
||||
if (!custom_border_color) {
|
||||
device_chain.unlink<vk::PhysicalDeviceCustomBorderColorFeaturesEXT>();
|
||||
}
|
||||
if (!dynamic_color_write_mask) {
|
||||
if (!dynamic_state_3) {
|
||||
device_chain.unlink<vk::PhysicalDeviceExtendedDynamicState3FeaturesEXT>();
|
||||
}
|
||||
if (!depth_clip_control) {
|
||||
device_chain.unlink<vk::PhysicalDeviceDepthClipControlFeaturesEXT>();
|
||||
}
|
||||
if (!null_descriptor) {
|
||||
if (!robustness2) {
|
||||
device_chain.unlink<vk::PhysicalDeviceRobustness2FeaturesEXT>();
|
||||
}
|
||||
if (!vertex_input_dynamic_state) {
|
||||
|
@ -99,9 +99,10 @@ public:
|
||||
return depth_clip_control;
|
||||
}
|
||||
|
||||
/// Returns true when dynamic color write mask state is supported
|
||||
/// Returns true when the extendedDynamicState3ColorWriteMask feature of
|
||||
/// VK_EXT_extended_dynamic_state3 is supported.
|
||||
bool IsDynamicColorWriteMaskSupported() const {
|
||||
return dynamic_color_write_mask;
|
||||
return dynamic_state_3 && dynamic_state_3_features.extendedDynamicState3ColorWriteMask;
|
||||
}
|
||||
|
||||
/// Returns true when VK_EXT_vertex_input_dynamic_state is supported.
|
||||
@ -109,9 +110,14 @@ public:
|
||||
return vertex_input_dynamic_state;
|
||||
}
|
||||
|
||||
/// Returns true when the robustBufferAccess2 feature of VK_EXT_robustness2 is supported.
|
||||
bool IsRobustBufferAccess2Supported() const {
|
||||
return robustness2 && robustness2_features.robustBufferAccess2;
|
||||
}
|
||||
|
||||
/// Returns true when the nullDescriptor feature of VK_EXT_robustness2 is supported.
|
||||
bool IsNullDescriptorSupported() const {
|
||||
return null_descriptor;
|
||||
return robustness2 && robustness2_features.nullDescriptor;
|
||||
}
|
||||
|
||||
/// Returns true when VK_KHR_fragment_shader_barycentric is supported.
|
||||
@ -303,6 +309,8 @@ private:
|
||||
vk::PhysicalDevicePushDescriptorPropertiesKHR push_descriptor_props;
|
||||
vk::PhysicalDeviceFeatures features;
|
||||
vk::PhysicalDevicePortabilitySubsetFeaturesKHR portability_features;
|
||||
vk::PhysicalDeviceExtendedDynamicState3FeaturesEXT dynamic_state_3_features;
|
||||
vk::PhysicalDeviceRobustness2FeaturesEXT robustness2_features;
|
||||
vk::DriverIdKHR driver_id;
|
||||
vk::UniqueDebugUtilsMessengerEXT debug_callback{};
|
||||
std::string vendor_name;
|
||||
@ -317,9 +325,9 @@ private:
|
||||
bool custom_border_color{};
|
||||
bool fragment_shader_barycentric{};
|
||||
bool depth_clip_control{};
|
||||
bool dynamic_color_write_mask{};
|
||||
bool dynamic_state_3{};
|
||||
bool vertex_input_dynamic_state{};
|
||||
bool null_descriptor{};
|
||||
bool robustness2{};
|
||||
bool list_restart{};
|
||||
bool legacy_vertex_attributes{};
|
||||
bool shader_stencil_export{};
|
||||
|
@ -200,6 +200,7 @@ PipelineCache::PipelineCache(const Instance& instance_, Scheduler& scheduler_,
|
||||
.support_legacy_vertex_attributes = instance_.IsLegacyVertexAttributesSupported(),
|
||||
.supports_image_load_store_lod = instance_.IsImageLoadStoreLodSupported(),
|
||||
.supports_native_cube_calc = instance_.IsAmdGcnShaderSupported(),
|
||||
.supports_robust_buffer_access = instance_.IsRobustBufferAccess2Supported(),
|
||||
.needs_manual_interpolation = instance.IsFragmentShaderBarycentricSupported() &&
|
||||
instance.GetDriverID() == vk::DriverId::eNvidiaProprietary,
|
||||
.needs_lds_barriers = instance.GetDriverID() == vk::DriverId::eNvidiaProprietary ||
|
||||
|
@ -447,7 +447,6 @@ bool Rasterizer::BindResources(const Pipeline* pipeline) {
|
||||
set_writes.clear();
|
||||
buffer_barriers.clear();
|
||||
buffer_infos.clear();
|
||||
buffer_views.clear();
|
||||
image_infos.clear();
|
||||
|
||||
// Bind resource buffers and textures.
|
||||
|
@ -110,18 +110,17 @@ private:
|
||||
std::pair<VideoCore::ImageId, VideoCore::TextureCache::RenderTargetDesc>, 8>
|
||||
cb_descs;
|
||||
std::optional<std::pair<VideoCore::ImageId, VideoCore::TextureCache::DepthTargetDesc>> db_desc;
|
||||
boost::container::static_vector<vk::DescriptorImageInfo, 64> image_infos;
|
||||
boost::container::static_vector<vk::BufferView, 16> buffer_views;
|
||||
boost::container::static_vector<vk::DescriptorBufferInfo, 32> buffer_infos;
|
||||
boost::container::static_vector<VideoCore::ImageId, 64> bound_images;
|
||||
boost::container::static_vector<vk::DescriptorImageInfo, Shader::NumImages> image_infos;
|
||||
boost::container::static_vector<vk::DescriptorBufferInfo, Shader::NumBuffers> buffer_infos;
|
||||
boost::container::static_vector<VideoCore::ImageId, Shader::NumImages> bound_images;
|
||||
|
||||
Pipeline::DescriptorWrites set_writes;
|
||||
Pipeline::BufferBarriers buffer_barriers;
|
||||
|
||||
using BufferBindingInfo = std::tuple<VideoCore::BufferId, AmdGpu::Buffer, u64>;
|
||||
boost::container::static_vector<BufferBindingInfo, 32> buffer_bindings;
|
||||
using BufferBindingInfo = std::pair<VideoCore::BufferId, AmdGpu::Buffer>;
|
||||
boost::container::static_vector<BufferBindingInfo, Shader::NumBuffers> buffer_bindings;
|
||||
using ImageBindingInfo = std::pair<VideoCore::ImageId, VideoCore::TextureCache::TextureDesc>;
|
||||
boost::container::static_vector<ImageBindingInfo, 64> image_bindings;
|
||||
boost::container::static_vector<ImageBindingInfo, Shader::NumImages> image_bindings;
|
||||
};
|
||||
|
||||
} // namespace Vulkan
|
||||
|
Loading…
Reference in New Issue
Block a user