From a48bfb0fa61f30e6f68b6b5d3a184a772167c00a Mon Sep 17 00:00:00 2001
From: squidbus <175574877+squidbus@users.noreply.github.com>
Date: Fri, 6 Sep 2024 03:27:23 -0700
Subject: [PATCH 1/5] Standardize game_data directory for game metadata. (#809)
---
src/common/path_util.cpp | 1 +
src/common/path_util.h | 2 ++
src/core/file_format/trp.cpp | 6 ++++--
src/qt_gui/game_grid_frame.cpp | 7 ++++---
src/qt_gui/game_list_frame.cpp | 8 ++++----
src/qt_gui/main.cpp | 1 -
src/qt_gui/trophy_viewer.cpp | 4 ++--
7 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/src/common/path_util.cpp b/src/common/path_util.cpp
index e6c1fc1af..cce12ebcf 100644
--- a/src/common/path_util.cpp
+++ b/src/common/path_util.cpp
@@ -116,6 +116,7 @@ static auto UserPaths = [] {
create_path(PathType::CheatsDir, user_dir / CHEATS_DIR);
create_path(PathType::PatchesDir, user_dir / PATCHES_DIR);
create_path(PathType::AddonsDir, user_dir / ADDONS_DIR);
+ create_path(PathType::MetaDataDir, user_dir / METADATA_DIR);
return paths;
}();
diff --git a/src/common/path_util.h b/src/common/path_util.h
index bee93c1b9..623b285ed 100644
--- a/src/common/path_util.h
+++ b/src/common/path_util.h
@@ -23,6 +23,7 @@ enum class PathType {
CheatsDir, // Where cheats are stored.
PatchesDir, // Where patches are stored.
AddonsDir, // Where additional content is stored.
+ MetaDataDir, // Where game metadata (e.g. trophies and menu backgrounds) is stored.
};
constexpr auto PORTABLE_DIR = "user";
@@ -41,6 +42,7 @@ constexpr auto CAPTURES_DIR = "captures";
constexpr auto CHEATS_DIR = "cheats";
constexpr auto PATCHES_DIR = "patches";
constexpr auto ADDONS_DIR = "addcont";
+constexpr auto METADATA_DIR = "game_data";
// Filenames
constexpr auto LOG_FILE = "shad_log.txt";
diff --git a/src/core/file_format/trp.cpp b/src/core/file_format/trp.cpp
index f122709e4..86865fe63 100644
--- a/src/core/file_format/trp.cpp
+++ b/src/core/file_format/trp.cpp
@@ -1,6 +1,7 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
+#include "common/path_util.h"
#include "trp.h"
TRP::TRP() = default;
@@ -48,8 +49,9 @@ bool TRP::Extract(const std::filesystem::path& trophyPath) {
return false;
s64 seekPos = sizeof(TrpHeader);
- std::filesystem::path trpFilesPath(std::filesystem::current_path() / "user/game_data" /
- title / "TrophyFiles" / it.path().stem());
+ std::filesystem::path trpFilesPath(
+ Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / title / "TrophyFiles" /
+ it.path().stem());
std::filesystem::create_directories(trpFilesPath / "Icons");
std::filesystem::create_directory(trpFilesPath / "Xml");
diff --git a/src/qt_gui/game_grid_frame.cpp b/src/qt_gui/game_grid_frame.cpp
index 3d5ab14ec..9fba0c47c 100644
--- a/src/qt_gui/game_grid_frame.cpp
+++ b/src/qt_gui/game_grid_frame.cpp
@@ -114,8 +114,8 @@ void GameGridFrame::SetGridBackgroundImage(int row, int column) {
QWidget* item = this->cellWidget(row, column);
if (item) {
QString pic1Path = QString::fromStdString((*m_games_shared)[itemID].pic_path);
- const auto blurredPic1Path = Common::FS::GetUserPath(Common::FS::PathType::UserDir) /
- "game_data" / (*m_games_shared)[itemID].serial / "pic1.png";
+ const auto blurredPic1Path = Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) /
+ (*m_games_shared)[itemID].serial / "pic1.png";
#ifdef _WIN32
const auto blurredPic1PathQt = QString::fromStdWString(blurredPic1Path.wstring());
#else
@@ -128,7 +128,8 @@ void GameGridFrame::SetGridBackgroundImage(int row, int column) {
backgroundImage = m_game_list_utils.BlurImage(image, image.rect(), 16);
std::filesystem::path img_path =
- std::filesystem::path("user/game_data/") / (*m_games_shared)[itemID].serial;
+ Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) /
+ (*m_games_shared)[itemID].serial;
std::filesystem::create_directories(img_path);
if (!backgroundImage.save(blurredPic1PathQt, "PNG")) {
// qDebug() << "Error: Unable to save image.";
diff --git a/src/qt_gui/game_list_frame.cpp b/src/qt_gui/game_list_frame.cpp
index f8f6c6c78..b17da127e 100644
--- a/src/qt_gui/game_list_frame.cpp
+++ b/src/qt_gui/game_list_frame.cpp
@@ -90,9 +90,8 @@ void GameListFrame::SetListBackgroundImage(QTableWidgetItem* item) {
}
QString pic1Path = QString::fromStdString(m_game_info->m_games[item->row()].pic_path);
- const auto blurredPic1Path = Common::FS::GetUserPath(Common::FS::PathType::UserDir) /
- "game_data" / m_game_info->m_games[item->row()].serial /
- "pic1.png";
+ const auto blurredPic1Path = Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) /
+ m_game_info->m_games[item->row()].serial / "pic1.png";
#ifdef _WIN32
const auto blurredPic1PathQt = QString::fromStdWString(blurredPic1Path.wstring());
#else
@@ -105,7 +104,8 @@ void GameListFrame::SetListBackgroundImage(QTableWidgetItem* item) {
backgroundImage = m_game_list_utils.BlurImage(image, image.rect(), 16);
std::filesystem::path img_path =
- std::filesystem::path("user/game_data/") / m_game_info->m_games[item->row()].serial;
+ Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) /
+ m_game_info->m_games[item->row()].serial;
std::filesystem::create_directories(img_path);
if (!backgroundImage.save(blurredPic1PathQt, "PNG")) {
// qDebug() << "Error: Unable to save image.";
diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp
index 02957c6d5..abbf6dcb6 100644
--- a/src/qt_gui/main.cpp
+++ b/src/qt_gui/main.cpp
@@ -16,7 +16,6 @@ int main(int argc, char* argv[]) {
// Load configurations and initialize Qt application
const auto user_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir);
Config::load(user_dir / "config.toml");
- std::filesystem::create_directory(user_dir / "game_data");
// Check if elf or eboot.bin path was passed as a command line argument
bool has_command_line_argument = argc > 1;
diff --git a/src/qt_gui/trophy_viewer.cpp b/src/qt_gui/trophy_viewer.cpp
index 57dce6b4e..6fd5322c6 100644
--- a/src/qt_gui/trophy_viewer.cpp
+++ b/src/qt_gui/trophy_viewer.cpp
@@ -21,11 +21,11 @@ TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath) : QMainWindo
void TrophyViewer::PopulateTrophyWidget(QString title) {
#ifdef _WIN32
- const auto trophyDir = Common::FS::GetUserPath(Common::FS::PathType::UserDir) / "game_data" /
+ const auto trophyDir = Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) /
title.toStdWString() / "TrophyFiles";
const auto trophyDirQt = QString::fromStdWString(trophyDir.wstring());
#else
- const auto trophyDir = Common::FS::GetUserPath(Common::FS::PathType::UserDir) / "game_data" /
+ const auto trophyDir = Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) /
title.toStdString() / "TrophyFiles";
const auto trophyDirQt = QString::fromStdString(trophyDir.string());
#endif
From 1d7ee198e1836aed65580a7553594d2a572eb24b Mon Sep 17 00:00:00 2001
From: squidbus <175574877+squidbus@users.noreply.github.com>
Date: Fri, 6 Sep 2024 04:12:07 -0700
Subject: [PATCH 2/5] shader_recompiler: Add ConvertF16F32 to FP16 detection.
(#800)
---
src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp b/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp
index 7105f01f1..5ce024b43 100644
--- a/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp
+++ b/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp
@@ -22,6 +22,7 @@ void Visit(Info& info, IR::Inst& inst) {
case IR::Opcode::WriteSharedU64:
info.uses_shared = true;
break;
+ case IR::Opcode::ConvertF16F32:
case IR::Opcode::ConvertF32F16:
case IR::Opcode::BitCastF16U16:
info.uses_fp16 = true;
From 8d1641e4d3987872d83718fe1df2dc30fcb5ef0f Mon Sep 17 00:00:00 2001
From: squidbus <175574877+squidbus@users.noreply.github.com>
Date: Fri, 6 Sep 2024 04:12:29 -0700
Subject: [PATCH 3/5] vulkan: Add VK_KHR_format_feature_flags_2 to extensions.
(#803)
---
src/video_core/renderer_vulkan/vk_instance.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp
index a055cf3bc..a19ee1c76 100644
--- a/src/video_core/renderer_vulkan/vk_instance.cpp
+++ b/src/video_core/renderer_vulkan/vk_instance.cpp
@@ -220,12 +220,13 @@ bool Instance::CreateDevice() {
const bool robustness = add_extension(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
const bool topology_restart =
add_extension(VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME);
+ const bool maintenance5 = add_extension(VK_KHR_MAINTENANCE_5_EXTENSION_NAME);
// These extensions are promoted by Vulkan 1.3, but for greater compatibility we use Vulkan 1.2
// with extensions.
tooling_info = add_extension(VK_EXT_TOOLING_INFO_EXTENSION_NAME);
const bool maintenance4 = add_extension(VK_KHR_MAINTENANCE_4_EXTENSION_NAME);
- const bool maintenance5 = add_extension(VK_KHR_MAINTENANCE_5_EXTENSION_NAME);
+ add_extension(VK_KHR_FORMAT_FEATURE_FLAGS_2_EXTENSION_NAME);
add_extension(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
add_extension(VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME);
add_extension(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
From b97b5a7db42e19754dd51e12a35f37f731fab876 Mon Sep 17 00:00:00 2001
From: RDN000 <109141852+RDN000@users.noreply.github.com>
Date: Fri, 6 Sep 2024 15:35:42 +0200
Subject: [PATCH 4/5] Updated sq translation (#791)
---
src/qt_gui/translations/sq.ts | 36 +++++++++++++++++------------------
1 file changed, 18 insertions(+), 18 deletions(-)
diff --git a/src/qt_gui/translations/sq.ts b/src/qt_gui/translations/sq.ts
index f5dd55949..85110c6ae 100644
--- a/src/qt_gui/translations/sq.ts
+++ b/src/qt_gui/translations/sq.ts
@@ -37,7 +37,7 @@
Loading game list, please wait :3
- Duke ngarkuar listën e lojërave, të lutem prit :3
+ Po ngarkohet lista e lojërave, të lutem prit :3
@@ -181,7 +181,7 @@
Install application from a .pkg file
- Instalo aplikacionin nga skedari .pkg
+ Instalo aplikacionin nga një skedar .pkg
@@ -256,12 +256,12 @@
Download Cheats/Patches
- Shkarko Mashtrimet / Arnat
+ Shkarko Mashtrime/Arna
Dump Game List
- Zbraz Listën e lojërave
+ Zbraz Listën e Lojërave
@@ -276,12 +276,12 @@
File
- Skedar
+ Skedari
View
- Pamje
+ Pamja
@@ -301,7 +301,7 @@
Utils
- Shërbime
+ Shërbimet
@@ -647,7 +647,7 @@
- File doesn't appear to be a valid PKG file
+ File doesn't appear to be a valid PKG file
Skedari nuk duket si skedar PKG i vlefshëm
@@ -661,7 +661,7 @@
defaultTextEdit_MSG
- Mashtrimet/Arnat janë eksperimentale.\nPërdori me kujdes.\n\nShkarko mashtrimet individualisht duke zgjedhur depon dhe duke klikuar butonin e shkarkimit.\nNë skedën Arna, mund t'i shkarkosh të gjitha arnat menjëherë, të zgjidhësh cilat dëshiron të përdorësh dhe të ruash zgjedhjen tënde.\n\nMeqenëse ne nuk zhvillojmë Mashtrimet/Arnat,\ntë lutem raporto problemet te autori i mashtrimit.\n\nKe krijuar një mashtrim të ri? Vizito:\nhttps://github.com/shadps4-emu/ps4_cheats
+ Mashtrimet/Arnat janë eksperimentale.\nPërdori me kujdes.\n\nShkarko mashtrimet individualisht duke zgjedhur depon dhe duke klikuar butonin e shkarkimit.\nNë skedën Arna, mund t'i shkarkosh të gjitha arnat menjëherë, të zgjidhësh cilat dëshiron të përdorësh dhe të ruash zgjedhjen tënde.\n\nMeqenëse ne nuk zhvillojmë Mashtrimet/Arnat,\ntë lutem raporto problemet te autori i mashtrimit.\n\nKe krijuar një mashtrim të ri? Vizito:\nhttps://github.com/shadps4-emu/ps4_cheats
@@ -856,7 +856,7 @@
DownloadComplete_MSG
- Arnat u shkarkuan me sukses! Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar, nuk ka nevojë t'i shkarkosh ato individualisht për secilën lojë siç ndodh me Mashtrimet. Nëse patch-i nuk shfaqet, mund të mos ekzistojë për numrin e serisë dhe versionin specifik të lojës. Mund të jetë e nevojshme të përditësoni lojën.
+ Arnat u shkarkuan me sukses! Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar, nuk ka nevojë t'i shkarkosh ato individualisht për secilën lojë siç ndodh me Mashtrimet. Nëse patch-i nuk shfaqet, mund të mos ekzistojë për numrin e serisë dhe versionin specifik të lojës. Mund të jetë e nevojshme të përditësosh lojën.
@@ -906,7 +906,7 @@
Can't apply cheats before the game is started
- Nuk mund të aplikoni mashtrime para se të fillojë loja.
+ Nuk mund të zbatohen mashtrime para se të fillojë loja.
@@ -919,12 +919,12 @@
Apply
- Përdor
+ Zbato
Restore Defaults
- Rikthe parazgjedhjet
+ Rikthe paracaktimet
@@ -937,7 +937,7 @@
Icon
- Ikonë
+ Ikona
@@ -947,7 +947,7 @@
Serial
- Seri
+ Seriku
@@ -957,12 +957,12 @@
Firmware
- Firmware
+ Firmueri
Size
- Madësia
+ Madhësia
@@ -972,7 +972,7 @@
Path
- Rrugë
+ Shtegu
From 416e23fe768cf2f9e78f219627be501e2486eb74 Mon Sep 17 00:00:00 2001
From: "Daniel R." <47796739+polybiusproxy@users.noreply.github.com>
Date: Fri, 6 Sep 2024 19:09:28 +0200
Subject: [PATCH 5/5] Fix incompatible format images being passed on overlap
resolve (#794)
---
src/video_core/texture_cache/texture_cache.cpp | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp
index 0d0c81f5d..996fcad04 100644
--- a/src/video_core/texture_cache/texture_cache.cpp
+++ b/src/video_core/texture_cache/texture_cache.cpp
@@ -109,9 +109,12 @@ ImageId TextureCache::ResolveOverlap(const ImageInfo& image_info, ImageId cache_
}
if (image_info.pixel_format != tex_cache_image.info.pixel_format ||
- image_info.size != tex_cache_image.info.size ||
image_info.guest_size_bytes <= tex_cache_image.info.guest_size_bytes) {
- return merged_image_id ? merged_image_id : cache_image_id;
+ auto result_id = merged_image_id ? merged_image_id : cache_image_id;
+ const auto& result_image = slot_images[result_id];
+ return IsVulkanFormatCompatible(image_info.pixel_format, result_image.info.pixel_format)
+ ? result_id
+ : ImageId{};
}
ImageId new_image_id{};