From 0257a8d49123948c0f9b3d091aaf8b6a1641c913 Mon Sep 17 00:00:00 2001 From: crueter Date: Tue, 21 Apr 2026 04:01:39 +0200 Subject: [PATCH 01/45] [desktop] Change data manager to use tabs instead of a list (#3856) Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3856 Reviewed-by: CamilleLaVey Reviewed-by: Lizzie --- src/yuzu/data_dialog.cpp | 44 ++++++++++++++++++---------------------- src/yuzu/data_dialog.h | 2 +- src/yuzu/data_dialog.ui | 26 ++---------------------- 3 files changed, 23 insertions(+), 49 deletions(-) diff --git a/src/yuzu/data_dialog.cpp b/src/yuzu/data_dialog.cpp index bbe5d43e05..8d50843eb3 100644 --- a/src/yuzu/data_dialog.cpp +++ b/src/yuzu/data_dialog.cpp @@ -23,27 +23,18 @@ DataDialog::DataDialog(QWidget* parent) : QDialog(parent), ui(std::make_uniquepage->addWidget(new DataWidget(FrontendCommon::DataManager::DataDir::name, \ - QtCommon::StringLookup::DataManager##name##Tooltip, \ - QStringLiteral(#name), this)); \ - ui->labels->addItem(label); + ui->pages->addTab(new DataWidget(FrontendCommon::DataManager::DataDir::name, \ + QtCommon::StringLookup::DataManager##name##Tooltip, \ + QStringLiteral(#name), this), \ + label); WIDGET(tr("Shaders"), Shaders) - WIDGET(tr("UserNAND"), UserNand) - WIDGET(tr("SysNAND"), SysNand) + WIDGET(tr("User NAND"), UserNand) + WIDGET(tr("System NAND"), SysNand) WIDGET(tr("Mods"), Mods) WIDGET(tr("Saves"), Saves) #undef WIDGET - - connect(ui->labels, &QListWidget::itemSelectionChanged, this, [this]() { - const auto items = ui->labels->selectedItems(); - if (items.isEmpty()) { - return; - } - - ui->page->setCurrentIndex(ui->labels->row(items[0])); - }); } DataDialog::~DataDialog() = default; @@ -71,25 +62,29 @@ DataWidget::DataWidget(FrontendCommon::DataManager::DataDir data_dir, } void DataWidget::clear() { - std::string user_id = selectProfile(); - QtCommon::Content::ClearDataDir(m_dir, user_id); + std::optional user_id = selectProfile(); + if (!user_id) return; + QtCommon::Content::ClearDataDir(m_dir, user_id.value()); scan(); } void DataWidget::open() { - std::string user_id = selectProfile(); + std::optional user_id = selectProfile(); + if (!user_id) return; QDesktopServices::openUrl(QUrl::fromLocalFile( - QString::fromStdString(FrontendCommon::DataManager::GetDataDirString(m_dir, user_id)))); + QString::fromStdString(FrontendCommon::DataManager::GetDataDirString(m_dir, user_id.value())))); } void DataWidget::upload() { - std::string user_id = selectProfile(); - QtCommon::Content::ExportDataDir(m_dir, user_id, m_exportName); + std::optional user_id = selectProfile(); + if (!user_id) return; + QtCommon::Content::ExportDataDir(m_dir, user_id.value(), m_exportName); } void DataWidget::download() { - std::string user_id = selectProfile(); - QtCommon::Content::ImportDataDir(m_dir, user_id, std::bind(&DataWidget::scan, this)); + std::optional user_id = selectProfile(); + if (!user_id) return; + QtCommon::Content::ImportDataDir(m_dir, user_id.value(), std::bind(&DataWidget::scan, this)); } void DataWidget::scan() { @@ -108,10 +103,11 @@ void DataWidget::scan() { QtConcurrent::run([this]() { return FrontendCommon::DataManager::DataDirSize(m_dir); })); } -std::string DataWidget::selectProfile() { +std::optional DataWidget::selectProfile() { std::string user_id{}; if (m_dir == FrontendCommon::DataManager::DataDir::Saves) { user_id = GetProfileIDString(); + if (user_id.empty()) return std::nullopt; } return user_id; diff --git a/src/yuzu/data_dialog.h b/src/yuzu/data_dialog.h index 7f988f6047..2915f00848 100644 --- a/src/yuzu/data_dialog.h +++ b/src/yuzu/data_dialog.h @@ -45,7 +45,7 @@ private: FrontendCommon::DataManager::DataDir m_dir; const QString m_exportName; - std::string selectProfile(); + std::optional selectProfile(); }; #endif // DATA_DIALOG_H diff --git a/src/yuzu/data_dialog.ui b/src/yuzu/data_dialog.ui index 02e674d856..1e33530774 100644 --- a/src/yuzu/data_dialog.ui +++ b/src/yuzu/data_dialog.ui @@ -27,31 +27,9 @@ - + - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - 275 - 200 - - + -1 From 3a823de605252c7c994626fa7586b932d2b119ee Mon Sep 17 00:00:00 2001 From: MaranBr Date: Tue, 21 Apr 2026 05:03:43 +0200 Subject: [PATCH 02/45] [dynarmic] Remove Ignore Global Monitor from CPU Accuracy Auto (#3846) This fixes a flickering issue in some games, such as The Legend of Zelda: Echoes of Wisdom. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3846 Reviewed-by: crueter Reviewed-by: Lizzie --- src/core/arm/dynarmic/arm_dynarmic_32.cpp | 1 - src/core/arm/dynarmic/arm_dynarmic_64.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 1520f128cf..c0d6ff9516 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -289,7 +289,6 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; - config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; break; // Paranoia mode for debugging optimizations case Settings::CpuAccuracy::Paranoid: diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index fe7fb5983f..db8f4424eb 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -340,7 +340,6 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s config.unsafe_optimizations = true; config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; config.fastmem_address_space_bits = 64; - config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; break; // Paranoia mode for debugging optimizations case Settings::CpuAccuracy::Paranoid: From a0bb6324c0a11bf6578fe7d6951d08968fc16e12 Mon Sep 17 00:00:00 2001 From: Eden CI Date: Tue, 21 Apr 2026 16:02:40 +0200 Subject: [PATCH 03/45] [dist, android] Update translations from Transifex for Apr 21 (#3871) Automatic translation update for Apr 21 Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3871 --- dist/languages/ar.ts | 449 +++++++------- dist/languages/ca.ts | 445 +++++++------- dist/languages/cs.ts | 445 +++++++------- dist/languages/da.ts | 445 +++++++------- dist/languages/de.ts | 445 +++++++------- dist/languages/el.ts | 445 +++++++------- dist/languages/es.ts | 457 +++++++------- dist/languages/fi.ts | 445 +++++++------- dist/languages/fr.ts | 449 +++++++------- dist/languages/hu.ts | 445 +++++++------- dist/languages/id.ts | 568 +++++++++--------- dist/languages/it.ts | 449 +++++++------- dist/languages/ja_JP.ts | 445 +++++++------- dist/languages/ko_KR.ts | 445 +++++++------- dist/languages/nb.ts | 447 +++++++------- dist/languages/nl.ts | 445 +++++++------- dist/languages/pl.ts | 449 +++++++------- dist/languages/pt_BR.ts | 449 +++++++------- dist/languages/pt_PT.ts | 445 +++++++------- dist/languages/ru_RU.ts | 449 +++++++------- dist/languages/sv.ts | 454 +++++++------- dist/languages/tr_TR.ts | 449 +++++++------- dist/languages/uk.ts | 449 +++++++------- dist/languages/vi.ts | 445 +++++++------- dist/languages/vi_VN.ts | 445 +++++++------- dist/languages/zh_CN.ts | 449 +++++++------- dist/languages/zh_TW.ts | 445 +++++++------- .../src/main/res/values-zh-rCN/strings.xml | 16 +- 28 files changed, 5907 insertions(+), 6306 deletions(-) diff --git a/dist/languages/ar.ts b/dist/languages/ar.ts index 4b390b586a..88a83a26a7 100644 --- a/dist/languages/ar.ts +++ b/dist/languages/ar.ts @@ -1249,1046 +1249,1031 @@ Setting to Handheld can help improve performance for low end systems. يُمكن أن يُساعد الضبط على الوضع المحمول على تحسين أداء الأجهزة منخفضة المواصفات. - - Unit Serial - الرقم التسلسلي للوحدة - - - - Battery Serial - الرقم التسلسلي للبطارية - - - - Debug knobs - مقابض تصحيح الأخطاء - - - + Prompt for user profile on boot المطالبة بملف تعريف المستخدم عند التشغيل - + Useful if multiple people use the same PC. مفيد إذا كان هناك عدة أشخاص يستخدمون نفس الكمبيوتر. - + Pause when not in focus توقف عند عدم التركيز - + Pauses emulation when focusing on other windows. يوقف المحاكاة عند التركيز على نوافذ أخرى. - + Confirm before stopping emulation تأكيد قبل إيقاف المحاكاة - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. يتجاوز المطالبات التي تطلب تأكيد إيقاف المحاكاة. يؤدي تمكينه إلى تجاوز هذه المطالبات والخروج مباشرة من المحاكاة. - + Hide mouse on inactivity إخفاء الماوس عند عدم النشاط - + Hides the mouse after 2.5s of inactivity. يخفي الماوس بعد 2.5 ثانية من عدم النشاط. - + Disable controller applet تعطيل تطبيق التحكم - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. يُعطّل استخدام أداة التحكم في البرامج المُحاكاة قسرًا. عند محاولة أي برنامج فتح أداة التحكم، تُغلق فورًا. - + Check for updates التحقق من توفر التحديثات - + Whether or not to check for updates upon startup. ما إذا كان يجب التحقق من التحديثات عند بدء التشغيل أم لا. - + Enable Gamemode تمكين وضع اللعبة - + Force X11 as Graphics Backend كخلفية رسومات X11 فرض - + Custom frontend الواجهة الأمامية المخصصة - + Real applet تطبيق صغير حقيقي - + Never أبداً - + On Load عند التحميل - + Always دائماً - + CPU وحدة المعالجة المركزية - + GPU وحدة معالجة الرسومات - + CPU Asynchronous وحدة المعالجة المركزية غير المتزامنة - + Uncompressed (Best quality) Uncompressed (أفضل جودة) - + BC1 (Low quality) BC1 (جودة منخفضة) - + BC3 (Medium quality) BC3 (جودة متوسطة) - - + + Auto تلقائي - + 30 FPS 30 إطارًا في الثانية - + 60 FPS 60 إطارًا في الثانية - + 90 FPS 90 إطارًا في الثانية - + 120 FPS 120 إطارًا في الثانية - + Conservative محافظ - + Aggressive عدواني - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null لا شيء - + Fast سريع - + Balanced متوازن - - + + Accurate دقه - - + + Default افتراضي - + Unsafe (fast) غير آمن (سريع) - + Safe (stable) آمن (مستقر) - + Unsafe غير آمن - + Paranoid (disables most optimizations) جنون العظمة (يعطل معظم التحسينات) - + Debugging تصحيح الأخطاء - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed نافذة بلا حدود - + Exclusive Fullscreen شاشة كاملة حصرية - + No Video Output لا يوجد إخراج فيديو - + CPU Video Decoding فك تشفير فيديو وحدة المعالجة المركزية - + GPU Video Decoding (Default) فك تشفير فيديو وحدة معالجة الرسومات (افتراضي) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [تجريبي] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [تجريبي] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [تجريبي] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [تجريبي] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [تجريبي] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - - + + None لا شيء - + FXAA FXAA - + SMAA SMAA - + Default (16:9) (16:9) افتراضي - + Force 4:3 4:3 فرض - + Force 21:9 21:9 فرض - + Force 16:10 16:10 فرض - + Stretch to Window تمديد إلى النافذة - + Automatic تلقائي - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x 32x - + 64x 64x - + Japanese (日本語) اليابانية (日本語) - + American English الإنجليزية الأمريكية - + French (français) الفرنسية (français) - + German (Deutsch) الألمانية (Deutsch) - + Italian (italiano) الإيطالية (Italiano) - + Spanish (español) الإسبانية (español) - + Chinese الصينية - + Korean (한국어) الكورية (한국어) - + Dutch (Nederlands) الهولندية (Nederlands) - + Portuguese (português) البرتغالية (Português) - + Russian (Русский) الروسية (Русский) - + Taiwanese تايواني - + British English الإنكليزية البريطانية - + Canadian French الكندية الفرنسية - + Latin American Spanish أمريكا اللاتينية الإسبانية - + Simplified Chinese الصينية المبسطة - + Traditional Chinese (正體中文) الصينية التقليدية (正體中文) - + Brazilian Portuguese (português do Brasil) البرتغالية البرازيلية (português do Brasil) - + Polish (polska) البولندية (polska) - + Thai (แบบไทย) التايلاندية (แบบไทย) - - + + Japan اليابان - + USA الولايات المتحدة الأمريكية - + Europe أوروبا - + Australia أستراليا - + China الصين - + Korea كوريا - + Taiwan تايوان - + Auto (%1) Auto select time zone تلقائي (%1) - + Default (%1) Default time zone افتراضي (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypt - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Poland - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkey - + UCT UCT - + Universal عالمي - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono أحادي - + Stereo مجسم - + Surround محيطي - + 4GB DRAM (Default) 4GB DRAM (افتراضي) - + 6GB DRAM (Unsafe) 6GB DRAM (غير آمنة) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (غير آمنة) - + 12GB DRAM (Unsafe) 12GB DRAM (غير آمنة) - + Docked الإرساء - + Handheld محمول - - + + Off تعطيل - + Boost (1700MHz) تعزيز (1700 ميجا هرتز) - + Fast (2000MHz) سريع (2000 ميجاهرتز) - + Always ask (Default) اسأل دائمًا (افتراضي) - + Only if game specifies not to stop فقط إذا حددت اللعبة عدم التوقف - + Never ask لا تسأل أبدا - - + + Medium (256) متوسط (256) - - + + High (512) عالي (512) - + Very Small (16 MB) صغير جدًا (16 ميغابايت) - + Small (32 MB) صغير (32 ميغابايت) - + Normal (128 MB) قياسي (128 ميغابايت) - + Large (256 MB) كبير (256 ميغابايت) - + Very Large (512 MB) كبير جدًا (512 ميغابايت) - + Very Low (4 MB) منخفض جدًا (4 ميغابايت) - + Low (8 MB) منخفض (8 ميغابايت) - + Normal (16 MB) قياسي (16 ميغابايت) - + Medium (32 MB) متوسط (32 ميغابايت) - + High (64 MB) عالي (64 ميغابايت) - + Very Low (32) منخفض جدًا (32) - + Low (64) منخفض (64) - + Normal (128) قياسي (128) - + Disabled معطل - + ExtendedDynamicState 1 الحالة الديناميكية الممتدة 1 - + ExtendedDynamicState 2 الحالة الديناميكية الممتدة 2 - + ExtendedDynamicState 3 الحالة الديناميكية الممتدة 3 - + Tree View عرض قائمة - + Grid View عرض شبكة @@ -5802,7 +5787,7 @@ Drag points to change position, or double-click table cells to edit values.إدارة البيانات - + Deleting ANY data is IRREVERSABLE! حذف أي بيانات أمر لا رجعة فيه! @@ -5813,13 +5798,13 @@ Drag points to change position, or double-click table cells to edit values. - UserNAND - UserNAND + User NAND + ذاكرة المستخدم الداخلية - SysNAND - SysNAND + System NAND + ذاكرة النظام الداخلية @@ -5865,7 +5850,7 @@ Drag points to change position, or double-click table cells to edit values.استيراد البيانات لهذا المجلد. قد يستغرق هذا بعض الوقت، وسيؤدي إلى حذف جميع البيانات الموجودة! - + Calculating... يتم الحساب... diff --git a/dist/languages/ca.ts b/dist/languages/ca.ts index 984ac20327..5b9c9301f9 100644 --- a/dist/languages/ca.ts +++ b/dist/languages/ca.ts @@ -1191,1044 +1191,1029 @@ Setting to Handheld can help improve performance for low end systems. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Ocultar el cursor del ratolí en cas d'inactivitat - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Activa el mode joc - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never Mai - + On Load - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservador - + Aggressive Agressiu - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Ensamblat d'ombrejadors, només NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, només AMD/Mesa) - + Null Nul - + Fast Ràpid - + Balanced Equilibrat - - + + Accurate Precís - - + + Default Valor predeterminat - + Unsafe (fast) Insegur (ràpid) - + Safe (stable) Segur (estable) - + Unsafe Insegur - + Paranoid (disables most optimizations) Paranoic (desactiva la majoria d'optimitzacions) - + Debugging Depuració - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Finestra sense vores - + Exclusive Fullscreen Pantalla completa exclusiva - + No Video Output Sense sortida de vídeo - + CPU Video Decoding Descodificació de vídeo a la CPU - + GPU Video Decoding (Default) Descodificació de vídeo a la GPU (Valor predeterminat) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Veí més proper - + Bilinear Bilineal - + Bicubic Bicúbic - + Gaussian Gaussià - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution Super resolució AMD FidelityFX - + Area Àrea - + MMPX MMPX - + Zero-Tangent Tangència zero - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - - + + None Cap - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Valor predeterminat (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 - + Stretch to Window Estirar a la finestra - + Automatic Automàtic - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x 32x - + 64x 64x - + Japanese (日本語) Japonès (日本語) - + American English Anglès americà - + French (français) Francès (français) - + German (Deutsch) Alemany (Deutsch) - + Italian (italiano) Italià (italiano) - + Spanish (español) Castellà (español) - + Chinese Xinès - + Korean (한국어) Coreà (한국어) - + Dutch (Nederlands) Holandès (Nederlands) - + Portuguese (português) Portuguès (português) - + Russian (Русский) Rus (Русский) - + Taiwanese Taiwanès - + British English Anglès britànic - + Canadian French Francès canadenc - + Latin American Spanish Espanyol llatinoamericà - + Simplified Chinese Xinès simplificat - + Traditional Chinese (正體中文) Xinès tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Portuguès brasiler (português do Brasil) - + Polish (polska) Polonès (polska) - + Thai (แบบไทย) Tailandès (แบบไทย) - - + + Japan Japó - + USA EUA - + Europe Europa - + Australia Austràlia - + China Xina - + Korea Corea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Per defecte (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islàndia - + Iran Iran - + Israel Isreal - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polònia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estèreo - + Surround Envoltant - + 4GB DRAM (Default) 4GB DRAM (Insegur) - + 6GB DRAM (Unsafe) 6GB DRAM (Insegur) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Insegur) - + 12GB DRAM (Unsafe) 12GB DRAM (Insegur) - + Docked Sobretaula - + Handheld Portàtil - - + + Off - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop Tan sols si el joc especifica no parar - + Never ask No preguntar mai - - + + Medium (256) - - + + High (512) - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -5735,7 +5720,7 @@ Arrossegui els punts per a canviar la posició, o faci doble clic a les cel·les - + Deleting ANY data is IRREVERSABLE! @@ -5746,12 +5731,12 @@ Arrossegui els punts per a canviar la posició, o faci doble clic a les cel·les - UserNAND + User NAND - SysNAND + System NAND @@ -5798,7 +5783,7 @@ Arrossegui els punts per a canviar la posició, o faci doble clic a les cel·les - + Calculating... diff --git a/dist/languages/cs.ts b/dist/languages/cs.ts index aa3093fb4a..14aa5503a4 100644 --- a/dist/languages/cs.ts +++ b/dist/languages/cs.ts @@ -1191,1044 +1191,1029 @@ Setting to Handheld can help improve performance for low end systems. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Potvrzení před zastavením emulace - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Skrýt myš při neaktivitě - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Automatické - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - + Balanced - - + + Accurate Přesné - - + + Default Výchozí - + Unsafe (fast) - + Safe (stable) - + Unsafe Nebezpečné - + Paranoid (disables most optimizations) Paranoidní (zakáže většinu optimizací) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Okno bez okrajů - + Exclusive Fullscreen Exkluzivní - + No Video Output - + CPU Video Decoding - + GPU Video Decoding (Default) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) - + 3X (2160p/3240p) - + 4X (2880p/4320p) - + 5X (3600p/5400p) - + 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor - + Bilinear Bilineární - + Bicubic - + Gaussian - + Lanczos - + ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - - + + None Žádné - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Výchozí (16:9) - + Force 4:3 Vynutit 4:3 - + Force 21:9 Vynutit 21:9 - + Force 16:10 - + Stretch to Window Roztáhnout podle okna - + Automatic - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x - + 64x - + Japanese (日本語) Japonština (日本語) - + American English - + French (français) Francouzština (français) - + German (Deutsch) Nemčina (Deutsch) - + Italian (italiano) Italština (Italiano) - + Spanish (español) Španělština (español) - + Chinese Čínština - + Korean (한국어) Korejština (한국어) - + Dutch (Nederlands) Holandština (Nederlands) - + Portuguese (português) Portugalština (português) - + Russian (Русский) Ruština (Русский) - + Taiwanese Tajwanština - + British English Britská Angličtina - + Canadian French Kanadská Francouzština - + Latin American Spanish Latinsko Americká Španělština - + Simplified Chinese Zjednodušená Čínština - + Traditional Chinese (正體中文) Tradiční Čínština (正體中文) - + Brazilian Portuguese (português do Brasil) Brazilská Portugalština (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonsko - + USA USA - + Europe Evropa - + Australia Austrálie - + China Čína - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypt - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamajka - + Kwajalein Kwajalein - + Libya Lybie - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polsko - + Portugal Portugalsko - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turecko - + UCT UCT - + Universal Univerzální - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Zadokovaná - + Handheld Příruční - - + + Off - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) Vždy se zeptat (Výchozí) - + Only if game specifies not to stop - + Never ask - - + + Medium (256) - - + + High (512) - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -5726,7 +5711,7 @@ Táhněte body pro změnu pozice nebo dvojitě klikněte na buňky tabulky pro z - + Deleting ANY data is IRREVERSABLE! @@ -5737,12 +5722,12 @@ Táhněte body pro změnu pozice nebo dvojitě klikněte na buňky tabulky pro z - UserNAND + User NAND - SysNAND + System NAND @@ -5789,7 +5774,7 @@ Táhněte body pro změnu pozice nebo dvojitě klikněte na buňky tabulky pro z - + Calculating... diff --git a/dist/languages/da.ts b/dist/languages/da.ts index a8f430b52f..bd3478d2af 100644 --- a/dist/languages/da.ts +++ b/dist/languages/da.ts @@ -1193,1044 +1193,1029 @@ Setting to Handheld can help improve performance for low end systems. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Skjul mus ved inaktivitet - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Automatisk - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - + Balanced - - + + Accurate Nøjagtig - - + + Default Standard - + Unsafe (fast) - + Safe (stable) - + Unsafe Usikker - + Paranoid (disables most optimizations) Paranoid (deaktiverer de fleste optimeringer) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Uindrammet Vindue - + Exclusive Fullscreen Eksklusiv Fuld Skærm - + No Video Output Ingen Video-Output - + CPU Video Decoding CPU-Video Afkodning - + GPU Video Decoding (Default) GPU-Video Afkodning (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75X (540p/810p) [EKSPERIMENTEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor Nærmeste Nabo - + Bilinear Bilineær - + Bicubic Bikubisk - + Gaussian Gausisk - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - - + + None Ingen - + FXAA FXAA - + SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tving 4:3 - + Force 21:9 Tving 21:9 - + Force 16:10 - + Stretch to Window Stræk til Vindue - + Automatic - + 2x - + 4x - + 8x - + 16x - + 32x - + 64x - + Japanese (日本語) Japansk (日本語) - + American English - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Chinese Kinesisk - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Hollandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Taiwanese Taiwanesisk - + British English Britisk Engelsk - + Canadian French Candadisk Fransk - + Latin American Spanish Latinamerikansk Spansk - + Simplified Chinese Forenklet Kinesisk - + Traditional Chinese (正體中文) Traditionelt Kinesisk (正體中文) - + Brazilian Portuguese (português do Brasil) Braziliansk Portugisisk (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ægypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Tyrkiet - + UCT UCT - + Universal Universel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Dokket - + Handheld Håndholdt - - + + Off - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - - + + Medium (256) - - + + High (512) - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -5734,7 +5719,7 @@ Træk punkter, for at skifte position, eller dobbeltklik i tabelceller, for at r - + Deleting ANY data is IRREVERSABLE! @@ -5745,12 +5730,12 @@ Træk punkter, for at skifte position, eller dobbeltklik i tabelceller, for at r - UserNAND + User NAND - SysNAND + System NAND @@ -5797,7 +5782,7 @@ Træk punkter, for at skifte position, eller dobbeltklik i tabelceller, for at r - + Calculating... diff --git a/dist/languages/de.ts b/dist/languages/de.ts index e9c7e9fb41..7e2f73180d 100644 --- a/dist/languages/de.ts +++ b/dist/languages/de.ts @@ -1202,1044 +1202,1029 @@ Setting to Handheld can help improve performance for low end systems. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot Beim Start nach Nutzer fragen - + Useful if multiple people use the same PC. Nützlich falls mehrere Personen den gleichen Computer benutzen. - + Pause when not in focus Pausiere falls nicht im Fokus - + Pauses emulation when focusing on other windows. Pausiere Emulation falls andere Fenster im Fokus/Vordergrund sind. - + Confirm before stopping emulation Vor dem Stoppen der Emulation bestätigen - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Mauszeiger verstecken - + Hides the mouse after 2.5s of inactivity. Den Mauszeiger nach 2,5 Sekunden Inaktivität verstecken. - + Disable controller applet Deaktiviere Controller-Applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates Auf Updates überprüfen - + Whether or not to check for updates upon startup. Ob nach Updates während des Startens gesucht werden soll. - + Enable Gamemode GameMode aktivieren - + Force X11 as Graphics Backend - + Custom frontend Benutzerdefinierte Frontend - + Real applet Echtes Applet - + Never Niemals - + On Load Beim Laden - + Always Immer - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Asynchron - + Uncompressed (Best quality) Unkomprimiert (Beste Qualität) - + BC1 (Low quality) BC1 (Niedrige Qualität) - + BC3 (Medium quality) BC3 (Mittlere Qualität) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Konservativ - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast Schnell - + Balanced Ausgeglichen - - + + Accurate Akkurat - - + + Default Standard - + Unsafe (fast) Unsicher (schnell) - + Safe (stable) Sicher (stabil) - + Unsafe Unsicher - + Paranoid (disables most optimizations) Paranoid (deaktiviert die meisten Optimierungen) - + Debugging Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Rahmenloses Fenster - + Exclusive Fullscreen Exklusiver Vollbildmodus - + No Video Output Keine Videoausgabe - + CPU Video Decoding CPU Video Dekodierung - + GPU Video Decoding (Default) GPU Video Dekodierung (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5X (360p/540p) [EXPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75X (540p/810p) [EXPERIMENTELL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1,5X (1080p/1620p) [EXPERIMENTELL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest-Neighbor - + Bilinear Bilinear - + Bicubic Bikubisch - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - - + + None Keiner - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Erzwinge 4:3 - + Force 21:9 Erzwinge 21:9 - + Force 16:10 Erzwinge 16:10 - + Stretch to Window Auf Fenster anpassen - + Automatic Automatisch - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x - + 64x - + Japanese (日本語) Japanisch (日本語) - + American English Amerikanisches Englisch - + French (français) Französisch (français) - + German (Deutsch) Deutsch (German) - + Italian (italiano) Italienisch (italiano) - + Spanish (español) Spanisch (español) - + Chinese Chinesisch - + Korean (한국어) Koreanisch (한국어) - + Dutch (Nederlands) Niederländisch (Nederlands) - + Portuguese (português) Portugiesisch (português) - + Russian (Русский) Russisch (Русский) - + Taiwanese Taiwanesisch - + British English Britisches Englisch - + Canadian French Kanadisches Französisch - + Latin American Spanish Lateinamerikanisches Spanisch - + Simplified Chinese Vereinfachtes Chinesisch - + Traditional Chinese (正體中文) Traditionelles Chinesisch (正體中文) - + Brazilian Portuguese (português do Brasil) Brasilianisches Portugiesisch (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China China - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Automatisch (%1) - + Default (%1) Default time zone Standard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Ägypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Türkei - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Standard) - + 6GB DRAM (Unsafe) 6GB DRAM (Unsicher) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Unsicher) - + 12GB DRAM (Unsafe) 12GB DRAM (Unsicher) - + Docked Im Dock - + Handheld Handheld - - + + Off Aus - + Boost (1700MHz) Boost (1700MHz) - + Fast (2000MHz) Schnell (2000MHz) - + Always ask (Default) Immer fragen (Standard) - + Only if game specifies not to stop Nur wenn ein Spiel vorgibt, nicht zu stoppen - + Never ask Niemals fragen - - + + Medium (256) Mittel (256) - - + + High (512) Hoch (512) - + Very Small (16 MB) Sehr klein (16 MB) - + Small (32 MB) Klein (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Groß (256 MB) - + Very Large (512 MB) Sehr groß (512 MB) - + Very Low (4 MB) Sehr niedrig (4 MB) - + Low (8 MB) Niedrig (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Mittel (32 MB) - + High (64 MB) Hoch (64 MB) - + Very Low (32) Sehr niedrig (32) - + Low (64) Niedrig (64) - + Normal (128) Normal (128) - + Disabled Deaktiviert - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View Baum Ansicht - + Grid View Raster Ansicht @@ -5749,7 +5734,7 @@ Ziehe die Punkte mit deiner Maus, um ihre Position zu ändern. Doppelklicke auf Datenmanager - + Deleting ANY data is IRREVERSABLE! Das Löschen JEGLICHER Daten ist UNUMKEHRBAR! @@ -5760,12 +5745,12 @@ Ziehe die Punkte mit deiner Maus, um ihre Position zu ändern. Doppelklicke auf - UserNAND + User NAND - SysNAND + System NAND @@ -5812,7 +5797,7 @@ Ziehe die Punkte mit deiner Maus, um ihre Position zu ändern. Doppelklicke auf - + Calculating... Berechnen... diff --git a/dist/languages/el.ts b/dist/languages/el.ts index 5ef3147cdd..c9fb878c95 100644 --- a/dist/languages/el.ts +++ b/dist/languages/el.ts @@ -1193,1044 +1193,1029 @@ Setting to Handheld can help improve performance for low end systems. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Απόκρυψη δρομέα ποντικιού στην αδράνεια - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Αυτόματη - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - + Balanced - - + + Accurate Ακριβής - - + + Default Προεπιλεγμένο - + Unsafe (fast) - + Safe (stable) - + Unsafe Επισφαλής - + Paranoid (disables most optimizations) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Παραθυροποιημένο Χωρίς Όρια - + Exclusive Fullscreen Αποκλειστική Πλήρης Οθόνη - + No Video Output Χωρίς Έξοδο Βίντεο - + CPU Video Decoding Αποκωδικοποίηση Βίντεο CPU - + GPU Video Decoding (Default) Αποκωδικοποίηση Βίντεο GPU (Προεπιλογή) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [ΠΕΙΡΑΜΑΤΙΚΟ] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor Πλησιέστερος Γείτονας - + Bilinear Διγραμμικό - + Bicubic Δικυβικό - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - - + + None Κανένα - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Προεπιλογή (16:9) - + Force 4:3 Επιβολή 4:3 - + Force 21:9 Επιβολή 21:9 - + Force 16:10 Επιβολή 16:10 - + Stretch to Window Επέκταση στο Παράθυρο - + Automatic Αυτόματα - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x - + 64x - + Japanese (日本語) Ιαπωνικά (日本語) - + American English - + French (français) Γαλλικά (Français) - + German (Deutsch) Γερμανικά (Deutsch) - + Italian (italiano) Ιταλικά (Italiano) - + Spanish (español) Ισπανικά (Español) - + Chinese Κινέζικα - + Korean (한국어) Κορεάτικα (한국어) - + Dutch (Nederlands) Ολλανδικά (Nederlands) - + Portuguese (português) Πορτογαλικά (Português) - + Russian (Русский) Ρώσικα (Русский) - + Taiwanese Ταϊβανέζικα - + British English Βρετανικά Αγγλικά - + Canadian French Καναδικά Γαλλικά - + Latin American Spanish Λατινοαμερικάνικα Ισπανικά - + Simplified Chinese Απλοποιημένα Κινέζικα - + Traditional Chinese (正體中文) Παραδοσιακά Κινέζικα (正體中文) - + Brazilian Portuguese (português do Brasil) Πορτογαλικά Βραζιλίας (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Ιαπωνία - + USA ΗΠΑ - + Europe Ευρώπη - + Australia Αυστραλία - + China Κίνα - + Korea Κορέα - + Taiwan Ταϊβάν - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Κούβα - + EET EET - + Egypt Αίγυπτος - + Eire - + EST EST - + EST5EDT EST5EDT - + GB - + GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Γκρήνουιτς - + Hongkong Χονγκ Κονγκ - + HST HST - + Iceland Ισλανδία - + Iran Ιράν - + Israel Ισραήλ - + Jamaica Ιαμαϊκή - + Kwajalein - + Libya Λιβύη - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Ναβάχο - + NZ - + NZ-CHAT - + Poland Πολωνία - + Portugal Πορτογαλία - + PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Σιγκαπούρη - + Turkey Τουρκία - + UCT UCT - + Universal Παγκόσμια - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu - + Mono Μονοφωνικό - + Stereo Στέρεοφωνικό - + Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Off - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - - + + Medium (256) - - + + High (512) - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -5725,7 +5710,7 @@ Drag points to change position, or double-click table cells to edit values. - + Deleting ANY data is IRREVERSABLE! @@ -5736,12 +5721,12 @@ Drag points to change position, or double-click table cells to edit values. - UserNAND + User NAND - SysNAND + System NAND @@ -5788,7 +5773,7 @@ Drag points to change position, or double-click table cells to edit values. - + Calculating... diff --git a/dist/languages/es.ts b/dist/languages/es.ts index fe1b3e41bf..a15674b7ea 100644 --- a/dist/languages/es.ts +++ b/dist/languages/es.ts @@ -239,7 +239,7 @@ Esto vetará su nombre de usuario del foro y su dirección IP. <html><head/><body><p><span style=" font-size:10pt;">Should you choose to submit a test case to the </span><a href="https://eden-emulator.github.io/game/"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">eden Compatibility List</span></a><span style=" font-size:10pt;">, The following information will be collected and displayed on the site:</span></p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hardware Information (CPU / GPU / Operating System)</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Which version of eden you are running</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The connected eden account</li></ul></body></html> - <html><head/><body><p><span style=" font-size:10pt;">Si elijes entregar un caso de prueba a la </span><a href="https://eden-emulator.github.io/game/"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">lista de compatibilidad de Eden</span></a><span style=" font-size:10pt;">, Se recopilará y mostrará la siguiente información en el sito:</span></p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Información del hardware (CPU / GPU / Sistema operativo)</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Qué version de Eden estás usando</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La cuenta de eden que está conectada </li></ul></body></html> + <html><head/><body><p><span style=" font-size:10pt;">Si elijes entregar un caso de prueba a la </span><a href="https://eden-emulator.github.io/game/"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">lista de compatibilidad de Eden</span></a><span style=" font-size:10pt;">, Se recopilará y mostrará la siguiente información en el sito:</span></p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Información del hardware (Procesador / Tarjeta gráfica / Sistema operativo)</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Qué version de Eden estás usando</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La cuenta de eden que está conectada </li></ul></body></html> @@ -498,7 +498,7 @@ Esto vetará su nombre de usuario del foro y su dirección IP. This option increases CPU emulation thread use from 1 to the maximum of 4. This is mainly a debug option and shouldn't be disabled. - Esta opción aumenta el uso de hilos de emulación de la CPU de 1 a un máximo de 4. + Esta opción aumenta el uso de hilos de emulación del procesador de 1 a un máximo de 4. Principalmente es una opción de depuración y no debería desactivarse. @@ -556,7 +556,7 @@ Desactivarlo hará que el juego se renderice lo más rápido posible según tu o Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). Can help reduce stuttering at lower framerates. - Sincroniza la velocidad del núcleo de la CPU con la velocidad máxima de renderizado del juego para aumentar los FPS sin afectar la velocidad del juego (animaciones, físicas, etc.). + Sincroniza la velocidad del núcleo del procesador con la velocidad máxima de renderizado del juego para aumentar los fotogramas por segundo sin afectar la velocidad del juego (animaciones, físicas, etc.). Puede ayudar a reducir los tirones o parpadeos en tasas de fotogramas bajas. @@ -567,7 +567,7 @@ Puede ayudar a reducir los tirones o parpadeos en tasas de fotogramas bajas. Change the accuracy of the emulated CPU (for debugging only). - Cambia la precisión de la CPU emulada (solo para depuración) + Cambia la precisión del procesador emulado (solo para depuración) @@ -1254,1045 +1254,1030 @@ Los juegos cambiarán su resolución, detalles y compatibilidad con los mandos s Configurar el modo portátil puede mejorar el rendimiento en sistemas de gama baja. - - Unit Serial - Nº de serie de la unidad - - - - Battery Serial - Nº de serie de la batería - - - - Debug knobs - Perillas de depuración - - - + Prompt for user profile on boot Solicitud para perfil de usuario al arrancar - + Useful if multiple people use the same PC. Útil si múltiples personas usan la misma PC - + Pause when not in focus Pausar cuando la ventana no esté activa - + Pauses emulation when focusing on other windows. Pausa la emulación cuando esta activa otra ventana diferente. - + Confirm before stopping emulation Confirmar detención - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Anula las solicitudes de confirmación para detener la emulación. Al habilitar esta opción, se omiten dichas solicitudes y se sale directamente de la emulación. - + Hide mouse on inactivity Ocultar el cursor por inactividad. - + Hides the mouse after 2.5s of inactivity. Oculta el mouse después de 2.5s de inactividad. - + Disable controller applet Desactivar applet de mandos - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Desactiva forzosamente el uso del applet del controlador en programas emulados. Cuando un programa intenta abrir el applet del controlador, se cierra inmediatamente. - + Check for updates Buscar actualizaciones - + Whether or not to check for updates upon startup. Si se deben buscar actualizaciones al iniciar o no. - + Enable Gamemode Activar Modo Juego - + Force X11 as Graphics Backend Forzar X11 como motor gráfico - + Custom frontend Interfaz personalizada - + Real applet Applet real - + Never Nunca - + On Load Al cargar - + Always Siempre - + CPU Procesador - + GPU GPU - + CPU Asynchronous Procesador asíncrono - + Uncompressed (Best quality) Sin compresión (Mejor calidad) - + BC1 (Low quality) BC1 (Calidad baja) - + BC3 (Medium quality) BC3 (Calidad media) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservativo - + Aggressive Agresivo - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Ensamblado de sombreadores, solo NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, solo AMD/Mesa) - + Null Ninguno - + Fast Rápido - + Balanced Balanceado - - + + Accurate Preciso - - + + Default Predeterminado - + Unsafe (fast) Inseguro (rápido) - + Safe (stable) Seguro (estable) - + Unsafe Impreciso - + Paranoid (disables most optimizations) Paranoico (Deshabilita la mayoría de optimizaciones) - + Debugging Depuración - + Dynarmic DynARMic - + NCE NCE - + Borderless Windowed Ventana sin bordes - + Exclusive Fullscreen Pantalla completa - + No Video Output Sin salida de vídeo - + CPU Video Decoding Decodificación de vídeo en el procesador - + GPU Video Decoding (Default) Decodificación de vídeo en GPU (Por defecto) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] x0,5 (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] x0,75 (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) x1 (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] x1,5 (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) x2 (1440p/2160p) - + 3X (2160p/3240p) x3 (2160p/3240p) - + 4X (2880p/4320p) x4 (2880p/4320p) - + 5X (3600p/5400p) x5 (3600p/5400p) - + 6X (4320p/6480p) x6 (4320p/6480p) - + 7X (5040p/7560p) x7 (5040p/7560p) - + 8X (5760p/8640p) x8 (5760p/8640p) - + Nearest Neighbor Vecino más próximo - + Bilinear Bilineal - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution Super Resolución AMD FidelityFX - + Area Área - + MMPX MMPX - + Zero-Tangent Tangente cero - + B-Spline Ranura B - + Mitchell Mitchell - + Spline-1 Spline-1 - - + + None Ninguno - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Predeterminado (16:9) - + Force 4:3 Forzar 4:3 - + Force 21:9 Forzar 21:9 - + Force 16:10 Forzar 16:10 - + Stretch to Window Estirar a la ventana - + Automatic Automático - + 2x x2 - + 4x x4 - + 8x x8 - + 16x x16 - + 32x 32x - + 64x 64x - + Japanese (日本語) Japonés (日本語) - + American English Inglés estadounidense - + French (français) Francés (français) - + German (Deutsch) Alemán (deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Español - + Chinese Chino - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandés (nederlands) - + Portuguese (português) Portugués (português) - + Russian (Русский) Ruso (Русский) - + Taiwanese Taiwanés - + British English Inglés británico - + Canadian French Francés canadiense - + Latin American Spanish Español latinoamericano - + Simplified Chinese Chino simplificado - + Traditional Chinese (正體中文) Chino tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Portugués brasileño (português do Brasil) - + Polish (polska) Polaco (polska) - + Thai (แบบไทย) Tailandés (แบบไทย) - - + + Japan Japón - + USA EEUU - + Europe Europa - + Australia Australia - + China China - + Korea Corea - + Taiwan Taiwán - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Predeterminada (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipto - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Irán - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polonia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turquía - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulú - + Mono Mono - + Stereo Estéreo - + Surround Envolvente - + 4GB DRAM (Default) 4GB DRAM (Por defecto) - + 6GB DRAM (Unsafe) 6GB DRAM (Inseguro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Inseguro) - + 12GB DRAM (Unsafe) 12GB DRAM (Inseguro) - + Docked Sobremesa - + Handheld Portátil - - + + Off Apagado - + Boost (1700MHz) Boost (1700MHz) - + Fast (2000MHz) Rápido (2000MHz) - + Always ask (Default) Preguntar siempre (Por defecto) - + Only if game specifies not to stop Solo si el juego pide no ser cerrado - + Never ask Nunca preguntar - - + + Medium (256) Medio (256) - - + + High (512) Alto (512) - + Very Small (16 MB) Muy pequeño (16 MB) - + Small (32 MB) Pequeño (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Muy grande (512 MB) - + Very Low (4 MB) Muy bajo (4 MB) - + Low (8 MB) Bajo (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Medio (32 MB) - + High (64 MB) Alto (64 MB) - + Very Low (32) Muy bajo (32) - + Low (64) Bajo (64) - + Normal (128) Normal (128) - + Disabled Desactivado - + ExtendedDynamicState 1 ModoDynamicoExtendido 1 - + ExtendedDynamicState 2 ModoDynamicoExtendido 2 - + ExtendedDynamicState 3 ModoDynamicoExtendido 3 - + Tree View Vista en árbol - + Grid View Vista en cuadrícula @@ -5817,7 +5802,7 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d Gestor de datos - + Deleting ANY data is IRREVERSABLE! ¡Eliminar CUALQUIER dato es IRREVERSIBLE! @@ -5828,13 +5813,13 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d - UserNAND - NAND de usuario + User NAND + - SysNAND - NAND de sistema + System NAND + @@ -5880,7 +5865,7 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d Importar todos los datos en este directorio. Esto puede tomar un tiempo, ¡y borrará TODOS LOS DATOS EXISTENTES! - + Calculating... Calculando... diff --git a/dist/languages/fi.ts b/dist/languages/fi.ts index 7d56802ad7..4c1db2eef4 100644 --- a/dist/languages/fi.ts +++ b/dist/languages/fi.ts @@ -1191,1044 +1191,1029 @@ Setting to Handheld can help improve performance for low end systems. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - + Balanced - - + + Accurate - - + + Default - + Unsafe (fast) - + Safe (stable) - + Unsafe - + Paranoid (disables most optimizations) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed - + Exclusive Fullscreen - + No Video Output - + CPU Video Decoding - + GPU Video Decoding (Default) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) - + 3X (2160p/3240p) - + 4X (2880p/4320p) - + 5X (3600p/5400p) - + 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor - + Bilinear - + Bicubic - + Gaussian - + Lanczos - + ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - - + + None - + FXAA - + SMAA - + Default (16:9) - + Force 4:3 - + Force 21:9 - + Force 16:10 - + Stretch to Window - + Automatic - + 2x - + 4x - + 8x - + 16x - + 32x - + 64x - + Japanese (日本語) - + American English - + French (français) - + German (Deutsch) - + Italian (italiano) - + Spanish (español) - + Chinese - + Korean (한국어) - + Dutch (Nederlands) - + Portuguese (português) - + Russian (Русский) - + Taiwanese - + British English - + Canadian French - + Latin American Spanish - + Simplified Chinese - + Traditional Chinese (正體中文) - + Brazilian Portuguese (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan - + USA - + Europe - + Australia - + China - + Korea - + Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET - + CST6CDT - + Cuba - + EET - + Egypt - + Eire - + EST - + EST5EDT - + GB - + GB-Eire - + GMT - + GMT+0 - + GMT-0 - + GMT0 - + Greenwich - + Hongkong - + HST - + Iceland - + Iran - + Israel - + Jamaica - + Kwajalein - + Libya - + MET - + MST - + MST7MDT - + Navajo - + NZ - + NZ-CHAT - + Poland - + Portugal - + PRC - + PST8PDT - + ROC - + ROK - + Singapore - + Turkey - + UCT - + Universal - + UTC - + W-SU - + WET - + Zulu - + Mono - + Stereo - + Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked - + Handheld - - + + Off - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - - + + Medium (256) - - + + High (512) - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -5701,7 +5686,7 @@ Drag points to change position, or double-click table cells to edit values. - + Deleting ANY data is IRREVERSABLE! @@ -5712,12 +5697,12 @@ Drag points to change position, or double-click table cells to edit values. - UserNAND + User NAND - SysNAND + System NAND @@ -5764,7 +5749,7 @@ Drag points to change position, or double-click table cells to edit values. - + Calculating... diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts index 168eac8efc..df2b201c09 100644 --- a/dist/languages/fr.ts +++ b/dist/languages/fr.ts @@ -1245,1046 +1245,1031 @@ Les jeux adaptent leur résolution, leurs paramètres graphiques et les manettes Passer en mode Portable peut améliorer les performances sur les systèmes peu puissants. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot Choisir l’utilisateur au démarrage. - + Useful if multiple people use the same PC. Utile si plusieurs personnes utilisent le même PC. - + Pause when not in focus Pause lorsque la fenêtre n’est pas active. - + Pauses emulation when focusing on other windows. Met l’émulation en pause dès que l’utilisateur change de fenêtre. - + Confirm before stopping emulation Confirmer avant d'arrêter l'émulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Ignore les demandes de confirmation pour arrêter l’émulation. L’activer permet de contourner ces confirmations et de quitter directement l’émulation. - + Hide mouse on inactivity Cacher la souris en cas d'inactivité - + Hides the mouse after 2.5s of inactivity. Cache le curseur après 2,5 secondes d’inactivité. - + Disable controller applet Désactiver l'applet du contrôleur - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Désactive de force le menu de configuration des manettes dans les programmes émulés. Lorsqu’un programme tente d’ouvrir ce menu, il est immédiatement fermé. - + Check for updates Rechercher des mises à jours - + Whether or not to check for updates upon startup. Vérifier ou non les mises à jour au démarrage. - + Enable Gamemode Activer le mode jeu - + Force X11 as Graphics Backend Forcer X11 comme moteur graphique - + Custom frontend Interface personnalisée - + Real applet Applet réel - + Never Jamais - + On Load Au chargement - + Always Toujours - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Asynchrone - + Uncompressed (Best quality) Non compressé (Meilleure qualité) - + BC1 (Low quality) BC1 (Basse qualité) - + BC3 (Medium quality) BC3 (Qualité moyenne) - - + + Auto Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Conservateur - + Aggressive Agressif - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Nul - + Fast Rapide - + Balanced Moyen - - + + Accurate Précis - - + + Default Par défaut - + Unsafe (fast) Insecure (rapide) - + Safe (stable) Sûr (stable) - + Unsafe Risqué - + Paranoid (disables most optimizations) Paranoïaque (désactive la plupart des optimisations) - + Debugging Débogage - + Dynarmic Dynamique - + NCE NCE - + Borderless Windowed Fenêtré sans bordure - + Exclusive Fullscreen Plein écran exclusif - + No Video Output Pas de sortie vidéo - + CPU Video Decoding Décodage Vidéo sur le CPU - + GPU Video Decoding (Default) Décodage Vidéo sur le GPU (par défaut) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPÉRIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPÉRIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1,25X (900p/1350p) [EXPÉRIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPÉRIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Plus proche voisin - + Bilinear Bilinéaire - + Bicubic Bicubique - + Gaussian Gaussien - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area (Par zone) - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - - + + None Aucun - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Par défaut (16:9) - + Force 4:3 Forcer le 4:3 - + Force 21:9 Forcer le 21:9 - + Force 16:10 Forcer le 16:10 - + Stretch to Window Étirer à la fenêtre - + Automatic Automatique - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x 32x - + 64x 64x - + Japanese (日本語) Japonais (日本語) - + American English Anglais Américain - + French (français) Français (français) - + German (Deutsch) Allemand (Deutsch) - + Italian (italiano) Italien (italiano) - + Spanish (español) Espagnol (español) - + Chinese Chinois - + Korean (한국어) Coréen (한국어) - + Dutch (Nederlands) Néerlandais (Nederlands) - + Portuguese (português) Portugais (português) - + Russian (Русский) Russe (Русский) - + Taiwanese Taïwanais - + British English Anglais Britannique - + Canadian French Français Canadien - + Latin American Spanish Espagnol d'Amérique Latine - + Simplified Chinese Chinois Simplifié - + Traditional Chinese (正體中文) Chinois Traditionnel (正體中文) - + Brazilian Portuguese (português do Brasil) Portugais Brésilien (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japon - + USA É.-U.A. - + Europe Europe - + Australia Australie - + China Chine - + Korea Corée - + Taiwan Taïwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Par défaut (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Égypte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islande - + Iran Iran - + Israel Israël - + Jamaica Jamaïque - + Kwajalein Kwajalein - + Libya Libye - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Pologne - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapour - + Turkey Turquie - + UCT UCT - + Universal Universel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stéréo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (Par défaut) - + 6GB DRAM (Unsafe) 6 GB DRAM (Risqué) - + 8GB DRAM 8GO DRAM - + 10GB DRAM (Unsafe) 10GO DRAM (Insecure) - + 12GB DRAM (Unsafe) 12GO DRAM (Insecure) - + Docked Mode TV - + Handheld Mode Portable - - + + Off Désactivé - + Boost (1700MHz) Boost (1700MHz) - + Fast (2000MHz) Rapide (2000MHz) - + Always ask (Default) Toujours demander (par défaut) - + Only if game specifies not to stop Uniquement si le jeu précise de ne pas s'arrêter - + Never ask Jamais demander - - + + Medium (256) Moyen (256) - - + + High (512) Élevé (512) - + Very Small (16 MB) Très petit (16Mo) - + Small (32 MB) Petit (32Mo) - + Normal (128 MB) Normal (128Mo) - + Large (256 MB) Large (256Mo) - + Very Large (512 MB) Très large (512Mo) - + Very Low (4 MB) Très faible (4 Mo) - + Low (8 MB) Faible (8 Mo) - + Normal (16 MB) Normal (16 Mo) - + Medium (32 MB) Moyen (32 Mo) - + High (64 MB) Élevé (64 Mo) - + Very Low (32) Très faible (32) - + Low (64) Faible (64) - + Normal (128) Normal (128) - + Disabled Désactivé - + ExtendedDynamicState 1 État dynamique étendu 1 - + ExtendedDynamicState 2 État dynamique étendu 2 - + ExtendedDynamicState 3 État dynamique étendu 3 - + Tree View Vue en liste - + Grid View Vue en grille @@ -5793,7 +5778,7 @@ Faites glisser les points pour modifier la position ou double-cliquez sur les ce Gestionnaire de données - + Deleting ANY data is IRREVERSABLE! La suppression de TOUTES les données est IRRÉVERSIBLE ! @@ -5804,13 +5789,13 @@ Faites glisser les points pour modifier la position ou double-cliquez sur les ce - UserNAND - NAND utilisateur + User NAND + - SysNAND - SysNAND + System NAND + @@ -5856,7 +5841,7 @@ Faites glisser les points pour modifier la position ou double-cliquez sur les ce Importer les données dans ce répertoire. Cela peut prendre un certain temps et supprimera TOUTES LES DONNÉES EXISTANTES ! - + Calculating... Calcul en cours… diff --git a/dist/languages/hu.ts b/dist/languages/hu.ts index 4d48bc0009..42ced640de 100644 --- a/dist/languages/hu.ts +++ b/dist/languages/hu.ts @@ -1199,1044 +1199,1029 @@ Setting to Handheld can help improve performance for low end systems. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Emuláció leállításának megerősítése - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Egér elrejtése inaktivitáskor - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Vezérlő applet letiltása - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Játékmód engedélyezése - + Force X11 as Graphics Backend - + Custom frontend Egyéni frontend - + Real applet Valódi applet - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU aszinkron - + Uncompressed (Best quality) Tömörítetlen (legjobb minőség) - + BC1 (Low quality) BC1 (alacsony minőség) - + BC3 (Medium quality) BC3 (közepes minőség) - - + + Auto Automatikus - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Takarékos - + Aggressive Aggresszív - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - + Balanced - - + + Accurate Pontos - - + + Default Alapértelmezett - + Unsafe (fast) - + Safe (stable) - + Unsafe Nem biztonságos - + Paranoid (disables most optimizations) Paranoid (a legtöbb optimalizálást letiltja) - + Debugging - + Dynarmic Dinamikus - + NCE NCE - + Borderless Windowed Szegély nélküli ablak - + Exclusive Fullscreen Exkluzív teljes képernyő - + No Video Output Nincs videokimenet - + CPU Video Decoding CPU videódekódolás - + GPU Video Decoding (Default) GPU videódekódolás (alapértelmezett) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [KÍSÉRLETI] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [KÍSÉRLETI] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [KÍSÉRLETI] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Legközelebbi szomszéd - + Bilinear Bilineáris - + Bicubic Bikubikus - + Gaussian Gauss-féle - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - - + + None Nincs - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Alapértelmezett (16:9) - + Force 4:3 4:3 kényszerítése - + Force 21:9 21:9 kényszerítése - + Force 16:10 16:10 kényszerítése - + Stretch to Window Ablakhoz nyújtás - + Automatic Automatikus - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x - + 64x - + Japanese (日本語) Japán (日本語) - + American English Amerikai angol - + French (français) Francia (français) - + German (Deutsch) Német (Deutsch) - + Italian (italiano) Olasz (italiano) - + Spanish (español) Spanyol (español) - + Chinese Kínai - + Korean (한국어) Koreai (한국어) - + Dutch (Nederlands) Holland (Nederlands) - + Portuguese (português) Portugál (português) - + Russian (Русский) Orosz (Русский) - + Taiwanese Tajvani - + British English Brit Angol - + Canadian French Kanadai francia - + Latin American Spanish Latin-amerikai spanyol - + Simplified Chinese Egyszerűsített kínai - + Traditional Chinese (正體中文) Hagyományos kínai (正體中文) - + Brazilian Portuguese (português do Brasil) Brazíliai portugál (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japán - + USA USA - + Europe Európa - + Australia Ausztrália - + China Kína - + Korea Korea - + Taiwan Tajvan - + Auto (%1) Auto select time zone Automatikus (%1) - + Default (%1) Default time zone Alapértelmezett (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Egyiptom - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Izland - + Iran Irán - + Israel Izrael - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navahó - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Lengyelország - + Portugal Portugália - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Szingapúr - + Turkey Törökország - + UCT UCT - + Universal Univerzális - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Sztereó - + Surround Térhangzás - + 4GB DRAM (Default) 4GB DRAM (Alapértelmezett) - + 6GB DRAM (Unsafe) 6GB DRAM (Nem biztonságos) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Dokkolt - + Handheld Kézi - - + + Off - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) Mindig kérdezz rá (alapértelmezett) - + Only if game specifies not to stop Csak akkor, ha a játék kifejezetten kéri a folytatást. - + Never ask Soha ne kérdezz rá - - + + Medium (256) - - + + High (512) - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -5718,7 +5703,7 @@ Húzd a pontokat a pozíció megváltoztatásához, vagy kattints duplán a táb - + Deleting ANY data is IRREVERSABLE! @@ -5729,12 +5714,12 @@ Húzd a pontokat a pozíció megváltoztatásához, vagy kattints duplán a táb - UserNAND + User NAND - SysNAND + System NAND @@ -5781,7 +5766,7 @@ Húzd a pontokat a pozíció megváltoztatásához, vagy kattints duplán a táb - + Calculating... diff --git a/dist/languages/id.ts b/dist/languages/id.ts index 7ce7f9ce74..6a28fe45e2 100644 --- a/dist/languages/id.ts +++ b/dist/languages/id.ts @@ -43,7 +43,7 @@ li.checked::marker { content: "\2612"; } <html><head/><body><p><span style=" font-size:7pt;">&quot;Nintendo Switch&quot; is a trademark of Nintendo. Eden is not affiliated with Nintendo in any way.</span></p></body></html> - + <html><head/><body><p><span style=" font-size:7pt;">&quot;Nintendo Switch&quot; merupakan merek dagang milik Nintendo. eden tidak berafiliasi dengan Nintendo dalam maksud apapun.</span></p></body></html> @@ -498,7 +498,8 @@ Ini akan melarang nama pengguna forum mereka dan alamat IP mereka. This option increases CPU emulation thread use from 1 to the maximum of 4. This is mainly a debug option and shouldn't be disabled. - + Opsi ini meningkatkan penggunaan utas emulasi CPU dari 1 menjadi maksimum Switch yaitu 4. +Ini terutama merupakan opsi debug dan sebaiknya tidak dinonaktifkan. @@ -926,7 +927,7 @@ Safe to set at 16x on most GPUs. GPU Mode: - + Mode GPU: @@ -938,7 +939,7 @@ Particles tend to only render correctly with Accurate mode. DMA Accuracy: - + Akurasi DMA @@ -948,7 +949,7 @@ Particles tend to only render correctly with Accurate mode. Enable asynchronous shader compilation - + Gunakan kompilasi shader asinkron @@ -958,7 +959,7 @@ Particles tend to only render correctly with Accurate mode. Fast GPU Time - + Percepatan Waktu CPU @@ -1079,7 +1080,7 @@ This option may improve rendering quality and performance consistency in some ga Fix bloom effects - + Perbaiki efek bloom @@ -1121,7 +1122,7 @@ Higher states allow for more features and can increase performance, but may caus Sample Shading - + Pencahayaan Sampel @@ -1214,1044 +1215,1029 @@ Setting to Handheld can help improve performance for low end systems. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Konfirmasi sebelum menghentikan emulasi - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Sembunyikan mouse saat tidak aktif - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Nonaktifkan aplikasi pengontrol - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates Cek Pembaruan - + Whether or not to check for updates upon startup. - + Enable Gamemode Aktifkan Mode Permainan - + Force X11 as Graphics Backend - + Custom frontend Tampilan depan kustom - + Real applet Aplikasi nyata - + Never Tidak Pernah - + On Load - + Always Selalu - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU sinkron - + Uncompressed (Best quality) Tidak terkompresi (Kualitas Terbaik) - + BC1 (Low quality) BC1 (Kualitas rendah) - + BC3 (Medium quality) BC3 (Kualitas sedang) - - + + Auto Otomatis - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Konservatif - + Aggressive Agresif - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - + Cepat - + Balanced - + Seimbang - - + + Accurate Akurat - - + + Default Bawaan - + Unsafe (fast) - + Safe (stable) - + Unsafe Berbahaya - + Paranoid (disables most optimizations) Paranoid (menonaktifkan sebagian besar optimasi) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Layar Tanpa Batas - + Exclusive Fullscreen Layar Penuh Eksklusif - + No Video Output Tidak ada Keluaran Suara - + CPU Video Decoding Penguraian Video menggunakan CPU - + GPU Video Decoding (Default) Penguraian Video menggunakan GPU (Bawaan) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EKSPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EKSPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EKSPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Biliner - + Bicubic Bikubik - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - - + + None Tak ada - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Bawaan (16:9) - + Force 4:3 Paksa 4:3 - + Force 21:9 Paksa 21:9 - + Force 16:10 Paksa 16:10 - + Stretch to Window Regangkan ke Layar - + Automatic Otomatis - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x - + 64x - + Japanese (日本語) Jepang (日本語) - + American English Bahasa Inggris Amerika - + French (français) Prancis (français) - + German (Deutsch) Jerman (Deutsch) - + Italian (italiano) Italia (italiano) - + Spanish (español) Spanyol (español) - + Chinese Cina - + Korean (한국어) Korea (한국어) - + Dutch (Nederlands) Belanda (Nederlands) - + Portuguese (português) Portugis (português) - + Russian (Русский) Rusia (Русский) - + Taiwanese Taiwan - + British English Inggris Britania - + Canadian French Prancis Kanada - + Latin American Spanish Spanyol Amerika Latin - + Simplified Chinese Cina Sederhana - + Traditional Chinese (正體中文) Cina Tradisional (正體中文) - + Brazilian Portuguese (português do Brasil) Portugis Brazil (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Jepang - + USA USA - + Europe Eropa - + Australia Australia - + China Tiongkok - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Bawaan (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Mesir - + Eire Éire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Éire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Iran - + Israel Israel - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polandia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turki - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Bawaan) - + 6GB DRAM (Unsafe) 6GB DRAM (Tidak Aman) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 10GB DRAM (Tidak Aman) - + 12GB DRAM (Unsafe) - + 12GB DRAM (Tidak Aman) - + Docked Terpasang - + Handheld Jinjing - - + + Off - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) Selalu tanyakan (Bawaan) - + Only if game specifies not to stop Hanya jika permainan menentukan untuk tidak berhenti - + Never ask Jangan pernah bertanya - - + + Medium (256) - + Sedang (256) - - + + High (512) - + Tinggi (512) - + Very Small (16 MB) - + Sangat Kecil (16 MB) - + Small (32 MB) - + Kecil (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -3036,7 +3022,7 @@ Memungkinkan berbagai macam optimasi IR. Save Data - + Simpanan Data @@ -3112,7 +3098,7 @@ Memungkinkan berbagai macam optimasi IR. Select Save Data Directory... - + Pilih Direktori Simpanan Data... @@ -3132,7 +3118,7 @@ Memungkinkan berbagai macam optimasi IR. Save Data Directory - + Direktori Simpanan Data @@ -3147,7 +3133,7 @@ Memungkinkan berbagai macam optimasi IR. Reset to NAND - + Setel ulang ke NAND @@ -3171,23 +3157,23 @@ To: %2 Migrate Save Data - + Migrasi Simpanan Data Migrating save data... - + Memigrasi simpanan data... Cancel - + Batalkan Migration Failed - + Migrasi Gagal @@ -3203,7 +3189,7 @@ To: %2 Migration Complete - + Migrasi selesai @@ -5756,7 +5742,7 @@ Drag points to change position, or double-click table cells to edit values. - + Deleting ANY data is IRREVERSABLE! @@ -5767,12 +5753,12 @@ Drag points to change position, or double-click table cells to edit values. - UserNAND + User NAND - SysNAND + System NAND @@ -5819,7 +5805,7 @@ Drag points to change position, or double-click table cells to edit values. - + Calculating... @@ -5849,7 +5835,7 @@ Drag points to change position, or double-click table cells to edit values. Version - + Versi @@ -5900,7 +5886,7 @@ Drag points to change position, or double-click table cells to edit values. Connecting - + Menghubungkan @@ -5973,7 +5959,7 @@ Drag points to change position, or double-click table cells to edit values. Incorrect password. - + Password salah @@ -6015,7 +6001,7 @@ Please go to Configure -> System -> Network and make a selection. Error - + Galat @@ -6153,17 +6139,17 @@ Please go to Configure -> System -> Network and make a selection. Manage Play Time - + Kelola waktu bermain Edit Play Time Data - + Edit data waktu bermain Remove Play Time Data - + Hapus data waktu bermain @@ -6179,7 +6165,7 @@ Please go to Configure -> System -> Network and make a selection. Verify Integrity - + Verifikasi Integritas @@ -6269,7 +6255,7 @@ Please go to Configure -> System -> Network and make a selection. Play time - + Waktu bermain @@ -6545,7 +6531,7 @@ Debug Message: Fullscreen - + Layar penuh @@ -6565,7 +6551,7 @@ Debug Message: Create Room - + Buat Ruangan @@ -6575,12 +6561,12 @@ Debug Message: Leave Room - + Keluar dari Ruangan Show Current Room - + Tampilkan ruangan saat ini @@ -9797,7 +9783,7 @@ Would you like to manually select a portable folder to use? Mod Name - + Nama Mod @@ -9807,7 +9793,7 @@ Would you like to manually select a portable folder to use? RomFS - + RomFS @@ -9817,12 +9803,12 @@ Would you like to manually select a portable folder to use? Cheat - + Cheat Mod Type - + Tipe Mod @@ -9866,7 +9852,7 @@ Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. Contains game save data. DO NOT REMOVE UNLESS YOU KNOW WHAT YOU'RE DOING! - + Berisikan simpanan data game. JANGAN DIHAPUS KECUALI KAMU TAHU YANG KAMU LAKUKAN! @@ -9876,7 +9862,7 @@ Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. Contains updates and DLC for games. - + Berisi pembaruan dan DLC untuk game ini @@ -10030,7 +10016,7 @@ This is recommended if you want to share data between emulators. Players: - + Pemain: @@ -10040,7 +10026,7 @@ This is recommended if you want to share data between emulators. P4 - + P4 @@ -10104,17 +10090,17 @@ This is recommended if you want to share data between emulators. Use Current Config - + Pakai konfigurasi saat ini P2 - + P2 P1 - + P1 @@ -10126,27 +10112,27 @@ This is recommended if you want to share data between emulators. P3 - + P3 P7 - + P7 P8 - + P8 P5 - + P5 P6 - + P6 @@ -10182,7 +10168,7 @@ This is recommended if you want to share data between emulators. Create - + Buat @@ -10237,7 +10223,7 @@ This is recommended if you want to share data between emulators. Not enough controllers - + Kontroler tidak cukup. @@ -10393,7 +10379,7 @@ Please try again or contact the developer of the software. Software Keyboard - + Papan Ketik Perangkat Lunak @@ -10448,7 +10434,7 @@ By selecting "From Eden", previous save data stored in Ryujinx will be Cancel - + Batalkan @@ -10479,17 +10465,17 @@ By selecting "From Eden", previous save data stored in Ryujinx will be Hours: - + Jam: Minutes: - + Menit: Seconds: - + Detik: diff --git a/dist/languages/it.ts b/dist/languages/it.ts index 20181c78e6..146f7f2605 100644 --- a/dist/languages/it.ts +++ b/dist/languages/it.ts @@ -1248,1046 +1248,1031 @@ I giochi ne terranno conto e modificheranno la risoluzione, i dettagli e i contr Impostare l'opzione su "Portatile" può aiutare a migliorare le prestazioni sui sistemi meno potenti. - - Unit Serial - Codice seriale dell'unità - - - - Battery Serial - Codice seriale della batteria - - - - Debug knobs - - - - + Prompt for user profile on boot Scegli il profilo utente all'avvio - + Useful if multiple people use the same PC. Utile se più persone utilizzano lo stesso PC. - + Pause when not in focus Metti in pausa quando la finestra non è in primo piano - + Pauses emulation when focusing on other windows. Mette in pausa l'emulazione quando altre finestre sono in primo piano. - + Confirm before stopping emulation Chiedi conferma prima di arrestare l'emulazione - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Sovrascrive le richieste di conferma per fermare l'emulazione. Abilitarla bypassa queste richieste e l'emulazione cesserà immediatamente. - + Hide mouse on inactivity Nascondi il puntatore del mouse se inattivo - + Hides the mouse after 2.5s of inactivity. Nasconde il mouse dopo 2,5 secondi di inattività. - + Disable controller applet Disabilita l'applet controller - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Disabilita forzatamente l'uso dell'applet del controller nei programmi emulati. Quando un programma proverà ad aprire l'applet del controller, quest'ultimo verrà immediatamente chiuso. - + Check for updates Controlla la presenza di aggiornamenti - + Whether or not to check for updates upon startup. Determina se controllare o meno la presenza di aggiornamenti all'avvio. - + Enable Gamemode Abilita Gamemode - + Force X11 as Graphics Backend Forza l'uso del back-end grafico X11 - + Custom frontend Frontend personalizzato - + Real applet Applet reale - + Never Mai - + On Load Al caricamento - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU (Asincrono) - + Uncompressed (Best quality) Nessuna compressione (qualità migliore) - + BC1 (Low quality) BC1 (qualità bassa) - + BC3 (Medium quality) BC3 (qualità media) - - + + Auto Automatico - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservativa - + Aggressive Aggressiva - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (shader assembly, solo NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (sperimentale, solo AMD/MESA) - + Null Nullo - + Fast Veloce - + Balanced Bilanciata - - + + Accurate Accurata - - + + Default Predefinito - + Unsafe (fast) Non sicuro (veloce) - + Safe (stable) Sicuro (stabile) - + Unsafe Non sicura - + Paranoid (disables most optimizations) Paranoica (disabilita la maggior parte delle ottimizzazioni) - + Debugging Debug - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Finestra senza bordi - + Exclusive Fullscreen Schermo intero esclusivo - + No Video Output Nessun output video - + CPU Video Decoding Decodifica video CPU - + GPU Video Decoding (Default) Decodifica video GPU (predefinita) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [SPERIMENTALE] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [SPERIMENTALE] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [SPERIMENTALE] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [SPERIMENTALE] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [SPERIMENTALE] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest neighbor - + Bilinear Bilineare - + Bicubic Bicubico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - - + + None Nessuna - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Predefinito (16:9) - + Force 4:3 Forza 4:3 - + Force 21:9 Forza 21:9 - + Force 16:10 Forza 16:10 - + Stretch to Window Allunga a finestra - + Automatic Automatico - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x 32x - + 64x 64x - + Japanese (日本語) Giapponese (日本語) - + American English Inglese americano - + French (français) Francese (français) - + German (Deutsch) Tedesco (Deutsch) - + Italian (italiano) Italiano - + Spanish (español) Spagnolo (español) - + Chinese Cinese - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Olandese (Nederlands) - + Portuguese (português) Portoghese (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanese - + British English Inglese britannico - + Canadian French Francese canadese - + Latin American Spanish Spagnolo latino-americano - + Simplified Chinese Cinese semplificato - + Traditional Chinese (正體中文) Cinese tradizionale (正體中文) - + Brazilian Portuguese (português do Brasil) Portoghese brasiliano (português do Brasil) - + Polish (polska) Polacco (polska) - + Thai (แบบไทย) Thailandese (แบบไทย) - - + + Japan Giappone - + USA USA - + Europe Europa - + Australia Australia - + China Cina - + Korea Corea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Automatico (%1) - + Default (%1) Default time zone Predefinito (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egitto - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islanda - + Iran Iran - + Israel Israele - + Jamaica Giamaica - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polonia - + Portugal Portogallo - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turchia - + UCT UCT - + Universal Universale - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Predefinito) - + 6GB DRAM (Unsafe) 6GB DRAM (Non sicuro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Non sicuro) - + 12GB DRAM (Unsafe) 12GB DRAM (Non sicuro) - + Docked Dock - + Handheld Portatile - - + + Off Disattivato - + Boost (1700MHz) Boost (1700MHz) - + Fast (2000MHz) Veloce (2000MHz) - + Always ask (Default) Chiedi sempre (Predefinito) - + Only if game specifies not to stop Solo se il gioco richiede di non essere arrestato - + Never ask Non chiedere mai - - + + Medium (256) Medio (256) - - + + High (512) Alto (512) - + Very Small (16 MB) Molto piccola (16 MB) - + Small (32 MB) Piccola (32 MB) - + Normal (128 MB) Normale (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Molto grande (512 MB) - + Very Low (4 MB) Molto bassa (4 MB) - + Low (8 MB) Bassa (8 MB) - + Normal (16 MB) Normale (16 MB) - + Medium (32 MB) Media (32 MB) - + High (64 MB) Alta (64 MB) - + Very Low (32) Molto basso (32) - + Low (64) Basso (64) - + Normal (128) Normale (128) - + Disabled Disabilitato - + ExtendedDynamicState 1 Stato dinamico esteso 1 - + ExtendedDynamicState 2 Stato dinamico esteso 2 - + ExtendedDynamicState 3 Stato dinamico esteso 3 - + Tree View Vista ad albero - + Grid View Vista a griglia @@ -5815,7 +5800,7 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab Gestione dati - + Deleting ANY data is IRREVERSABLE! La cancellazione di qualsiasi dato è IRREVERSIBILE! @@ -5826,13 +5811,13 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab - UserNAND - UserNAND + User NAND + - SysNAND - SysNAND + System NAND + @@ -5878,7 +5863,7 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab Importa dati in questa cartella. Potrebbe impiegare un po' di tempo, e TUTTI I DATI ESISTENTI verranno cancellati! - + Calculating... Calcolo in corso... diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts index 83b022e695..a6128bb885 100644 --- a/dist/languages/ja_JP.ts +++ b/dist/languages/ja_JP.ts @@ -1196,1044 +1196,1029 @@ Setting to Handheld can help improve performance for low end systems. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation エミュレーションを停止する前に確認する - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity 非アクティブ時にマウスカーソルを隠す - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet コントローラーアプレットの無効化 - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 非同期 - + Uncompressed (Best quality) 圧縮しない (最高品質) - + BC1 (Low quality) BC1 (低品質) - + BC3 (Medium quality) BC3 (中品質) - - + + Auto 自動 - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (アセンブリシェーダー、NVIDIA のみ) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V(実験的、AMD/Mesaのみ) - + Null - + Fast - + Balanced - - + + Accurate 正確 - - + + Default デフォルト - + Unsafe (fast) - + Safe (stable) - + Unsafe 不安定 - + Paranoid (disables most optimizations) パラノイド (ほとんどの最適化を無効化) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed ボーダーレスウィンドウ - + Exclusive Fullscreen 排他的フルスクリーン - + No Video Output ビデオ出力しない - + CPU Video Decoding ビデオをCPUでデコード - + GPU Video Decoding (Default) ビデオをGPUでデコード (デフォルト) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [実験的] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [実験的] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [実験的] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area - + MMPX MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - - + + None なし - + FXAA FXAA - + SMAA SMAA - + Default (16:9) デフォルト (16:9) - + Force 4:3 強制 4:3 - + Force 21:9 強制 21:9 - + Force 16:10 強制 16:10 - + Stretch to Window ウィンドウに合わせる - + Automatic 自動 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x 32x - + 64x 64x - + Japanese (日本語) 日本語 - + American English アメリカ英語 - + French (français) フランス語 (français) - + German (Deutsch) ドイツ語 (Deutsch) - + Italian (italiano) イタリア語 (italiano) - + Spanish (español) スペイン語 (español) - + Chinese 中国語 - + Korean (한국어) 韓国語 (한국어) - + Dutch (Nederlands) オランダ語 (Nederlands) - + Portuguese (português) ポルトガル語 (português) - + Russian (Русский) ロシア語 (Русский) - + Taiwanese 台湾語 - + British English イギリス英語 - + Canadian French カナダフランス語 - + Latin American Spanish ラテンアメリカスペイン語 - + Simplified Chinese 簡体字中国語 - + Traditional Chinese (正體中文) 繁体字中国語 (正體中文) - + Brazilian Portuguese (português do Brasil) ブラジルポルトガル語 (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan 日本 - + USA アメリカ - + Europe ヨーロッパ - + Australia オーストラリア - + China 中国 - + Korea 韓国 - + Taiwan 台湾 - + Auto (%1) Auto select time zone 自動 (%1) - + Default (%1) Default time zone 既定 (%1) - + CET 中央ヨーロッパ時間 - + CST6CDT CST6CDT - + Cuba キューバ - + EET 東ヨーロッパ標準時 - + Egypt エジプト - + Eire アイルランド - + EST アメリカ東部標準時 - + EST5EDT EST5EDT - + GB GB - + GB-Eire イギリス-アイルランド - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich グリニッジ - + Hongkong 香港 - + HST ハワイ標準時 - + Iceland アイスランド - + Iran イラン - + Israel イスラエル - + Jamaica ジャマイカ - + Kwajalein クェゼリン - + Libya リビア - + MET 中東時間 - + MST MST - + MST7MDT MST7MDT - + Navajo ナバホ - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland ポーランド - + Portugal ポルトガル - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore シンガポール - + Turkey トルコ - + UCT UCT - + Universal ユニバーサル - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu ズールー - + Mono モノラル - + Stereo ステレオ - + Surround サラウンド - + 4GB DRAM (Default) 4GB DRAM (デフォルト) - + 6GB DRAM (Unsafe) 6GB DRAM (不安定) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld 携帯モード - - + + Off - + Boost (1700MHz) Boost (1700MHz) - + Fast (2000MHz) Fast (2000MHz) - + Always ask (Default) 常に確認する (デフォルト) - + Only if game specifies not to stop ゲームが停止しないように指定しているときのみ - + Never ask 確認しない - - + + Medium (256) - - + + High (512) - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Disabled 無効 - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -5741,7 +5726,7 @@ Drag points to change position, or double-click table cells to edit values. - + Deleting ANY data is IRREVERSABLE! @@ -5752,12 +5737,12 @@ Drag points to change position, or double-click table cells to edit values. - UserNAND + User NAND - SysNAND + System NAND @@ -5804,7 +5789,7 @@ Drag points to change position, or double-click table cells to edit values. - + Calculating... diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts index 6de2935190..6737f5cae5 100644 --- a/dist/languages/ko_KR.ts +++ b/dist/languages/ko_KR.ts @@ -1193,1044 +1193,1029 @@ Setting to Handheld can help improve performance for low end systems. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity 비활성 상태일 때 마우스 숨기기 - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet 컨트롤러 애플릿 비활성화 - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous - + Uncompressed (Best quality) 비압축(최고 품질) - + BC1 (Low quality) BC1(저품질) - + BC3 (Medium quality) BC3(중간 품질) - - + + Auto 자동 - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulcan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - + Balanced - - + + Accurate 정확함 - - + + Default 기본값 - + Unsafe (fast) - + Safe (stable) - + Unsafe 최적화 (안전하지 않음) - + Paranoid (disables most optimizations) 편집증(대부분의 최적화 비활성화) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed 경계 없는 창 모드 - + Exclusive Fullscreen 독점 전체화면 모드 - + No Video Output 비디오 출력 없음 - + CPU Video Decoding CPU 비디오 디코딩 - + GPU Video Decoding (Default) GPU 비디오 디코딩(기본값) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [실험적] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [실험적] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 최근접 보간 - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian 가우시안 - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - - + + None 없음 - + FXAA FXAA - + SMAA SMAA - + Default (16:9) 기본 (16:9) - + Force 4:3 강제 4:3 - + Force 21:9 강제 21:9 - + Force 16:10 강제 16:10 - + Stretch to Window 창에 맞게 늘림 - + Automatic 자동 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x - + 64x - + Japanese (日本語) 일본어 (日本語) - + American English 미국 영어 - + French (français) 프랑스어(français) - + German (Deutsch) 독일어(Deutsch) - + Italian (italiano) 이탈리아어(italiano) - + Spanish (español) 스페인어(español) - + Chinese 중국어 - + Korean (한국어) 한국어 (Korean) - + Dutch (Nederlands) 네덜란드어 (Nederlands) - + Portuguese (português) 포르투갈어(português) - + Russian (Русский) 러시아어 (Русский) - + Taiwanese 대만어 - + British English 영어 (British English) - + Canadian French 캐나다 프랑스어 - + Latin American Spanish 라틴 아메리카 스페인어 - + Simplified Chinese 간체 - + Traditional Chinese (正體中文) 중국어 번체 (正體中文) - + Brazilian Portuguese (português do Brasil) 브라질 포르투갈어(português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan 일본 - + USA 미국 - + Europe 유럽 - + Australia 호주 - + China 중국 - + Korea 대한민국 - + Taiwan 대만 - + Auto (%1) Auto select time zone 자동 (%1) - + Default (%1) Default time zone 기본 (%1) - + CET 중앙유럽 표준시(CET) - + CST6CDT CST6CDT - + Cuba 쿠바 - + EET 동유럽 표준시(EET) - + Egypt 이집트 - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB 영국 하계 표준시(GB) - + GB-Eire GB-Eire - + GMT 그리니치 표준시(GMT) - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 그리니치 - + Hongkong 홍콩 - + HST 하와이-알류샨 표준시(HST) - + Iceland 아이슬란드 - + Iran 이란 - + Israel 이스라엘 - + Jamaica 자메이카 - + Kwajalein 크와잘린 - + Libya 리비아 - + MET 중앙유럽 표준시(MET) - + MST 산악 표준시(MST) - + MST7MDT MST7MDT - + Navajo 나바호 - + NZ 뉴질랜드 표준시(NZ) - + NZ-CHAT 채텀 표준시(NZ-CHAT) - + Poland 폴란드 - + Portugal 포르투갈 - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK 북한 표준시(ROK) - + Singapore 싱가포르 - + Turkey 터키 - + UCT UCT - + Universal Universal - + UTC 협정 세계시(UTC) - + W-SU 유럽/모스크바(W-SU) - + WET 서유럽 - + Zulu 줄루 - + Mono 모노 - + Stereo 스테레오 - + Surround 서라운드 - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked 거치 모드 - + Handheld 휴대 모드 - - + + Off - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - - + + Medium (256) - - + + High (512) - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -5739,7 +5724,7 @@ Drag points to change position, or double-click table cells to edit values. - + Deleting ANY data is IRREVERSABLE! @@ -5750,12 +5735,12 @@ Drag points to change position, or double-click table cells to edit values. - UserNAND + User NAND - SysNAND + System NAND @@ -5802,7 +5787,7 @@ Drag points to change position, or double-click table cells to edit values. - + Calculating... diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts index 282bad749f..7f22606b5f 100644 --- a/dist/languages/nb.ts +++ b/dist/languages/nb.ts @@ -1193,1044 +1193,1029 @@ Setting to Handheld can help improve performance for low end systems. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Bekreft før stopping av emulering - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Gjem mus under inaktivitet - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Deaktiver kontroller-appleten - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates Se etter oppdateringer - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never Aldri - + On Load - + Always Alltid - + CPU CPU - + GPU Skjermkort - + CPU Asynchronous - + Uncompressed (Best quality) Ukomprimert (Best kvalitet) - + BC1 (Low quality) BC1 (Lav kvalitet) - + BC3 (Medium quality) BC3 (Middels kvalitet) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (eksperimentelt, kun AMD/Mesa) - + Null Null - + Fast Rask - + Balanced Balansert - - + + Accurate Nøyaktig - - + + Default Standard - + Unsafe (fast) Utrygg (raskt) - + Safe (stable) Trygg (stabil) - + Unsafe Utrygt - + Paranoid (disables most optimizations) Paranoid (deaktiverer de fleste optimaliseringer) - + Debugging - + Dynarmic - + NCE NCE - + Borderless Windowed Rammeløst vindu - + Exclusive Fullscreen Eksklusiv fullskjerm - + No Video Output Ingen videoutdata - + CPU Video Decoding CPU-videodekoding - + GPU Video Decoding (Default) GPU-videodekoding (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0,25× (180p/270p) [EKSPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5× (360p/540p) [EKSPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75× (540p/810p) [EKSPERIMENTELL] - + 1X (720p/1080p) 1× (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1,25× (900p/1350p) [EKSPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1,5× (1080p/1620p) [EKSPERIMENTELL] - + 2X (1440p/2160p) 2× (1440p/2160p) - + 3X (2160p/3240p) 3× (2160p/3240p) - + 4X (2880p/4320p) 4× (2880p/4320p) - + 5X (3600p/5400p) 5× (3600p/5400p) - + 6X (4320p/6480p) 6× (4320p/6480p) - + 7X (5040p/7560p) 7× (5040p/7560p) - + 8X (5760p/8640p) 8× (5760p/8640p) - + Nearest Neighbor Nærmeste nabo - + Bilinear Bilineær - + Bicubic Bikubisk - + Gaussian Gaussisk - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Område - + MMPX MMPX - + Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - - + + None Ingen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tving 4:3 - + Force 21:9 Tving 21:9 - + Force 16:10 Tving 16:10 - + Stretch to Window Strekk til vinduet - + Automatic Automatisk - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x 32x - + 64x 64x - + Japanese (日本語) Japansk (日本語) - + American English Amerikansk engelsk - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Chinese Kinesisk - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Nederlandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Taiwanese Taiwansk - + British English Britisk engelsk - + Canadian French Kanadisk fransk - + Latin American Spanish Latinamerikansk spansk - + Simplified Chinese Forenklet kinesisk - + Traditional Chinese (正體中文) Tradisjonell kinesisk (正體中文) - + Brazilian Portuguese (português do Brasil) Brasiliansk portugisisk (português do Brasil) - + Polish (polska) Polsk (polska) - + Thai (แบบไทย) Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australia - + China Folkerepublikken Kina - + Korea Korea - + Taiwan Taiwan (Republikken Kina) - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standard (%1) - + CET Sentraleuropeisk tid - + CST6CDT CST6CDT - + Cuba Cuba - + EET Østeuropeisk tid - + Egypt Egypt - + Eire Republikken Irland - + EST EST - + EST5EDT EST5EDT - + GB Storbritannia - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC Folkerepublikken Kina - + PST8PDT PST8PDT - + ROC Taiwan (Republikken Kina) - + ROK Sør-Korea - + Singapore Singapore - + Turkey Tyrkia - + UCT UCT - + Universal Universalt - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (Standard) - + 6GB DRAM (Unsafe) 6 GB DRAM (Utrygt) - + 8GB DRAM 8 GB DRAM - + 10GB DRAM (Unsafe) 10 GB DRAM (Utrygt) - + 12GB DRAM (Unsafe) 12 GB DRAM (Utrygt) - + Docked I dokking - + Handheld Håndholdt - - + + Off Av - + Boost (1700MHz) Boost (1700 MHz) - + Fast (2000MHz) Rask (2000 MHz) - + Always ask (Default) Spør alltid (Standard) - + Only if game specifies not to stop - + Never ask Aldri spør - - + + Medium (256) Middels (256) - - + + High (512) Høy (512) - + Very Small (16 MB) Veldig liten (16 MB) - + Small (32 MB) Liten (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Stor (256 MB) - + Very Large (512 MB) Veldig stor (512 MB) - + Very Low (4 MB) Veldig lav (4 MB) - + Low (8 MB) Lav (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Middels (32 MB) - + High (64 MB) Høy (64 MB) - + Very Low (32) Svært lav (32) - + Low (64) Lav (64) - + Normal (128) Normal (128) - + Disabled Skrudd av - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -5738,7 +5723,7 @@ Dra punkter for å endre posisjon, eller dobbelttrykk på tabellfelter for å re Databehandler - + Deleting ANY data is IRREVERSABLE! @@ -5749,13 +5734,13 @@ Dra punkter for å endre posisjon, eller dobbelttrykk på tabellfelter for å re - UserNAND + User NAND - SysNAND - SysNAND + System NAND + @@ -5801,7 +5786,7 @@ Dra punkter for å endre posisjon, eller dobbelttrykk på tabellfelter for å re - + Calculating... diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts index a299835b4a..ca69114e62 100644 --- a/dist/languages/nl.ts +++ b/dist/languages/nl.ts @@ -1202,1044 +1202,1029 @@ Setting to Handheld can help improve performance for low end systems. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Bevestig voordat u de emulatie stopt - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Verberg muis wanneer inactief - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Controller-applet uitschakelen - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) BC1 (Lage Kwaliteit) - + BC3 (Medium quality) BC3 (Gemiddelde kwaliteit) - - + + Auto Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - + Balanced - - + + Accurate Accuraat - - + + Default Standaard - + Unsafe (fast) - + Safe (stable) - + Unsafe Onveilig - + Paranoid (disables most optimizations) Paranoid (schakelt de meeste optimalisaties uit) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Randloos Venster - + Exclusive Fullscreen Exclusief Volledig Scherm - + No Video Output Geen Video-uitvoer - + CPU Video Decoding CPU Videodecodering - + GPU Video Decoding (Default) GPU Videodecodering (Standaard) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTEEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTEEL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - - + + None Geen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standaart (16:9) - + Force 4:3 Forceer 4:3 - + Force 21:9 Forceer 21:9 - + Force 16:10 Forceer 16:10 - + Stretch to Window Uitrekken naar Venster - + Automatic Automatisch - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x - + 64x - + Japanese (日本語) Japans (日本語) - + American English Amerikaans-Engels - + French (français) Frans (Français) - + German (Deutsch) Duits (Deutsch) - + Italian (italiano) Italiaans (italiano) - + Spanish (español) Spaans (Español) - + Chinese Chinees - + Korean (한국어) Koreaans (한국어) - + Dutch (Nederlands) Nederlands (Nederlands) - + Portuguese (português) Portugees (português) - + Russian (Русский) Russisch (Русский) - + Taiwanese Taiwanese - + British English Brits-Engels - + Canadian French Canadees-Frans - + Latin American Spanish Latijns-Amerikaans Spaans - + Simplified Chinese Vereenvoudigd Chinees - + Traditional Chinese (正體中文) Traditioneel Chinees (正體中文) - + Brazilian Portuguese (português do Brasil) Braziliaans-Portugees (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australië - + China China - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standaard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Ijsland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libië - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkije - + UCT UCT - + Universal Universeel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Off - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - - + + Medium (256) - - + + High (512) - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -5736,7 +5721,7 @@ Versleep punten om de positie te veranderen, of dubbelklik op tabelcellen om waa - + Deleting ANY data is IRREVERSABLE! @@ -5747,12 +5732,12 @@ Versleep punten om de positie te veranderen, of dubbelklik op tabelcellen om waa - UserNAND + User NAND - SysNAND + System NAND @@ -5799,7 +5784,7 @@ Versleep punten om de positie te veranderen, of dubbelklik op tabelcellen om waa - + Calculating... diff --git a/dist/languages/pl.ts b/dist/languages/pl.ts index 906a046125..e3e720b23f 100644 --- a/dist/languages/pl.ts +++ b/dist/languages/pl.ts @@ -1247,1046 +1247,1031 @@ W zależności od tego ustawienia gry zmienią swoją rozdzielczość, szczegó Ustawienie na Handheld może poprawić wydajność na słabszych komputerach. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot Pytaj o profil użytkownika przy uruchomieniu. - + Useful if multiple people use the same PC. Przydatne, gdy z tego samego PC korzysta wiele osób. - + Pause when not in focus Wstrzymuj, gdy okno nie jest aktywne - + Pauses emulation when focusing on other windows. Wstrzymuje emulację po przełączeniu na inne okna. - + Confirm before stopping emulation Potwierdzaj przed zatrzymaniem emulacji - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Nadpisuje monity z prośbą o potwierdzenie zatrzymania emulacji. Włączenie powoduje pominięcie takich monitów i bezpośrednie wyjście z emulacji. - + Hide mouse on inactivity Ukryj mysz przy braku aktywności - + Hides the mouse after 2.5s of inactivity. Ukrywa kursor po 2,5 s bezczynności. - + Disable controller applet Wyłącz aplet kontrolera - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Wymusza wyłączenie użycia apletu kontrolera w oprogramowaniu uruchamianym w emulacji. Jeśli emulowane oprogramowanie próbuje otworzyć aplet kontrolera, jest on natychmiast zamykany. - + Check for updates Sprawdź aktualizacje - + Whether or not to check for updates upon startup. Czy sprawdzać aktualizacje przy uruchomieniu. - + Enable Gamemode Włącz Tryb gry - + Force X11 as Graphics Backend Wymuś X11 jako backend grafiki - + Custom frontend Niestandardowy frontend - + Real applet Prawdziwy aplet - + Never Nigdy - + On Load Przy wczytywaniu - + Always Zawsze - + CPU CPU - + GPU GPU - + CPU Asynchronous Asynchroniczne CPU - + Uncompressed (Best quality) Brak (najlepsza jakość) - + BC1 (Low quality) BC1 (niska jakość) - + BC3 (Medium quality) BC3 (średnia jakość) - - + + Auto Automatyczny - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Konserwatywny - + Aggressive Agresywny - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast Szybkie - + Balanced Zrównoważony - - + + Accurate Dokładny - - + + Default Domyślny - + Unsafe (fast) Niezalecane (szybkie) - + Safe (stable) Bezpieczne (stabilne) - + Unsafe Niebezpieczny - + Paranoid (disables most optimizations) Paranoiczne (wyłącza większość optymalizacji) - + Debugging Debugowanie - + Dynarmic Dynamiczny - + NCE NCE - + Borderless Windowed W oknie (Bezramkowy) - + Exclusive Fullscreen Exclusive Fullscreen - + No Video Output Brak wyjścia wideo - + CPU Video Decoding Dekodowanie Wideo przez CPU - + GPU Video Decoding (Default) Dekodowanie Wideo przez GPU (Domyślne) - + 0.25X (180p/270p) [EXPERIMENTAL] 0,25x (180p/270p) [EKSPERYMENTALNE] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5x (360p/540p) [EKSPERYMENTALNE] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EKSPERYMENTALNE] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EKSPERYMENTALNE] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [Ekperymentalnie] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Najbliższy sąsiadujący - + Bilinear Bilinearny - + Bicubic Bikubiczny - + Gaussian Kulisty - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Obszar - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - - + + None Żadna (wyłączony) - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Domyślne (16:9) - + Force 4:3 Wymuś 4:3 - + Force 21:9 Wymuś 21:9 - + Force 16:10 Wymuś 16:10 - + Stretch to Window Rozciągnij do Okna - + Automatic Automatyczne - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x 32x - + 64x 64x - + Japanese (日本語) Japoński (日本語) - + American English Angielski Amerykański - + French (français) Francuski (français) - + German (Deutsch) Niemiecki (Niemcy) - + Italian (italiano) Włoski (italiano) - + Spanish (español) Hiszpański (español) - + Chinese Chiński - + Korean (한국어) Koreański (한국어) - + Dutch (Nederlands) Duński (Holandia) - + Portuguese (português) Portugalski (português) - + Russian (Русский) Rosyjski (Русский) - + Taiwanese Tajwański - + British English Angielski Brytyjski - + Canadian French Fancuski (Kanada) - + Latin American Spanish Hiszpański (Latin American) - + Simplified Chinese Chiński (Uproszczony) - + Traditional Chinese (正體中文) Chiński tradycyjny (正體中文) - + Brazilian Portuguese (português do Brasil) Portugalski (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonia - + USA USA - + Europe Europa - + Australia Australia - + China Chiny - + Korea Korea - + Taiwan Tajwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Domyślne (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipt - + Eire Irlandia - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Iran - + Israel Izrael - + Jamaica Jamajka - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polska - + Portugal Portugalia - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turcja - + UCT UCT - + Universal Uniwersalny - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Domyślne) - + 6GB DRAM (Unsafe) 6GB DRAM (NIebezpieczne) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (NIebezpieczne) - + 12GB DRAM (Unsafe) 12GB DRAM (NIebezpieczne) - + Docked Zadokowany - + Handheld Przenośnie - - + + Off Wyłączone - + Boost (1700MHz) Boost (1700MHz) - + Fast (2000MHz) Szybki (2000MHz) - + Always ask (Default) Zawsze pytaj (Domyślne) - + Only if game specifies not to stop Tylko jeśli gra określa, aby nie zatrzymywać - + Never ask Nie pytaj więcej - - + + Medium (256) Średnie (256) - - + + High (512) Wysokie (512) - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Disabled Wyłączone - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View - + Grid View @@ -5805,7 +5790,7 @@ Przeciągnij punkty, aby zmienić pozycję, lub kliknij dwukrotnie komórki tabe Menedżer danych - + Deleting ANY data is IRREVERSABLE! Usunięcie JAKICHKOLWIEK danych jest NIEODWRACALNE! @@ -5816,13 +5801,13 @@ Przeciągnij punkty, aby zmienić pozycję, lub kliknij dwukrotnie komórki tabe - UserNAND - UserNAND + User NAND + - SysNAND - SysNAND + System NAND + @@ -5868,7 +5853,7 @@ Przeciągnij punkty, aby zmienić pozycję, lub kliknij dwukrotnie komórki tabe Zaimportuj dane dla tego katalogu. To może chwilę potrwać i USUNIE WSZYSTKIE ISTNIEJĄCE DANE! - + Calculating... Obliczanie... diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts index 971f1cedd4..831f28c0be 100644 --- a/dist/languages/pt_BR.ts +++ b/dist/languages/pt_BR.ts @@ -1253,1046 +1253,1031 @@ Os jogos ajustarão resolução, detalhes e controladores suportados conforme es Definir como Portátil pode ajudar a melhorar o desempenho em sistemas mais fracos. - - Unit Serial - Número de Série da Unidade - - - - Battery Serial - Número de Série da Bateria - - - - Debug knobs - Opções de depuração - - - + Prompt for user profile on boot Solicitar perfil de usuário na inicialização - + Useful if multiple people use the same PC. Útil se várias pessoas usam o mesmo PC. - + Pause when not in focus Pausar quando não estiver em foco - + Pauses emulation when focusing on other windows. Pausa a emulação ao focar em outras janelas. - + Confirm before stopping emulation Confirmar antes de parar a emulação - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Substitui as confirmações ao parar a emulação. Ao ativar, ignora esses avisos e encerra diretamente a emulação. - + Hide mouse on inactivity Esconder rato quando inactivo. - + Hides the mouse after 2.5s of inactivity. Oculta o mouse após 2,5s de inatividade. - + Disable controller applet Desabilitar applet de controle - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Desativa forçadamente o uso do applet de controle em programas emulados. Quando um programa tenta abrir o applet, ele é imediatamente fechado. - + Check for updates Verificar atualizações - + Whether or not to check for updates upon startup. Define se deve verificar atualizações na inicialização. - + Enable Gamemode Habilitar Gamemode - + Force X11 as Graphics Backend Forçar X11 como backend gráfico - + Custom frontend Frontend customizado - + Real applet Applet real - + Never Nunca - + On Load Ao carregar - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Assíncrona - + Uncompressed (Best quality) Descompactado (Melhor Qualidade) - + BC1 (Low quality) BC1 (Baixa qualidade) - + BC3 (Medium quality) BC3 (Média qualidade) - - + + Auto Automático - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservador - + Aggressive Agressivo - + Vulkan Vulcano - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Shaders em Assembly, apenas NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, apenas AMD/Mesa) - + Null Nenhum - + Fast Rápido - + Balanced Balanceado - - + + Accurate Preciso - - + + Default Padrão - + Unsafe (fast) Inseguro (rápido) - + Safe (stable) Seguro (estável) - + Unsafe Inseguro - + Paranoid (disables most optimizations) Paranoia (desativa a maioria das otimizações) - + Debugging Depuração - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Janela sem bordas - + Exclusive Fullscreen Tela cheia exclusiva - + No Video Output Sem saída de vídeo - + CPU Video Decoding Decodificação de vídeo pela CPU - + GPU Video Decoding (Default) Decodificação de vídeo pela GPU (Padrão) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Vizinho mais próximo - + Bilinear Bilinear - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Área - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - - + + None Nenhum - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Padrão (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 Forçar 16:10 - + Stretch to Window Esticar à Janela - + Automatic Automático - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x 32x - + 64x 64x - + Japanese (日本語) Japonês (日本語) - + American English Inglês Americano - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Chinese Chinês - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandês (Nederlands) - + Portuguese (português) Português (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanês - + British English Inglês Britânico - + Canadian French Francês Canadense - + Latin American Spanish Espanhol Latino-Americano - + Simplified Chinese Chinês Simplificado - + Traditional Chinese (正體中文) Chinês Tradicional (正 體 中文) - + Brazilian Portuguese (português do Brasil) Português do Brasil (Brazilian Portuguese) - + Polish (polska) Polonês (polska) - + Thai (แบบไทย) Tailandês (แบบไทย) - - + + Japan Japão - + USA EUA - + Europe Europa - + Australia Austrália - + China China - + Korea Coreia - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Padrão (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egito - + Eire Irlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islândia - + Iran Irã - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polônia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estéreo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Padrão) - + 6GB DRAM (Unsafe) 6GB DRAM (Não seguro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Inseguro) - + 12GB DRAM (Unsafe) 12GB DRAM (Inseguro) - + Docked Ancorado - + Handheld Portátil - - + + Off Desligado - + Boost (1700MHz) Impulso (1700MHz) - + Fast (2000MHz) Rápido (2000MHz) - + Always ask (Default) Sempre perguntar (Padrão) - + Only if game specifies not to stop Somente se o jogo especificar para não parar - + Never ask Nunca perguntar - - + + Medium (256) Médio (256) - - + + High (512) Alto (512) - + Very Small (16 MB) Muito Pequeno (16 MB) - + Small (32 MB) Pequeno (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Muito Grande (512 MB) - + Very Low (4 MB) Muito Baixo (4 MB) - + Low (8 MB) Baixo (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Médio (32 MB) - + High (64 MB) Alto (64 MB) - + Very Low (32) Muito Baixo (32) - + Low (64) Baixo (64) - + Normal (128) Normal (128) - + Disabled Desativado - + ExtendedDynamicState 1 Estado Dinâmico Estendido 1 - + ExtendedDynamicState 2 Estado Dinâmico Estendido 2 - + ExtendedDynamicState 3 Estado Dinâmico Estendido 3 - + Tree View Visualização em Árvore - + Grid View Visualização em Grade @@ -5794,7 +5779,7 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta - + Deleting ANY data is IRREVERSABLE! @@ -5805,13 +5790,13 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta - UserNAND - UserNAND + User NAND + - SysNAND - SysNAND + System NAND + @@ -5857,7 +5842,7 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta - + Calculating... diff --git a/dist/languages/pt_PT.ts b/dist/languages/pt_PT.ts index 342d4bb566..0b7a48bbec 100644 --- a/dist/languages/pt_PT.ts +++ b/dist/languages/pt_PT.ts @@ -1201,1044 +1201,1029 @@ Setting to Handheld can help improve performance for low end systems. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Confirmar antes de parar a emulação - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Esconder rato quando inactivo. - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Desabilitar miniaplicativo de controle - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Habilitar Gamemode - + Force X11 as Graphics Backend - + Custom frontend Frontend customizado - + Real applet Miniaplicativo real - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Assíncrona - + Uncompressed (Best quality) Descompactado (Melhor Q - + BC1 (Low quality) BC1 (Baixa qualidade) - + BC3 (Medium quality) BC3 (Média qualidade) - - + + Auto Automático - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Conservador - + Aggressive Agressivo - + Vulkan Vulcano - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Nenhum (desativado) - + Fast - + Balanced - - + + Accurate Preciso - - + + Default Padrão - + Unsafe (fast) - + Safe (stable) - + Unsafe Inseguro - + Paranoid (disables most optimizations) Paranoia (desativa a maioria das otimizações) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Janela sem bordas - + Exclusive Fullscreen Tela cheia exclusiva - + No Video Output Sem saída de vídeo - + CPU Video Decoding Decodificação de vídeo pela CPU - + GPU Video Decoding (Default) Decodificação de vídeo pela GPU (Padrão) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Vizinho mais próximo - + Bilinear Bilinear - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - - + + None Nenhum - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Padrão (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 Forçar 16:10 - + Stretch to Window Esticar à Janela - + Automatic Automático - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x - + 64x - + Japanese (日本語) Japonês (日本語) - + American English Inglês Americano - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Chinese Chinês - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandês (Nederlands) - + Portuguese (português) Português (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanês - + British English Inglês Britânico - + Canadian French Francês Canadense - + Latin American Spanish Espanhol Latino-Americano - + Simplified Chinese Chinês Simplificado - + Traditional Chinese (正體中文) Chinês Tradicional (正 體 中文) - + Brazilian Portuguese (português do Brasil) Português do Brasil (Brazilian Portuguese) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japão - + USA EUA - + Europe Europa - + Australia Austrália - + China China - + Korea Coreia - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Padrão (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipto - + Eire Irlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islândia - + Iran Irão - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polónia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estéreo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Padrão) - + 6GB DRAM (Unsafe) 6GB DRAM (Não seguro) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Ancorado - + Handheld Portátil - - + + Off - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) Sempre perguntar (Padrão) - + Only if game specifies not to stop Somente se o jogo especificar para não parar - + Never ask Nunca perguntar - - + + Medium (256) - - + + High (512) - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -5739,7 +5724,7 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta - + Deleting ANY data is IRREVERSABLE! @@ -5750,12 +5735,12 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta - UserNAND + User NAND - SysNAND + System NAND @@ -5802,7 +5787,7 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta - + Calculating... diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts index 3417060eaf..f0c3a9bd85 100644 --- a/dist/languages/ru_RU.ts +++ b/dist/languages/ru_RU.ts @@ -1253,1046 +1253,1031 @@ Setting to Handheld can help improve performance for low end systems. Установка в режим портативной консоли может помочь улучшить производительность для слабых устройств. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot Спрашивать профиль пользователя при запуске - + Useful if multiple people use the same PC. Полезно, если несколько человек используют один и тот же компьютер. - + Pause when not in focus Делает паузу, когда не в фокусе - + Pauses emulation when focusing on other windows. Ставит на паузу эмуляцию, когда фокусируешься на другие окна. - + Confirm before stopping emulation Подтвердите перед остановкой эмуляции - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Эта настройка переопределяет запросы игры, запрашивающие подтверждение остановки игры. Включение этой настройки обходит такие запросы и непосредственно завершает эмуляцию. - + Hide mouse on inactivity Спрятать мышь при неактивности - + Hides the mouse after 2.5s of inactivity. Эта настройка скрывает указатель мыши после 2,5 секунды бездействия. - + Disable controller applet Отключить веб-апплет - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Принудительно отключает использование приложения контроллера в эмулированных программах. При попытке программы открыть приложение контроллера, оно немедленно закрывается. - + Check for updates Проверка обновлений - + Whether or not to check for updates upon startup. Следует ли проверять наличие обновлений при запуске. - + Enable Gamemode Включить режим игры - + Force X11 as Graphics Backend Использовать X11 в качестве графического бэкенда - + Custom frontend Свой фронтенд - + Real applet Реальное приложение - + Never Никогда - + On Load При загрузке - + Always Всегда - + CPU ЦП - + GPU графический процессор - + CPU Asynchronous Асинхронный ГП - + Uncompressed (Best quality) Без сжатия (наилучшее качество) - + BC1 (Low quality) BC1 (низкое качество) - + BC3 (Medium quality) BC3 (среднее качество) - - + + Auto Авто - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Консервативный - + Aggressive Агрессивный - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (ассемблерные шейдеры, только для NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Экспериментальный, только для AMD/Mesa) - + Null Null - + Fast Быстро - + Balanced Сбалансированный - - + + Accurate Точно - - + + Default По умолчанию - + Unsafe (fast) Небезопасно (быстро) - + Safe (stable) Безопасно (стабильно) - + Unsafe Небезопасно - + Paranoid (disables most optimizations) Параноик (отключает большинство оптимизаций) - + Debugging Отладка - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Окно без границ - + Exclusive Fullscreen Эксклюзивный полноэкранный - + No Video Output Отсутствие видеовыхода - + CPU Video Decoding Декодирование видео на ЦП - + GPU Video Decoding (Default) Декодирование видео на ГП (по умолчанию) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p)[ЭКСПЕРИМЕНТАЛЬНО] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [ЭКСПЕРИМЕНТАЛЬНО] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [ЭКСПЕРИМЕНТАЛЬНО] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [ЭКПЕРИМЕНТАЛЬНО] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [ЭКСПЕРИМЕНТАЛЬНО] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Ближайший сосед - + Bilinear Билинейный - + Bicubic Бикубический - + Gaussian Гаусс - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX™️ Super Resolution - + Area Зона - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - - + + None Никакой - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Стандартное (16:9) - + Force 4:3 Заставить 4:3 - + Force 21:9 Заставить 21:9 - + Force 16:10 Заставить 16:10 - + Stretch to Window Растянуть до окна - + Automatic Автоматически - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x 32x - + 64x 64x - + Japanese (日本語) Японский (日本語) - + American English Американский английский - + French (français) Французский (français) - + German (Deutsch) Немецкий (Deutsch) - + Italian (italiano) Итальянский (italiano) - + Spanish (español) Испанский (español) - + Chinese Китайский - + Korean (한국어) Корейский (한국어) - + Dutch (Nederlands) Голландский (Nederlands) - + Portuguese (português) Португальский (português) - + Russian (Русский) Русский - + Taiwanese Тайваньский - + British English Британский английский - + Canadian French Канадский французский - + Latin American Spanish Латиноамериканский испанский - + Simplified Chinese Упрощённый китайский - + Traditional Chinese (正體中文) Традиционный китайский (正體中文) - + Brazilian Portuguese (português do Brasil) Бразильский португальский (português do Brasil) - + Polish (polska) Польский (polska) - + Thai (แบบไทย) Тайский (แบบไทย) - - + + Japan Япония - + USA США - + Europe Европа - + Australia Австралия - + China Китай - + Korea Корея - + Taiwan Тайвань - + Auto (%1) Auto select time zone Авто (%1) - + Default (%1) Default time zone По умолчанию (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Куба - + EET EET - + Egypt Египт - + Eire Эйре - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Эйре - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Гринвич - + Hongkong Гонконг - + HST HST - + Iceland Исландия - + Iran Иран - + Israel Израиль - + Jamaica Ямайка - + Kwajalein Кваджалейн - + Libya Ливия - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Навахо - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Польша - + Portugal Португалия - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Сингапур - + Turkey Турция - + UCT UCT - + Universal Универсальный - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Зулусы - + Mono Моно - + Stereo Стерео - + Surround Объёмный звук - + 4GB DRAM (Default) 4 ГБ ОЗУ (по умолчанию) - + 6GB DRAM (Unsafe) 6GB ОЗУ (Небезопасно) - + 8GB DRAM 8ГБ ОЗУ - + 10GB DRAM (Unsafe) 10ГБ ОЗУ(Небезопасно) - + 12GB DRAM (Unsafe) 12ГБ ОЗУ(Небезопасно) - + Docked В док-станции - + Handheld Портативный - - + + Off Выкл. - + Boost (1700MHz) Разгон (1700MHz) - + Fast (2000MHz) Быстрая (2000MHz) - + Always ask (Default) Всегда спрашивать (По умолчанию) - + Only if game specifies not to stop Только если игра указывает не останавливаться - + Never ask Никогда не спрашивать - - + + Medium (256) Средний (256) - - + + High (512) Высокий (512) - + Very Small (16 MB) Очень малый (16 МБ) - + Small (32 MB) Малый (32 МБ) - + Normal (128 MB) Обычный (128 МБ) - + Large (256 MB) Большой (256 МБ) - + Very Large (512 MB) Очень большой (512 МБ) - + Very Low (4 MB) Очень низкий (4 МБ) - + Low (8 MB) Низкий (8 МБ) - + Normal (16 MB) Обычный (16 МБ) - + Medium (32 MB) Средний (32 МБ) - + High (64 MB) Высокий (64 МБ) - + Very Low (32) Очень низкий (32) - + Low (64) Низкий (64) - + Normal (128) Обычный (128) - + Disabled Выключено - + ExtendedDynamicState 1 Расширенное динамическое состояние 1 - + ExtendedDynamicState 2 Расширенное динамическое состояние 2 - + ExtendedDynamicState 3 Расширенное динамическое состояние 3 - + Tree View В виде списка - + Grid View В виде сетки @@ -5814,7 +5799,7 @@ Drag points to change position, or double-click table cells to edit values.Управление данными - + Deleting ANY data is IRREVERSABLE! Удаление ЛЮБЫХ данных НЕВОЗВРАТИМО! @@ -5825,13 +5810,13 @@ Drag points to change position, or double-click table cells to edit values. - UserNAND - UserNAND + User NAND + - SysNAND - SysNAND + System NAND + @@ -5877,7 +5862,7 @@ Drag points to change position, or double-click table cells to edit values.Импортирует данные для этого каталога. Это может занять некоторое время и приведет к удалению ВСЕХ СУЩЕСТВУЮЩИХ ДАННЫХ! - + Calculating... Подсчитываем... diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts index 6b998cbaaa..672523630c 100644 --- a/dist/languages/sv.ts +++ b/dist/languages/sv.ts @@ -801,13 +801,14 @@ Denna funktion är experimentell. Use asynchronous GPU emulation - + Använd asynkron GPU-emulering Uses an extra CPU thread for rendering. This option should always remain enabled. - + Använder en extra CPU-tråd för rendering. +Detta alternativ bör alltid vara aktiverat. @@ -1261,1046 +1262,1031 @@ Spel ändrar upplösning, detaljer och stödda kontroller beroende på denna ins Inställningen Handhållen kan förbättra prestandan för enklare system. - - Unit Serial - Enhetens serienr - - - - Battery Serial - Batteriets serienr - - - - Debug knobs - Felsökningsknappar - - - + Prompt for user profile on boot Fråga efter användarprofil vid uppstart - + Useful if multiple people use the same PC. Användbart om flera personer använder samma dator. - + Pause when not in focus Pausa när inte i fokus - + Pauses emulation when focusing on other windows. Pausar emulering när fokus är på andra fönster. - + Confirm before stopping emulation Bekräfta innan emuleringen stoppas - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Åsidosätter frågor om att bekräfta att emuleringen ska avslutas. Om du aktiverar den hoppar du över sådana uppmaningar och avslutar emuleringen direkt. - + Hide mouse on inactivity Dölj musen vid inaktivitet - + Hides the mouse after 2.5s of inactivity. Döljer musen efter 2,5 sekunders inaktivitet. - + Disable controller applet Inaktivera kontroller-appleten - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Inaktiverar med tvång användningen av kontrollerappletten i emulerade program. När ett program försöker öppna kontrollerappletten stängs den omedelbart. - + Check for updates Leta efter uppdateringar - + Whether or not to check for updates upon startup. Om uppdateringar ska sökas vid start eller inte. - + Enable Gamemode Aktivera Gamemode - + Force X11 as Graphics Backend Tvinga X11 som grafikbackend - + Custom frontend Anpassad frontend - + Real applet Verklig applet - + Never Aldrig - + On Load Vid inläsning - + Always Alltid - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU asynkron - + Uncompressed (Best quality) Okomprimerad (bästa kvalitet) - + BC1 (Low quality) BC1 (låg kvalitet) - + BC3 (Medium quality) BC3 (medelhög kvalitet) - - + + Auto Auto - + 30 FPS 30 bilder/s - + 60 FPS 60 bilder/s - + 90 FPS 90 bilder/s - + 120 FPS 120 bilder/s - + Conservative Konservativ - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembly Shaders, endast NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimentell, endast AMD/Mesa) - + Null Null - + Fast Snabb - + Balanced Balanserad - - + + Accurate Exakt - - + + Default Standard - + Unsafe (fast) Osäker (snabb) - + Safe (stable) Säker (stabil) - + Unsafe Inte säker - + Paranoid (disables most optimizations) Paranoid (inaktiverar de flesta optimeringar) - + Debugging Felsökning - + Dynarmic Dynarmisk - + NCE NCE - + Borderless Windowed Ramlöst fönsterläge - + Exclusive Fullscreen Exklusiv helskärm - + No Video Output Ingen videoutgång - + CPU Video Decoding CPU-videoavkodning - + GPU Video Decoding (Default) GPU videoavkodning (standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTELL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTELL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Närmsta granne - + Bilinear Bilinjär - + Bicubic Bikubisk - + Gaussian Gaussisk - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Område - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - - + + None Ingen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tvinga 4:3 - + Force 21:9 Tvinga 21:9 - + Force 16:10 Tvinga 16:10 - + Stretch to Window Sträck ut till fönster - + Automatic Automatiskt - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x 32x - + 64x 64x - + Japanese (日本語) Japanska (日本語) - + American English Amerikansk engelska - + French (français) Franska (français) - + German (Deutsch) Tyska (Deutsch) - + Italian (italiano) Italienska (italiano) - + Spanish (español) Spanska (español) - + Chinese Kinesiska - + Korean (한국어) Koreanska (한국어) - + Dutch (Nederlands) Nederländska (Nederlands) - + Portuguese (português) Portugisiska (português) - + Russian (Русский) Ryska (Русский) - + Taiwanese Taiwanesiska - + British English Brittisk engelska - + Canadian French Kanadensisk franska - + Latin American Spanish Latinamerikansk spanska - + Simplified Chinese Förenklad kinesiska - + Traditional Chinese (正體中文) Traditionell kinesiska (正體中文) - + Brazilian Portuguese (português do Brasil) Brasiliansk portugisiska (português do Brasil) - + Polish (polska) Polska (polska) - + Thai (แบบไทย) Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Egypten - + Eire Irland - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irland - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkiet - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET VÅT - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (standard) - + 6GB DRAM (Unsafe) 6 GB DRAM (osäker) - + 8GB DRAM 8 GB DRAM - + 10GB DRAM (Unsafe) 10 GB DRAM (osäker) - + 12GB DRAM (Unsafe) 12 GB DRAM (osäker) - + Docked Dockad - + Handheld Handhållen - - + + Off Av - + Boost (1700MHz) Boost (1700MHz) - + Fast (2000MHz) Snabb (2000 MHz) - + Always ask (Default) Fråga alltid (standard) - + Only if game specifies not to stop Endast om spelet anger att det inte ska stoppas - + Never ask Fråga aldrig - - + + Medium (256) Medium (256) - - + + High (512) Hög (512) - + Very Small (16 MB) Mycket liten (16 MB) - + Small (32 MB) Liten (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Stor (256 MB) - + Very Large (512 MB) Mycket stor (512 MB) - + Very Low (4 MB) Mycket låg (4 MB) - + Low (8 MB) Låg (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Medium (32 MB) - + High (64 MB) Hög (64 MB) - + Very Low (32) Mycket låg (32) - + Low (64) Låg (64) - + Normal (128) Normal (128) - + Disabled Inaktiverad - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View Trädvy - + Grid View Rutnätsvy @@ -5826,7 +5812,7 @@ Dra punkterna för att ändra position, eller dubbelklicka på tabellcellerna f Datahanterare - + Deleting ANY data is IRREVERSABLE! Borttagning av VALFRITT data går INTE ATT ÅNGRA! @@ -5837,13 +5823,13 @@ Dra punkterna för att ändra position, eller dubbelklicka på tabellcellerna f - UserNAND - UserNAND + User NAND + - SysNAND - SysNAND + System NAND + @@ -5889,7 +5875,7 @@ Dra punkterna för att ändra position, eller dubbelklicka på tabellcellerna f Importera data för denna katalog. Detta kan ta en stund och kommer att ta bort ALLT BEFINTLIGT DATA! - + Calculating... Beräknar... diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts index cff9e8a0f5..02c4348c14 100644 --- a/dist/languages/tr_TR.ts +++ b/dist/languages/tr_TR.ts @@ -1210,1045 +1210,1030 @@ Setting to Handheld can help improve performance for low end systems. Konsolun Yerleşik veya El Modunda olup olmadığını seçer. Oyunlar bu ayara bağlı olarak çözünürlüklerini, detaylarını ve desteklenen kontrolcülerini değiştirecektir. El Moduna ayarlamak, düşük seviyeli sistemler için performansı artırmaya yardımcı olabilir. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot Açılışta kullanıcı profili için sor - + Useful if multiple people use the same PC. Aynı bilgisayarı birden fazla kişi kullanıyorsa yararlıdır. - + Pause when not in focus Odaklı değilken duraklat - + Pauses emulation when focusing on other windows. Diğer pencerelere odaklanıldığında emülasyonu duraklatır. - + Confirm before stopping emulation Emülasyonu durdurmadan önce onayla - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Emülasyonu durdurma onayı isteklerini/istemlerini geçersiz kılar. Etkinleştirildiğinde, bu tür istekleri/istemleri atlar ve emülasyonu doğrudan/dirket olarak kapatır. - + Hide mouse on inactivity Hareketsizlik durumunda imleci gizle - + Hides the mouse after 2.5s of inactivity. 2,5 saniye hareketsizlikten sonra fareyi gizler. - + Disable controller applet Kontrolcü aplikasyonunu devre dışı bırak - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Emüle edilen programlarda kontrolcü aplikasyonunun kullanımını zorla devre dışı bırakır. Bir program kontrolcü aplikasyonunu açmaya çalıştığında, aplikasyon anında kapatılır. - + Check for updates Güncellemeleri Kontrol Et - + Whether or not to check for updates upon startup. Başlangıçta güncellemelerin kontrol edilip edilmeyeceği. - + Enable Gamemode Oyun Modunu/Gamemode Etkinleştir - + Force X11 as Graphics Backend Grafik arka ucu olarak X11'i zorla - + Custom frontend Özel ön yüz - + Real applet Gerçek aplikasyon - + Never Asla - + On Load Yüklemede - + Always Her zaman - + CPU CPU - + GPU GPU - + CPU Asynchronous Asenkron CPU - + Uncompressed (Best quality) Sıkıştırılmamış (En iyi kalite) - + BC1 (Low quality) BC1 (Düşük kalite) - + BC3 (Medium quality) BC3 (Orta kalite) - - + + Auto Otomatik - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Muhafazakar - + Aggressive Agresif - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Boş - + Fast Hızlı - + Balanced Dengeli - - + + Accurate Doğru - - + + Default Varsayılan - + Unsafe (fast) Güvenli Değil (hızlı) - + Safe (stable) Güvenli (Stabil) - + Unsafe Güvensiz - + Paranoid (disables most optimizations) Paranoya (çoğu optimizasyonu kapatır) - + Debugging Hata ayıklama - + Dynarmic Dinamik - + NCE NCE - + Borderless Windowed Kenarlıksız Tam Ekran - + Exclusive Fullscreen Ayrılmış Tam Ekran - + No Video Output Video Çıkışı Yok - + CPU Video Decoding CPU Video Decoding - + GPU Video Decoding (Default) GPU Video Decoding (Varsayılan) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [DENEYSEL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [DENEYSEL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [DENEYSEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [DENEYSEL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [DENEYSEL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor En Yakın Komşu Algoritması - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gausyen - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Süper Çözünürlük - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - - + + None Yok - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Varsayılan (16:9) - + Force 4:3 4:3'e Zorla - + Force 21:9 21:9'a Zorla - + Force 16:10 16:10'a Zorla - + Stretch to Window Ekrana Sığdır - + Automatic Otomatik - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x 32x - + 64x 64x - + Japanese (日本語) Japonca (日本語) - + American English Amerikan İngilizcesi - + French (français) Fransızca (français) - + German (Deutsch) Almanca (Deutsch) - + Italian (italiano) İtalyanca (italiano) - + Spanish (español) İspanyolca (español) - + Chinese Çince - + Korean (한국어) Korece (한국어) - + Dutch (Nederlands) Flemenkçe (Nederlands) - + Portuguese (português) Portekizce (português) - + Russian (Русский) Rusça (Русский) - + Taiwanese Tayvanca - + British English İngiliz İngilizcesi - + Canadian French Kanada Fransızcası - + Latin American Spanish Latin Amerika İspanyolcası - + Simplified Chinese Basitleştirilmiş Çince - + Traditional Chinese (正體中文) Geleneksel Çince (正體中文) - + Brazilian Portuguese (português do Brasil) Brezilya Portekizcesi (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonya - + USA ABD - + Europe Avrupa - + Australia Avustralya - + China Çin - + Korea Kore - + Taiwan Tayvan - + Auto (%1) Auto select time zone Otomatik (%1) - + Default (%1) Default time zone Varsayılan (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Küba - + EET EET - + Egypt Mısır - + Eire İrlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-İrlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 MT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland İzlanda - + Iran İran - + Israel İsrail - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navaho - + NZ Yeni Zelanda - + NZ-CHAT Chatham Adaları - + Poland Polonya - + Portugal Portekiz - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Türkiye - + UCT UCT - + Universal Evrensel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Varsayılan) - + 6GB DRAM (Unsafe) 6GB DRAM (Güvenli Değil) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Güvenli Değil) - + 12GB DRAM (Unsafe) 12GB DRAM (Güvenli Değil) - + Docked Dock Modu Aktif - + Handheld Taşınabilir - - + + Off Kapalı - + Boost (1700MHz) Takviye (1700MHz) - + Fast (2000MHz) Hızlı (2000MHz) - + Always ask (Default) Her zaman sor (Varsayılan) - + Only if game specifies not to stop Sadece oyun durdurulmamasını belirtirse - + Never ask Asla sorma - - + + Medium (256) Orta (256) - - + + High (512) Yüksek (512) - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Disabled Devre Dışı - + ExtendedDynamicState 1 Genişletilmiş Dinamik Durum 1 - + ExtendedDynamicState 2 Genişletilmiş Dinamik Durum 2 - + ExtendedDynamicState 3 Genişletilmiş Dinamik Durum 3 - + Tree View - + Grid View @@ -5767,7 +5752,7 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne Veri Yöneticisi - + Deleting ANY data is IRREVERSABLE! HERHANGİ bir veriyi silmek GERİ DÖNDÜRÜLEMEZ! @@ -5778,13 +5763,13 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne - UserNAND - Kullanıcı NAND + User NAND + - SysNAND - SysNAND + System NAND + @@ -5830,7 +5815,7 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne Bu dizin için veri içe aktarın. Bu biraz zaman alabilir ve MEVCUT TÜM VERİLERİ silecek! - + Calculating... Hesaplanıyor... diff --git a/dist/languages/uk.ts b/dist/languages/uk.ts index 4ba7f8914c..9e9d18d90a 100644 --- a/dist/languages/uk.ts +++ b/dist/languages/uk.ts @@ -1257,1046 +1257,1031 @@ Setting to Handheld can help improve performance for low end systems. Налаштування «Портативний» може покращити продуктивність на слабких системах. - - Unit Serial - Серійний номер пристрою - - - - Battery Serial - Серійний номер акумулятора - - - - Debug knobs - Зневаджувальні регулятори - - - + Prompt for user profile on boot Запитувати профіль користувача під час запуску - + Useful if multiple people use the same PC. Корисно, якщо одним комп’ютером користуються кілька користувачів. - + Pause when not in focus Призупиняти, якщо не у фокусі - + Pauses emulation when focusing on other windows. Призупиняє емуляцію при фокусування на інших вікнах. - + Confirm before stopping emulation Підтверджувати зупинку емуляції - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Перевизначає запити на підтвердження зупинки емуляції. Увімкнення обходить такі запити й одразу зупиняє емуляцію. - + Hide mouse on inactivity Приховувати курсор миші при бездіяльності - + Hides the mouse after 2.5s of inactivity. Приховує курсор миші після 2,5 с її бездіяльності. - + Disable controller applet Вимкнути аплет контролера - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Примусово вимикає використання в емульованих програмах аплета контролера. Якщо програма спробує відкрити аплет контролера, він одразу закриється. - + Check for updates Перевіряти оновлення - + Whether or not to check for updates upon startup. Чи перевіряти оновлення при запуску. - + Enable Gamemode Увімкнути ігровий режим - + Force X11 as Graphics Backend Примусово використовувати X11 як графічний бекенд - + Custom frontend Користувацький фронтенд - + Real applet Справжній аплет - + Never Ніколи - + On Load При завантаженні - + Always Завжди - + CPU ЦП - + GPU ГП - + CPU Asynchronous Асинхронно ЦП - + Uncompressed (Best quality) Без стиснення (Найкраща якість) - + BC1 (Low quality) ВС1 (Низька якість) - + BC3 (Medium quality) ВС3 (Середня якість) - - + + Auto Автоматично - + 30 FPS 30 к/с - + 60 FPS 60 к/с - + 90 FPS 90 к/с - + 120 FPS 120 к/с - + Conservative Заощадження - + Aggressive Агресивно - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (асемблерні шейдери, лише NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (експериментально, лише AMD/Mesa) - + Null Нічого - + Fast Швидко - + Balanced Збалансовано - - + + Accurate Точно - - + + Default Стандартно - + Unsafe (fast) Небезпечно (швидко) - + Safe (stable) Безпечно (стабільно) - + Unsafe Небезпечно - + Paranoid (disables most optimizations) Параноїк (вимикає більшість оптимізацій) - + Debugging Зневадження - + Dynarmic Динамічно - + NCE NCE - + Borderless Windowed Безрамкове вікно - + Exclusive Fullscreen Ексклюзивний повноекранний - + No Video Output Виведення відео відсутнє - + CPU Video Decoding Декодування відео на ЦП - + GPU Video Decoding (Default) Декодування відео на ГП (стандатно) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [ЕКСПЕРИМЕНТАЛЬНО] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [ЕКСПЕРИМЕНТАЛЬНО] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [ЕКСПЕРИМЕНТАЛЬНО] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [ЕКСПЕРИМЕНТАЛЬНО] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [ЕКСПЕРИМЕНТАЛЬНО] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Найближчий сусід - + Bilinear Білінійний - + Bicubic Бікубічний - + Gaussian Ґаусса - + Lanczos Ланцоша - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Області - + MMPX MMPX - + Zero-Tangent Нульовий тангенс - + B-Spline B-Spline - + Mitchell Мітчелла - + Spline-1 Spline-1 - - + + None Немає - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Стандартно (16:9) - + Force 4:3 Примусово 4:3 - + Force 21:9 Примусово 21:9 - + Force 16:10 Примусово 16:10 - + Stretch to Window Розтягнути до вікна - + Automatic Автоматично - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x 32x - + 64x 64x - + Japanese (日本語) Японська (日本語) - + American English Американська англійська - + French (français) Французька (français) - + German (Deutsch) Німецька (Deutsch) - + Italian (italiano) Італійська (italiano) - + Spanish (español) Іспанська (español) - + Chinese Китайська - + Korean (한국어) Корейська (한국어) - + Dutch (Nederlands) Нідерландська (Nederlands) - + Portuguese (português) Португальська (português) - + Russian (Русский) Російська (Русский) - + Taiwanese Тайванська - + British English Британська англійська - + Canadian French Канадська французька - + Latin American Spanish Латиноамериканська іспанська - + Simplified Chinese Спрощена китайська - + Traditional Chinese (正體中文) Традиційна китайська (正體中文) - + Brazilian Portuguese (português do Brasil) Бразильська португальська (português do Brasil) - + Polish (polska) Польська (polska) - + Thai (แบบไทย) Тайська (แบบไทย) - - + + Japan Японія - + USA США - + Europe Європа - + Australia Австралія - + China Китай - + Korea Корея - + Taiwan Тайвань - + Auto (%1) Auto select time zone Автоматично (%1) - + Default (%1) Default time zone Стандартно (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Куба - + EET EET - + Egypt Єгипет - + Eire Ейре - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Гринвіч - + Hongkong Гонконг - + HST HST - + Iceland Ісландія - + Iran Іран - + Israel Ізраїль - + Jamaica Ямайка - + Kwajalein Кваджалейн - + Libya Лівія - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Навахо - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Польща - + Portugal Португалія - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Сінгапур - + Turkey Туреччина - + UCT UCT - + Universal Універсальний - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Зулу - + Mono Моно - + Stereo Стерео - + Surround Об’ємний - + 4GB DRAM (Default) 4GB DRAM (стандартно) - + 6GB DRAM (Unsafe) 6GB DRAM (небезпечно) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (небезпечно) - + 12GB DRAM (Unsafe) 12GB DRAM (небезпечно) - + Docked У докстанції - + Handheld Портативний - - + + Off Вимкнено - + Boost (1700MHz) Підвищення (1700 МГц) - + Fast (2000MHz) Швидко (2000 МГц) - + Always ask (Default) Завжди запитувати (стандартно) - + Only if game specifies not to stop Лише якщо гра вказує не зупиняти - + Never ask Ніколи не запитувати - - + + Medium (256) Середньо (256) - - + + High (512) Високо (512) - + Very Small (16 MB) Дуже малий (16 МБ) - + Small (32 MB) Малий (32 МБ) - + Normal (128 MB) Нормальний (128 МБ) - + Large (256 MB) Великий (256 МБ) - + Very Large (512 MB) Дуже великий (512 МБ) - + Very Low (4 MB) Дуже низький (4 МБ) - + Low (8 MB) Низький (8 МБ) - + Normal (16 MB) Нормальний (16 МБ) - + Medium (32 MB) Середній (32 МБ) - + High (64 MB) Високий (64 МБ) - + Very Low (32) Дуже низький (32) - + Low (64) Низький (64) - + Normal (128) Нормальний (128) - + Disabled Вимкнено - + ExtendedDynamicState 1 Розширений динамічний стан 1 - + ExtendedDynamicState 2 Розширений динамічний стан 2 - + ExtendedDynamicState 3 Розширений динамічний стан 3 - + Tree View Дерево вибору - + Grid View Таблиця @@ -5822,7 +5807,7 @@ Drag points to change position, or double-click table cells to edit values.Керування даними - + Deleting ANY data is IRREVERSABLE! Видалення БУДЬ-ЯКИХ даних НЕЗВОРОТНЕ! @@ -5833,13 +5818,13 @@ Drag points to change position, or double-click table cells to edit values. - UserNAND - Користувацька NAND + User NAND + - SysNAND - Системна NAND + System NAND + @@ -5885,7 +5870,7 @@ Drag points to change position, or double-click table cells to edit values.Імпортувати дані до цієї теки. Це може тривати певний час і видалить УСІ НАЯВНІ ДАНІ! - + Calculating... Обчислення... diff --git a/dist/languages/vi.ts b/dist/languages/vi.ts index 1a263b0be9..eb328bd695 100644 --- a/dist/languages/vi.ts +++ b/dist/languages/vi.ts @@ -1193,1044 +1193,1029 @@ Setting to Handheld can help improve performance for low end systems. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Ẩn con trỏ chuột khi không dùng - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Vô hiệu hoá applet tay cầm - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) Không nén (Chất lượng tốt nhất) - + BC1 (Low quality) BC1 (Chất lượng thấp) - + BC3 (Medium quality) BC3 (Chất lượng trung bình) - - + + Auto Tự động - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - + Balanced - - + + Accurate Chính xác - - + + Default Mặc định - + Unsafe (fast) - + Safe (stable) - + Unsafe Không an toàn - + Paranoid (disables most optimizations) Paranoid (vô hiệu hoá hầu hết sự tối ưu) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Cửa sổ không viền - + Exclusive Fullscreen Toàn màn hình - + No Video Output Không có đầu ra video - + CPU Video Decoding Giải mã video bằng CPU - + GPU Video Decoding (Default) Giải mã video bằng GPU (Mặc định) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [THỬ NGHIỆM] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [THỬ NGHIỆM] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - - + + None Không có - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Mặc định (16:9) - + Force 4:3 Dùng 4:3 - + Force 21:9 Dùng 21:9 - + Force 16:10 Dùng 16:10 - + Stretch to Window Mở rộng đến cửa sổ - + Automatic Tự động - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x - + 64x - + Japanese (日本語) Tiếng Nhật (日本語) - + American English Tiếng Anh Mỹ - + French (français) Tiếng Pháp (French) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (italiano) - + Spanish (español) Tiếng Tây Ban Nha (Español) - + Chinese Tiếng Trung - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Nederlands) - + Portuguese (português) Tiếng Bồ Đào Nha (Portuguese) - + Russian (Русский) Tiếng Nga (Русский) - + Taiwanese Tiếng Đài Loan - + British English Tiếng Anh Anh - + Canadian French Tiếng Pháp Canada - + Latin American Spanish Tiếng Tây Ban Nha Mỹ Latinh - + Simplified Chinese Tiếng Trung giản thể - + Traditional Chinese (正體中文) Tiếng Trung phồn thể (正體中文) - + Brazilian Portuguese (português do Brasil) Tiếng Bồ Đào Nha Brasil (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Nhật Bản - + USA Hoa Kỳ - + Europe Châu Âu - + Australia Úc - + China Trung Quốc - + Korea Hàn Quốc - + Taiwan Đài Loan - + Auto (%1) Auto select time zone Tự động (%1) - + Default (%1) Default time zone Mặc định (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ai Cập - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hồng Kông - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Ba Lan - + Portugal Bồ Đào Nha - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Thổ Nhĩ Kỳ - + UCT UCT - + Universal Quốc tế - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Off - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - - + + Medium (256) - - + + High (512) - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -5739,7 +5724,7 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr - + Deleting ANY data is IRREVERSABLE! @@ -5750,12 +5735,12 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr - UserNAND + User NAND - SysNAND + System NAND @@ -5802,7 +5787,7 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr - + Calculating... diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts index 5f6c118322..9e98d41fd5 100644 --- a/dist/languages/vi_VN.ts +++ b/dist/languages/vi_VN.ts @@ -1193,1044 +1193,1029 @@ Setting to Handheld can help improve performance for low end systems. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Ẩn con trỏ chuột khi không dùng - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Vô hiệu hoá applet tay cầm - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) Không nén (Chất lượng tốt nhất) - + BC1 (Low quality) BC1 (Chất lượng thấp) - + BC3 (Medium quality) BC3 (Chất lượng trung bình) - - + + Auto Tự động - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - + Balanced - - + + Accurate Tuyệt đối - - + + Default Mặc định - + Unsafe (fast) - + Safe (stable) - + Unsafe Tương đối - + Paranoid (disables most optimizations) Paranoid (vô hiệu hoá hầu hết sự tối ưu) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Cửa sổ không viền - + Exclusive Fullscreen Toàn màn hình - + No Video Output Không Video Đầu Ra - + CPU Video Decoding Giải mã video bằng CPU - + GPU Video Decoding (Default) Giải mã video bằng GPU (Mặc định) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [THỬ NGHIỆM] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [THỬ NGHIỆM] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian ScaleForce - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - - + + None Trống - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Mặc định (16:9) - + Force 4:3 Dùng 4:3 - + Force 21:9 Dùng 21:9 - + Force 16:10 Dung 16:10 - + Stretch to Window Kéo dãn đến cửa sổ phần mềm - + Automatic Tự động - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x - + 64x - + Japanese (日本語) Tiếng Nhật (日本語) - + American English Tiếng Anh Mỹ - + French (français) Tiếng Pháp (French) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (italiano) - + Spanish (español) Tiếng Tây Ban Nha (Spanish) - + Chinese Tiếng Trung - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Dutch) - + Portuguese (português) Tiếng Bồ Đào Nha (Portuguese) - + Russian (Русский) Tiếng Nga (Русский) - + Taiwanese Tiếng Đài Loan - + British English Tiếng Anh UK (British English) - + Canadian French Tiếng Pháp Canada - + Latin American Spanish Tiếng Mỹ La-tinh - + Simplified Chinese Tiếng Trung giản thể - + Traditional Chinese (正體中文) Tiếng Trung phồn thể (正體中文) - + Brazilian Portuguese (português do Brasil) Tiếng Bồ Đào Nha của người Brazil (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Nhật Bản - + USA Hoa Kỳ - + Europe Châu Âu - + Australia Châu Úc - + China Trung Quốc - + Korea Hàn Quốc - + Taiwan Đài Loan - + Auto (%1) Auto select time zone Tự động (%1) - + Default (%1) Default time zone Mặc định (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ai Cập - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hồng Kông - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Ba Lan - + Portugal Bồ Đào Nha - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Thổ Nhĩ Kỳ - + UCT UCT - + Universal Quốc tế - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Chế độ cắm TV - + Handheld Cầm tay - - + + Off - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - - + + Medium (256) - - + + High (512) - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -5739,7 +5724,7 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr - + Deleting ANY data is IRREVERSABLE! @@ -5750,12 +5735,12 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr - UserNAND + User NAND - SysNAND + System NAND @@ -5802,7 +5787,7 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr - + Calculating... diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts index dd66113ea7..48a06c6e0a 100644 --- a/dist/languages/zh_CN.ts +++ b/dist/languages/zh_CN.ts @@ -1254,1046 +1254,1031 @@ Setting to Handheld can help improve performance for low end systems. 将设置为掌机模式可以帮助低端系统提高性能。 - - Unit Serial - 单元序列号: - - - - Battery Serial - 电池序列号: - - - - Debug knobs - 调试开关 - - - + Prompt for user profile on boot 启动时提示选择用户账户 - + Useful if multiple people use the same PC. 在多人使用相同的 PC 时有效。 - + Pause when not in focus 在丢失焦点时暂停 - + Pauses emulation when focusing on other windows. 当焦点位于其它窗口时暂停模拟器。 - + Confirm before stopping emulation 停止模拟时需要确认 - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. 替代提示以确认停止模拟。 启用它将绕过此类提示并直接退出模拟。 - + Hide mouse on inactivity 自动隐藏鼠标光标 - + Hides the mouse after 2.5s of inactivity. 在 2.5 秒无活动后隐藏鼠标。 - + Disable controller applet 禁用控制器小程序 - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. 强制禁止在模拟程序中使用控制器小程序。 当程序尝试打开控制器小程序时,它会立即被关闭。 - + Check for updates 检查更新 - + Whether or not to check for updates upon startup. 在启动时是否检查更新。 - + Enable Gamemode 启用游戏模式 - + Force X11 as Graphics Backend 强制使用 X11 作为图形后端 - + Custom frontend 自定义前端 - + Real applet 真实的小程序 - + Never 永不 - + On Load 加载时 - + Always 总是 - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 异步模拟 - + Uncompressed (Best quality) 不压缩 (最高质量) - + BC1 (Low quality) BC1 (低质量) - + BC3 (Medium quality) BC3 (中等质量) - - + + Auto 自动 - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative 保守模式 - + Aggressive 激进模式 - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (汇编着色器,仅限 NVIDIA 显卡) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (实验性,仅限 AMD/Mesa) - + Null 无 - + Fast 高速 - + Balanced 平衡 - - + + Accurate 高精度 - - + + Default 系统默认 - + Unsafe (fast) 不安全(快速) - + Safe (stable) 安全(稳定) - + Unsafe 低精度 - + Paranoid (disables most optimizations) 偏执模式 (禁用绝大多数优化项) - + Debugging 调试 - + Dynarmic 动态编译 - + NCE 本机代码执行 - + Borderless Windowed 无边框窗口 - + Exclusive Fullscreen 独占全屏 - + No Video Output 无视频输出 - + CPU Video Decoding CPU 视频解码 - + GPU Video Decoding (Default) GPU 视频解码 (默认) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [实验性] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [实验性] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [实验性] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [实验性] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [实验性] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 近邻取样 - + Bilinear 双线性过滤 - + Bicubic 双三线过滤 - + Gaussian 高斯模糊 - + Lanczos Lanczos - + ScaleForce 强制缩放 - + AMD FidelityFX Super Resolution AMD FidelityFX 超级分辨率 - + Area 区域 - + MMPX MMPX - + Zero-Tangent 零切线 - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - - + + None 无 - + FXAA 快速近似抗锯齿 - + SMAA 子像素形态学抗锯齿 - + Default (16:9) 默认 (16:9) - + Force 4:3 强制 4:3 - + Force 21:9 强制 21:9 - + Force 16:10 强制 16:10 - + Stretch to Window 拉伸窗口 - + Automatic 自动 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x 32x - + 64x 64x - + Japanese (日本語) 日语 (日本語) - + American English 美式英语 - + French (français) 法语 (français) - + German (Deutsch) 德语 (Deutsch) - + Italian (italiano) 意大利语 (italiano) - + Spanish (español) 西班牙语 (español) - + Chinese 中文 - + Korean (한국어) 韩语 (한국어) - + Dutch (Nederlands) 荷兰语 (Nederlands) - + Portuguese (português) 葡萄牙语 (português) - + Russian (Русский) 俄语 (Русский) - + Taiwanese 台湾中文 - + British English 英式英语 - + Canadian French 加拿大法语 - + Latin American Spanish 拉美西班牙语 - + Simplified Chinese 简体中文 - + Traditional Chinese (正體中文) 繁体中文 (正體中文) - + Brazilian Portuguese (português do Brasil) 巴西-葡萄牙语 (português do Brasil) - + Polish (polska) 波兰语(波兰语) - + Thai (แบบไทย) 泰语 - - + + Japan 日本 - + USA 美国 - + Europe 欧洲 - + Australia 澳大利亚 - + China 中国 - + Korea 韩国 - + Taiwan 台湾地区 - + Auto (%1) Auto select time zone 自动 (%1) - + Default (%1) Default time zone 默认 (%1) - + CET 欧洲中部时间 - + CST6CDT 古巴标准时间&古巴夏令时 - + Cuba 古巴 - + EET 东欧时间 - + Egypt 埃及 - + Eire 爱尔兰 - + EST 东部标准时间 - + EST5EDT 东部标准时间&东部夏令时 - + GB 英国 - + GB-Eire 英国-爱尔兰时间 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 格林威治 - + Hongkong 香港 - + HST 美国夏威夷时间 - + Iceland 冰岛 - + Iran 伊朗 - + Israel 以色列 - + Jamaica 牙买加 - + Kwajalein 夸贾林环礁 - + Libya 利比亚 - + MET 中欧时间 - + MST 山区标准时间 (北美) - + MST7MDT 山区标准时间&山区夏令时 (北美) - + Navajo 纳瓦霍 - + NZ 新西兰时间 - + NZ-CHAT 新西兰-查塔姆群岛 - + Poland 波兰 - + Portugal 葡萄牙 - + PRC 中国标准时间 - + PST8PDT 太平洋标准时间&太平洋夏令时 - + ROC 台湾时间 - + ROK 韩国时间 - + Singapore 新加坡 - + Turkey 土耳其 - + UCT UCT - + Universal 世界时间 - + UTC 协调世界时 - + W-SU 欧洲-莫斯科时间 - + WET 西欧时间 - + Zulu 祖鲁 - + Mono 单声道 - + Stereo 立体声 - + Surround 环绕声 - + 4GB DRAM (Default) 4GB DRAM (默认) - + 6GB DRAM (Unsafe) 6GB DRAM (不安全) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (不安全) - + 12GB DRAM (Unsafe) 12GB DRAM (不安全) - + Docked 主机模式 - + Handheld 掌机模式 - - + + Off 关闭 - + Boost (1700MHz) 加速 (1700MHz) - + Fast (2000MHz) 快速 (2000MHz) - + Always ask (Default) 总是询问 (默认) - + Only if game specifies not to stop 仅当游戏不希望停止时 - + Never ask 从不询问 - - + + Medium (256) 中(256) - - + + High (512) 高(512) - + Very Small (16 MB) 很小 (16 MB) - + Small (32 MB) 较小 (32 MB) - + Normal (128 MB) 正常 (128 MB) - + Large (256 MB) 较大 (256 MB) - + Very Large (512 MB) 很大 (512 MB) - + Very Low (4 MB) 很低 (4 MB) - + Low (8 MB) 低 (8 MB) - + Normal (16 MB) 正常 (16 MB) - + Medium (32 MB) 中 (32 MB) - + High (64 MB) 高 (64 MB) - + Very Low (32) 很低 (32) - + Low (64) 低 (64) - + Normal (128) 正常 (128) - + Disabled 禁用 - + ExtendedDynamicState 1 扩展动态状态 1 - + ExtendedDynamicState 2 扩展动态状态 2 - + ExtendedDynamicState 3 扩展动态状态 3 - + Tree View 树景视图 - + Grid View 网格视图 @@ -5806,7 +5791,7 @@ Drag points to change position, or double-click table cells to edit values.数据管理器 - + Deleting ANY data is IRREVERSABLE! 删除任何数据都是不可逆的! @@ -5817,13 +5802,13 @@ Drag points to change position, or double-click table cells to edit values. - UserNAND - 用户 NAND + User NAND + - SysNAND - 系统 NAND + System NAND + @@ -5869,7 +5854,7 @@ Drag points to change position, or double-click table cells to edit values.导入此目录的数据。这可能需要一些时间,并且会删除所有现有数据! - + Calculating... 正在计算... diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts index f7479697b0..0f3b2fa04e 100644 --- a/dist/languages/zh_TW.ts +++ b/dist/languages/zh_TW.ts @@ -1223,1044 +1223,1029 @@ Setting to Handheld can help improve performance for low end systems. - - Unit Serial - - - - - Battery Serial - - - - - Debug knobs - - - - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation 停止模拟时需要确认 - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity 滑鼠閒置時自動隱藏 - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet 禁用控制器程序 - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode 启用游戏模式 - + Force X11 as Graphics Backend - + Custom frontend 自定义前端 - + Real applet 真实的小程序 - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 异步模拟 - + Uncompressed (Best quality) 不壓縮 (最高品質) - + BC1 (Low quality) BC1 (低品質) - + BC3 (Medium quality) BC3 (中品質) - - + + Auto 自動 - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative 保守模式(节省 VRAM) - + Aggressive 激进模式 - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null 無 - + Fast - + Balanced - - + + Accurate 高精度 - - + + Default 預設 - + Unsafe (fast) - + Safe (stable) - + Unsafe 低精度 - + Paranoid (disables most optimizations) 偏执模式 (禁用绝大多数优化项) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed 無邊框視窗 - + Exclusive Fullscreen 全螢幕獨占 - + No Video Output 無視訊輸出 - + CPU Video Decoding CPU 視訊解碼 - + GPU Video Decoding (Default) GPU 視訊解碼(預設) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [实验性] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [實驗性] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [實驗性] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 最近鄰 - + Bilinear 雙線性 - + Bicubic 雙立方 - + Gaussian 高斯 - + Lanczos - + ScaleForce 強制縮放 - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - - + + None 無 - + FXAA FXAA - + SMAA SMAA - + Default (16:9) 預設 (16:9) - + Force 4:3 強制 4:3 - + Force 21:9 強制 21:9 - + Force 16:10 強制 16:10 - + Stretch to Window 延伸視窗 - + Automatic 自動 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + 32x - + 64x - + Japanese (日本語) 日文 (日本語) - + American English 美式英语 - + French (français) 法文 (français) - + German (Deutsch) 德文 (Deutsch) - + Italian (italiano) 義大利文 (italiano) - + Spanish (español) 西班牙文 (español) - + Chinese 中文 - + Korean (한국어) 韓文 (한국어) - + Dutch (Nederlands) 荷蘭文 (Nederlands) - + Portuguese (português) 葡萄牙文 (português) - + Russian (Русский) 俄文 (Русский) - + Taiwanese 台灣中文 - + British English 英式英文 - + Canadian French 加拿大法文 - + Latin American Spanish 拉丁美洲西班牙文 - + Simplified Chinese 簡體中文 - + Traditional Chinese (正體中文) 正體中文 (正體中文) - + Brazilian Portuguese (português do Brasil) 巴西-葡萄牙語 (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan 日本 - + USA 美國 - + Europe 歐洲 - + Australia 澳洲 - + China 中國 - + Korea 南韓 - + Taiwan 台灣 - + Auto (%1) Auto select time zone 自動 (%1) - + Default (%1) Default time zone 預設 (%1) - + CET 中歐 - + CST6CDT CST6CDT - + Cuba 古巴 - + EET EET - + Egypt 埃及 - + Eire 愛爾蘭 - + EST 北美東部 - + EST5EDT EST5EDT - + GB GB - + GB-Eire 英國-愛爾蘭 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 格林威治 - + Hongkong 香港 - + HST 夏威夷 - + Iceland 冰島 - + Iran 伊朗 - + Israel 以色列 - + Jamaica 牙買加 - + Kwajalein 瓜加林環礁 - + Libya 利比亞 - + MET 中歐 - + MST 北美山區 - + MST7MDT MST7MDT - + Navajo 納瓦霍 - + NZ 紐西蘭 - + NZ-CHAT 紐西蘭-查塔姆群島 - + Poland 波蘭 - + Portugal 葡萄牙 - + PRC 中國 - + PST8PDT 太平洋 - + ROC 臺灣 - + ROK 韓國 - + Singapore 新加坡 - + Turkey 土耳其 - + UCT UCT - + Universal 世界 - + UTC UTC - + W-SU 莫斯科 - + WET 西歐 - + Zulu 協調世界時 - + Mono 單聲道 - + Stereo 立體聲 - + Surround 環繞音效 - + 4GB DRAM (Default) 4GB DRAM (默认) - + 6GB DRAM (Unsafe) 6GB DRAM (不安全) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked TV - + Handheld 掌機模式 - - + + Off - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) 总是询问 (默认) - + Only if game specifies not to stop 仅当游戏不希望停止时 - + Never ask 从不询问 - - + + Medium (256) - - + + High (512) - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -5768,7 +5753,7 @@ Drag points to change position, or double-click table cells to edit values. - + Deleting ANY data is IRREVERSABLE! @@ -5779,12 +5764,12 @@ Drag points to change position, or double-click table cells to edit values. - UserNAND + User NAND - SysNAND + System NAND @@ -5831,7 +5816,7 @@ Drag points to change position, or double-click table cells to edit values. - + Calculating... diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml index 8fc37937bf..8b26754e2c 100644 --- a/src/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml @@ -476,21 +476,25 @@ 将生成的着色器缓存于磁盘中并进行读取,以减少卡顿。 强制最大时钟 (仅限 Adreno) 强制 GPU 以最大时钟运行 (仍被温控限制)。 + GPU 异步模拟 + 异步运行 GPU 模拟,以减少 CPU 停顿并提高吞吐量。仅当遇到与时序相关的问题时才应禁用此功能。 + 异步呈现 + 通过将呈现操作移至单独的 CPU 线程来略微提升性能。 启用反应性刷新 - 牺牲性能,提高某些游戏的渲染精度。 + 通过牺牲性能来提高某些游戏的渲染精度。 启用缓冲区历史 - 允许访问之前的缓冲状态。\n这个选项可能会提升某些游戏的渲染质量和性能一致性。 + 启用对先前缓冲区状态的访问。此选项可在某些游戏中提升渲染质量并保持性能的一致性。 优化顶点缓冲区 - 实现优化顶点缓冲区绑定以提升性能。需要 Mesa 26.0+ Turnip 驱动。老驱动会崩溃。 + 启用经过优化的顶点缓冲区绑定以提升性能。需要 Mesa 26.0 及以上版本的 Turnip 驱动程序。在旧版驱动程序上会导致程序崩溃。 Hacks GPU 超频频率 - 强制大多数游戏以其最高原生分辨率运行。使用 256 以获得最大性能,使用 512 以获得最大图形保真度。 + 强制大多数游戏以其最高原生分辨率运行。设置为 256 可获得最佳性能,设置为 512 可获得最佳画面保真度。 跳过CPU内部无效化 在内存更新期间跳过某些CPU端缓存无效化,减少CPU使用率并提高其性能。可能会导致某些游戏出现故障或崩溃。 - 修复泛光效果 - 减少《塞尔达传说:智慧的再现》(LA/EOW) 在 Adreno 700 系列 GPU 上的模糊感,并移除《横冲直撞》(Burnout) 中的模糊特效。警告:可能会导致其他游戏出现画面花屏或异常。 + 修复 Bloom 效果 + 减少《塞尔达传说:智慧的再现》(Adreno 700)中的 bloom 模糊,并移除《Burnout》中的 bloom 效果。警告:可能会导致在其他游戏中出现画面显示问题。 使用异步着色器 异步编译着色器。这可能会减少卡顿,但也可能会导致图形错误。 GPU 还原设置 From 860acb4faf0b453912c451238b44f77e6a7a7fdf Mon Sep 17 00:00:00 2001 From: coolone Date: Wed, 22 Apr 2026 05:32:52 +0200 Subject: [PATCH 04/45] [android] Fix crash on start any games for many handhelds (Ayaneo, Retroid etc) (#3647) ## Summary This change hardens Android Picture-in-Picture handling to avoid runtime crashes on devices/ROMs where PiP APIs are unavailable or behave inconsistently. ## What changed - Added a feature gate for PiP support using `FEATURE_PICTURE_IN_PICTURE`. - Early-returned from PiP flows when unsupported. - Wrapped PiP API calls (`enterPictureInPictureMode`, `setPictureInPictureParams`) in guarded handlers that catch `IllegalStateException` and `UnsupportedOperationException`. - Logged one warning per failed PiP action to avoid log spam. ## Why On some Android devices, calling PiP APIs can throw at runtime even when the app is otherwise functioning normally. This patch prevents those calls from crashing/interrupting emulation and keeps behavior unchanged on supported devices. ## Notes - No behavior changes for fully PiP-capable devices. - Safe no-op on unsupported devices. Co-authored-by: Nikolai Trukhin Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3647 Reviewed-by: DraVee Reviewed-by: Lizzie Reviewed-by: MaranBr --- .../yuzu_emu/activities/EmulationActivity.kt | 46 ++++++++++++++++--- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt index 949edc1ee3..eab0fac705 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt @@ -15,6 +15,7 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter +import android.content.pm.PackageManager import android.content.res.Configuration import android.graphics.Rect import android.graphics.drawable.Icon @@ -100,6 +101,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager private var romSwapGeneration = 0 private var hasEmulationSession = processHasEmulationSession private val romSwapStopTimeoutRunnable = Runnable { onRomSwapStopTimeout() } + private val pictureInPictureFailureActions: MutableSet = mutableSetOf() private fun onRomSwapStopTimeout() { if (!isWaitingForRomSwapStop) { @@ -266,12 +268,18 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager } override fun onUserLeaveHint() { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { - if (BooleanSetting.PICTURE_IN_PICTURE.getBoolean() && !isInPictureInPictureMode) { - val pictureInPictureParamsBuilder = PictureInPictureParams.Builder() - .getPictureInPictureActionsBuilder().getPictureInPictureAspectBuilder() - enterPictureInPictureMode(pictureInPictureParamsBuilder.build()) - } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S || + !isPictureInPictureSupported() || + !BooleanSetting.PICTURE_IN_PICTURE.getBoolean() || + isInPictureInPictureMode + ) { + return + } + + val pictureInPictureParamsBuilder = PictureInPictureParams.Builder() + .getPictureInPictureActionsBuilder().getPictureInPictureAspectBuilder() + runPictureInPictureAction("enter picture-in-picture mode") { + enterPictureInPictureMode(pictureInPictureParamsBuilder.build()) } } @@ -651,7 +659,29 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager return this.apply { setActions(pictureInPictureActions) } } + private fun isPictureInPictureSupported() = + Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && + packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) + + private fun runPictureInPictureAction(actionName: String, action: () -> Unit) { + try { + action() + } catch (e: IllegalStateException) { + if (pictureInPictureFailureActions.add(actionName)) { + Log.warning("[PiP] Failed to $actionName: ${e.message}") + } + } catch (e: UnsupportedOperationException) { + if (pictureInPictureFailureActions.add(actionName)) { + Log.warning("[PiP] Failed to $actionName: ${e.message}") + } + } + } + fun buildPictureInPictureParams() { + if (!isPictureInPictureSupported()) { + return + } + val pictureInPictureParamsBuilder = PictureInPictureParams.Builder() .getPictureInPictureActionsBuilder().getPictureInPictureAspectBuilder() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { @@ -661,7 +691,9 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager BooleanSetting.PICTURE_IN_PICTURE.getBoolean() && isEmulationActive ) } - setPictureInPictureParams(pictureInPictureParamsBuilder.build()) + runPictureInPictureAction("set picture-in-picture params") { + setPictureInPictureParams(pictureInPictureParamsBuilder.build()) + } } fun displayMultiplayerDialog() { From 838cc926f6c87a25cccab2dcd2e73f5b5baa8440 Mon Sep 17 00:00:00 2001 From: wildcard Date: Thu, 23 Apr 2026 03:43:54 +0200 Subject: [PATCH 05/45] keyboard fixes (#3865) Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3865 Reviewed-by: CamilleLaVey --- .../applets/keyboard/SoftwareKeyboard.kt | 6 ++ .../org/yuzu/yuzu_emu/overlay/InputOverlay.kt | 84 +++++++++++++++++++ .../android/applets/software_keyboard.cpp | 3 + 3 files changed, 93 insertions(+) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard.kt index e058067c97..26e787f377 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard.kt @@ -1,3 +1,7 @@ + +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -33,8 +37,10 @@ object SoftwareKeyboard { val emulationActivity = NativeLibrary.sEmulationActivity.get() val overlayView = emulationActivity!!.findViewById(R.id.surface_input_overlay) + overlayView.requestFocus() val im = overlayView.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + im.restartInput(overlayView) im.showSoftInput(overlayView, InputMethodManager.SHOW_FORCED) // There isn't a good way to know that the IMM is dismissed, so poll every 500ms to submit inline keyboard result. diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt index d3b5d86174..7ff9c78923 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt @@ -17,16 +17,23 @@ import android.graphics.drawable.VectorDrawable import android.os.Build import android.os.Handler import android.os.Looper +import android.text.Editable +import android.text.InputType import android.util.AttributeSet import android.view.HapticFeedbackConstants +import android.view.KeyEvent import android.view.MotionEvent import android.view.View import android.view.View.OnTouchListener import android.view.WindowInsets +import android.view.inputmethod.BaseInputConnection +import android.view.inputmethod.EditorInfo +import android.view.inputmethod.InputConnection import androidx.core.content.ContextCompat import androidx.window.layout.WindowMetricsCalculator import kotlin.math.max import kotlin.math.min +import org.yuzu.yuzu_emu.NativeLibrary import org.yuzu.yuzu_emu.features.input.NativeInput import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.features.input.model.NativeAnalog @@ -49,6 +56,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : private val overlayButtons: MutableSet = HashSet() private val overlayDpads: MutableSet = HashSet() private val overlayJoysticks: MutableSet = HashSet() + private val imeEditable = Editable.Factory.getInstance().newEditable("") private var inEditMode = false private var gamelessMode = false @@ -75,6 +83,63 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : // External listener for EmulationFragment joypad overlay auto-hide var touchEventListener: ((MotionEvent) -> Unit)? = null + override fun onCheckIsTextEditor(): Boolean = true + + override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection { + imeEditable.clear() + outAttrs.inputType = + InputType.TYPE_CLASS_TEXT or + InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS or + InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD + outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI or EditorInfo.IME_ACTION_DONE + outAttrs.initialSelStart = 0 + outAttrs.initialSelEnd = 0 + + return object : BaseInputConnection(this, true) { + override fun getEditable(): Editable = imeEditable + + override fun commitText(text: CharSequence?, newCursorPosition: Int): Boolean { + if (!text.isNullOrEmpty()) { + forwardCommittedText(text) + } + return super.commitText(text, newCursorPosition) + } + + override fun deleteSurroundingText(beforeLength: Int, afterLength: Int): Boolean { + repeat(beforeLength.coerceAtLeast(0)) { + NativeLibrary.submitInlineKeyboardInput(KeyEvent.KEYCODE_DEL) + } + return super.deleteSurroundingText(beforeLength, afterLength) + } + + override fun sendKeyEvent(event: KeyEvent): Boolean { + if (event.action != KeyEvent.ACTION_DOWN) { + return true + } + + when (event.keyCode) { + KeyEvent.KEYCODE_BACK, + KeyEvent.KEYCODE_DEL, + KeyEvent.KEYCODE_ENTER -> { + NativeLibrary.submitInlineKeyboardInput(event.keyCode) + } + else -> { + val textChar = event.unicodeChar + if (textChar != 0) { + NativeLibrary.submitInlineKeyboardText(textChar.toChar().toString()) + } + } + } + return true + } + + override fun performEditorAction(actionCode: Int): Boolean { + NativeLibrary.submitInlineKeyboardInput(KeyEvent.KEYCODE_ENTER) + return true + } + } + } + override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { super.onLayout(changed, left, top, right, bottom) @@ -119,6 +184,25 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : } } + private fun forwardCommittedText(text: CharSequence) { + val builder = StringBuilder() + text.forEach { character -> + when (character) { + '\n' -> { + if (builder.isNotEmpty()) { + NativeLibrary.submitInlineKeyboardText(builder.toString()) + builder.clear() + } + NativeLibrary.submitInlineKeyboardInput(KeyEvent.KEYCODE_ENTER) + } + else -> builder.append(character) + } + } + if (builder.isNotEmpty()) { + NativeLibrary.submitInlineKeyboardText(builder.toString()) + } + } + private fun drawGrid(canvas: Canvas) { val gridSize = IntSetting.OVERLAY_GRID_SIZE.getInt() val width = canvas.width diff --git a/src/common/android/applets/software_keyboard.cpp b/src/common/android/applets/software_keyboard.cpp index db76db91a6..8967811bd3 100644 --- a/src/common/android/applets/software_keyboard.cpp +++ b/src/common/android/applets/software_keyboard.cpp @@ -243,6 +243,9 @@ void AndroidKeyboard::SubmitInlineKeyboardInput(int key_code) { static_cast(m_current_text.size())); break; case KEYCODE_DEL: + if (m_current_text.empty()) { + return; + } m_current_text.pop_back(); submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::ChangedString, m_current_text, static_cast(m_current_text.size())); From 417ed904f038543f91288692a5153ffffbd8617d Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 23 Apr 2026 05:06:33 +0200 Subject: [PATCH 06/45] [dynarmic] fix MWAIT push/pop not being handled properly on xbyak (#3875) push %edx is not what i wanted, nor what anybody wants, xbyak silently accepting this before was not intended now that xbyak is updated this is an issue the issue was simply: a) ptr being overwritten (if it happened to be EDX/EBX/EAX) due to changed WAITPKG logic (oops) b) xbyak not reporting wrong r32 pop/push on older versions thus missing it and now it throws an exception Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3875 Reviewed-by: crueter Reviewed-by: CamilleLaVey --- .../src/dynarmic/common/spin_lock_x64.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp b/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp index 7607bbaafc..e3f1721132 100644 --- a/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp +++ b/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp @@ -23,16 +23,14 @@ static const auto default_cg_mode = nullptr; //Allow RWE namespace Dynarmic { void EmitSpinLockLock(Xbyak::CodeGenerator& code, Xbyak::Reg64 ptr, Xbyak::Reg32 tmp, bool waitpkg) { - // TODO: this is because we lack regalloc - so better to be safe :( - if (waitpkg) { - code.push(Xbyak::util::eax); - code.push(Xbyak::util::ebx); - code.push(Xbyak::util::edx); - } Xbyak::Label start, loop; code.jmp(start, code.T_NEAR); code.L(loop); if (waitpkg) { + // TODO: this is because we lack regalloc - so better to be safe :( + code.push(Xbyak::util::rax); + code.push(Xbyak::util::rbx); + code.push(Xbyak::util::rdx); // TODO: This clobbers EAX and EDX did we tell the regalloc? // ARM ptr for address-monitoring code.umonitor(ptr); @@ -49,6 +47,9 @@ void EmitSpinLockLock(Xbyak::CodeGenerator& code, Xbyak::Reg64 ptr, Xbyak::Reg32 code.umwait(Xbyak::util::ebx); // CF == 1 if we hit the OS-timeout in IA32_UMWAIT_CONTROL without a write // CF == 0 if we exited the wait for any other reason + code.pop(Xbyak::util::rdx); + code.pop(Xbyak::util::rbx); + code.pop(Xbyak::util::rax); } else { code.pause(); } @@ -57,11 +58,6 @@ void EmitSpinLockLock(Xbyak::CodeGenerator& code, Xbyak::Reg64 ptr, Xbyak::Reg32 /*code.lock();*/ code.xchg(code.dword[ptr], tmp); code.test(tmp, tmp); code.jnz(loop, code.T_NEAR); - if (waitpkg) { - code.pop(Xbyak::util::edx); - code.pop(Xbyak::util::ebx); - code.pop(Xbyak::util::eax); - } } void EmitSpinLockUnlock(Xbyak::CodeGenerator& code, Xbyak::Reg64 ptr, Xbyak::Reg32 tmp) { From b3cc8723c14a48bd75f124bed67ac5a2b44e013a Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Fri, 24 Apr 2026 16:37:18 +0200 Subject: [PATCH 07/45] [vulkan] 2nd Vulkan Global Maintenance (#3853) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This pr is a sequel to the one merged some days ago (#3839); which aims to improve stability, graphical accuracy and better Vulkan implementation and coherency among all platforms, contains the next changes: -> Removal of VK_EXT_unified_image_layouts: The removal of this ext was for cleaning purposes since the only part of this extension implemented was the activator; meanwhile a proper structure of use for this extension was not implemented, currently it's not viable to keep following an idea of a proper implementation due to complexity of this feature and the state of buffer cache and texture cache, which it's task that we must do near in the future, when this happens a better oportunity will arise to properly set layouts along a proper implementation of VK_EXT_descriptors_indexing, practically this feature was dead code. -> Adjustment of VK_EXT_custom_border_color: The implementation of this feature was handled poorly and worsened during the first tries of making ExtendedDynamicState stable, by gating it's use to the slider of EDS (dyna_state) if the counter was at least in 1, even tho this entered in a bug with the RemoveUnsuitableExtension, when is not a requirement for enabling in Vulkan's documentation and was my mistake, some time later in ExtendedDynamicState refactor (#3074) I tried to make the implementation more robust in comparison the Yuzu's implementation which had bans on vendor drivers, the new handling was requesting if extension was available and what kind of support feature it had, enabling what it was available and wiring an adequate path for said available feature; which leads us to today's change, after reading carefully how certain paths weren't triggered or caused mostly issues on how extension should work I did the next changes: - I removed the forced disabling with ExtendedDynamicState setting - Resolved the bug with RemoveUnsuitableExtension + dyna_state - Removed comments of explanation + log_debug warning - Set extension to be disabled if customBorderColorWithoutFormat is not available - Helps to solidify the removal of bans in vendor drivers This changes fixes the VUID 04015 for the handling with undefined format and made the usage of the extension more near to what Vulkan specification expects, yet there is still cases where we can't emulate properly samplers and some translucid black boxes will still appear, yet, now alleviated by allowing extension choose the proper custom available in Vulkan or degrade into a fallaback of solid colors. -> Adjustment of VK_EXT/KHR_robustness2: This feature was introduced in ExtendedDynamicState refactor (#3074), as safety measure for descriptors during the Write of buffers, providing robustness with an upgraded access to image, buffers and proper discard of null data in descriptors, however, despite the configuration the logs during debug sessions never stopped to bring the next VUID-VkWriteDescriptorSet-descriptorType-00324 and VUID-VkWriteDescriptorSet-descriptorType-00325, being the first one, the most constant issue plaguing logs; the approach was not only ensuring device can access between each of the version of this feature, whether is an EXT or KHR (drivers can report one of them or both, yet, if we call the one of them and it's not the version supported, driver would not load the feature, there's a priority to the KHR version) with a simplified configuration of the extension to use only nullDescritor to deflect properly buffers and other trash data outside of descriptors bound; ensuring to wire the path when it's and not available and also with BindVertexBuffers2EXT when it's or not available; fixing both VUID's. This changes helps to save some CPU resources and memory on binding routes. - Fixes VUID-VkWriteDescriptorSet-descriptorType-00324 - Fixes VUID-VkWriteDescriptorSet-descriptorType-00325 - Fixes VUID-vkCmdBindVertexBuffers-pBuffers-00621 (alongisde a latter adjustment for pStrides) -> Adjustment VK_EXT_image_robustness: As other features, this was implemented during the ExtendedDynamicState refactor (#3074), currently this change it's just to ensure more drivers are accessing this feature by changing the modality from extension to an explicit feature, some other redundant code was cleaned within this change. -> Restored gating flush operation on removed gpu accuracy: An issue report from an user called CaptFaraday in https://github.com/eden-emulator/Issue-Reports/issues/425, posted a behavior appearing after the rework of gpu accuracy levels (#3129), which broke the rendering in Paper Mario - The-Thousand-Year Door where some graphical issues such as black flash and missing rendering from many animations through the game thanks to the removal of the flush inside FlushAndInvalidateRegion gated with IsGPULevelExtreme and suggested a possible fix with resting the missing gating and flush; which I did and properly restoring the complete behavior of this functionality + wiring to the new IsGPULevelHigh for a better semantic correctness, the change was tested and didn't affected Yoshi's Crafted World graphical problems and main reason behind the deletion of this function, fixed in fcfcee7247. - Solves https://github.com/eden-emulator/Issue-Reports/issues/266 - Solves https://github.com/eden-emulator/Issue-Reports/issues/425 - Fixes Paper Mario - The-Thousand-Year Door - Keeps Yoshi's Crafted World issue still fixed -> Adjustment VK_EXT_conditional_rendering: Yuzu inherited us in their Vulkan backend multiple flaws which got worsened with the time as game and drivers changed, aside that, with the time studying this source code and especially the Vulkan-side of Eden, I started to learn and recognize some extensions that required a wide and robust modification to ensure the logic of the extension works as intended; currently ConditionalRendering had a lot of minimal modification: - Reordering the functions from "_NotifySegment_" to avoid a masive ram leak coming from query_cache (@weakboson) (#131) - Removing a function "_NotifySegment_" from rasterizer to ensure Metroid Prime 4 stopped crashing due to serious ram leaks in query_cache (@Maufeat) (#3142) And other intents to make ConditionalRendering fully working, such as happened in ExtendedDynamicState refactor (#3074) but only patched an horrible situation with how the extension was truly working, after spending more than 3 months studying how this and other sub-sequential and essential extensions touched in this PR worked in Vulkan, I dived once again to make it work properly; one of the first changes was to fix an invalid reference lookup of queries, which fixed the removal of "NotifySegment" inside rasterizer and start to adjusting other parts of the implementation of ConditionalRendering minimally and switching with heavy tests to ensure not a single game gets broken among the changes; yet the initial benefits from fixing the indirection in the lookups to query cache, was to reduce the amount of time of GPU was spending in the constant state of queries, which proved to reduce flickering in Pokémon ZA among others, with also an small increase of performance but more noticeable stability, starting to reduce stutering bit by bit. This advances allowed me to fix one of the the functions of IsGPULevelHigh, where existed a bypass to accelerate conditional rendering without the proper checks if the extension was truly supported, freeing QCOM from the flag of a fixated presync workaround; which also improved the usage of QCOM driver for 8 Elite devices and Unreal Engine 4 - 5 games, such as Dragon Ball Z - Sparking Zero; but that's not the only benefit from the current tries to make ConditionalRendering implementation more robust and accurate to specifications, but also started to show key points of where VK_EXT_transform_feedback was also failing to work properly. -> Adjustment VK_EXT_transform_feedback: Like many other features in this PR, this one was also adjusted minimally in ExtendedDynamicState refactor (#3074), with the ConditionalRendering refactor going on, the solutions for the usage of this extensions started by ensuring each key function is properly gated by a getter which would only be enabled if the extension was already being loaded in the virtual device, if wasn't the case I was making sure to wire the fallback correctly, which wasn't in place and didn't had a robust handling since ever, this way games started to not only improve graphical accuracy, like some games such as Zelda - Echoes Of Wisdom where the lightning and dark border moves/ reacts dynamically. Besides that, this change brought the possibility to finally get rid of the indirection of the buffers synchronization which often take a non-synchornization path to ensure a faster reply but with higher possibilities to cause graphical issues in among several games; aside that, also helped to ensure "_query_cache.CounterEnable(VideoCommon::QueryType::StreamingByteCount, false)_;" function is properly allocated and reset in a different place than where this was placed. - Maintain Metroid Prime 4 fixes even after returning the lines that caused the game to be unplayable, whether was an instant crash or crash after some minutes of gameplay, fixes that were introduced in other work (#3142). Within the first step in the refactor of this extension, this work was reviewed by @wildcard which made me notice of an issue of handling inside buffers, there existed a mismatch on the tracking of feedback buffers and since we're treating them as buffer_slot, counterstream was still tracking and consuming stream_buffers and not where data was really passing through; derivating the counter selection of counterBufferCount by stream indexes and not by slot, which could cause cases of _Stream =! slot_, a solution proposed for me was to add stream mapper function where the stream slot were located + updating UpdateBuffers() to calculate buffer counts per slot and not stream, allowing to fully map the map funtion of stream mapper; along other changes on the WriteBuffers + ProduceBufferCounter to avoid any misaligment. -> Other minimal adjustments: Alongside these important adjustment, others were also made to ensure logical coherency to this recent changes, such as ensuring FullSynchronization of buffers path, since GPU has mostly a syncing issue with certain type of textures and vertex calculations, the original behavior of jumping into a non-synchronize path of buffers let GPU ran without proper awareness of the textures being loaded, ensuring more performance if all the textures reached properly inside GPU, but with no safety provided for buffers, even we added a cases were dummies and mostly buffer trash data gets discarded by nullDescriptors, this won't ensure graphical artifacts or a bad calculation on the range of lightning/ gfx could appear. I dare to think this was thought to be implemented due to the original heavy costs on Yuzu's time, this along the removal of QCOM's drivers from Query's Presync funtions. A small adjustment to the mutable functions inside the CreateImageView structure to add the extended usage: "Because Switch's GPU creates incompatible views (sRGB and UNORM) on the same image. A sRGB image can't be used as storage but it is in a UNORM view. Which is exactly the use case of these flags." - @weakboson During all of this changes inside queries, we started to get in some devices "Device Loss" warning from Vulkan along 2 specific warnings: - [ 102.384895] Render.Vulkan video_core/vulkan_common/vulkan_debug_callback.cpp:69:DebugUtilCallback: vkDeviceWaitIdle(): THREADING ERROR : object of type VkQueue is simultaneously used in current thread 517024609280 and thread 517864567808 - [ 114.003530] Render.Vulkan video_core/vulkan_common/vulkan_debug_callback.cpp:69:DebugUtilCallback: vkCmdBeginQuery(): VkQueryPool 0x15e400000015e4 and query 172: query not reset. After query pool creation, each query must be reset (with vkCmdResetQueryPool or vkResetQueryPool) before it is used. Queries must also be reset between uses. Since before all of this adjustments, original GPU thread often take it's time to stop and look for a moment to synchronize with CPU (non-TimelineSemaphore), the whole flow data was improved that we were producing more data stale than we could really take due to the lack of a Reset to avoid pools being filled with old data, in order to get rid of this, another try to implement ResetQueryPool's appeared which was intented to be implemented some months ago and got removed in #3270, this time aligning the vkDeviceWaitIdle + ResetQueryPool was proved to be effective than first implementation and didn't caused major issues, now GPU can Vulkan can reset staling data, which can catalogued as old once they were used and displayed in frame, keeping a more fluid exchance and discard of data. - Fixes VUID-vkCmdBeginQuery-None-00807 - Fixes multithreading error with vkDeviceWaitIdle and data allocation We have some other changes to the coherency of ExtendedDynamicState2 and the feature of restart primitives, which now patches topologies once are processed if they pass through ExtendedDynamicState2 enabled and get reset before every draw to prevent another topology VUID; also I ensured refresh, reset, clamp and overall improve the math inside the Viewport/ Scissor feature operations inside DynamicState and later upgrades. --------------------------- UPDATE (23/04/2026): After passing a heavy testing phase, an issue was encountered with AMD drivers on Windows which based on the commit: c07dfa6fb4, Super Mario Odissey started to show vertex glitches on the the waterfall + water fog being rendered incorrectly, if VertexInputDynamicState was disabled caused black screen on ExtendedDynamicState (1 - 3) and hard crash if ExtendedDynamicState it was disabled; this situation was caused to the vertex input dynamic tied to ExtendedDynamicState1, AMD driver didn't allowed fast access to BindVertexBuffers2EXT without binding strides first, which caused a syncing problem between the binded vertex and the missing buffer in the same chain, this got fixed by removing the conditions for vertex input dynamic. Aside that; another pair of issues were addressed in the meantime of refining this PR, one of them was to solve the failing BGR565 formats to swizzle into RGBA5 which allows to swap between red and blue; solving the inverse situation of blue icons on Mario Kart 8 Deluxe for older QCOM drivers and SoC's, such as Snapdragon 855 - 870; which will also help some Exynos processors to render properly. This solution was converted into a toggle/hack because it's use it's very conditional on older hardware; newer SoC's such as 8 Elite won't longer require this handling to convert properly BGR565 texture even if the support for the format is not available. --------------------------- Here an small preview of what this pr has been fixed so far, but our testing range may be more limited than what this can actually do: - Allow to display new effect on games 1. Jump Force: New particle on stages and main menu. 2. The Legend Of Zelda - Echoes of Wisdom: darkness post processing effect on screen filter such as game intro and smokes on houses (8 Elite). 3. Reduce texture flickering on games such as EoW, Monster Hunter Rise. 4. Improved performance stability on various games with Android. 5. Improved Xenoblade games rendering with QCOM stock drivers by improve viewpoint handling (8 Elite). 6. Fixes vertex explosion on Xenoblade 3 with AMD GPU with extended dynamic state enabled. 7. Fixed Mario Kart 8 Deluxe rendering with VK_EXT_vertex_input_dynamic_state enabled. 8. Fixes certain angle of Pokemon Legend Z-A would look mono color with vertex input dynamic state. 9. Fixed graphical issue with VK_EXT_vertex_input_dynamic_state on mobile drivers. 10. Fixed vertex explosion with Turnip (8 Elite) on The Legend Of Zelda- Breath Of The Wild during loading screen. 11. Fixed issue of vertex on Pokémon Legends ZA with VK_EXT_vertex_input_dynamic_state enabled. 12. Improved rendering and stability of Inmortal Fenyx Rising, including QCOM drivers being able to reach into gameplay. 13. Fixes Paper Mario - The-Thousand-Year Door missing rendering on animations through the whole game. 14. Fixed Mario Kart 8 Deluxe blue tint icon on Snapdragon 855 - 870 (by enabling Emulated BGR565 hack toggle). 15. Fixed Naruto Ultimate Ninja Storm issue rendering on characters like Naruto being blue on older QCOM SoC's and Exynos (by enabling Emulated BGR565 hack toggle) 16. Fixed Dangaronpa Killing Harmony v3 issue rendering on characters with blue tint on older QCOM SoC's. --------------------------- _**Special Thanks - Credits**_ -> @Gidoly for being able to keep track of the intensive testing phase this pr required and the will to keep helping in development, you're a good friend and very useful. -> @CaptFaraday for the suggestion of the fix for Paper Mario. -> @wildcard for the review during the refactor of VK_EXT_transform_feedback, without this comment I would probably ran into many untrackable issues. -> @weakboson for the suggestion into the solution for sRGB's and UNORM's in the incompatible views. Co-authored-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3853 Reviewed-by: crueter --- .../features/settings/model/BooleanSetting.kt | 1 + .../settings/model/view/SettingsItem.kt | 7 + .../settings/ui/SettingsFragmentPresenter.kt | 1 + .../app/src/main/res/values/strings.xml | 6 +- src/common/settings.h | 5 +- .../backend/spirv/spirv_emit_context.cpp | 3 + src/shader_recompiler/runtime_info.h | 1 + src/video_core/buffer_cache/buffer_cache.h | 33 ++-- src/video_core/gpu_thread.cpp | 13 +- .../resolve_conditional_render.comp | 21 ++- src/video_core/macro.cpp | 4 +- src/video_core/query_cache/query_cache.h | 1 + src/video_core/query_cache/query_stream.h | 5 +- .../renderer_opengl/gl_rasterizer.cpp | 3 + .../renderer_vulkan/fixed_pipeline_state.cpp | 30 ++-- .../renderer_vulkan/fixed_pipeline_state.h | 8 +- .../renderer_vulkan/renderer_vulkan.cpp | 7 +- .../renderer_vulkan/vk_blit_screen.cpp | 6 +- .../renderer_vulkan/vk_buffer_cache.cpp | 8 +- .../renderer_vulkan/vk_compute_pass.cpp | 18 +- .../renderer_vulkan/vk_graphics_pipeline.cpp | 4 + .../renderer_vulkan/vk_pipeline_cache.cpp | 6 + .../renderer_vulkan/vk_present_manager.cpp | 2 +- .../renderer_vulkan/vk_query_cache.cpp | 155 +++++++++++++++--- .../renderer_vulkan/vk_query_cache.h | 3 +- .../renderer_vulkan/vk_rasterizer.cpp | 137 ++++++++++++---- .../renderer_vulkan/vk_rasterizer.h | 3 +- .../renderer_vulkan/vk_scheduler.cpp | 2 + src/video_core/renderer_vulkan/vk_scheduler.h | 5 + .../renderer_vulkan/vk_state_tracker.cpp | 3 +- .../renderer_vulkan/vk_state_tracker.h | 2 +- .../renderer_vulkan/vk_texture_cache.cpp | 50 +++--- src/video_core/transform_feedback.cpp | 4 +- .../vulkan_common/vulkan_device.cpp | 57 ++++--- src/video_core/vulkan_common/vulkan_device.h | 53 ++---- .../vulkan_common/vulkan_wrapper.cpp | 1 + src/video_core/vulkan_common/vulkan_wrapper.h | 5 + 37 files changed, 467 insertions(+), 206 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt index e47263bfb2..e482725196 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt @@ -17,6 +17,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { USE_CUSTOM_CPU_TICKS("use_custom_cpu_ticks"), SKIP_CPU_INNER_INVALIDATION("skip_cpu_inner_invalidation"), FIX_BLOOM_EFFECTS("fix_bloom_effects"), + EMULATE_BGR565("emulate_bgr565"), CPUOPT_UNSAFE_HOST_MMU("cpuopt_unsafe_host_mmu"), USE_DOCKED_MODE("use_docked_mode"), USE_AUTO_STUB("use_auto_stub"), diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index 8ca9533f83..daeee398d4 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt @@ -756,6 +756,13 @@ abstract class SettingsItem( descriptionId = R.string.fix_bloom_effects_description ) ) + put( + SwitchSetting( + BooleanSetting.EMULATE_BGR565, + titleId = R.string.emulate_bgr565, + descriptionId = R.string.emulate_bgr565_description + ) + ) put( SwitchSetting( BooleanSetting.CPUOPT_UNSAFE_HOST_MMU, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 542215fa97..0487339f68 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -293,6 +293,7 @@ class SettingsFragmentPresenter( add(IntSetting.FAST_GPU_TIME.key) add(BooleanSetting.SKIP_CPU_INNER_INVALIDATION.key) add(BooleanSetting.FIX_BLOOM_EFFECTS.key) + add(BooleanSetting.EMULATE_BGR565.key) add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key) add(BooleanSetting.RENDERER_ASYNCHRONOUS_GPU_EMULATION.key) add(BooleanSetting.RENDERER_ASYNC_PRESENTATION.key) diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index d42fb37d58..02860364a9 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -501,7 +501,7 @@ Enable buffer history Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Optimized Vertex Buffers - Enables optimized vertex buffer binding for improved performance. Requires Mesa 26.0+ Turnip drivers. Will crash on older drivers. + Enables optimized vertex buffer binding for improved performance. Requires Mesa 26.0+ Turnip drivers/ QCOM drivers. Will crash on older Turnip drivers. Hacks @@ -510,7 +510,9 @@ Skip CPU Inner Invalidation Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it\'s performance. This may cause glitches or crashes on some games. Fix Bloom Effects - Reduces bloom blur in LA/EOW (Adreno 700), removes bloom in Burnout. Warning: may cause graphical artifacts in other games. + Reduces bloom blur in LA/EOW (Adreno A6XX - A7XX/ Turnip), removes bloom in Burnout. Warning: may cause graphical artifacts in other games. + Emulate BGR565 + Fixes problems with inverted colors in games or strange artifacts or strange shadows. Use asynchronous shaders Compiles shaders asynchronously. This may reduce stutters but may also introduce glitches. GPU Unswizzle Settings diff --git a/src/common/settings.h b/src/common/settings.h index ca61ac906e..13ccf5a1d5 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -555,6 +555,9 @@ struct Values { SwitchableSetting fix_bloom_effects{linkage, false, "fix_bloom_effects", Category::RendererHacks}; + SwitchableSetting emulate_bgr565{linkage, false, "emulate_bgr565", + Category::RendererHacks}; + SwitchableSetting rescale_hack{linkage, false, "rescale_hack", Category::RendererHacks}; @@ -584,7 +587,7 @@ struct Values { SwitchableSetting dyna_state{linkage, #if defined(ANDROID) - ExtendedDynamicState::EDS1, + ExtendedDynamicState::Disabled, #elif defined(__APPLE__) ExtendedDynamicState::Disabled, #else diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index b9a24496c9..169e83d9fd 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -178,6 +178,9 @@ void DefineGenericOutput(EmitContext& ctx, size_t index, std::optional invo ctx.Decorate(id, spv::Decoration::XfbBuffer, xfb_varying->buffer); ctx.Decorate(id, spv::Decoration::XfbStride, xfb_varying->stride); ctx.Decorate(id, spv::Decoration::Offset, xfb_varying->offset); + if (ctx.stage == Stage::Geometry && xfb_varying->stream != 0) { + ctx.Decorate(id, spv::Decoration::Stream, xfb_varying->stream); + } } if (num_components < 4 || element > 0) { const std::string_view subswizzle{swizzle.substr(element, num_components)}; diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index be10a9bb08..e6e1284762 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -76,6 +76,7 @@ enum class TessSpacing { struct TransformFeedbackVarying { u32 buffer{}; + u32 stream{}; u32 stride{}; u32 offset{}; u32 components{}; diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 014b4a318e..c857e90e02 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -1067,26 +1067,29 @@ void BufferCache

::BindHostTransformFeedbackBuffers() { HostBindings host_bindings; for (u32 index = 0; index < NUM_TRANSFORM_FEEDBACK_BUFFERS; ++index) { const Binding& binding = channel_state->transform_feedback_buffers[index]; - if (maxwell3d->regs.transform_feedback.controls[index].varying_count == 0 && - maxwell3d->regs.transform_feedback.controls[index].stride == 0) { - break; + const auto& control = maxwell3d->regs.transform_feedback.controls[index]; + const bool has_layout = control.varying_count != 0 || control.stride != 0; + + Buffer* host_buffer = &slot_buffers[NULL_BUFFER_ID]; + u32 offset = 0; + u32 size = 0; + + if (has_layout && binding.buffer_id != NULL_BUFFER_ID && binding.size != 0) { + Buffer& buffer = slot_buffers[binding.buffer_id]; + TouchBuffer(buffer, binding.buffer_id); + size = binding.size; + SynchronizeBuffer(buffer, binding.device_addr, size); + MarkWrittenBuffer(binding.buffer_id, binding.device_addr, size); + offset = buffer.Offset(binding.device_addr); + buffer.MarkUsage(offset, size); + host_buffer = &buffer; } - Buffer& buffer = slot_buffers[binding.buffer_id]; - TouchBuffer(buffer, binding.buffer_id); - const u32 size = binding.size; - SynchronizeBuffer(buffer, binding.device_addr, size); - MarkWrittenBuffer(binding.buffer_id, binding.device_addr, size); - - const u32 offset = buffer.Offset(binding.device_addr); - buffer.MarkUsage(offset, size); - host_bindings.buffers.push_back(&buffer); + host_bindings.buffers.push_back(host_buffer); host_bindings.offsets.push_back(offset); host_bindings.sizes.push_back(size); } - if (host_bindings.buffers.size() > 0) { - runtime.BindTransformFeedbackBuffers(host_bindings); - } + runtime.BindTransformFeedbackBuffers(host_bindings); } template diff --git a/src/video_core/gpu_thread.cpp b/src/video_core/gpu_thread.cpp index 8d8d857a02..63a2516399 100644 --- a/src/video_core/gpu_thread.cpp +++ b/src/video_core/gpu_thread.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project @@ -92,7 +92,16 @@ void ThreadManager::InvalidateRegion(DAddr addr, u64 size) { } void ThreadManager::FlushAndInvalidateRegion(DAddr addr, u64 size) { - // Skip flush on asynch mode, as FlushAndInvalidateRegion is not used for anything too important + if (Settings::IsGPULevelHigh()) { + if (!is_async) { + PushCommand(FlushRegionCommand(addr, size)); + } else { + auto& gpu = system.GPU(); + const u64 fence = gpu.RequestFlush(addr, size); + TickGPU(); + gpu.WaitForSyncOperation(fence); + } + } rasterizer->OnCacheInvalidation(addr, size); } diff --git a/src/video_core/host_shaders/resolve_conditional_render.comp b/src/video_core/host_shaders/resolve_conditional_render.comp index 307e77d1ad..3bc92f94fa 100644 --- a/src/video_core/host_shaders/resolve_conditional_render.comp +++ b/src/video_core/host_shaders/resolve_conditional_render.comp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -5,16 +8,22 @@ layout(local_size_x = 1) in; -layout(std430, binding = 0) buffer Query { - uvec2 initial; - uvec2 unknown; - uvec2 current; +layout(std430, binding = 0) readonly buffer Query { + uint data[]; }; -layout(std430, binding = 1) buffer Result { +layout(std430, binding = 1) writeonly buffer Result { uint result; }; +layout(push_constant) uniform PushConstants { + uint compare_to_zero; +}; + void main() { - result = all(equal(initial, current)) ? 1 : 0; + if (compare_to_zero != 0u) { + result = (data[0] != 0u && data[1] != 0u) ? 1u : 0u; + } else { + result = (data[0] == data[4] && data[1] == data[5]) ? 1u : 0u; + } } diff --git a/src/video_core/macro.cpp b/src/video_core/macro.cpp index 66cea5afbd..2cda78c459 100644 --- a/src/video_core/macro.cpp +++ b/src/video_core/macro.cpp @@ -285,11 +285,11 @@ void HLE_MultiDrawIndexedIndirectCount::Fallback(Engines::Maxwell3D& maxwell3d, } void HLE_DrawIndirectByteCount::Execute(Engines::Maxwell3D& maxwell3d, std::span parameters, [[maybe_unused]] u32 method) { const bool force = maxwell3d.Rasterizer().HasDrawTransformFeedback(); - auto topology = Maxwell3D::Regs::PrimitiveTopology(parameters[0] & 0xFFFFU); - if (!force && (!maxwell3d.AnyParametersDirty() || !IsTopologySafe(topology))) { + if (!force) { Fallback(maxwell3d, parameters); return; } + auto topology = Maxwell3D::Regs::PrimitiveTopology(parameters[0] & 0xFFFFU); auto& params = maxwell3d.draw_manager->GetIndirectParams(); params.is_byte_count = true; params.is_indexed = false; diff --git a/src/video_core/query_cache/query_cache.h b/src/video_core/query_cache/query_cache.h index 4ed42487aa..6bed91a53e 100644 --- a/src/video_core/query_cache/query_cache.h +++ b/src/video_core/query_cache/query_cache.h @@ -412,6 +412,7 @@ bool QueryCacheBase::AccelerateHostConditionalRendering() { .found_query = nullptr, }; } + it_current = it_current_2; } auto* query = impl->ObtainQuery(it_current->second); qc_dirty |= True(query->flags & QueryFlagBits::IsHostManaged) && diff --git a/src/video_core/query_cache/query_stream.h b/src/video_core/query_cache/query_stream.h index 1d11b12752..b4dc9d1815 100644 --- a/src/video_core/query_cache/query_stream.h +++ b/src/video_core/query_cache/query_stream.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -75,7 +78,7 @@ public: } u64 GetDependentMask() const { - return dependence_mask; + return dependent_mask; } u64 GetAmendValue() const { diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index e268c4d2c6..26826a8f78 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -629,6 +629,9 @@ void RasterizerOpenGL::ReleaseFences(bool force) { void RasterizerOpenGL::FlushAndInvalidateRegion(DAddr addr, u64 size, VideoCommon::CacheType which) { + if (Settings::IsGPULevelHigh()) { + FlushRegion(addr, size, which); + } InvalidateRegion(addr, size, which); } diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp index 866b721a84..d53cf70b37 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp @@ -190,9 +190,7 @@ void FixedPipelineState::Refresh(Tegra::Engines::Maxwell3D& maxwell3d, DynamicFe } } } - if (!extended_dynamic_state_3_enables) { - dynamic_state.Refresh3(regs); - } + dynamic_state.Refresh3(regs, features); if (xfb_enabled) { RefreshXfbState(xfb_state, regs); } @@ -295,16 +293,22 @@ void FixedPipelineState::DynamicState::Refresh2(const Maxwell& regs, depth_bias_enable.Assign(enabled_lut[POLYGON_OFFSET_ENABLE_LUT[topology_index]] != 0 ? 1 : 0); } -void FixedPipelineState::DynamicState::Refresh3(const Maxwell& regs) { - logic_op_enable.Assign(regs.logic_op.enable != 0 ? 1 : 0); - depth_clamp_disabled.Assign(regs.viewport_clip_control.geometry_clip == - Maxwell::ViewportClipControl::GeometryClip::Passthrough || - regs.viewport_clip_control.geometry_clip == - Maxwell::ViewportClipControl::GeometryClip::FrustumXYZ || - regs.viewport_clip_control.geometry_clip == - Maxwell::ViewportClipControl::GeometryClip::FrustumZ); - - line_stipple_enable.Assign(regs.line_stipple_enable); +void FixedPipelineState::DynamicState::Refresh3(const Maxwell& regs, + const DynamicFeatures& features) { + if (!features.has_dynamic_state3_logic_op_enable) { + logic_op_enable.Assign(regs.logic_op.enable != 0 ? 1 : 0); + } + if (!features.has_dynamic_state3_depth_clamp_enable) { + depth_clamp_disabled.Assign(regs.viewport_clip_control.geometry_clip == + Maxwell::ViewportClipControl::GeometryClip::Passthrough || + regs.viewport_clip_control.geometry_clip == + Maxwell::ViewportClipControl::GeometryClip::FrustumXYZ || + regs.viewport_clip_control.geometry_clip == + Maxwell::ViewportClipControl::GeometryClip::FrustumZ); + } + if (!features.has_dynamic_state3_line_stipple_enable) { + line_stipple_enable.Assign(regs.line_stipple_enable); + } } size_t FixedPipelineState::Hash() const noexcept { diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.h b/src/video_core/renderer_vulkan/fixed_pipeline_state.h index ffc91e9a55..44157d686d 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.h +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.h @@ -27,6 +27,9 @@ struct DynamicFeatures { bool has_extended_dynamic_state_2_patch_control_points; bool has_extended_dynamic_state_3_blend; bool has_extended_dynamic_state_3_enables; + bool has_dynamic_state3_depth_clamp_enable; + bool has_dynamic_state3_logic_op_enable; + bool has_dynamic_state3_line_stipple_enable; bool has_dynamic_vertex_input; bool has_provoking_vertex; bool has_provoking_vertex_first_mode; @@ -175,7 +178,7 @@ struct FixedPipelineState { void Refresh(const Maxwell& regs); void Refresh2(const Maxwell& regs, Maxwell::PrimitiveTopology topology, bool base_features_supported); - void Refresh3(const Maxwell& regs); + void Refresh3(const Maxwell& regs, const DynamicFeatures& features); Maxwell::ComparisonOp DepthTestFunc() const noexcept { return UnpackComparisonOp(depth_test_func); @@ -265,8 +268,7 @@ struct FixedPipelineState { return sizeof(*this); } if (dynamic_vertex_input && extended_dynamic_state_3_blend) { - // Exclude dynamic state and attributes - return offsetof(FixedPipelineState, dynamic_state); + return offsetof(FixedPipelineState, attachments); } if (dynamic_vertex_input) { // Exclude dynamic state diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 010cfd225d..2deec13ace 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -171,7 +172,11 @@ try RendererVulkan::~RendererVulkan() { scheduler.RegisterOnSubmit([] {}); - void(device.GetLogical().WaitIdle()); + scheduler.Finish(); + { + std::scoped_lock lock{scheduler.submit_mutex}; + void(device.GetLogical().WaitIdle()); + } } void RendererVulkan::Composite(std::span framebuffers) { diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp index bb7eb9bdaa..75a8c3bf91 100644 --- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp +++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp @@ -8,6 +8,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include #include "video_core/framebuffer_config.h" #include "video_core/present.h" #include "video_core/renderer_vulkan/present/filters.h" @@ -31,7 +32,10 @@ BlitScreen::~BlitScreen() = default; void BlitScreen::WaitIdle() { present_manager.WaitPresent(); scheduler.Finish(); - device.GetLogical().WaitIdle(); + { + std::scoped_lock lock{scheduler.submit_mutex}; + device.GetLogical().WaitIdle(); + } } void BlitScreen::SetWindowAdaptPass() { diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index 74f06427dd..a359502046 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp @@ -637,12 +637,10 @@ void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings< for (u32 i = 0; i < bindings.buffers.size(); ++i) { auto handle = bindings.buffers[i]->Handle(); if (handle == VK_NULL_HANDLE) { + ReserveNullBuffer(); + handle = *null_buffer; bindings.offsets[i] = 0; - bindings.sizes[i] = VK_WHOLE_SIZE; - if (!device.HasNullDescriptor()) { - ReserveNullBuffer(); - handle = *null_buffer; - } + bindings.sizes[i] = 0; } buffer_handles[i] = handle; } diff --git a/src/video_core/renderer_vulkan/vk_compute_pass.cpp b/src/video_core/renderer_vulkan/vk_compute_pass.cpp index d45a57f7bb..f198b65d69 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pass.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pass.cpp @@ -228,6 +228,10 @@ struct QueriesPrefixScanPushConstants { u32 accumulation_limit; u32 buffer_offset; }; + +struct ConditionalRenderingResolvePushConstants { + u32 compare_to_zero; +}; } // Anonymous namespace ComputePass::ComputePass(const Device& device_, DescriptorPool& descriptor_pool, @@ -413,7 +417,8 @@ ConditionalRenderingResolvePass::ConditionalRenderingResolvePass( const Device& device_, Scheduler& scheduler_, DescriptorPool& descriptor_pool_, ComputePassDescriptorQueue& compute_pass_descriptor_queue_) : ComputePass(device_, descriptor_pool_, INPUT_OUTPUT_DESCRIPTOR_SET_BINDINGS, - INPUT_OUTPUT_DESCRIPTOR_UPDATE_TEMPLATE, INPUT_OUTPUT_BANK_INFO, nullptr, + INPUT_OUTPUT_DESCRIPTOR_UPDATE_TEMPLATE, INPUT_OUTPUT_BANK_INFO, + COMPUTE_PUSH_CONSTANT_RANGE, RESOLVE_CONDITIONAL_RENDER_COMP_SPV), scheduler{scheduler_}, compute_pass_descriptor_queue{compute_pass_descriptor_queue_} {} @@ -430,7 +435,7 @@ void ConditionalRenderingResolvePass::Resolve(VkBuffer dst_buffer, VkBuffer src_ const void* const descriptor_data{compute_pass_descriptor_queue.UpdateData()}; scheduler.RequestOutsideRenderPassOperationContext(); - scheduler.Record([this, descriptor_data](vk::CommandBuffer cmdbuf) { + scheduler.Record([this, descriptor_data, compare_to_zero](vk::CommandBuffer cmdbuf) { static constexpr VkMemoryBarrier read_barrier{ .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, .pNext = nullptr, @@ -443,6 +448,9 @@ void ConditionalRenderingResolvePass::Resolve(VkBuffer dst_buffer, VkBuffer src_ .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT, .dstAccessMask = VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT, }; + const ConditionalRenderingResolvePushConstants uniforms{ + .compare_to_zero = compare_to_zero ? 1U : 0U, + }; const VkDescriptorSet set = descriptor_allocator.Commit(); device.GetLogical().UpdateDescriptorSet(set, *descriptor_template, descriptor_data); @@ -450,9 +458,11 @@ void ConditionalRenderingResolvePass::Resolve(VkBuffer dst_buffer, VkBuffer src_ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, read_barrier); cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline); cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_COMPUTE, *layout, 0, set, {}); + cmdbuf.PushConstants(*layout, VK_SHADER_STAGE_COMPUTE_BIT, uniforms); cmdbuf.Dispatch(1, 1, 1); cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, write_barrier); + VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT, 0, + write_barrier); }); } @@ -520,7 +530,7 @@ void QueriesPrefixScanPass::Run(VkBuffer accumulation_buffer, VkBuffer dst_buffe const VkDescriptorSet set = descriptor_allocator.Commit(); device.GetLogical().UpdateDescriptorSet(set, *descriptor_template, descriptor_data); - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, read_barrier); cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline); cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_COMPUTE, *layout, 0, set, {}); diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 8f706a02c8..43fbefe425 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -467,6 +467,10 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { bind_stage_info(4); } + if (regs.transform_feedback_enabled != 0) { + scheduler.RequestOutsideRenderPassOperationContext(); + } + buffer_cache.UpdateGraphicsBuffers(is_indexed); buffer_cache.BindHostGeometryBuffers(is_indexed); diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 5f86506961..7b5ac7fac0 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -485,6 +485,12 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, device.IsExtExtendedDynamicState3BlendingSupported(); dynamic_features.has_extended_dynamic_state_3_enables = device.IsExtExtendedDynamicState3EnablesSupported(); + dynamic_features.has_dynamic_state3_depth_clamp_enable = + device.SupportsDynamicState3DepthClampEnable(); + dynamic_features.has_dynamic_state3_logic_op_enable = + device.SupportsDynamicState3LogicOpEnable(); + dynamic_features.has_dynamic_state3_line_stipple_enable = + device.SupportsDynamicState3LineStippleEnable(); // VIDS: Independent toggle (not affected by dyna_state levels) dynamic_features.has_dynamic_vertex_input = diff --git a/src/video_core/renderer_vulkan/vk_present_manager.cpp b/src/video_core/renderer_vulkan/vk_present_manager.cpp index 80853362ad..de854554c7 100644 --- a/src/video_core/renderer_vulkan/vk_present_manager.cpp +++ b/src/video_core/renderer_vulkan/vk_present_manager.cpp @@ -189,7 +189,7 @@ void PresentManager::RecreateFrame(Frame* frame, u32 width, u32 height, VkFormat frame->image = memory_allocator.CreateImage({ .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, .pNext = nullptr, - .flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, + .flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT, .imageType = VK_IMAGE_TYPE_2D, .format = swapchain.GetImageFormat(), .extent = diff --git a/src/video_core/renderer_vulkan/vk_query_cache.cpp b/src/video_core/renderer_vulkan/vk_query_cache.cpp index 8518d89eee..6aea5d18a8 100644 --- a/src/video_core/renderer_vulkan/vk_query_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_query_cache.cpp @@ -157,8 +157,9 @@ public: ReserveHostQuery(); scheduler.Record([query_pool = current_query_pool, - query_index = current_bank_slot](vk::CommandBuffer cmdbuf) { + query_index = current_bank_slot](vk::CommandBuffer cmdbuf) { const bool use_precise = Settings::IsGPULevelHigh(); + cmdbuf.ResetQueryPool(query_pool, static_cast(query_index), 1); cmdbuf.BeginQuery(query_pool, static_cast(query_index), use_precise ? VK_QUERY_CONTROL_PRECISE_BIT : 0); }); @@ -220,8 +221,7 @@ public: } PauseCounter(); const auto driver_id = device.GetDriverID(); - if (driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY || - driver_id == VK_DRIVER_ID_ARM_PROPRIETARY || driver_id == VK_DRIVER_ID_MESA_TURNIP) { + if (driver_id == VK_DRIVER_ID_ARM_PROPRIETARY || driver_id == VK_DRIVER_ID_MESA_TURNIP) { pending_sync.clear(); sync_values_stash.clear(); return; @@ -666,13 +666,18 @@ public: offsets.fill(0); last_queries.fill(0); last_queries_stride.fill(1); + stream_to_slot.fill(INVALID_SLOT); + VkBufferUsageFlags counter_buffer_usage = + VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; + if (device.IsExtTransformFeedbackSupported()) { + counter_buffer_usage |= VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT; + } const VkBufferCreateInfo buffer_ci = { .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, .pNext = nullptr, .flags = 0, .size = TFBQueryBank::QUERY_SIZE * NUM_STREAMS, - .usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | - VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT, + .usage = counter_buffer_usage, .sharingMode = VK_SHARING_MODE_EXCLUSIVE, .queueFamilyIndexCount = 0, .pQueueFamilyIndices = nullptr, @@ -692,6 +697,9 @@ public: ~TFBCounterStreamer() = default; void StartCounter() override { + if (!device.IsExtTransformFeedbackSupported()) { + return; + } FlushBeginTFB(); has_started = true; } @@ -706,7 +714,9 @@ public: void CloseCounter() override { if (has_flushed_end_pending) { - FlushEndTFB(); + if (scheduler.IsRenderPassActive()) { + FlushEndTFB(); + } } runtime.View3DRegs([this](Maxwell3D& maxwell3d) { if (maxwell3d.regs.transform_feedback_enabled == 0) { @@ -756,18 +766,33 @@ public: if (has_timestamp) { new_query->flags |= VideoCommon::QueryFlagBits::HasTimestamp; } + if (!device.IsExtTransformFeedbackSupported()) { + new_query->flags |= VideoCommon::QueryFlagBits::IsFinalValueSynced; + return index; + } if (!subreport_) { new_query->flags |= VideoCommon::QueryFlagBits::IsFinalValueSynced; return index; } const size_t subreport = static_cast(*subreport_); + if (subreport >= NUM_STREAMS) { + new_query->flags |= VideoCommon::QueryFlagBits::IsFinalValueSynced; + return index; + } last_queries[subreport] = address; if ((streams_mask & (1ULL << subreport)) == 0) { new_query->flags |= VideoCommon::QueryFlagBits::IsFinalValueSynced; return index; } + const size_t slot = stream_to_slot[subreport]; + if (slot >= NUM_STREAMS) { + new_query->flags |= VideoCommon::QueryFlagBits::IsFinalValueSynced; + return index; + } + + scheduler.RequestOutsideRenderPassOperationContext(); CloseCounter(); - auto [bank_slot, data_slot] = ProduceCounterBuffer(subreport); + auto [bank_slot, data_slot] = ProduceCounterBuffer(slot); new_query->start_bank_id = static_cast(bank_slot); new_query->size_banks = 1; new_query->start_slot = static_cast(data_slot); @@ -778,6 +803,9 @@ public: } std::optional> GetLastQueryStream(size_t stream) { + if (stream >= NUM_STREAMS) { + return std::nullopt; + } if (last_queries[stream] != 0) { std::pair result(last_queries[stream], last_queries_stride[stream]); return result; @@ -789,6 +817,10 @@ public: return out_topology; } + u32 GetPatchVertices() const { + return patch_vertices; + } + bool HasUnsyncedQueries() const override { return !pending_flush_queries.empty(); } @@ -855,6 +887,9 @@ public: private: void FlushBeginTFB() { + if (!device.IsExtTransformFeedbackSupported()) [[unlikely]] { + return; + } if (has_flushed_end_pending) [[unlikely]] { return; } @@ -868,12 +903,24 @@ private: }); return; } + static constexpr VkMemoryBarrier COUNTER_RESUME_BARRIER{ + .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, + .pNext = nullptr, + .srcAccessMask = VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT, + .dstAccessMask = VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT, + }; scheduler.Record([this, total = static_cast(buffers_count)](vk::CommandBuffer cmdbuf) { + cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT, + VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT, 0, + COUNTER_RESUME_BARRIER); cmdbuf.BeginTransformFeedbackEXT(0, total, counter_buffers.data(), offsets.data()); }); } void FlushEndTFB() { + if (!device.IsExtTransformFeedbackSupported()) [[unlikely]] { + return; + } if (!has_flushed_end_pending) [[unlikely]] { UNREACHABLE(); return; @@ -899,28 +946,48 @@ private: void UpdateBuffers() { last_queries.fill(0); last_queries_stride.fill(1); + stream_to_slot.fill(INVALID_SLOT); streams_mask = 0; // reset previously recorded streams runtime.View3DRegs([this](Maxwell3D& maxwell3d) { buffers_count = 0; out_topology = maxwell3d.draw_manager->GetDrawState().topology; + patch_vertices = std::max(maxwell3d.regs.patch_vertices, 1U); + if (out_topology == Maxwell3D::Regs::PrimitiveTopology::Patches) { + switch (maxwell3d.regs.tessellation.params.output_primitives.Value()) { + case Maxwell3D::Regs::Tessellation::OutputPrimitives::Points: + out_topology = Maxwell3D::Regs::PrimitiveTopology::Points; + break; + case Maxwell3D::Regs::Tessellation::OutputPrimitives::Lines: + out_topology = Maxwell3D::Regs::PrimitiveTopology::LineStrip; + break; + case Maxwell3D::Regs::Tessellation::OutputPrimitives::Triangles_CW: + case Maxwell3D::Regs::Tessellation::OutputPrimitives::Triangles_CCW: + out_topology = Maxwell3D::Regs::PrimitiveTopology::TriangleStrip; + break; + } + } for (size_t i = 0; i < Maxwell3D::Regs::NumTransformFeedbackBuffers; i++) { const auto& tf = maxwell3d.regs.transform_feedback; if (tf.buffers[i].enable == 0) { continue; } + buffers_count = std::max(buffers_count, i + 1); const size_t stream = tf.controls[i].stream; if (stream >= last_queries_stride.size()) { LOG_WARNING(Render_Vulkan, "TransformFeedback stream {} out of range", stream); continue; } + if ((streams_mask & (1ULL << stream)) != 0) { + continue; + } last_queries_stride[stream] = tf.controls[i].stride; + stream_to_slot[stream] = i; streams_mask |= 1ULL << stream; - buffers_count = std::max(buffers_count, stream + 1); } }); } - std::pair ProduceCounterBuffer(size_t stream) { + std::pair ProduceCounterBuffer(size_t slot_index) { if (current_bank == nullptr || current_bank->IsClosed()) { current_bank_id = bank_pool.ReserveBank([this](std::deque& queue, size_t index) { @@ -946,7 +1013,8 @@ private: }; scheduler.RequestOutsideRenderPassOperationContext(); scheduler.Record([dst_buffer = current_bank->GetBuffer(), - src_buffer = counter_buffers[stream], src_offset = offsets[stream], + src_buffer = counter_buffers[slot_index], + src_offset = offsets[slot_index], slot](vk::CommandBuffer cmdbuf) { cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, READ_BARRIER); @@ -965,6 +1033,7 @@ private: friend class PrimitivesSucceededStreamer; static constexpr size_t NUM_STREAMS = 4; + static constexpr size_t INVALID_SLOT = NUM_STREAMS; QueryCacheRuntime& runtime; const Device& device; @@ -994,7 +1063,9 @@ private: std::array offsets{}; std::array last_queries; std::array last_queries_stride; + std::array stream_to_slot; Maxwell3D::Regs::PrimitiveTopology out_topology; + u32 patch_vertices{1}; u64 streams_mask; }; @@ -1015,6 +1086,7 @@ public: u64 stride{}; DAddr dependant_address{}; Maxwell3D::Regs::PrimitiveTopology topology{Maxwell3D::Regs::PrimitiveTopology::Points}; + u32 patch_vertices{1}; size_t dependant_index{}; bool dependant_manage{}; }; @@ -1031,6 +1103,10 @@ public: ~PrimitivesSucceededStreamer() = default; + void ResetCounter() override { + tfb_streamer.ResetCounter(); + } + size_t WriteCounter(DAddr address, bool has_timestamp, u32 value, std::optional subreport_) override { auto index = BuildQuery(); @@ -1048,6 +1124,7 @@ public: auto dependant_address_opt = tfb_streamer.GetLastQueryStream(subreport); bool must_manage_dependance = false; new_query->topology = tfb_streamer.GetOutputTopology(); + new_query->patch_vertices = tfb_streamer.GetPatchVertices(); if (dependant_address_opt) { auto [dep_address, stride] = *dependant_address_opt; new_query->dependant_address = dep_address; @@ -1068,6 +1145,7 @@ public: } new_query->stride = 1; runtime.View3DRegs([new_query, subreport](Maxwell3D& maxwell3d) { + new_query->patch_vertices = std::max(maxwell3d.regs.patch_vertices, 1U); for (size_t i = 0; i < Maxwell3D::Regs::NumTransformFeedbackBuffers; i++) { const auto& tf = maxwell3d.regs.transform_feedback; if (tf.buffers[i].enable == 0) { @@ -1131,27 +1209,39 @@ public: } } query->value = [&]() -> u64 { + const auto saturating_subtract = [](u64 value, u64 amount) { + return value > amount ? value - amount : 0; + }; switch (query->topology) { case Maxwell3D::Regs::PrimitiveTopology::Points: return num_vertices; case Maxwell3D::Regs::PrimitiveTopology::Lines: return num_vertices / 2; case Maxwell3D::Regs::PrimitiveTopology::LineLoop: - return (num_vertices / 2) + 1; + return num_vertices > 1 ? num_vertices : 0; case Maxwell3D::Regs::PrimitiveTopology::LineStrip: - return num_vertices - 1; - case Maxwell3D::Regs::PrimitiveTopology::Patches: + return saturating_subtract(num_vertices, 1); + case Maxwell3D::Regs::PrimitiveTopology::LinesAdjacency: + return num_vertices / 4; + case Maxwell3D::Regs::PrimitiveTopology::LineStripAdjacency: + return saturating_subtract(num_vertices, 3); case Maxwell3D::Regs::PrimitiveTopology::Triangles: - case Maxwell3D::Regs::PrimitiveTopology::TrianglesAdjacency: return num_vertices / 3; + case Maxwell3D::Regs::PrimitiveTopology::TrianglesAdjacency: + return num_vertices / 6; case Maxwell3D::Regs::PrimitiveTopology::TriangleFan: case Maxwell3D::Regs::PrimitiveTopology::TriangleStrip: + return saturating_subtract(num_vertices, 2); case Maxwell3D::Regs::PrimitiveTopology::TriangleStripAdjacency: - return num_vertices - 2; + return num_vertices > 4 ? (num_vertices - 4) / 2 : 0; case Maxwell3D::Regs::PrimitiveTopology::Quads: return num_vertices / 4; + case Maxwell3D::Regs::PrimitiveTopology::QuadStrip: + return num_vertices > 2 ? (num_vertices - 2) / 2 : 0; case Maxwell3D::Regs::PrimitiveTopology::Polygon: - return 1U; + return num_vertices >= 3 ? 1U : 0U; + case Maxwell3D::Regs::PrimitiveTopology::Patches: + return num_vertices / std::max(query->patch_vertices, 1U); default: return num_vertices; } @@ -1202,16 +1292,24 @@ struct QueryCacheRuntimeImpl { hcr_setup.pNext = nullptr; hcr_setup.flags = 0; - conditional_resolve_pass = std::make_unique( - device, scheduler, descriptor_pool, compute_pass_descriptor_queue); + const bool has_conditional_rendering = device.IsExtConditionalRendering(); + if (has_conditional_rendering) { + conditional_resolve_pass = std::make_unique( + device, scheduler, descriptor_pool, compute_pass_descriptor_queue); + } + + VkBufferUsageFlags hcr_buffer_usage = + VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; + if (has_conditional_rendering) { + hcr_buffer_usage |= VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT; + } const VkBufferCreateInfo buffer_ci = { .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, .pNext = nullptr, .flags = 0, .size = sizeof(u32), - .usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | - VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT, + .usage = hcr_buffer_usage, .sharingMode = VK_SHARING_MODE_EXCLUSIVE, .queueFamilyIndexCount = 0, .pQueueFamilyIndices = nullptr, @@ -1338,15 +1436,17 @@ void QueryCacheRuntime::HostConditionalRenderingCompareValueImpl(VideoCommon::Lo } } -void QueryCacheRuntime::HostConditionalRenderingCompareBCImpl(DAddr address, bool is_equal) { +void QueryCacheRuntime::HostConditionalRenderingCompareBCImpl(DAddr address, bool is_equal, + bool compare_to_zero) { VkBuffer to_resolve; u32 to_resolve_offset; + const u32 resolve_size = compare_to_zero ? 8 : 24; { std::scoped_lock lk(impl->buffer_cache.mutex); - static constexpr auto sync_info = VideoCommon::ObtainBufferSynchronize::NoSynchronize; + const auto sync_info = VideoCommon::ObtainBufferSynchronize::FullSynchronize; const auto post_op = VideoCommon::ObtainBufferOperation::DoNothing; const auto [buffer, offset] = - impl->buffer_cache.ObtainCPUBuffer(address, 24, sync_info, post_op); + impl->buffer_cache.ObtainCPUBuffer(address, resolve_size, sync_info, post_op); to_resolve = buffer->Handle(); to_resolve_offset = static_cast(offset); } @@ -1355,7 +1455,7 @@ void QueryCacheRuntime::HostConditionalRenderingCompareBCImpl(DAddr address, boo PauseHostConditionalRendering(); } impl->conditional_resolve_pass->Resolve(*impl->hcr_resolve_buffer, to_resolve, - to_resolve_offset, false); + to_resolve_offset, compare_to_zero); impl->hcr_setup.buffer = *impl->hcr_resolve_buffer; impl->hcr_setup.offset = 0; impl->hcr_setup.flags = is_equal ? 0 : VK_CONDITIONAL_RENDERING_INVERTED_BIT_EXT; @@ -1371,7 +1471,7 @@ bool QueryCacheRuntime::HostConditionalRenderingCompareValue(VideoCommon::Lookup if (!impl->device.IsExtConditionalRendering()) { return false; } - HostConditionalRenderingCompareValueImpl(object_1, false); + HostConditionalRenderingCompareBCImpl(object_1.address, true, true); return true; } @@ -1420,7 +1520,8 @@ bool QueryCacheRuntime::HostConditionalRenderingCompareValues(VideoCommon::Looku auto driver_id = impl->device.GetDriverID(); const bool is_gpu_high = Settings::IsGPULevelHigh(); - if ((!is_gpu_high && driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS) || driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY || driver_id == VK_DRIVER_ID_ARM_PROPRIETARY || driver_id == VK_DRIVER_ID_MESA_TURNIP) { + if ((!is_gpu_high && driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS) || driver_id == VK_DRIVER_ID_ARM_PROPRIETARY || driver_id == VK_DRIVER_ID_MESA_TURNIP) { + EndHostConditionalRendering(); return true; } @@ -1437,10 +1538,12 @@ bool QueryCacheRuntime::HostConditionalRenderingCompareValues(VideoCommon::Looku } if (!is_gpu_high) { + EndHostConditionalRendering(); return true; } if (!is_in_bc[0] && !is_in_bc[1]) { + EndHostConditionalRendering(); return true; } HostConditionalRenderingCompareBCImpl(object_1.address, equal_check); diff --git a/src/video_core/renderer_vulkan/vk_query_cache.h b/src/video_core/renderer_vulkan/vk_query_cache.h index e2aa4d991e..bbb5234e11 100644 --- a/src/video_core/renderer_vulkan/vk_query_cache.h +++ b/src/video_core/renderer_vulkan/vk_query_cache.h @@ -63,7 +63,8 @@ public: private: void HostConditionalRenderingCompareValueImpl(VideoCommon::LookupData object, bool is_equal); - void HostConditionalRenderingCompareBCImpl(DAddr address, bool is_equal); + void HostConditionalRenderingCompareBCImpl(DAddr address, bool is_equal, + bool compare_to_zero = false); friend struct QueryCacheRuntimeImpl; std::unique_ptr impl; }; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index ba7b5d8c1b..78337b3ebe 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -173,6 +173,28 @@ DrawParams MakeDrawParams(const MaxwellDrawState& draw_state, u32 num_instances, } return params; } + +bool SupportsPrimitiveRestart(VkPrimitiveTopology topology) { + switch (topology) { + case VK_PRIMITIVE_TOPOLOGY_POINT_LIST: + case VK_PRIMITIVE_TOPOLOGY_LINE_LIST: + case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST: + case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY: + case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY: + case VK_PRIMITIVE_TOPOLOGY_PATCH_LIST: + return false; + default: + return true; + } +} + +bool IsPrimitiveRestartSupported(const Device& device, VkPrimitiveTopology topology) { + return ((topology != VK_PRIMITIVE_TOPOLOGY_PATCH_LIST && + device.IsTopologyListPrimitiveRestartSupported()) || + SupportsPrimitiveRestart(topology) || + (topology == VK_PRIMITIVE_TOPOLOGY_PATCH_LIST && + device.IsPatchListPrimitiveRestartSupported())); +} } // Anonymous namespace RasterizerVulkan::RasterizerVulkan(Core::Frontend::EmuWindow& emu_window_, Tegra::GPU& gpu_, @@ -225,6 +247,7 @@ void RasterizerVulkan::PrepareDraw(bool is_indexed, Func&& draw_func) { UpdateDynamicStates(); + query_cache.NotifySegment(true); HandleTransformFeedback(); query_cache.CounterEnable(VideoCommon::QueryType::ZPassPixelCount64, maxwell3d->regs.zpass_pixel_count_enable); @@ -336,6 +359,7 @@ void RasterizerVulkan::DrawTexture() { UpdateDynamicStates(); + query_cache.NotifySegment(true); query_cache.CounterEnable(VideoCommon::QueryType::ZPassPixelCount64, maxwell3d->regs.zpass_pixel_count_enable); const auto& draw_texture_state = maxwell3d->draw_manager->GetDrawTextureState(); @@ -575,11 +599,17 @@ void RasterizerVulkan::DispatchCompute() { } void RasterizerVulkan::ResetCounter(VideoCommon::QueryType type) { - if (type != VideoCommon::QueryType::ZPassPixelCount64) { + switch (type) { + case VideoCommon::QueryType::ZPassPixelCount64: + case VideoCommon::QueryType::StreamingByteCount: + case VideoCommon::QueryType::StreamingPrimitivesSucceeded: + case VideoCommon::QueryType::VtgPrimitivesOut: + query_cache.CounterReset(type); + return; + default: LOG_DEBUG(Render_Vulkan, "Unimplemented counter reset={}", type); return; } - query_cache.CounterReset(type); } void RasterizerVulkan::Query(GPUVAddr gpu_addr, VideoCommon::QueryType type, @@ -766,6 +796,9 @@ void RasterizerVulkan::ReleaseFences(bool force) { void RasterizerVulkan::FlushAndInvalidateRegion(DAddr addr, u64 size, VideoCommon::CacheType which) { + if (Settings::IsGPULevelHigh()) { + FlushRegion(addr, size, which); + } InvalidateRegion(addr, size, which); } @@ -830,6 +863,10 @@ bool RasterizerVulkan::AccelerateConditionalRendering() { return query_cache.AccelerateHostConditionalRendering(); } +bool RasterizerVulkan::HasDrawTransformFeedback() { + return device.IsTransformFeedbackDrawSupported(); +} + bool RasterizerVulkan::AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Surface& src, const Tegra::Engines::Fermi2D::Surface& dst, const Tegra::Engines::Fermi2D::Config& copy_config) { @@ -976,6 +1013,12 @@ bool AccelerateDMA::BufferToImage(const Tegra::DMA::ImageCopy& copy_info, void RasterizerVulkan::UpdateDynamicStates() { auto& regs = maxwell3d->regs; + auto& flags = maxwell3d->dirty.flags; + const auto topology = maxwell3d->draw_manager->GetDrawState().topology; + if (state_tracker.ChangePrimitiveTopology(topology)) { + flags[Dirty::DepthBiasEnable] = true; + flags[Dirty::PrimitiveRestartEnable] = true; + } // Core Dynamic States (Vulkan 1.0) - Always active regardless of dyna_state setting UpdateViewportsState(regs); @@ -1084,6 +1127,9 @@ void RasterizerVulkan::UpdateViewportsState(Tegra::Engines::Maxwell3D::Regs& reg if (!state_tracker.TouchViewports()) { return; } + + maxwell3d->dirty.flags[Dirty::Scissors] = true; + if (!regs.viewport_scale_offset_enabled) { float x = static_cast(regs.surface_clip.x); float y = static_cast(regs.surface_clip.y); @@ -1101,8 +1147,12 @@ void RasterizerVulkan::UpdateViewportsState(Tegra::Engines::Maxwell3D::Regs& reg .minDepth = 0.0f, .maxDepth = 1.0f, }; - scheduler.Record([viewport](vk::CommandBuffer cmdbuf) { - cmdbuf.SetViewport(0, viewport); + scheduler.Record([this, viewport](vk::CommandBuffer cmdbuf) { + const u32 num_viewports = std::min(device.GetMaxViewports(), Maxwell::NumViewports); + std::array viewport_list{}; + viewport_list.fill(viewport); + const vk::Span viewports(viewport_list.data(), num_viewports); + cmdbuf.SetViewport(0, viewports); }); return; } @@ -1142,8 +1192,12 @@ void RasterizerVulkan::UpdateScissorsState(Tegra::Engines::Maxwell3D::Regs& regs scissor.offset.y = static_cast(y); scissor.extent.width = width; scissor.extent.height = height; - scheduler.Record([scissor](vk::CommandBuffer cmdbuf) { - cmdbuf.SetScissor(0, scissor); + scheduler.Record([this, scissor](vk::CommandBuffer cmdbuf) { + const u32 num_scissors = std::min(device.GetMaxViewports(), Maxwell::NumViewports); + std::array scissor_list{}; + scissor_list.fill(scissor); + const vk::Span scissors(scissor_list.data(), num_scissors); + cmdbuf.SetScissor(0, scissors); }); return; } @@ -1388,7 +1442,17 @@ void RasterizerVulkan::UpdatePrimitiveRestartEnable(Tegra::Engines::Maxwell3D::R if (!state_tracker.TouchPrimitiveRestartEnable()) { return; } - scheduler.Record([enable = regs.primitive_restart.enabled](vk::CommandBuffer cmdbuf) { + + bool enable = regs.primitive_restart.enabled != 0; + if (device.IsMoltenVK()) { + enable = true; + } else if (enable) { + const auto topology = + MaxwellToVK::PrimitiveTopology(device, maxwell3d->draw_manager->GetDrawState().topology); + enable = IsPrimitiveRestartSupported(device, topology); + } + + scheduler.Record([enable](vk::CommandBuffer cmdbuf) { cmdbuf.SetPrimitiveRestartEnableEXT(enable); }); } @@ -1727,7 +1791,9 @@ void RasterizerVulkan::UpdateStencilTestEnable(Tegra::Engines::Maxwell3D::Regs& void RasterizerVulkan::UpdateVertexInput(Tegra::Engines::Maxwell3D::Regs& regs) { auto& dirty{maxwell3d->dirty.flags}; - if (!dirty[Dirty::VertexInput]) { + const bool vertex_input_dirty = dirty[Dirty::VertexInput]; + const bool vertex_buffers_dirty = dirty[VideoCommon::Dirty::VertexBuffers]; + if (!vertex_input_dirty && !vertex_buffers_dirty) { return; } dirty[Dirty::VertexInput] = false; @@ -1735,38 +1801,31 @@ void RasterizerVulkan::UpdateVertexInput(Tegra::Engines::Maxwell3D::Regs& regs) boost::container::static_vector bindings; boost::container::static_vector attributes; - // There seems to be a bug on Nvidia's driver where updating only higher attributes ends up - // generating dirty state. Track the highest dirty attribute and update all attributes until - // that one. - size_t highest_dirty_attr{}; - for (size_t index = 0; index < Maxwell::NumVertexAttributes; ++index) { - if (dirty[Dirty::VertexAttribute0 + index]) { - highest_dirty_attr = index; - } - } - for (size_t index = 0; index < highest_dirty_attr; ++index) { + const u32 max_attributes = + static_cast(std::min(Maxwell::NumVertexAttributes, + device.GetMaxVertexInputAttributes())); + const u32 max_bindings = + static_cast(std::min(Maxwell::NumVertexArrays, + device.GetMaxVertexInputBindings())); + + + for (u32 index = 0; index < max_attributes; ++index) { const Maxwell::VertexAttribute attribute{regs.vertex_attrib_format[index]}; const u32 binding{attribute.buffer}; - dirty[Dirty::VertexAttribute0 + index] = false; - dirty[Dirty::VertexBinding0 + static_cast(binding)] = true; - if (!attribute.constant) { - attributes.push_back({ - .sType = VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT, - .pNext = nullptr, - .location = static_cast(index), - .binding = binding, - .format = MaxwellToVK::VertexFormat(device, attribute.type, attribute.size), - .offset = attribute.offset, - }); - } - } - for (size_t index = 0; index < Maxwell::NumVertexAttributes; ++index) { - if (!dirty[Dirty::VertexBinding0 + index]) { + if (attribute.constant || binding >= max_bindings) { continue; } - dirty[Dirty::VertexBinding0 + index] = false; + attributes.push_back({ + .sType = VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT, + .pNext = nullptr, + .location = index, + .binding = binding, + .format = MaxwellToVK::VertexFormat(device, attribute.type, attribute.size), + .offset = attribute.offset, + }); + } - const u32 binding{static_cast(index)}; + for (u32 binding = 0; binding < max_bindings; ++binding) { const auto& input_binding{regs.vertex_streams[binding]}; const bool is_instanced{regs.vertex_stream_instances.IsInstancingEnabled(binding)}; bindings.push_back({ @@ -1778,6 +1837,14 @@ void RasterizerVulkan::UpdateVertexInput(Tegra::Engines::Maxwell3D::Regs& regs) .divisor = is_instanced ? input_binding.frequency : 1, }); } + + for (size_t index = 0; index < Maxwell::NumVertexAttributes; ++index) { + dirty[Dirty::VertexAttribute0 + index] = false; + } + for (size_t index = 0; index < Maxwell::NumVertexArrays; ++index) { + dirty[Dirty::VertexBinding0 + index] = false; + } + scheduler.Record([bindings, attributes](vk::CommandBuffer cmdbuf) { cmdbuf.SetVertexInputEXT(bindings, attributes); }); diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index b689c6b660..841933d31d 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project @@ -122,6 +122,7 @@ public: void FlushCommands() override; void TickFrame() override; bool AccelerateConditionalRendering() override; + bool HasDrawTransformFeedback() override; bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Surface& src, const Tegra::Engines::Fermi2D::Surface& dst, const Tegra::Engines::Fermi2D::Config& copy_config) override; diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index 226619d8d6..fdaf9baacc 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -324,6 +324,8 @@ void Scheduler::EndRenderPass() return; } + query_cache->CounterClose(VideoCommon::QueryType::StreamingByteCount); + // Log render pass end if (Settings::values.gpu_logging_enabled.GetValue() && Settings::values.gpu_log_vulkan_calls.GetValue()) { diff --git a/src/video_core/renderer_vulkan/vk_scheduler.h b/src/video_core/renderer_vulkan/vk_scheduler.h index 00a912f2cd..0709c3a370 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.h +++ b/src/video_core/renderer_vulkan/vk_scheduler.h @@ -63,6 +63,11 @@ public: /// of a renderpass. void RequestOutsideRenderPassOperationContext(); + /// Returns true when a render pass is currently active in the scheduler state. + bool IsRenderPassActive() const { + return state.renderpass != VK_NULL_HANDLE; + } + /// Update the pipeline to the current execution context. bool UpdateGraphicsPipeline(GraphicsPipeline* pipeline); diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.cpp b/src/video_core/renderer_vulkan/vk_state_tracker.cpp index 79967d540a..3f4dd89c7e 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.cpp +++ b/src/video_core/renderer_vulkan/vk_state_tracker.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -87,6 +87,7 @@ Flags MakeInvalidationFlags() { void SetupDirtyViewports(Tables& tables) { FillBlock(tables[0], OFF(viewport_transform), NUM(viewport_transform), Viewports); FillBlock(tables[0], OFF(viewports), NUM(viewports), Viewports); + FillBlock(tables[1], OFF(surface_clip), NUM(surface_clip), Viewports); tables[0][OFF(viewport_scale_offset_enabled)] = Viewports; tables[1][OFF(window_origin)] = Viewports; } diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.h b/src/video_core/renderer_vulkan/vk_state_tracker.h index 74bae9e181..6b47ba4176 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.h +++ b/src/video_core/renderer_vulkan/vk_state_tracker.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 48aa5ec476..f099db74cb 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -176,7 +176,18 @@ constexpr VkBorderColor ConvertBorderColor(const std::array& color) { .pViewFormats = view_formats.data(), }; if (view_formats.size() > 1) { - image_ci.flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT; + image_ci.flags |= + VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT; + + const bool has_storage_compatible_view = + std::any_of(view_formats.begin(), view_formats.end(), [&device](VkFormat view_format) { + return device.IsFormatSupported(view_format, VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT, + FormatType::Optimal); + }); + if (has_storage_compatible_view) { + image_ci.usage |= VK_IMAGE_USAGE_STORAGE_BIT; + } + if (device.IsKhrImageFormatListSupported()) { image_ci.pNext = &image_format_list; } @@ -668,11 +679,16 @@ void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage im } void TryTransformSwizzleIfNeeded(PixelFormat format, std::array& swizzle, - bool emulate_a4b4g4r4) { + bool emulate_bgr565, bool emulate_a4b4g4r4) { switch (format) { case PixelFormat::A1B5G5R5_UNORM: std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed); break; + case PixelFormat::B5G6R5_UNORM: + if (emulate_bgr565) { + std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed); + } + break; case PixelFormat::A5B5G5R1_UNORM: std::ranges::transform(swizzle, swizzle.begin(), SwapSpecial); break; @@ -2119,22 +2135,21 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI if (!info.IsRenderTarget()) { swizzle = info.Swizzle(); TryTransformSwizzleIfNeeded(format, swizzle, - !device->IsExt4444FormatsSupported()); + device->MustEmulateBGR565(), + !device->IsExt4444FormatsSupported()); if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) { std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed); SanitizeDepthStencilSwizzle(swizzle, device->SupportsDepthStencilSwizzleOne()); } } const auto format_info = MaxwellToVK::SurfaceFormat(*device, FormatType::Optimal, true, format); - if (ImageUsageFlags(format_info, format) != image.UsageFlags()) { - LOG_WARNING(Render_Vulkan, - "Image view format {} has different usage flags than image format {}", format, - image.info.format); - } + const VkImageUsageFlags requested_view_usage = ImageUsageFlags(format_info, format); + const VkImageUsageFlags image_usage = image.UsageFlags(); + const VkImageUsageFlags clamped_view_usage = requested_view_usage & image_usage; const VkImageViewUsageCreateInfo image_view_usage{ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, .pNext = nullptr, - .usage = ImageUsageFlags(format_info, format), + .usage = clamped_view_usage, }; const VkImageViewCreateInfo create_info{ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, @@ -2300,23 +2315,18 @@ vk::ImageView ImageView::MakeView(VkFormat vk_format, VkImageAspectFlags aspect_ Sampler::Sampler(TextureCacheRuntime& runtime, const Tegra::Texture::TSCEntry& tsc) { const auto& device = runtime.device; - // Check if custom border colors are supported - const bool has_custom_border_colors = runtime.device.IsCustomBorderColorsSupported(); - const bool has_format_undefined = runtime.device.IsCustomBorderColorWithoutFormatSupported(); + const bool has_custom_border_extension = runtime.device.IsExtCustomBorderColorSupported(); + const bool has_format_undefined = + has_custom_border_extension && runtime.device.IsCustomBorderColorWithoutFormatSupported(); + const bool has_custom_border_colors = + has_format_undefined && runtime.device.IsCustomBorderColorsSupported(); const auto color = tsc.BorderColor(); - // Determine border format based on available features: - // - If customBorderColorWithoutFormat is available: use VK_FORMAT_UNDEFINED (most flexible) - // - If only customBorderColors is available: use concrete format (R8G8B8A8_UNORM) - // - If neither is available: use standard border colors (handled by ConvertBorderColor) - const VkFormat border_format = has_format_undefined ? VK_FORMAT_UNDEFINED - : VK_FORMAT_R8G8B8A8_UNORM; - const VkSamplerCustomBorderColorCreateInfoEXT border_ci{ .sType = VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT, .pNext = nullptr, .customBorderColor = std::bit_cast(color), - .format = border_format, + .format = VK_FORMAT_UNDEFINED, }; const void* pnext = nullptr; if (has_custom_border_colors) { diff --git a/src/video_core/transform_feedback.cpp b/src/video_core/transform_feedback.cpp index a8f9da9853..53d29c08e2 100644 --- a/src/video_core/transform_feedback.cpp +++ b/src/video_core/transform_feedback.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -88,13 +88,13 @@ std::pair, u32> MakeTransformF return 0; }; - UNIMPLEMENTED_IF_MSG(layout.stream != 0, "Stream is not zero: {}", layout.stream); Shader::TransformFeedbackVarying varying{ .buffer = static_cast(buffer), .stride = layout.stride, .offset = offset * 4, .components = 1, }; + varying.stream = layout.stream; const u32 base_offset = offset; const auto attribute{get_attribute(offset)}; if (std::ranges::find(VECTORS, Common::AlignDown(attribute, 4)) != VECTORS.end()) { diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 5075a79bcd..6e55306079 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -869,6 +869,10 @@ bool Device::HasTimelineSemaphore() const { return features.timeline_semaphore.timelineSemaphore; } +bool Device::MustEmulateBGR565() const { + return Settings::values.emulate_bgr565.GetValue(); +} + bool Device::GetSuitability(bool requires_swapchain) { // Assume we will be suitable. bool suitable = true; @@ -919,6 +923,17 @@ bool Device::GetSuitability(bool requires_swapchain) { FOR_EACH_VK_FEATURE_EXT(FEATURE_EXTENSION); FOR_EACH_VK_EXTENSION(EXTENSION); + if (supported_extensions.contains(VK_KHR_ROBUSTNESS_2_EXTENSION_NAME)) { + loaded_extensions.erase(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME); + loaded_extensions.insert(VK_KHR_ROBUSTNESS_2_EXTENSION_NAME); + extensions.robustness_2 = true; + } else if (supported_extensions.contains(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME)) { + loaded_extensions.insert(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME); + extensions.robustness_2 = true; + } else { + extensions.robustness_2 = false; + } + #undef FEATURE_EXTENSION #undef EXTENSION @@ -1131,8 +1146,6 @@ bool Device::GetSuitability(bool requires_swapchain) { if (u32(Settings::values.dyna_state.GetValue()) == 0) { LOG_INFO(Render_Vulkan, "Extended Dynamic State disabled by user setting, clearing all EDS features"); - features.custom_border_color.customBorderColors = false; - features.custom_border_color.customBorderColorWithoutFormat = false; features.extended_dynamic_state.extendedDynamicState = false; features.extended_dynamic_state2.extendedDynamicState2 = false; features.extended_dynamic_state3.extendedDynamicState3ColorBlendEnable = false; @@ -1148,24 +1161,13 @@ bool Device::GetSuitability(bool requires_swapchain) { void Device::RemoveUnsuitableExtensions() { // VK_EXT_custom_border_color - // Enable extension if driver supports it, then check individual features - // - customBorderColors: Required to use VK_BORDER_COLOR_FLOAT_CUSTOM_EXT - // - customBorderColorWithoutFormat: Optional, allows VK_FORMAT_UNDEFINED - // If only customBorderColors is available, we must provide a specific format if (extensions.custom_border_color) { - // Verify that at least customBorderColors is available - if (!features.custom_border_color.customBorderColors) { - LOG_WARNING(Render_Vulkan, - "VK_EXT_custom_border_color reported but customBorderColors feature not available, disabling"); - extensions.custom_border_color = false; - } + extensions.custom_border_color = + features.custom_border_color.customBorderColors && + features.custom_border_color.customBorderColorWithoutFormat; } RemoveExtensionFeatureIfUnsuitable(extensions.custom_border_color, features.custom_border_color, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME); - // VK_KHR_unified_image_layouts - extensions.unified_image_layouts = features.unified_image_layouts.unifiedImageLayouts; - RemoveExtensionFeatureIfUnsuitable(extensions.unified_image_layouts, features.unified_image_layouts, - VK_KHR_UNIFIED_IMAGE_LAYOUTS_EXTENSION_NAME); // VK_EXT_depth_bias_control extensions.depth_bias_control = @@ -1251,16 +1253,22 @@ void Device::RemoveUnsuitableExtensions() { VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME); // VK_EXT_robustness2 - extensions.robustness_2 = features.robustness2.robustBufferAccess2 || - features.robustness2.robustImageAccess2 || - features.robustness2.nullDescriptor; + features.robustness2.robustBufferAccess2 = VK_FALSE; + features.robustness2.robustImageAccess2 = VK_FALSE; + extensions.robustness_2 = features.robustness2.nullDescriptor; + + const char* robustness2_extension_name = + loaded_extensions.contains(VK_KHR_ROBUSTNESS_2_EXTENSION_NAME) + ? VK_KHR_ROBUSTNESS_2_EXTENSION_NAME + : VK_EXT_ROBUSTNESS_2_EXTENSION_NAME; RemoveExtensionFeatureIfUnsuitable(extensions.robustness_2, features.robustness2, - VK_EXT_ROBUSTNESS_2_EXTENSION_NAME); + robustness2_extension_name); - // VK_EXT_image_robustness - extensions.image_robustness = features.image_robustness.robustImageAccess; - RemoveExtensionFeatureIfUnsuitable(extensions.image_robustness, features.image_robustness, + // Image robustness + extensions.robust_image_access = features.robust_image_access.robustImageAccess; + RemoveExtensionFeatureIfUnsuitable(extensions.robust_image_access, + features.robust_image_access, VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME); // VK_KHR_shader_atomic_int64 @@ -1288,8 +1296,7 @@ void Device::RemoveUnsuitableExtensions() { // VK_EXT_transform_feedback extensions.transform_feedback = features.transform_feedback.transformFeedback && - properties.transform_feedback.maxTransformFeedbackBuffers > 0 && - properties.transform_feedback.transformFeedbackQueries; + properties.transform_feedback.maxTransformFeedbackBuffers > 0; RemoveExtensionFeatureIfUnsuitable(extensions.transform_feedback, features.transform_feedback, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME); diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index ad9d53ce16..a8a89aee89 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -38,7 +38,7 @@ VK_DEFINE_HANDLE(VmaAllocator) FEATURE(KHR, TimelineSemaphore, TIMELINE_SEMAPHORE, timeline_semaphore) #define FOR_EACH_VK_FEATURE_1_3(FEATURE) \ - FEATURE(EXT, ImageRobustness, IMAGE_ROBUSTNESS, image_robustness) \ + FEATURE(EXT, ImageRobustness, IMAGE_ROBUSTNESS, robust_image_access) \ FEATURE(EXT, ShaderDemoteToHelperInvocation, SHADER_DEMOTE_TO_HELPER_INVOCATION, \ shader_demote_to_helper_invocation) \ FEATURE(EXT, SubgroupSizeControl, SUBGROUP_SIZE_CONTROL, subgroup_size_control) \ @@ -68,8 +68,7 @@ VK_DEFINE_HANDLE(VmaAllocator) FEATURE(KHR, PipelineExecutableProperties, PIPELINE_EXECUTABLE_PROPERTIES, \ pipeline_executable_properties) \ FEATURE(KHR, WorkgroupMemoryExplicitLayout, WORKGROUP_MEMORY_EXPLICIT_LAYOUT, \ - workgroup_memory_explicit_layout) \ - FEATURE(KHR, UnifiedImageLayouts, UNIFIED_IMAGE_LAYOUTS, unified_image_layouts) + workgroup_memory_explicit_layout) // Define miscellaneous extensions which may be used by the implementation here. @@ -124,7 +123,6 @@ VK_DEFINE_HANDLE(VmaAllocator) EXTENSION_NAME(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME) \ EXTENSION_NAME(VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME) \ EXTENSION_NAME(VK_EXT_4444_FORMATS_EXTENSION_NAME) \ - EXTENSION_NAME(VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME) \ EXTENSION_NAME(VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME) \ EXTENSION_NAME(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME) \ EXTENSION_NAME(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME) \ @@ -174,13 +172,11 @@ VK_DEFINE_HANDLE(VmaAllocator) FEATURE_NAME(depth_bias_control, depthBiasExact) \ FEATURE_NAME(extended_dynamic_state, extendedDynamicState) \ FEATURE_NAME(format_a4b4g4r4, formatA4B4G4R4) \ - FEATURE_NAME(image_robustness, robustImageAccess) \ + FEATURE_NAME(robust_image_access, robustImageAccess) \ FEATURE_NAME(index_type_uint8, indexTypeUint8) \ FEATURE_NAME(primitive_topology_list_restart, primitiveTopologyListRestart) \ FEATURE_NAME(provoking_vertex, provokingVertexLast) \ FEATURE_NAME(robustness2, nullDescriptor) \ - FEATURE_NAME(robustness2, robustBufferAccess2) \ - FEATURE_NAME(robustness2, robustImageAccess2) \ FEATURE_NAME(shader_float16_int8, shaderFloat16) \ FEATURE_NAME(shader_float16_int8, shaderInt8) \ FEATURE_NAME(timeline_semaphore, timelineSemaphore) \ @@ -542,6 +538,17 @@ public: return extensions.transform_feedback; } + /// Returns true if transform feedback draw commands are supported. + bool IsTransformFeedbackDrawSupported() const { + return extensions.transform_feedback && properties.transform_feedback.transformFeedbackDraw; + } + + /// Returns true if transform feedback query types are supported. + bool IsTransformFeedbackQueriesSupported() const { + return extensions.transform_feedback && + properties.transform_feedback.transformFeedbackQueries; + } + /// Returns true if the device supports VK_EXT_transform_feedback properly. bool AreTransformFeedbackGeometryStreamsSupported() const { return features.transform_feedback.geometryStreams; @@ -552,36 +559,6 @@ public: return extensions.custom_border_color; } - /// Returns true if the device supports VK_EXT_image_robustness. - bool IsExtImageRobustnessSupported() const { - return extensions.image_robustness; - } - - /// Returns true if robustImageAccess is supported. - bool IsRobustImageAccessSupported() const { - return features.image_robustness.robustImageAccess; - } - - /// Returns true if the device supports VK_EXT_robustness2. - bool IsExtRobustness2Supported() const { - return extensions.robustness_2; - } - - /// Returns true if robustBufferAccess2 is supported. - bool IsRobustBufferAccess2Supported() const { - return features.robustness2.robustBufferAccess2; - } - - /// Returns true if robustImageAccess2 is supported. - bool IsRobustImageAccess2Supported() const { - return features.robustness2.robustImageAccess2; - } - - /// Returns true if nullDescriptor is supported. - bool IsNullDescriptorSupported() const { - return features.robustness2.nullDescriptor; - } - /// Returns true if customBorderColors feature is available. bool IsCustomBorderColorsSupported() const { return features.custom_border_color.customBorderColors; @@ -805,6 +782,8 @@ public: return features.robustness2.nullDescriptor; } + bool MustEmulateBGR565() const; + bool HasExactDepthBiasControl() const { return features.depth_bias_control.depthBiasExact; } diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index f59ac7d6bc..871ce52678 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp @@ -123,6 +123,7 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { X(vkCmdEndDebugUtilsLabelEXT); X(vkCmdFillBuffer); X(vkCmdPipelineBarrier); + X(vkCmdResetQueryPool); X(vkCmdPushConstants); X(vkCmdPushDescriptorSetWithTemplateKHR); X(vkCmdSetBlendConstants); diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index aaff66359e..4a3baad2c4 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h @@ -225,6 +225,7 @@ struct DeviceDispatch : InstanceDispatch { PFN_vkCmdEndTransformFeedbackEXT vkCmdEndTransformFeedbackEXT{}; PFN_vkCmdFillBuffer vkCmdFillBuffer{}; PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier{}; + PFN_vkCmdResetQueryPool vkCmdResetQueryPool{}; PFN_vkCmdPushConstants vkCmdPushConstants{}; PFN_vkCmdPushDescriptorSetWithTemplateKHR vkCmdPushDescriptorSetWithTemplateKHR{}; PFN_vkCmdResolveImage vkCmdResolveImage{}; @@ -1168,6 +1169,10 @@ public: dld->vkCmdEndQuery(handle, query_pool, query); } + void ResetQueryPool(VkQueryPool query_pool, u32 first_query, u32 query_count) const noexcept { + dld->vkCmdResetQueryPool(handle, query_pool, first_query, query_count); + } + void BindDescriptorSets(VkPipelineBindPoint bind_point, VkPipelineLayout layout, u32 first, Span sets, Span dynamic_offsets) const noexcept { dld->vkCmdBindDescriptorSets(handle, bind_point, layout, first, sets.size(), sets.data(), From 26ce96297cd3ca014bc526cd4ef03c731ef7bbd9 Mon Sep 17 00:00:00 2001 From: crueter Date: Fri, 24 Apr 2026 18:40:49 +0200 Subject: [PATCH 08/45] [frontend] Change update checker to use new endpoints (#3879) Related: [RFC3870](https://git.eden-emu.dev/eden-emu/eden/issues/3870) Nightly and stable releases are now served through `nightly.eden-emu.dev` and `stable.eden-emu.dev`, respectively. These are stored using Backblaze, and served and cached through the Cloudflare CDN. Ideally this will reduce costs, though I'll have to wait for my first invoice to be certain. These will serve as the new download locations going forward. Since we have full control over this API, we can make any adjustments we want as needed. For now, all it does is provide `tag_name`, `name`, and `body`, the latter of which will be used for the upcoming updater PR. Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3879 Reviewed-by: CamilleLaVey Reviewed-by: MaranBr --- CMakeModules/GenerateSCMRev.cmake | 10 ++--- src/android/app/src/main/jni/native.cpp | 14 +++---- src/frontend_common/update_checker.cpp | 53 +++++-------------------- src/frontend_common/update_checker.h | 2 +- 4 files changed, 21 insertions(+), 58 deletions(-) diff --git a/CMakeModules/GenerateSCMRev.cmake b/CMakeModules/GenerateSCMRev.cmake index 947a4963ee..2b028b4846 100644 --- a/CMakeModules/GenerateSCMRev.cmake +++ b/CMakeModules/GenerateSCMRev.cmake @@ -35,17 +35,17 @@ set(GIT_DESC ${BUILD_VERSION}) # Generate cpp with Git revision from template # Also if this is a CI build, add the build name (ie: Nightly, Canary) to the scm_rev file as well -# Auto-updater metadata! Must somewhat mirror GitHub API endpoint +# Auto-updater metadata! Must somewhat mirror GitHub/Forgejo API endpoint + +set(BUILD_AUTO_UPDATE_API_PATH "/latest/release.json") if (NIGHTLY_BUILD) set(BUILD_AUTO_UPDATE_WEBSITE "https://git.eden-emu.dev") - set(BUILD_AUTO_UPDATE_API "git.eden-emu.dev") - set(BUILD_AUTO_UPDATE_API_PATH "/api/v1/repos/") + set(BUILD_AUTO_UPDATE_API "nightly.eden-emu.dev") set(BUILD_AUTO_UPDATE_REPO "eden-ci/nightly") set(REPO_NAME "Eden Nightly") else() set(BUILD_AUTO_UPDATE_WEBSITE "https://git.eden-emu.dev") - set(BUILD_AUTO_UPDATE_API "git.eden-emu.dev") - set(BUILD_AUTO_UPDATE_API_PATH "/api/v1/repos/") + set(BUILD_AUTO_UPDATE_API "stable.eden-emu.dev") set(BUILD_AUTO_UPDATE_REPO "eden-emu/eden") set(REPO_NAME "Eden") endif() diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 210689ce55..93a1337d80 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -1726,9 +1726,8 @@ JNIEXPORT jstring JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_getUpdateUrl( jobject obj, jstring version) { const char* version_str = env->GetStringUTFChars(version, nullptr); - const std::string url = fmt::format("{}/{}/releases/tag/{}", - std::string{Common::g_build_auto_update_website}, - std::string{Common::g_build_auto_update_repo}, + const std::string url = fmt::format("{}/{}", + std::string{Common::g_build_auto_update_api}, version_str); env->ReleaseStringUTFChars(version, version_str); return env->NewStringUTF(url.c_str()); @@ -1760,11 +1759,10 @@ JNIEXPORT jstring JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_getUpdateApkUrl( } const std::string apk_filename = fmt::format("Eden-Android-{}-{}.apk", artifact_str, variant); - const std::string url = fmt::format("{}/{}/releases/download/{}/{}", - std::string{Common::g_build_auto_update_website}, - std::string{Common::g_build_auto_update_repo}, - version_str, - apk_filename); + + const std::string url = fmt::format("{}/{}/{}", + std::string{Common::g_build_auto_update_api}, + version_str, apk_filename); env->ReleaseStringUTFChars(tag, version_str); env->ReleaseStringUTFChars(artifact, artifact_str); diff --git a/src/frontend_common/update_checker.cpp b/src/frontend_common/update_checker.cpp index 1f01c25a26..71a94f38d4 100644 --- a/src/frontend_common/update_checker.cpp +++ b/src/frontend_common/update_checker.cpp @@ -80,55 +80,24 @@ std::optional UpdateChecker::GetResponse(std::string url, std::stri } } -std::optional UpdateChecker::GetLatestRelease(bool include_prereleases) { +std::optional UpdateChecker::GetLatestRelease() { #ifdef YUZU_BUNDLED_OPENSSL const auto update_check_url = fmt::format("https://{}", Common::g_build_auto_update_api); #else const auto update_check_url = std::string{Common::g_build_auto_update_api}; #endif - auto update_check_path = fmt::format("{}{}", std::string{Common::g_build_auto_update_api_path}, - std::string{Common::g_build_auto_update_repo}); + auto update_check_path = std::string{Common::g_build_auto_update_api_path}; try { - if (include_prereleases) { // This can return either a prerelease or a stable release, - // whichever is more recent. - const auto update_check_tags_path = update_check_path + "/tags"; - const auto update_check_releases_path = update_check_path + "/releases"; + const auto response = UpdateChecker::GetResponse(update_check_url, update_check_path); - const auto tags_response = UpdateChecker::GetResponse(update_check_url, update_check_tags_path); - const auto releases_response = UpdateChecker::GetResponse(update_check_url, update_check_releases_path); + if (!response) + return {}; - if (!tags_response || !releases_response) - return {}; - - const std::string latest_tag - = nlohmann::json::parse(tags_response.value()).at(0).at("name"); - const std::string latest_name = - nlohmann::json::parse(releases_response.value()).at(0).at("name"); - - const bool latest_tag_has_release = releases_response.value().find( - fmt::format("\"{}\"", latest_tag)) - != std::string::npos; - - // If there is a newer tag, but that tag has no associated release, don't prompt the - // user to update. - if (!latest_tag_has_release) - return {}; - - return Update{latest_tag, latest_name}; - } else { // This is a stable release, only check for other stable releases. - update_check_path += "/releases/latest"; - const auto response = UpdateChecker::GetResponse(update_check_url, update_check_path); - - if (!response) - return {}; - - const std::string latest_tag = nlohmann::json::parse(response.value()).at("tag_name"); - const std::string latest_name = nlohmann::json::parse(response.value()).at("name"); - - return Update{latest_tag, latest_name}; - } + const std::string latest_tag = nlohmann::json::parse(response.value()).at("tag_name"); + const std::string latest_name = nlohmann::json::parse(response.value()).at("name"); + return Update{latest_tag, latest_name}; } catch (nlohmann::detail::out_of_range&) { LOG_ERROR(Frontend, "Parsing JSON response from {}{} failed during update check: " @@ -147,12 +116,8 @@ std::optional UpdateChecker::GetLatestRelease(bool includ } std::optional UpdateChecker::GetUpdate() { - const bool is_prerelease = ((strstr(Common::g_build_version, "pre-alpha") != NULL) || - (strstr(Common::g_build_version, "alpha") != NULL) || - (strstr(Common::g_build_version, "beta") != NULL) || - (strstr(Common::g_build_version, "rc") != NULL)); const std::optional latest_release_tag = - UpdateChecker::GetLatestRelease(is_prerelease); + UpdateChecker::GetLatestRelease(); if (!latest_release_tag) goto empty; diff --git a/src/frontend_common/update_checker.h b/src/frontend_common/update_checker.h index fb6c25c3f3..307c38f202 100644 --- a/src/frontend_common/update_checker.h +++ b/src/frontend_common/update_checker.h @@ -18,6 +18,6 @@ typedef struct { } Update; std::optional GetResponse(std::string url, std::string path); -std::optional GetLatestRelease(bool include_prereleases); +std::optional GetLatestRelease(); std::optional GetUpdate(); } // namespace UpdateChecker From 15d9513d50c1732c0315a123f9de867869e2d44b Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 13 Jan 2026 13:09:17 +0000 Subject: [PATCH 09/45] [video_core/host_shaders] add Snapdragon GSRv1 fragment shaders Signed-off-by: lizzie --- .patch/snapdragon_gsr/0001-glslang-fix.patch | 61 ++++++++++++++++++++ CMakeLists.txt | 3 + cpmfile.json | 9 +++ src/video_core/host_shaders/CMakeLists.txt | 36 +++++++++++- 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 .patch/snapdragon_gsr/0001-glslang-fix.patch diff --git a/.patch/snapdragon_gsr/0001-glslang-fix.patch b/.patch/snapdragon_gsr/0001-glslang-fix.patch new file mode 100644 index 0000000000..2eb0099d64 --- /dev/null +++ b/.patch/snapdragon_gsr/0001-glslang-fix.patch @@ -0,0 +1,61 @@ +diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +index 7074999..69927af 100644 +--- a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag ++++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +@@ -1,4 +1,4 @@ +-#version 300 es ++#version 320 es + + //============================================================================================================ + // +@@ -63,9 +63,9 @@ vec2 weightY(float dx, float dy,float c, float std) + + void main() + { +- int mode = OperationMode; +- float edgeThreshold = EdgeThreshold; +- float edgeSharpness = EdgeSharpness; ++ const int mode = OperationMode; ++ const float edgeThreshold = EdgeThreshold; ++ const float edgeSharpness = EdgeSharpness; + + vec4 color; + if(mode == 1) +@@ -93,10 +93,10 @@ void main() + { + coord.x += ViewportInfo[0].x; + +- vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), mode); ++ vec4 right = textureGather(ps0,coord + vec2(ViewportInfo[0].x, 0.0), mode); + vec4 upDown; +- upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),mode).wz; +- upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), mode).yx; ++ upDown.xy = textureGather(ps0,coord + vec2(0.0, -ViewportInfo[0].y),mode).wz; ++ upDown.zw = textureGather(ps0,coord+ vec2(0.0, ViewportInfo[0].y), mode).yx; + + float mean = (left.y+left.z+right.x+right.w)*0.25; + left = left - vec4(mean); +diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +index d2df646..1f1daa6 100644 +--- a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag ++++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +@@ -1,4 +1,4 @@ +-#version 300 es ++#version 320 es + + //============================================================================================================ + // +@@ -124,10 +124,10 @@ void main() + { + coord.x += ViewportInfo[0].x; + +- vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), OperationMode); ++ vec4 right = textureGather(ps0,coord + vec2(ViewportInfo[0].x, 0.0), OperationMode); + vec4 upDown; +- upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),OperationMode).wz; +- upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), OperationMode).yx; ++ upDown.xy = textureGather(ps0,coord + vec2(0.0, -ViewportInfo[0].y),OperationMode).wz; ++ upDown.zw = textureGather(ps0,coord+ vec2(0.0, ViewportInfo[0].y), OperationMode).yx; + + float mean = (left.y+left.z+right.x+right.w)*0.25; + left = left - vec4(mean); diff --git a/CMakeLists.txt b/CMakeLists.txt index 42717c496d..c071c6e1f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -233,6 +233,9 @@ endif() option(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" ${DEFAULT_YUZU_USE_BUNDLED_OPENSSL}) +AddJsonPackage(snapdragon_gsr) + +# TODO(crueter): CPM this if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL) AddJsonPackage(vulkan-validation-layers) diff --git a/cpmfile.json b/cpmfile.json index 1bb29afae4..b9a1110106 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -102,6 +102,15 @@ "artifact": "android-binaries-%VERSION%.zip", "hash": "8812ae84cbe49e6a3418ade9c458d3be6d74a3dffd319d4502007b564d580998056e8190414368ec11b27bc83993c7a0dad713c31bcc3d9553b51243efee3753" }, + "snapdragon_gsr": { + "repo": "SnapdragonStudios/snapdragon-gsr", + "package": "snapdragon_gsr", + "hash": "dsfsdfsd", + "sha": "d926f074bcb9d714e179f1ce0fcb9ee2eeb5074e", + "patches": [ + "0001-glslang-fix.patch" + ] + }, "quazip": { "package": "QuaZip-Qt6", "repo": "stachenov/quazip", diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index 60b399ccba..30daaa9cde 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -2,6 +2,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later set(FIDELITYFX_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/externals/FidelityFX-FSR/ffx-fsr) +set(SNAPDRAGON_GSR_INCLUDE_DIR ${snapdragon_gsr_SOURCE_DIR}/sgsr/v1/include/glsl/) set(FIDELITYFX_FILES ${FIDELITYFX_INCLUDE_DIR}/ffx_a.h @@ -76,6 +77,8 @@ set(SHADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_quad_indexed.comp ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_turbo_mode.comp ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_uint8.comp + ${SNAPDRAGON_GSR_INCLUDE_DIR}/sgsr1_shader_mobile.frag + ${SNAPDRAGON_GSR_INCLUDE_DIR}/sgsr1_shader_mobile_edge_direction.frag ) if (PLATFORM_HAIKU) @@ -145,11 +148,42 @@ foreach(SOURCE_FILE IN ITEMS ${SHADER_FILES}) OUTPUT ${SPIRV_HEADER_FILE} COMMAND - ${GLSLANGVALIDATOR} -V ${QUIET_FLAG} -I"${FIDELITYFX_INCLUDE_DIR}" ${GLSL_FLAGS} --variable-name ${SPIRV_VARIABLE_NAME} -o ${SPIRV_HEADER_FILE} ${SOURCE_FILE} --target-env ${SPIR_V_VERSION} + ${GLSLANGVALIDATOR} -V ${QUIET_FLAG} -DUseUniformBlock=1 ${GLSL_FLAGS} --variable-name ${SPIRV_VARIABLE_NAME} -o ${SPIRV_HEADER_FILE} ${SOURCE_FILE} --target-env ${SPIR_V_VERSION} MAIN_DEPENDENCY ${SOURCE_FILE} ) set(SHADER_HEADERS ${SHADER_HEADERS} ${SPIRV_HEADER_FILE}) + else() + # Skip generating source headers on Vulkan exclusive files + if (NOT ${FILENAME} MATCHES "vulkan.*" AND NOT ${FILENAME} MATCHES "sgsr1.*") + set(SOURCE_HEADER_FILE ${SHADER_DIR}/${SHADER_NAME}.h) + add_custom_command( + OUTPUT + ${SOURCE_HEADER_FILE} + COMMAND + ${CMAKE_COMMAND} -P ${HEADER_GENERATOR} ${SOURCE_FILE} ${SOURCE_HEADER_FILE} ${INPUT_FILE} + MAIN_DEPENDENCY + ${SOURCE_FILE} + DEPENDS + ${INPUT_FILE} + # HEADER_GENERATOR should be included here but msbuild seems to assume it's always modified + ) + set(SHADER_HEADERS ${SHADER_HEADERS} ${SOURCE_HEADER_FILE}) + endif() + # Skip compiling to SPIR-V OpenGL exclusive files + if (NOT ${FILENAME} MATCHES "opengl.*") + string(TOUPPER ${SHADER_NAME}_SPV SPIRV_VARIABLE_NAME) + set(SPIRV_HEADER_FILE ${SHADER_DIR}/${SHADER_NAME}_spv.h) + add_custom_command( + OUTPUT + ${SPIRV_HEADER_FILE} + COMMAND + ${GLSLANGVALIDATOR} -V ${QUIET_FLAG} -I"${FIDELITYFX_INCLUDE_DIR}" ${GLSL_FLAGS} --variable-name ${SPIRV_VARIABLE_NAME} -o ${SPIRV_HEADER_FILE} ${SOURCE_FILE} --target-env ${SPIR_V_VERSION} + MAIN_DEPENDENCY + ${SOURCE_FILE} + ) + set(SHADER_HEADERS ${SHADER_HEADERS} ${SPIRV_HEADER_FILE}) + endif() endif() endforeach() From 733c2f348c79aa12b7b3361e82020078dfa80660 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 13 Jan 2026 13:13:57 +0000 Subject: [PATCH 10/45] fix --- src/video_core/host_shaders/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index 30daaa9cde..1a54082ffb 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -2,7 +2,6 @@ # SPDX-License-Identifier: GPL-3.0-or-later set(FIDELITYFX_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/externals/FidelityFX-FSR/ffx-fsr) -set(SNAPDRAGON_GSR_INCLUDE_DIR ${snapdragon_gsr_SOURCE_DIR}/sgsr/v1/include/glsl/) set(FIDELITYFX_FILES ${FIDELITYFX_INCLUDE_DIR}/ffx_a.h From 9032a78ec9509d003b045c289d813fd782f75c71 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Jan 2026 02:01:04 +0000 Subject: [PATCH 11/45] [android] add sgsr to ui --- .../app/src/main/res/values/arrays.xml | 1 + .../app/src/main/res/values/strings.xml | 1 + src/common/settings_enums.h | 2 +- src/qt_common/config/shared_translation.cpp | 1 + src/qt_common/config/shared_translation.h | 1 + src/video_core/host_shaders/sgsr1_shader.vert | 13 ++ .../renderer_opengl/gl_blit_screen.cpp | 1 + .../renderer_vulkan/present/layer.cpp | 2 + .../renderer_vulkan/present/layer.h | 1 + .../renderer_vulkan/present/sgsr.cpp | 150 ++++++++++++++++++ src/video_core/renderer_vulkan/present/sgsr.h | 50 ++++++ .../renderer_vulkan/vk_blit_screen.cpp | 1 + src/yuzu/main_window.cpp | 3 +- 13 files changed, 224 insertions(+), 3 deletions(-) create mode 100644 src/video_core/host_shaders/sgsr1_shader.vert create mode 100644 src/video_core/renderer_vulkan/present/sgsr.cpp create mode 100644 src/video_core/renderer_vulkan/present/sgsr.h diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 99838b98cc..81383e1bfc 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -240,6 +240,7 @@ @string/scaling_filter_bspline @string/scaling_filter_mitchell @string/scaling_filter_spline1 + @string/scaling_filter_sgsr diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 02860364a9..0e8807b405 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -1076,6 +1076,7 @@ B-Spline Mitchell MMPX + Snapdragon Game Super Resolution None diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h index 638be4127f..389b16608f 100644 --- a/src/common/settings_enums.h +++ b/src/common/settings_enums.h @@ -143,7 +143,7 @@ ENUM(ConfirmStop, Ask_Always, Ask_Based_On_Game, Ask_Never); ENUM(FullscreenMode, Borderless, Exclusive); ENUM(NvdecEmulation, Off, Cpu, Gpu); ENUM(ResolutionSetup, Res1_4X, Res1_2X, Res3_4X, Res1X, Res5_4X, Res3_2X, Res2X, Res3X, Res4X, Res5X, Res6X, Res7X, Res8X); -ENUM(ScalingFilter, NearestNeighbor, Bilinear, Bicubic, Gaussian, Lanczos, ScaleForce, Fsr, Area, ZeroTangent, BSpline, Mitchell, Spline1, Mmpx, MaxEnum); +ENUM(ScalingFilter, NearestNeighbor, Bilinear, Bicubic, Gaussian, Lanczos, ScaleForce, Fsr, Area, ZeroTangent, BSpline, Mitchell, Spline1, Mmpx, Sgsr, MaxEnum); ENUM(AntiAliasing, None, Fxaa, Smaa, MaxEnum); ENUM(AspectRatio, R16_9, R4_3, R21_9, R16_10, Stretch); ENUM(ConsoleMode, Handheld, Docked); diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index 2bcaf416df..d925e71561 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -492,6 +492,7 @@ std::unique_ptr ComboboxEnumeration(QObject* parent) { PAIR(ScalingFilter, BSpline, tr("B-Spline")), PAIR(ScalingFilter, Mitchell, tr("Mitchell")), PAIR(ScalingFilter, Spline1, tr("Spline-1")), + PAIR(ScalingFilter, Sgsr, tr("Snapdragon Game Super Resolution")), }}); translations->insert({Settings::EnumMetadata::Index(), { diff --git a/src/qt_common/config/shared_translation.h b/src/qt_common/config/shared_translation.h index 6529c7bf40..edadf5eb9b 100644 --- a/src/qt_common/config/shared_translation.h +++ b/src/qt_common/config/shared_translation.h @@ -53,6 +53,7 @@ static const std::map scaling_filter_texts_map {Settings::ScalingFilter::Fsr, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "FSR"))}, {Settings::ScalingFilter::Area, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Area"))}, {Settings::ScalingFilter::Mmpx, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "MMPX"))}, + {Settings::ScalingFilter::Sgsr, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "SGSR"))}, }; static const std::map use_docked_mode_texts_map = { diff --git a/src/video_core/host_shaders/sgsr1_shader.vert b/src/video_core/host_shaders/sgsr1_shader.vert new file mode 100644 index 0000000000..6a87a7cac0 --- /dev/null +++ b/src/video_core/host_shaders/sgsr1_shader.vert @@ -0,0 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#version 450 + +layout(location = 0) out vec2 texcoord; + +void main() { + float x = float((gl_VertexIndex & 1) << 2); + float y = float((gl_VertexIndex & 2) << 1); + gl_Position = vec4(x - 1.0, y - 1.0, 0.0, 1.0); + texcoord = vec2(x, y) / 2.0; +} diff --git a/src/video_core/renderer_opengl/gl_blit_screen.cpp b/src/video_core/renderer_opengl/gl_blit_screen.cpp index 4b75e1b949..b03fc3ecbd 100644 --- a/src/video_core/renderer_opengl/gl_blit_screen.cpp +++ b/src/video_core/renderer_opengl/gl_blit_screen.cpp @@ -115,6 +115,7 @@ void BlitScreen::CreateWindowAdapt() { window_adapt = MakeMmpx(device); break; case Settings::ScalingFilter::Fsr: + case Settings::ScalingFilter::Sgsr: case Settings::ScalingFilter::Bilinear: default: window_adapt = MakeBilinear(device); diff --git a/src/video_core/renderer_vulkan/present/layer.cpp b/src/video_core/renderer_vulkan/present/layer.cpp index b462c672cc..8b61e0ef28 100644 --- a/src/video_core/renderer_vulkan/present/layer.cpp +++ b/src/video_core/renderer_vulkan/present/layer.cpp @@ -64,6 +64,8 @@ Layer::Layer(const Device& device_, MemoryAllocator& memory_allocator_, Schedule CreateDescriptorSets(layout); if (filters.get_scaling_filter() == Settings::ScalingFilter::Fsr) { fsr.emplace(device, memory_allocator, image_count, output_size); + } else if (filters.get_scaling_filter() == Settings::ScalingFilter::Sgsr) { + sgsr.emplace(device, memory_allocator, image_count, output_size); } } diff --git a/src/video_core/renderer_vulkan/present/layer.h b/src/video_core/renderer_vulkan/present/layer.h index d38b81823e..6de7a66087 100644 --- a/src/video_core/renderer_vulkan/present/layer.h +++ b/src/video_core/renderer_vulkan/present/layer.h @@ -96,6 +96,7 @@ private: Settings::AntiAliasing anti_alias_setting{}; std::variant anti_alias{}; std::optional fsr{}; + std::unique_ptr sgsr{}; std::vector resource_ticks{}; }; diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp new file mode 100644 index 0000000000..8a1e23d5e7 --- /dev/null +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -0,0 +1,150 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "common/common_types.h" +#include "common/div_ceil.h" +#include "common/settings.h" + +#include "video_core/fsr.h" +#include "video_core/host_shaders/sgsr1_shader_mobile_frag_spv.h" +#include "video_core/host_shaders/sgsr1_shader_mobile_edge_direction_frag_spv.h" +#include "video_core/host_shaders/sgsr1_shader_vert_spv.h" +#include "video_core/renderer_vulkan/present/fsr.h" +#include "video_core/renderer_vulkan/present/util.h" +#include "video_core/renderer_vulkan/vk_scheduler.h" +#include "video_core/renderer_vulkan/vk_shader_util.h" +#include "video_core/vulkan_common/vulkan_device.h" + +namespace Vulkan { +using namespace SGSR; + +using PushConstants = std::array; + +SGSR::SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, VkExtent2D extent) + : m_device{device}, m_memory_allocator{memory_allocator} + , m_image_count{image_count}, m_extent{extent} +{ + m_dynamic_images.resize(m_image_count); + for (auto& images : m_dynamic_images) { + images.images[0] = CreateWrappedImage(m_memory_allocator, m_extent, VK_FORMAT_R16G16B16A16_SFLOAT); + images.images[1] = CreateWrappedImage(m_memory_allocator, m_extent, VK_FORMAT_R16G16B16A16_SFLOAT); + images.image_views[0] = CreateWrappedImageView(m_device, images.images[0], VK_FORMAT_R16G16B16A16_SFLOAT); + images.image_views[1] = CreateWrappedImageView(m_device, images.images[1], VK_FORMAT_R16G16B16A16_SFLOAT); + } + + m_renderpass = CreateWrappedRenderPass(m_device, VK_FORMAT_R16G16B16A16_SFLOAT); + for (auto& images : m_dynamic_images) { + images.framebuffers[0] = CreateWrappedFramebuffer(m_device, m_renderpass, images.image_views[0], m_extent); + images.framebuffers[1] = CreateWrappedFramebuffer(m_device, m_renderpass, images.image_views[1], m_extent); + } + + m_sampler = CreateBilinearSampler(m_device); + m_vert_shader = BuildShader(m_device, SGSR1_SHADER_VERT_SPV); + m_stage_shader[0] = BuildShader(m_device, SGSR1_SHADER_MOBILE_FRAG_SPV); + m_stage_shader[1] = BuildShader(m_device, SGSR1_SHADER_MOBILE_EDGE_DIRECTION_FRAG_SPV); + // 2 descriptors, 2 descriptor sets per invocation + m_descriptor_pool = CreateWrappedDescriptorPool(m_device, 2 * m_image_count, 2 * m_image_count); + m_descriptor_set_layout = CreateWrappedDescriptorSetLayout(m_device, {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER}); + + std::vector layouts(MaxSgsrStage, *m_descriptor_set_layout); + for (auto& images : m_dynamic_images) + images.descriptor_sets = CreateWrappedDescriptorSets(m_descriptor_pool, layouts); + + const VkPushConstantRange range{ + .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT, + .offset = 0, + .size = sizeof(PushConstants), + }; + VkPipelineLayoutCreateInfo ci{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .setLayoutCount = 1, + .pSetLayouts = m_descriptor_set_layout.address(), + .pushConstantRangeCount = 1, + .pPushConstantRanges = &range, + }; + m_pipeline_layout = m_device.GetLogical().CreatePipelineLayout(ci); + + m_stage_pipeline[0] = CreateWrappedPipeline(m_device, m_renderpass, m_pipeline_layout, std::tie(m_vert_shader, m_stage_shader[0])); + m_stage_pipeline[1] = CreateWrappedPipeline(m_device, m_renderpass, m_pipeline_layout, std::tie(m_vert_shader, m_stage_shader[1])); +} + +void SGSR::UpdateDescriptorSets(VkImageView image_view, size_t image_index) { + Images& images = m_dynamic_images[image_index]; + std::vector image_infos; + std::vector updates; + image_infos.reserve(2); + updates.push_back(CreateWriteDescriptorSet(image_infos, *m_sampler, image_view, images.descriptor_sets[0], 0)); + updates.push_back(CreateWriteDescriptorSet(image_infos, *m_sampler, *images.image_views[0], images.descriptor_sets[1], 0)); + m_device.GetLogical().UpdateDescriptorSets(updates, {}); +} + +void SGSR::UploadImages(Scheduler& scheduler) { + if (!m_images_ready) { + scheduler.Record([&](vk::CommandBuffer cmdbuf) { + for (auto& image : m_dynamic_images) { + ClearColorImage(cmdbuf, *image.images[0]); + ClearColorImage(cmdbuf, *image.images[1]); + } + }); + scheduler.Finish(); + m_images_ready = true; + } +} + +VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_image, VkImageView source_image_view, VkExtent2D input_image_extent, const Common::Rectangle& crop_rect) { + Images& images = m_dynamic_images[image_index]; + VkImage stage0_image = *images.images[0]; + VkImage stage1_image = *images.images[1]; + VkDescriptorSet stage0_descriptor_set = images.descriptor_sets[0]; + VkDescriptorSet stage1_descriptor_set = images.descriptor_sets[1]; + VkFramebuffer stage0_framebuffer = *images.framebuffers[0]; + VkFramebuffer stage1_framebuffer = *images.framebuffers[1]; + VkPipelineLayout pipeline_layout = *m_pipeline_layout; + VkRenderPass renderpass = *m_renderpass; + VkExtent2D extent = m_extent; + + const f32 input_image_width = f32(input_image_extent.width); + const f32 input_image_height = f32(input_image_extent.height); + const f32 viewport_width = (crop_rect.right - crop_rect.left) * input_image_width; + const f32 viewport_x = crop_rect.left * input_image_width; + const f32 viewport_height = (crop_rect.bottom - crop_rect.top) * input_image_height; + const f32 viewport_y = crop_rect.top * input_image_height; + + // highp vec4 + PushConstants viewport_con{}; + *reinterpret_cast(viewport_con.data() + 0) = viewport_x; + *reinterpret_cast(viewport_con.data() + 1) = viewport_y; + *reinterpret_cast(viewport_con.data() + 2) = viewport_width; + *reinterpret_cast(viewport_con.data() + 3) = viewport_height; + + UploadImages(scheduler); + UpdateDescriptorSets(source_image_view, image_index); + + scheduler.RequestOutsideRenderPassOperationContext(); + scheduler.Record([=](vk::CommandBuffer cmdbuf) { + TransitionImageLayout(cmdbuf, source_image, VK_IMAGE_LAYOUT_GENERAL); + TransitionImageLayout(cmdbuf, stage0_image, VK_IMAGE_LAYOUT_GENERAL); + BeginRenderPass(cmdbuf, renderpass, stage0_framebuffer, extent); + cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, m_stage_pipeline[0]); + cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, stage0_descriptor_set, {}); + cmdbuf.PushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, viewport_con); + cmdbuf.Draw(3, 1, 0, 0); + cmdbuf.EndRenderPass(); + // + TransitionImageLayout(cmdbuf, stage0_image, VK_IMAGE_LAYOUT_GENERAL); + TransitionImageLayout(cmdbuf, stage1_image, VK_IMAGE_LAYOUT_GENERAL); + BeginRenderPass(cmdbuf, renderpass, stage1_framebuffer, extent); + cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, m_stage_pipeline[1]); + cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, stage1_descriptor_set, {}); + cmdbuf.PushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, viewport_con); + cmdbuf.Draw(3, 1, 0, 0); + cmdbuf.EndRenderPass(); + TransitionImageLayout(cmdbuf, stage1_image, VK_IMAGE_LAYOUT_GENERAL); + }); + + return *images.image_views[1]; +} + +} // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/present/sgsr.h b/src/video_core/renderer_vulkan/present/sgsr.h new file mode 100644 index 0000000000..97691c9a90 --- /dev/null +++ b/src/video_core/renderer_vulkan/present/sgsr.h @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "common/math_util.h" +#include "video_core/vulkan_common/vulkan_memory_allocator.h" +#include "video_core/vulkan_common/vulkan_wrapper.h" + +namespace Vulkan { + +class Device; +class Scheduler; + +class SGSR { +public: + explicit SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, VkExtent2D extent); + VkImageView Draw(Scheduler& scheduler, size_t image_index, VkImage source_image, + VkImageView source_image_view, VkExtent2D input_image_extent, + const Common::Rectangle& crop_rect); + +private: + void UploadImages(Scheduler& scheduler); + void UpdateDescriptorSets(VkImageView image_view, size_t image_index); + + const Device& m_device; + MemoryAllocator& m_memory_allocator; + const size_t m_image_count; + const VkExtent2D m_extent; + + vk::DescriptorPool m_descriptor_pool; + vk::DescriptorSetLayout m_descriptor_set_layout; + vk::PipelineLayout m_pipeline_layout; + vk::ShaderModule m_vert_shader; + vk::ShaderModule m_stage_shader[2]; + vk::Pipeline m_stage_pipeline[2]; + vk::RenderPass m_renderpass; + vk::Sampler m_sampler; + + struct Images { + vk::DescriptorSets descriptor_sets; + std::array images; + std::array image_views; + std::array framebuffers; + }; + std::vector m_dynamic_images; + bool m_images_ready{}; +}; + +} // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp index 75a8c3bf91..c408928342 100644 --- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp +++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp @@ -77,6 +77,7 @@ void BlitScreen::SetWindowAdaptPass() { window_adapt = MakeMmpx(device, swapchain_view_format); break; case Settings::ScalingFilter::Fsr: + case Settings::ScalingFilter::Sgsr: case Settings::ScalingFilter::Bilinear: default: window_adapt = MakeBilinear(device, swapchain_view_format); diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index 2e7cef0953..d22be2ec67 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -4394,8 +4394,7 @@ void MainWindow::UpdateAPIText() { void MainWindow::UpdateFilterText() { const auto filter = Settings::values.scaling_filter.GetValue(); const auto filter_text = ConfigurationShared::scaling_filter_texts_map.find(filter)->second; - filter_status_button->setText(filter == Settings::ScalingFilter::Fsr ? tr("FSR") - : filter_text.toUpper()); + filter_status_button->setText(filter_text.toUpper()); } void MainWindow::UpdateAAText() { From 1e26edc70854617a0cab940c3fccc993676b2796 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Jan 2026 02:33:31 +0000 Subject: [PATCH 12/45] extra stuffs --- src/video_core/CMakeLists.txt | 2 ++ src/video_core/host_shaders/CMakeLists.txt | 7 +++++-- src/video_core/renderer_vulkan/present/layer.cpp | 1 + src/video_core/renderer_vulkan/present/sgsr.cpp | 13 ++++++------- src/video_core/renderer_vulkan/present/sgsr.h | 11 ++++++----- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 362b068656..07683dcbeb 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -131,6 +131,8 @@ add_library(video_core STATIC renderer_vulkan/present/present_push_constants.h renderer_vulkan/present/smaa.cpp renderer_vulkan/present/smaa.h + renderer_vulkan/present/sgsr.cpp + renderer_vulkan/present/sgsr.h renderer_vulkan/present/util.cpp renderer_vulkan/present/util.h renderer_vulkan/present/window_adapt_pass.cpp diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index 1a54082ffb..dc05853326 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -76,8 +76,11 @@ set(SHADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_quad_indexed.comp ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_turbo_mode.comp ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_uint8.comp - ${SNAPDRAGON_GSR_INCLUDE_DIR}/sgsr1_shader_mobile.frag - ${SNAPDRAGON_GSR_INCLUDE_DIR}/sgsr1_shader_mobile_edge_direction.frag + + # Snapdragon Game Super Resolution + ${CMAKE_CURRENT_SOURCE_DIR}/sgsr1_shader.vert + ${snapdragon_gsr_SOURCE_DIR}/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag + ${snapdragon_gsr_SOURCE_DIR}/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag ) if (PLATFORM_HAIKU) diff --git a/src/video_core/renderer_vulkan/present/layer.cpp b/src/video_core/renderer_vulkan/present/layer.cpp index 8b61e0ef28..e15fa7553a 100644 --- a/src/video_core/renderer_vulkan/present/layer.cpp +++ b/src/video_core/renderer_vulkan/present/layer.cpp @@ -15,6 +15,7 @@ #include "common/settings.h" #include "video_core/framebuffer_config.h" #include "video_core/renderer_vulkan/present/fsr.h" +#include "video_core/renderer_vulkan/present/sgsr.h" #include "video_core/renderer_vulkan/present/fxaa.h" #include "video_core/renderer_vulkan/present/layer.h" #include "video_core/renderer_vulkan/present/present_push_constants.h" diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 8a1e23d5e7..f873acfb48 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -5,18 +5,17 @@ #include "common/div_ceil.h" #include "common/settings.h" -#include "video_core/fsr.h" +//#include "video_core/sgsr.h" #include "video_core/host_shaders/sgsr1_shader_mobile_frag_spv.h" #include "video_core/host_shaders/sgsr1_shader_mobile_edge_direction_frag_spv.h" #include "video_core/host_shaders/sgsr1_shader_vert_spv.h" -#include "video_core/renderer_vulkan/present/fsr.h" +#include "video_core/renderer_vulkan/present/sgsr.h" #include "video_core/renderer_vulkan/present/util.h" #include "video_core/renderer_vulkan/vk_scheduler.h" #include "video_core/renderer_vulkan/vk_shader_util.h" #include "video_core/vulkan_common/vulkan_device.h" namespace Vulkan { -using namespace SGSR; using PushConstants = std::array; @@ -46,7 +45,7 @@ SGSR::SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image m_descriptor_pool = CreateWrappedDescriptorPool(m_device, 2 * m_image_count, 2 * m_image_count); m_descriptor_set_layout = CreateWrappedDescriptorSetLayout(m_device, {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER}); - std::vector layouts(MaxSgsrStage, *m_descriptor_set_layout); + std::vector layouts(SGSR_STAGE_COUNT, *m_descriptor_set_layout); for (auto& images : m_dynamic_images) images.descriptor_sets = CreateWrappedDescriptorSets(m_descriptor_pool, layouts); @@ -123,11 +122,11 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ UpdateDescriptorSets(source_image_view, image_index); scheduler.RequestOutsideRenderPassOperationContext(); - scheduler.Record([=](vk::CommandBuffer cmdbuf) { + scheduler.Record([=, this](vk::CommandBuffer cmdbuf) { TransitionImageLayout(cmdbuf, source_image, VK_IMAGE_LAYOUT_GENERAL); TransitionImageLayout(cmdbuf, stage0_image, VK_IMAGE_LAYOUT_GENERAL); BeginRenderPass(cmdbuf, renderpass, stage0_framebuffer, extent); - cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, m_stage_pipeline[0]); + cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, *m_stage_pipeline[0]); cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, stage0_descriptor_set, {}); cmdbuf.PushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, viewport_con); cmdbuf.Draw(3, 1, 0, 0); @@ -136,7 +135,7 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ TransitionImageLayout(cmdbuf, stage0_image, VK_IMAGE_LAYOUT_GENERAL); TransitionImageLayout(cmdbuf, stage1_image, VK_IMAGE_LAYOUT_GENERAL); BeginRenderPass(cmdbuf, renderpass, stage1_framebuffer, extent); - cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, m_stage_pipeline[1]); + cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, *m_stage_pipeline[1]); cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, stage1_descriptor_set, {}); cmdbuf.PushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, viewport_con); cmdbuf.Draw(3, 1, 0, 0); diff --git a/src/video_core/renderer_vulkan/present/sgsr.h b/src/video_core/renderer_vulkan/present/sgsr.h index 97691c9a90..14650a4143 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.h +++ b/src/video_core/renderer_vulkan/present/sgsr.h @@ -14,6 +14,7 @@ class Scheduler; class SGSR { public: + static constexpr size_t SGSR_STAGE_COUNT = 2; explicit SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, VkExtent2D extent); VkImageView Draw(Scheduler& scheduler, size_t image_index, VkImage source_image, VkImageView source_image_view, VkExtent2D input_image_extent, @@ -32,16 +33,16 @@ private: vk::DescriptorSetLayout m_descriptor_set_layout; vk::PipelineLayout m_pipeline_layout; vk::ShaderModule m_vert_shader; - vk::ShaderModule m_stage_shader[2]; - vk::Pipeline m_stage_pipeline[2]; + std::array m_stage_shader; + std::array m_stage_pipeline; vk::RenderPass m_renderpass; vk::Sampler m_sampler; struct Images { vk::DescriptorSets descriptor_sets; - std::array images; - std::array image_views; - std::array framebuffers; + std::array images; + std::array image_views; + std::array framebuffers; }; std::vector m_dynamic_images; bool m_images_ready{}; From 21fe9f6c1eb0e0c56457c88d4a607bf913854870 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Jan 2026 03:11:16 +0000 Subject: [PATCH 13/45] fix for push constants --- .../0002-push-constants-retrofit.patch | 97 +++++++++++++++++++ .../renderer_vulkan/present/layer.cpp | 3 + .../renderer_vulkan/present/sgsr.cpp | 26 ++--- 3 files changed, 114 insertions(+), 12 deletions(-) create mode 100644 .patch/snapdragon_gsr/0002-push-constants-retrofit.patch diff --git a/.patch/snapdragon_gsr/0002-push-constants-retrofit.patch b/.patch/snapdragon_gsr/0002-push-constants-retrofit.patch new file mode 100644 index 0000000000..33f13b0c65 --- /dev/null +++ b/.patch/snapdragon_gsr/0002-push-constants-retrofit.patch @@ -0,0 +1,97 @@ +diff --git a/d926/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/d926/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +index 69927af..c942bbc 100644 +--- a/d926/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag ++++ b/d926/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +@@ -34,11 +34,10 @@ precision highp int; + //////////////////////// + + #if defined(UseUniformBlock) +-layout (set=0, binding = 0) uniform UniformBlock +-{ +- highp vec4 ViewportInfo[1]; ++layout( push_constant ) uniform constants { ++ highp vec4 ViewportInfo; + }; +-layout(set = 0, binding = 1) uniform mediump sampler2D ps0; ++layout(set = 0, binding = 0) uniform mediump sampler2D ps0; + #else + uniform highp vec4 ViewportInfo[1]; + uniform mediump sampler2D ps0; +@@ -82,21 +81,21 @@ void main() + //if ( mode!=4 && xCenter*xCenter+yCenter*yCenter<=0.4 * 0.4) + if ( mode!=4) + { +- highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo[0].zw)+vec2(-0.5,0.5)); ++ highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo.zw)+vec2(-0.5,0.5)); + highp vec2 imgCoordPixel = floor(imgCoord); +- highp vec2 coord = (imgCoordPixel*ViewportInfo[0].xy); ++ highp vec2 coord = (imgCoordPixel*ViewportInfo.xy); + vec2 pl = (imgCoord+(-imgCoordPixel)); + vec4 left = textureGather(ps0,coord, mode); + + float edgeVote = abs(left.z - left.y) + abs(color[mode] - left.y) + abs(color[mode] - left.z) ; + if(edgeVote > edgeThreshold) + { +- coord.x += ViewportInfo[0].x; ++ coord.x += ViewportInfo.x; + +- vec4 right = textureGather(ps0,coord + vec2(ViewportInfo[0].x, 0.0), mode); ++ vec4 right = textureGather(ps0,coord + vec2(ViewportInfo.x, 0.0), mode); + vec4 upDown; +- upDown.xy = textureGather(ps0,coord + vec2(0.0, -ViewportInfo[0].y),mode).wz; +- upDown.zw = textureGather(ps0,coord+ vec2(0.0, ViewportInfo[0].y), mode).yx; ++ upDown.xy = textureGather(ps0,coord + vec2(0.0, -ViewportInfo.y),mode).wz; ++ upDown.zw = textureGather(ps0,coord+ vec2(0.0, ViewportInfo.y), mode).yx; + + float mean = (left.y+left.z+right.x+right.w)*0.25; + left = left - vec4(mean); +diff --git a/d926/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/d926/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +index 1f1daa6..128a348 100644 +--- a/d926/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag ++++ b/d926/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +@@ -40,13 +40,12 @@ precision highp int; + //////////////////////// + + #if defined(UseUniformBlock) +-layout (set=0, binding = 0) uniform UniformBlock +-{ +- highp vec4 ViewportInfo[1]; ++layout( push_constant ) uniform constants { ++ highp vec4 ViewportInfo; + }; +-layout(set = 0, binding = 1) uniform mediump sampler2D ps0; ++layout(set = 0, binding = 0) uniform mediump sampler2D ps0; + #else +-uniform highp vec4 ViewportInfo[1]; ++uniform highp vec4 ViewportInfo; + uniform mediump sampler2D ps0; + #endif + +@@ -113,21 +112,21 @@ void main() + //if ( OperationMode!=4 && xCenter*xCenter+yCenter*yCenter<=0.4 * 0.4) + if ( OperationMode!=4) + { +- highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo[0].zw)+vec2(-0.5,0.5)); ++ highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo.zw)+vec2(-0.5,0.5)); + highp vec2 imgCoordPixel = floor(imgCoord); +- highp vec2 coord = (imgCoordPixel*ViewportInfo[0].xy); ++ highp vec2 coord = (imgCoordPixel*ViewportInfo.xy); + vec2 pl = (imgCoord+(-imgCoordPixel)); + vec4 left = textureGather(ps0,coord, OperationMode); + + float edgeVote = abs(left.z - left.y) + abs(color[OperationMode] - left.y) + abs(color[OperationMode] - left.z) ; + if(edgeVote > EdgeThreshold) + { +- coord.x += ViewportInfo[0].x; ++ coord.x += ViewportInfo.x; + +- vec4 right = textureGather(ps0,coord + vec2(ViewportInfo[0].x, 0.0), OperationMode); ++ vec4 right = textureGather(ps0,coord + vec2(ViewportInfo.x, 0.0), OperationMode); + vec4 upDown; +- upDown.xy = textureGather(ps0,coord + vec2(0.0, -ViewportInfo[0].y),OperationMode).wz; +- upDown.zw = textureGather(ps0,coord+ vec2(0.0, ViewportInfo[0].y), OperationMode).yx; ++ upDown.xy = textureGather(ps0,coord + vec2(0.0, -ViewportInfo.y),OperationMode).wz; ++ upDown.zw = textureGather(ps0,coord+ vec2(0.0, ViewportInfo.y), OperationMode).yx; + + float mean = (left.y+left.z+right.x+right.w)*0.25; + left = left - vec4(mean); diff --git a/src/video_core/renderer_vulkan/present/layer.cpp b/src/video_core/renderer_vulkan/present/layer.cpp index e15fa7553a..d6c0ca082f 100644 --- a/src/video_core/renderer_vulkan/present/layer.cpp +++ b/src/video_core/renderer_vulkan/present/layer.cpp @@ -120,6 +120,9 @@ void Layer::ConfigureDraw(PresentPushConstants* out_push_constants, if (fsr) { source_image_view = fsr->Draw(scheduler, image_index, source_image, source_image_view, render_extent, crop_rect); crop_rect = {0, 0, 1, 1}; + } else if (sgsr) { + source_image_view = sgsr->Draw(scheduler, image_index, source_image, source_image_view, render_extent, crop_rect); + crop_rect = {0, 0, 1, 1}; } SetMatrixData(*out_push_constants, layout); diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index f873acfb48..6fe3415aa4 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -94,22 +94,25 @@ void SGSR::UploadImages(Scheduler& scheduler) { VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_image, VkImageView source_image_view, VkExtent2D input_image_extent, const Common::Rectangle& crop_rect) { Images& images = m_dynamic_images[image_index]; - VkImage stage0_image = *images.images[0]; - VkImage stage1_image = *images.images[1]; - VkDescriptorSet stage0_descriptor_set = images.descriptor_sets[0]; - VkDescriptorSet stage1_descriptor_set = images.descriptor_sets[1]; - VkFramebuffer stage0_framebuffer = *images.framebuffers[0]; - VkFramebuffer stage1_framebuffer = *images.framebuffers[1]; + auto const stage0_image = *images.images[0]; + auto const stage1_image = *images.images[1]; + auto const stage0_descriptor_set = images.descriptor_sets[0]; + auto const stage1_descriptor_set = images.descriptor_sets[1]; + auto const stage0_framebuffer = *images.framebuffers[0]; + auto const stage1_framebuffer = *images.framebuffers[1]; + auto const stage0_pipeline = *m_stage_pipeline[0]; + auto const stage1_pipeline = *m_stage_pipeline[1]; + VkPipelineLayout pipeline_layout = *m_pipeline_layout; VkRenderPass renderpass = *m_renderpass; VkExtent2D extent = m_extent; const f32 input_image_width = f32(input_image_extent.width); const f32 input_image_height = f32(input_image_extent.height); - const f32 viewport_width = (crop_rect.right - crop_rect.left) * input_image_width; const f32 viewport_x = crop_rect.left * input_image_width; - const f32 viewport_height = (crop_rect.bottom - crop_rect.top) * input_image_height; const f32 viewport_y = crop_rect.top * input_image_height; + const f32 viewport_width = (crop_rect.right - crop_rect.left) * input_image_width; + const f32 viewport_height = (crop_rect.bottom - crop_rect.top) * input_image_height; // highp vec4 PushConstants viewport_con{}; @@ -122,20 +125,19 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ UpdateDescriptorSets(source_image_view, image_index); scheduler.RequestOutsideRenderPassOperationContext(); - scheduler.Record([=, this](vk::CommandBuffer cmdbuf) { + scheduler.Record([=](vk::CommandBuffer cmdbuf) { TransitionImageLayout(cmdbuf, source_image, VK_IMAGE_LAYOUT_GENERAL); TransitionImageLayout(cmdbuf, stage0_image, VK_IMAGE_LAYOUT_GENERAL); BeginRenderPass(cmdbuf, renderpass, stage0_framebuffer, extent); - cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, *m_stage_pipeline[0]); + cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, stage0_pipeline); cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, stage0_descriptor_set, {}); cmdbuf.PushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, viewport_con); cmdbuf.Draw(3, 1, 0, 0); cmdbuf.EndRenderPass(); - // TransitionImageLayout(cmdbuf, stage0_image, VK_IMAGE_LAYOUT_GENERAL); TransitionImageLayout(cmdbuf, stage1_image, VK_IMAGE_LAYOUT_GENERAL); BeginRenderPass(cmdbuf, renderpass, stage1_framebuffer, extent); - cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, *m_stage_pipeline[1]); + cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, stage1_pipeline); cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, stage1_descriptor_set, {}); cmdbuf.PushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, viewport_con); cmdbuf.Draw(3, 1, 0, 0); From 7821fc083bb2a36be12d9c188af9e0d62c401232 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Jan 2026 03:51:23 +0000 Subject: [PATCH 14/45] fuck this --- .../0002-push-constants-retrofit.patch | 12 ++++---- docs/user/Graphics.md | 3 ++ .../renderer_vulkan/present/sgsr.cpp | 28 +++++++++---------- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/.patch/snapdragon_gsr/0002-push-constants-retrofit.patch b/.patch/snapdragon_gsr/0002-push-constants-retrofit.patch index 33f13b0c65..7faf70bcc1 100644 --- a/.patch/snapdragon_gsr/0002-push-constants-retrofit.patch +++ b/.patch/snapdragon_gsr/0002-push-constants-retrofit.patch @@ -1,7 +1,7 @@ -diff --git a/d926/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/d926/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag index 69927af..c942bbc 100644 ---- a/d926/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -+++ b/d926/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +--- a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag ++++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag @@ -34,11 +34,10 @@ precision highp int; //////////////////////// @@ -45,10 +45,10 @@ index 69927af..c942bbc 100644 float mean = (left.y+left.z+right.x+right.w)*0.25; left = left - vec4(mean); -diff --git a/d926/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/d926/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag index 1f1daa6..128a348 100644 ---- a/d926/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -+++ b/d926/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +--- a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag ++++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag @@ -40,13 +40,12 @@ precision highp int; //////////////////////// diff --git a/docs/user/Graphics.md b/docs/user/Graphics.md index ad359b9049..49ee0e68b2 100644 --- a/docs/user/Graphics.md +++ b/docs/user/Graphics.md @@ -44,6 +44,9 @@ Various graphical filters exist - each of them aimed at a specific target/image - **MMPX**: Nearest-neighbour filter aimed at providing higher pixel-art quality. - **Pros**: Offers decent pixel-art upscaling. - **Cons**: Only works for pixel-art. +- **SGSR**: Uses Snapdragon Studios Game Super Resolution to enhance image quality (similar to FSR, but for Adreno devices). + - **Pros**: Optimized for Adreno devices. + - **Cons**: Doesn't play nicely with non-Adreno devices. ### Anisotropy values diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 6fe3415aa4..1f334cbc92 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -116,10 +116,10 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ // highp vec4 PushConstants viewport_con{}; - *reinterpret_cast(viewport_con.data() + 0) = viewport_x; - *reinterpret_cast(viewport_con.data() + 1) = viewport_y; - *reinterpret_cast(viewport_con.data() + 2) = viewport_width; - *reinterpret_cast(viewport_con.data() + 3) = viewport_height; + viewport_con[0] = std::bit_cast(viewport_x); + viewport_con[1] = std::bit_cast(viewport_y); + viewport_con[2] = std::bit_cast(viewport_width); + viewport_con[3] = std::bit_cast(viewport_height); UploadImages(scheduler); UpdateDescriptorSets(source_image_view, image_index); @@ -135,17 +135,17 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ cmdbuf.Draw(3, 1, 0, 0); cmdbuf.EndRenderPass(); TransitionImageLayout(cmdbuf, stage0_image, VK_IMAGE_LAYOUT_GENERAL); - TransitionImageLayout(cmdbuf, stage1_image, VK_IMAGE_LAYOUT_GENERAL); - BeginRenderPass(cmdbuf, renderpass, stage1_framebuffer, extent); - cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, stage1_pipeline); - cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, stage1_descriptor_set, {}); - cmdbuf.PushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, viewport_con); - cmdbuf.Draw(3, 1, 0, 0); - cmdbuf.EndRenderPass(); - TransitionImageLayout(cmdbuf, stage1_image, VK_IMAGE_LAYOUT_GENERAL); + // TransitionImageLayout(cmdbuf, stage1_image, VK_IMAGE_LAYOUT_GENERAL); + // BeginRenderPass(cmdbuf, renderpass, stage1_framebuffer, extent); + // cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, stage1_pipeline); + // cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, stage1_descriptor_set, {}); + // cmdbuf.PushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, viewport_con); + // cmdbuf.Draw(3, 1, 0, 0); + // cmdbuf.EndRenderPass(); + // TransitionImageLayout(cmdbuf, stage1_image, VK_IMAGE_LAYOUT_GENERAL); }); - - return *images.image_views[1]; + //return *images.image_views[1]; + return *images.image_views[0]; } } // namespace Vulkan From dc778c959d5dab2e934842bbd0577f40ef9a248d Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Jan 2026 03:55:41 +0000 Subject: [PATCH 15/45] fix deps --- src/video_core/host_shaders/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index dc05853326..8533984db6 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -214,6 +214,7 @@ list(APPEND SHADER_SOURCES ${GLSL_INCLUDES}) add_custom_target(host_shaders DEPENDS ${SHADER_HEADERS} + snapdragon_gsr SOURCES ${SHADER_SOURCES} ) From c1a2477c6ce17915d542cba98c7c149bc30b08a4 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Jan 2026 04:10:47 +0000 Subject: [PATCH 16/45] fix everything --- .patch/snapdragon_gsr/0001-fix-glsl.patch | 99 +++++++++++++++++++ .patch/snapdragon_gsr/0001-glslang-fix.patch | 61 ------------ .../0002-push-constants-retrofit.patch | 97 ------------------ src/video_core/host_shaders/CMakeLists.txt | 3 +- 4 files changed, 100 insertions(+), 160 deletions(-) create mode 100644 .patch/snapdragon_gsr/0001-fix-glsl.patch delete mode 100644 .patch/snapdragon_gsr/0001-glslang-fix.patch delete mode 100644 .patch/snapdragon_gsr/0002-push-constants-retrofit.patch diff --git a/.patch/snapdragon_gsr/0001-fix-glsl.patch b/.patch/snapdragon_gsr/0001-fix-glsl.patch new file mode 100644 index 0000000000..794eed8a21 --- /dev/null +++ b/.patch/snapdragon_gsr/0001-fix-glsl.patch @@ -0,0 +1,99 @@ +diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +index 7074999..2d322fb 100644 +--- a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag ++++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +@@ -1,4 +1,5 @@ +-#version 300 es ++#version 310 es ++#extension GL_EXT_spec_constant_composites:require + + //============================================================================================================ + // +@@ -34,11 +35,10 @@ precision highp int; + //////////////////////// + + #if defined(UseUniformBlock) +-layout (set=0, binding = 0) uniform UniformBlock +-{ +- highp vec4 ViewportInfo[1]; ++layout( push_constant ) uniform constants { ++ highp vec4 ViewportInfo[1]; + }; +-layout(set = 0, binding = 1) uniform mediump sampler2D ps0; ++layout(set = 0, binding = 0) uniform mediump sampler2D ps0; + #else + uniform highp vec4 ViewportInfo[1]; + uniform mediump sampler2D ps0; +@@ -63,9 +63,9 @@ vec2 weightY(float dx, float dy,float c, float std) + + void main() + { +- int mode = OperationMode; +- float edgeThreshold = EdgeThreshold; +- float edgeSharpness = EdgeSharpness; ++ const int mode = OperationMode; ++ const float edgeThreshold = EdgeThreshold; ++ const float edgeSharpness = EdgeSharpness; + + vec4 color; + if(mode == 1) +@@ -93,10 +93,13 @@ void main() + { + coord.x += ViewportInfo[0].x; + +- vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), mode); ++ highp vec2 IR_highp_vec2_0 = vec2(ViewportInfo[0].x, 0.0); ++ vec4 right = textureGather(ps0,coord + IR_highp_vec2_0, mode); + vec4 upDown; +- upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),mode).wz; +- upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), mode).yx; ++ highp vec2 IR_highp_vec2_1 = vec2(0.0, -ViewportInfo[0].y); ++ upDown.xy = textureGather(ps0,coord + IR_highp_vec2_1,mode).wz; ++ highp vec2 IR_highp_vec2_2 = vec2(0.0, ViewportInfo[0].y); ++ upDown.zw = textureGather(ps0,coord+ IR_highp_vec2_2, mode).yx; + + float mean = (left.y+left.z+right.x+right.w)*0.25; + left = left - vec4(mean); +diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +index d2df646..875cdbf 100644 +--- a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag ++++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +@@ -1,4 +1,5 @@ +-#version 300 es ++#version 310 es ++#extension GL_EXT_spec_constant_composites:require + + //============================================================================================================ + // +@@ -40,11 +41,10 @@ precision highp int; + //////////////////////// + + #if defined(UseUniformBlock) +-layout (set=0, binding = 0) uniform UniformBlock +-{ +- highp vec4 ViewportInfo[1]; ++layout( push_constant ) uniform constants { ++ highp vec4 ViewportInfo[1]; + }; +-layout(set = 0, binding = 1) uniform mediump sampler2D ps0; ++layout(set = 0, binding = 0) uniform mediump sampler2D ps0; + #else + uniform highp vec4 ViewportInfo[1]; + uniform mediump sampler2D ps0; +@@ -124,10 +124,13 @@ void main() + { + coord.x += ViewportInfo[0].x; + +- vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), OperationMode); ++ highp vec2 IR_highp_vec2_0 = vec2(ViewportInfo[0].x, 0.0); ++ vec4 right = textureGather(ps0,coord + IR_highp_vec2_0, OperationMode); + vec4 upDown; +- upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),OperationMode).wz; +- upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), OperationMode).yx; ++ highp vec2 IR_highp_vec2_1 = vec2(0.0, -ViewportInfo[0].y); ++ upDown.xy = textureGather(ps0,coord + IR_highp_vec2_1,OperationMode).wz; ++ highp vec2 IR_highp_vec2_2 = vec2(0.0, ViewportInfo[0].y); ++ upDown.zw = textureGather(ps0,coord+ IR_highp_vec2_2, OperationMode).yx; + + float mean = (left.y+left.z+right.x+right.w)*0.25; + left = left - vec4(mean); diff --git a/.patch/snapdragon_gsr/0001-glslang-fix.patch b/.patch/snapdragon_gsr/0001-glslang-fix.patch deleted file mode 100644 index 2eb0099d64..0000000000 --- a/.patch/snapdragon_gsr/0001-glslang-fix.patch +++ /dev/null @@ -1,61 +0,0 @@ -diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -index 7074999..69927af 100644 ---- a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -+++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -@@ -1,4 +1,4 @@ --#version 300 es -+#version 320 es - - //============================================================================================================ - // -@@ -63,9 +63,9 @@ vec2 weightY(float dx, float dy,float c, float std) - - void main() - { -- int mode = OperationMode; -- float edgeThreshold = EdgeThreshold; -- float edgeSharpness = EdgeSharpness; -+ const int mode = OperationMode; -+ const float edgeThreshold = EdgeThreshold; -+ const float edgeSharpness = EdgeSharpness; - - vec4 color; - if(mode == 1) -@@ -93,10 +93,10 @@ void main() - { - coord.x += ViewportInfo[0].x; - -- vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), mode); -+ vec4 right = textureGather(ps0,coord + vec2(ViewportInfo[0].x, 0.0), mode); - vec4 upDown; -- upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),mode).wz; -- upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), mode).yx; -+ upDown.xy = textureGather(ps0,coord + vec2(0.0, -ViewportInfo[0].y),mode).wz; -+ upDown.zw = textureGather(ps0,coord+ vec2(0.0, ViewportInfo[0].y), mode).yx; - - float mean = (left.y+left.z+right.x+right.w)*0.25; - left = left - vec4(mean); -diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -index d2df646..1f1daa6 100644 ---- a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -+++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -@@ -1,4 +1,4 @@ --#version 300 es -+#version 320 es - - //============================================================================================================ - // -@@ -124,10 +124,10 @@ void main() - { - coord.x += ViewportInfo[0].x; - -- vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), OperationMode); -+ vec4 right = textureGather(ps0,coord + vec2(ViewportInfo[0].x, 0.0), OperationMode); - vec4 upDown; -- upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),OperationMode).wz; -- upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), OperationMode).yx; -+ upDown.xy = textureGather(ps0,coord + vec2(0.0, -ViewportInfo[0].y),OperationMode).wz; -+ upDown.zw = textureGather(ps0,coord+ vec2(0.0, ViewportInfo[0].y), OperationMode).yx; - - float mean = (left.y+left.z+right.x+right.w)*0.25; - left = left - vec4(mean); diff --git a/.patch/snapdragon_gsr/0002-push-constants-retrofit.patch b/.patch/snapdragon_gsr/0002-push-constants-retrofit.patch deleted file mode 100644 index 7faf70bcc1..0000000000 --- a/.patch/snapdragon_gsr/0002-push-constants-retrofit.patch +++ /dev/null @@ -1,97 +0,0 @@ -diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -index 69927af..c942bbc 100644 ---- a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -+++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -@@ -34,11 +34,10 @@ precision highp int; - //////////////////////// - - #if defined(UseUniformBlock) --layout (set=0, binding = 0) uniform UniformBlock --{ -- highp vec4 ViewportInfo[1]; -+layout( push_constant ) uniform constants { -+ highp vec4 ViewportInfo; - }; --layout(set = 0, binding = 1) uniform mediump sampler2D ps0; -+layout(set = 0, binding = 0) uniform mediump sampler2D ps0; - #else - uniform highp vec4 ViewportInfo[1]; - uniform mediump sampler2D ps0; -@@ -82,21 +81,21 @@ void main() - //if ( mode!=4 && xCenter*xCenter+yCenter*yCenter<=0.4 * 0.4) - if ( mode!=4) - { -- highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo[0].zw)+vec2(-0.5,0.5)); -+ highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo.zw)+vec2(-0.5,0.5)); - highp vec2 imgCoordPixel = floor(imgCoord); -- highp vec2 coord = (imgCoordPixel*ViewportInfo[0].xy); -+ highp vec2 coord = (imgCoordPixel*ViewportInfo.xy); - vec2 pl = (imgCoord+(-imgCoordPixel)); - vec4 left = textureGather(ps0,coord, mode); - - float edgeVote = abs(left.z - left.y) + abs(color[mode] - left.y) + abs(color[mode] - left.z) ; - if(edgeVote > edgeThreshold) - { -- coord.x += ViewportInfo[0].x; -+ coord.x += ViewportInfo.x; - -- vec4 right = textureGather(ps0,coord + vec2(ViewportInfo[0].x, 0.0), mode); -+ vec4 right = textureGather(ps0,coord + vec2(ViewportInfo.x, 0.0), mode); - vec4 upDown; -- upDown.xy = textureGather(ps0,coord + vec2(0.0, -ViewportInfo[0].y),mode).wz; -- upDown.zw = textureGather(ps0,coord+ vec2(0.0, ViewportInfo[0].y), mode).yx; -+ upDown.xy = textureGather(ps0,coord + vec2(0.0, -ViewportInfo.y),mode).wz; -+ upDown.zw = textureGather(ps0,coord+ vec2(0.0, ViewportInfo.y), mode).yx; - - float mean = (left.y+left.z+right.x+right.w)*0.25; - left = left - vec4(mean); -diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -index 1f1daa6..128a348 100644 ---- a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -+++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -@@ -40,13 +40,12 @@ precision highp int; - //////////////////////// - - #if defined(UseUniformBlock) --layout (set=0, binding = 0) uniform UniformBlock --{ -- highp vec4 ViewportInfo[1]; -+layout( push_constant ) uniform constants { -+ highp vec4 ViewportInfo; - }; --layout(set = 0, binding = 1) uniform mediump sampler2D ps0; -+layout(set = 0, binding = 0) uniform mediump sampler2D ps0; - #else --uniform highp vec4 ViewportInfo[1]; -+uniform highp vec4 ViewportInfo; - uniform mediump sampler2D ps0; - #endif - -@@ -113,21 +112,21 @@ void main() - //if ( OperationMode!=4 && xCenter*xCenter+yCenter*yCenter<=0.4 * 0.4) - if ( OperationMode!=4) - { -- highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo[0].zw)+vec2(-0.5,0.5)); -+ highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo.zw)+vec2(-0.5,0.5)); - highp vec2 imgCoordPixel = floor(imgCoord); -- highp vec2 coord = (imgCoordPixel*ViewportInfo[0].xy); -+ highp vec2 coord = (imgCoordPixel*ViewportInfo.xy); - vec2 pl = (imgCoord+(-imgCoordPixel)); - vec4 left = textureGather(ps0,coord, OperationMode); - - float edgeVote = abs(left.z - left.y) + abs(color[OperationMode] - left.y) + abs(color[OperationMode] - left.z) ; - if(edgeVote > EdgeThreshold) - { -- coord.x += ViewportInfo[0].x; -+ coord.x += ViewportInfo.x; - -- vec4 right = textureGather(ps0,coord + vec2(ViewportInfo[0].x, 0.0), OperationMode); -+ vec4 right = textureGather(ps0,coord + vec2(ViewportInfo.x, 0.0), OperationMode); - vec4 upDown; -- upDown.xy = textureGather(ps0,coord + vec2(0.0, -ViewportInfo[0].y),OperationMode).wz; -- upDown.zw = textureGather(ps0,coord+ vec2(0.0, ViewportInfo[0].y), OperationMode).yx; -+ upDown.xy = textureGather(ps0,coord + vec2(0.0, -ViewportInfo.y),OperationMode).wz; -+ upDown.zw = textureGather(ps0,coord+ vec2(0.0, ViewportInfo.y), OperationMode).yx; - - float mean = (left.y+left.z+right.x+right.w)*0.25; - left = left - vec4(mean); diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index 8533984db6..7b0d8e03e9 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -150,7 +150,7 @@ foreach(SOURCE_FILE IN ITEMS ${SHADER_FILES}) OUTPUT ${SPIRV_HEADER_FILE} COMMAND - ${GLSLANGVALIDATOR} -V ${QUIET_FLAG} -DUseUniformBlock=1 ${GLSL_FLAGS} --variable-name ${SPIRV_VARIABLE_NAME} -o ${SPIRV_HEADER_FILE} ${SOURCE_FILE} --target-env ${SPIR_V_VERSION} + ${GLSLANGVALIDATOR} -V ${QUIET_FLAG} -DUseUniformBlock=1 ${GLSL_FLAGS} --variable-name ${SPIRV_VARIABLE_NAME} -o ${SPIRV_HEADER_FILE} ${SOURCE_FILE} --target-env ${SPIR_V_VERSION} --relaxed-errors MAIN_DEPENDENCY ${SOURCE_FILE} ) @@ -214,7 +214,6 @@ list(APPEND SHADER_SOURCES ${GLSL_INCLUDES}) add_custom_target(host_shaders DEPENDS ${SHADER_HEADERS} - snapdragon_gsr SOURCES ${SHADER_SOURCES} ) From 75e4260905f731bcadd62e1e2a24811ac4b7cbcc Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Jan 2026 04:11:31 +0000 Subject: [PATCH 17/45] push constant is inverse --- src/video_core/renderer_vulkan/present/sgsr.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 1f334cbc92..a41e1885e2 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -116,8 +116,8 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ // highp vec4 PushConstants viewport_con{}; - viewport_con[0] = std::bit_cast(viewport_x); - viewport_con[1] = std::bit_cast(viewport_y); + viewport_con[0] = std::bit_cast(1.f / viewport_x); + viewport_con[1] = std::bit_cast(1.f / viewport_y); viewport_con[2] = std::bit_cast(viewport_width); viewport_con[3] = std::bit_cast(viewport_height); From b43192914b1bf43407112cc5ca36bb8c7ef2d683 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Jan 2026 04:53:47 +0000 Subject: [PATCH 18/45] fix oob error --- src/android/app/src/main/res/values/arrays.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 81383e1bfc..0250066050 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -257,6 +257,7 @@ 10 11 12 + 13 From adbd725263b753b045762160abc772169f799a97 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Jan 2026 04:54:59 +0000 Subject: [PATCH 19/45] FIX FUCKING BUILD --- src/video_core/renderer_vulkan/present/sgsr.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index a41e1885e2..0e4342a443 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -95,13 +95,13 @@ void SGSR::UploadImages(Scheduler& scheduler) { VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_image, VkImageView source_image_view, VkExtent2D input_image_extent, const Common::Rectangle& crop_rect) { Images& images = m_dynamic_images[image_index]; auto const stage0_image = *images.images[0]; - auto const stage1_image = *images.images[1]; + //auto const stage1_image = *images.images[1]; auto const stage0_descriptor_set = images.descriptor_sets[0]; - auto const stage1_descriptor_set = images.descriptor_sets[1]; + //auto const stage1_descriptor_set = images.descriptor_sets[1]; auto const stage0_framebuffer = *images.framebuffers[0]; - auto const stage1_framebuffer = *images.framebuffers[1]; + //auto const stage1_framebuffer = *images.framebuffers[1]; auto const stage0_pipeline = *m_stage_pipeline[0]; - auto const stage1_pipeline = *m_stage_pipeline[1]; + //auto const stage1_pipeline = *m_stage_pipeline[1]; VkPipelineLayout pipeline_layout = *m_pipeline_layout; VkRenderPass renderpass = *m_renderpass; From baef1ffacef198f7639264da02a4220479d96b76 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Jan 2026 05:12:37 +0000 Subject: [PATCH 20/45] fix sgsr on android hopefully --- src/video_core/renderer_vulkan/present/sgsr.cpp | 5 +++++ src/video_core/renderer_vulkan/present/sgsr.h | 6 ++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 0e4342a443..f6aeb9f19c 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -23,6 +23,11 @@ SGSR::SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image : m_device{device}, m_memory_allocator{memory_allocator} , m_image_count{image_count}, m_extent{extent} { + // Not finished yet initializing at ctor time? + Initialize(); +} + +void SGSR::Initialize() { m_dynamic_images.resize(m_image_count); for (auto& images : m_dynamic_images) { images.images[0] = CreateWrappedImage(m_memory_allocator, m_extent, VK_FORMAT_R16G16B16A16_SFLOAT); diff --git a/src/video_core/renderer_vulkan/present/sgsr.h b/src/video_core/renderer_vulkan/present/sgsr.h index 14650a4143..364500a159 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.h +++ b/src/video_core/renderer_vulkan/present/sgsr.h @@ -16,11 +16,9 @@ class SGSR { public: static constexpr size_t SGSR_STAGE_COUNT = 2; explicit SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, VkExtent2D extent); - VkImageView Draw(Scheduler& scheduler, size_t image_index, VkImage source_image, - VkImageView source_image_view, VkExtent2D input_image_extent, - const Common::Rectangle& crop_rect); - + VkImageView Draw(Scheduler& scheduler, size_t image_index, VkImage source_image, VkImageView source_image_view, VkExtent2D input_image_extent, const Common::Rectangle& crop_rect); private: + void Initialize(); void UploadImages(Scheduler& scheduler); void UpdateDescriptorSets(VkImageView image_view, size_t image_index); From fff1661f6a5c5c27b9c73461471d5c519285f5c6 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Jan 2026 05:26:00 +0000 Subject: [PATCH 21/45] fix relaxed errors --- src/video_core/host_shaders/CMakeLists.txt | 2 +- src/video_core/renderer_vulkan/present/sgsr.cpp | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index 7b0d8e03e9..dc05853326 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -150,7 +150,7 @@ foreach(SOURCE_FILE IN ITEMS ${SHADER_FILES}) OUTPUT ${SPIRV_HEADER_FILE} COMMAND - ${GLSLANGVALIDATOR} -V ${QUIET_FLAG} -DUseUniformBlock=1 ${GLSL_FLAGS} --variable-name ${SPIRV_VARIABLE_NAME} -o ${SPIRV_HEADER_FILE} ${SOURCE_FILE} --target-env ${SPIR_V_VERSION} --relaxed-errors + ${GLSLANGVALIDATOR} -V ${QUIET_FLAG} -DUseUniformBlock=1 ${GLSL_FLAGS} --variable-name ${SPIRV_VARIABLE_NAME} -o ${SPIRV_HEADER_FILE} ${SOURCE_FILE} --target-env ${SPIR_V_VERSION} MAIN_DEPENDENCY ${SOURCE_FILE} ) diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index f6aeb9f19c..0567ba3905 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -24,10 +24,6 @@ SGSR::SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image , m_image_count{image_count}, m_extent{extent} { // Not finished yet initializing at ctor time? - Initialize(); -} - -void SGSR::Initialize() { m_dynamic_images.resize(m_image_count); for (auto& images : m_dynamic_images) { images.images[0] = CreateWrappedImage(m_memory_allocator, m_extent, VK_FORMAT_R16G16B16A16_SFLOAT); From f23caf03dc2426b5daa3f190cdbb9201c9a8836f Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Jan 2026 05:41:58 +0000 Subject: [PATCH 22/45] push new --- .patch/snapdragon_gsr/0001-fix-glsl.patch | 28 +++++++++---------- .../renderer_vulkan/present/sgsr.cpp | 3 +- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/.patch/snapdragon_gsr/0001-fix-glsl.patch b/.patch/snapdragon_gsr/0001-fix-glsl.patch index 794eed8a21..c45180b197 100644 --- a/.patch/snapdragon_gsr/0001-fix-glsl.patch +++ b/.patch/snapdragon_gsr/0001-fix-glsl.patch @@ -1,15 +1,14 @@ diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -index 7074999..2d322fb 100644 +index 7074999..4f76e1a 100644 --- a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -@@ -1,4 +1,5 @@ +@@ -1,4 +1,4 @@ -#version 300 es -+#version 310 es -+#extension GL_EXT_spec_constant_composites:require ++#version 460 core //============================================================================================================ // -@@ -34,11 +35,10 @@ precision highp int; +@@ -34,11 +34,10 @@ precision highp int; //////////////////////// #if defined(UseUniformBlock) @@ -20,11 +19,11 @@ index 7074999..2d322fb 100644 + highp vec4 ViewportInfo[1]; }; -layout(set = 0, binding = 1) uniform mediump sampler2D ps0; -+layout(set = 0, binding = 0) uniform mediump sampler2D ps0; ++layout(set = 0, binding = 0) uniform sampler2D ps0; #else uniform highp vec4 ViewportInfo[1]; uniform mediump sampler2D ps0; -@@ -63,9 +63,9 @@ vec2 weightY(float dx, float dy,float c, float std) +@@ -63,9 +62,9 @@ vec2 weightY(float dx, float dy,float c, float std) void main() { @@ -37,7 +36,7 @@ index 7074999..2d322fb 100644 vec4 color; if(mode == 1) -@@ -93,10 +93,13 @@ void main() +@@ -93,10 +92,13 @@ void main() { coord.x += ViewportInfo[0].x; @@ -55,17 +54,16 @@ index 7074999..2d322fb 100644 float mean = (left.y+left.z+right.x+right.w)*0.25; left = left - vec4(mean); diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -index d2df646..875cdbf 100644 +index d2df646..116c572 100644 --- a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -@@ -1,4 +1,5 @@ +@@ -1,4 +1,4 @@ -#version 300 es -+#version 310 es -+#extension GL_EXT_spec_constant_composites:require ++#version 460 core //============================================================================================================ // -@@ -40,11 +41,10 @@ precision highp int; +@@ -40,11 +40,10 @@ precision highp int; //////////////////////// #if defined(UseUniformBlock) @@ -76,11 +74,11 @@ index d2df646..875cdbf 100644 + highp vec4 ViewportInfo[1]; }; -layout(set = 0, binding = 1) uniform mediump sampler2D ps0; -+layout(set = 0, binding = 0) uniform mediump sampler2D ps0; ++layout(set = 0, binding = 0) uniform sampler2D ps0; #else uniform highp vec4 ViewportInfo[1]; uniform mediump sampler2D ps0; -@@ -124,10 +124,13 @@ void main() +@@ -124,10 +123,13 @@ void main() { coord.x += ViewportInfo[0].x; diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 0567ba3905..9f6a01a962 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -17,7 +17,7 @@ namespace Vulkan { -using PushConstants = std::array; +using PushConstants = std::array; SGSR::SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, VkExtent2D extent) : m_device{device}, m_memory_allocator{memory_allocator} @@ -65,7 +65,6 @@ SGSR::SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image .pPushConstantRanges = &range, }; m_pipeline_layout = m_device.GetLogical().CreatePipelineLayout(ci); - m_stage_pipeline[0] = CreateWrappedPipeline(m_device, m_renderpass, m_pipeline_layout, std::tie(m_vert_shader, m_stage_shader[0])); m_stage_pipeline[1] = CreateWrappedPipeline(m_device, m_renderpass, m_pipeline_layout, std::tie(m_vert_shader, m_stage_shader[1])); } From 2c90fb00a55e076d26b7c138481a77d84c9c8fd9 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Jan 2026 06:02:19 +0000 Subject: [PATCH 23/45] fix 2 --- src/video_core/host_shaders/CMakeLists.txt | 1 + src/video_core/host_shaders/sgsr1_shader.vert | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index dc05853326..c6158b4a2f 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -217,3 +217,4 @@ add_custom_target(host_shaders SOURCES ${SHADER_SOURCES} ) +#add_dependencies(host_shaders snapdragon_gsr::snapdragon_gsr) diff --git a/src/video_core/host_shaders/sgsr1_shader.vert b/src/video_core/host_shaders/sgsr1_shader.vert index 6a87a7cac0..a7453114bd 100644 --- a/src/video_core/host_shaders/sgsr1_shader.vert +++ b/src/video_core/host_shaders/sgsr1_shader.vert @@ -1,13 +1,13 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later #version 450 -layout(location = 0) out vec2 texcoord; +layout(location = 0) out highp vec4 texcoord; void main() { float x = float((gl_VertexIndex & 1) << 2); float y = float((gl_VertexIndex & 2) << 1); gl_Position = vec4(x - 1.0, y - 1.0, 0.0, 1.0); - texcoord = vec2(x, y) / 2.0; + texcoord = vec4(x, y, 0.f, 0.f) / 2.0; } From f014c23875f1ad1ed79444e1b5c15277107dc35e Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Jan 2026 06:07:04 +0000 Subject: [PATCH 24/45] new glsl shit --- .patch/snapdragon_gsr/0001-fix-glsl.patch | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.patch/snapdragon_gsr/0001-fix-glsl.patch b/.patch/snapdragon_gsr/0001-fix-glsl.patch index c45180b197..89922f49c2 100644 --- a/.patch/snapdragon_gsr/0001-fix-glsl.patch +++ b/.patch/snapdragon_gsr/0001-fix-glsl.patch @@ -1,5 +1,5 @@ diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -index 7074999..4f76e1a 100644 +index 7074999..cb1eea3 100644 --- a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag @@ -1,4 +1,4 @@ @@ -19,7 +19,7 @@ index 7074999..4f76e1a 100644 + highp vec4 ViewportInfo[1]; }; -layout(set = 0, binding = 1) uniform mediump sampler2D ps0; -+layout(set = 0, binding = 0) uniform sampler2D ps0; ++layout(set = 0, binding = 0) uniform mediump sampler2D ps0; #else uniform highp vec4 ViewportInfo[1]; uniform mediump sampler2D ps0; @@ -54,7 +54,7 @@ index 7074999..4f76e1a 100644 float mean = (left.y+left.z+right.x+right.w)*0.25; left = left - vec4(mean); diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -index d2df646..116c572 100644 +index d2df646..95d09cf 100644 --- a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag @@ -1,4 +1,4 @@ @@ -74,7 +74,7 @@ index d2df646..116c572 100644 + highp vec4 ViewportInfo[1]; }; -layout(set = 0, binding = 1) uniform mediump sampler2D ps0; -+layout(set = 0, binding = 0) uniform sampler2D ps0; ++layout(set = 0, binding = 0) uniform mediump sampler2D ps0; #else uniform highp vec4 ViewportInfo[1]; uniform mediump sampler2D ps0; From b30ace8e3a694c52c9cd0737bb93e3462a1d6226 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Jan 2026 08:21:20 +0000 Subject: [PATCH 25/45] fx --- src/video_core/host_shaders/sgsr1_shader.vert | 2 +- src/video_core/renderer_vulkan/present/sgsr.cpp | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/video_core/host_shaders/sgsr1_shader.vert b/src/video_core/host_shaders/sgsr1_shader.vert index a7453114bd..8fa7ddff73 100644 --- a/src/video_core/host_shaders/sgsr1_shader.vert +++ b/src/video_core/host_shaders/sgsr1_shader.vert @@ -8,6 +8,6 @@ layout(location = 0) out highp vec4 texcoord; void main() { float x = float((gl_VertexIndex & 1) << 2); float y = float((gl_VertexIndex & 2) << 1); - gl_Position = vec4(x - 1.0, y - 1.0, 0.0, 1.0); + gl_Position = vec4(x - 1.0f, y - 1.0f, 0.0, 1.0f); texcoord = vec4(x, y, 0.f, 0.f) / 2.0; } diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 9f6a01a962..702f960939 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -109,6 +109,8 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ const f32 input_image_width = f32(input_image_extent.width); const f32 input_image_height = f32(input_image_extent.height); + const f32 output_image_width = f32(extent.width); + const f32 output_image_height = f32(extent.height); const f32 viewport_x = crop_rect.left * input_image_width; const f32 viewport_y = crop_rect.top * input_image_height; const f32 viewport_width = (crop_rect.right - crop_rect.left) * input_image_width; @@ -116,10 +118,10 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ // highp vec4 PushConstants viewport_con{}; - viewport_con[0] = std::bit_cast(1.f / viewport_x); - viewport_con[1] = std::bit_cast(1.f / viewport_y); - viewport_con[2] = std::bit_cast(viewport_width); - viewport_con[3] = std::bit_cast(viewport_height); + viewport_con[2] = std::bit_cast(0.5f * viewport_width / output_image_width - 0.5f + viewport_x); + viewport_con[3] = std::bit_cast(0.5f * viewport_height / output_image_height - 0.5f + viewport_y); + viewport_con[0] = std::bit_cast(1.f / std::bit_cast(viewport_con[2])); + viewport_con[1] = std::bit_cast(1.f / std::bit_cast(viewport_con[3])); UploadImages(scheduler); UpdateDescriptorSets(source_image_view, image_index); From ff9aaab9ce71f7d81162d9811005982293f11bbe Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Wed, 14 Jan 2026 13:43:45 -0400 Subject: [PATCH 26/45] [renderer_vulkan, sgsr] Playing a bit with viewports --- src/video_core/renderer_vulkan/present/sgsr.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 702f960939..31ba3b4eb0 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -116,12 +116,14 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ const f32 viewport_width = (crop_rect.right - crop_rect.left) * input_image_width; const f32 viewport_height = (crop_rect.bottom - crop_rect.top) * input_image_height; - // highp vec4 + // ViewportInfo[0] = vec4(1/inputWidth, 1/inputHeight, inputWidth, inputHeight) + // .xy = pixel step size for texture sampling + // .zw = input texture dimensions for coordinate scaling PushConstants viewport_con{}; - viewport_con[2] = std::bit_cast(0.5f * viewport_width / output_image_width - 0.5f + viewport_x); - viewport_con[3] = std::bit_cast(0.5f * viewport_height / output_image_height - 0.5f + viewport_y); - viewport_con[0] = std::bit_cast(1.f / std::bit_cast(viewport_con[2])); - viewport_con[1] = std::bit_cast(1.f / std::bit_cast(viewport_con[3])); + viewport_con[0] = std::bit_cast(1.f / input_image_width); + viewport_con[1] = std::bit_cast(1.f / input_image_height); + viewport_con[2] = std::bit_cast(input_image_width); + viewport_con[3] = std::bit_cast(input_image_height); UploadImages(scheduler); UpdateDescriptorSets(source_image_view, image_index); From c15fe47868b03e00711f4a1bb3b44c203d901a64 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Wed, 14 Jan 2026 16:29:31 -0400 Subject: [PATCH 27/45] [renderer_vulkan, sgsr] Another try --- src/video_core/renderer_vulkan/present/sgsr.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 31ba3b4eb0..25953090c0 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -116,14 +116,11 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ const f32 viewport_width = (crop_rect.right - crop_rect.left) * input_image_width; const f32 viewport_height = (crop_rect.bottom - crop_rect.top) * input_image_height; - // ViewportInfo[0] = vec4(1/inputWidth, 1/inputHeight, inputWidth, inputHeight) - // .xy = pixel step size for texture sampling - // .zw = input texture dimensions for coordinate scaling PushConstants viewport_con{}; - viewport_con[0] = std::bit_cast(1.f / input_image_width); - viewport_con[1] = std::bit_cast(1.f / input_image_height); - viewport_con[2] = std::bit_cast(input_image_width); - viewport_con[3] = std::bit_cast(input_image_height); + viewport_con[0] = std::bit_cast(1.f / output_image_width); + viewport_con[1] = std::bit_cast(1.f / output_image_height); + viewport_con[2] = std::bit_cast(output_image_width); + viewport_con[3] = std::bit_cast(output_image_height); UploadImages(scheduler); UpdateDescriptorSets(source_image_view, image_index); From 046b799275c660ad5080949e1a31ff7661c758f9 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 20 Jan 2026 20:09:50 +0000 Subject: [PATCH 28/45] fix sgsr with new variant shit --- src/video_core/renderer_vulkan/present/layer.cpp | 8 ++++---- src/video_core/renderer_vulkan/present/layer.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/video_core/renderer_vulkan/present/layer.cpp b/src/video_core/renderer_vulkan/present/layer.cpp index d6c0ca082f..198fd4f468 100644 --- a/src/video_core/renderer_vulkan/present/layer.cpp +++ b/src/video_core/renderer_vulkan/present/layer.cpp @@ -64,9 +64,9 @@ Layer::Layer(const Device& device_, MemoryAllocator& memory_allocator_, Schedule CreateDescriptorPool(); CreateDescriptorSets(layout); if (filters.get_scaling_filter() == Settings::ScalingFilter::Fsr) { - fsr.emplace(device, memory_allocator, image_count, output_size); + sr_filter.emplace(device, memory_allocator, image_count, output_size); } else if (filters.get_scaling_filter() == Settings::ScalingFilter::Sgsr) { - sgsr.emplace(device, memory_allocator, image_count, output_size); + sr_filter.emplace(device, memory_allocator, image_count, output_size); } } @@ -117,10 +117,10 @@ void Layer::ConfigureDraw(PresentPushConstants* out_push_constants, .height = scaled_height, }; - if (fsr) { + if (auto* fsr = std::get_if(&sr_filter)) { source_image_view = fsr->Draw(scheduler, image_index, source_image, source_image_view, render_extent, crop_rect); crop_rect = {0, 0, 1, 1}; - } else if (sgsr) { + } else if (auto* sgsr = std::get_if(&sr_filter)) { source_image_view = sgsr->Draw(scheduler, image_index, source_image, source_image_view, render_extent, crop_rect); crop_rect = {0, 0, 1, 1}; } diff --git a/src/video_core/renderer_vulkan/present/layer.h b/src/video_core/renderer_vulkan/present/layer.h index 6de7a66087..47a6a69218 100644 --- a/src/video_core/renderer_vulkan/present/layer.h +++ b/src/video_core/renderer_vulkan/present/layer.h @@ -13,6 +13,7 @@ #include "video_core/host1x/gpu_device_memory_manager.h" #include "video_core/vulkan_common/vulkan_wrapper.h" #include "video_core/renderer_vulkan/present/fsr.h" +#include "video_core/renderer_vulkan/present/sgsr.h" #include "video_core/renderer_vulkan/present/fxaa.h" #include "video_core/renderer_vulkan/present/smaa.h" @@ -95,8 +96,7 @@ private: Settings::AntiAliasing anti_alias_setting{}; std::variant anti_alias{}; - std::optional fsr{}; - std::unique_ptr sgsr{}; + std::variant sr_filter{}; std::vector resource_ticks{}; }; From c963fe8a53fdbf279cdc591786ec61a5bd5bb615 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 20 Jan 2026 21:25:44 +0000 Subject: [PATCH 29/45] fix sgsr --- src/video_core/renderer_vulkan/present/layer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/video_core/renderer_vulkan/present/layer.cpp b/src/video_core/renderer_vulkan/present/layer.cpp index 198fd4f468..b988e0862b 100644 --- a/src/video_core/renderer_vulkan/present/layer.cpp +++ b/src/video_core/renderer_vulkan/present/layer.cpp @@ -117,10 +117,10 @@ void Layer::ConfigureDraw(PresentPushConstants* out_push_constants, .height = scaled_height, }; - if (auto* fsr = std::get_if(&sr_filter)) { + if (auto* fsr = std::get_if(&sr_filter)) { source_image_view = fsr->Draw(scheduler, image_index, source_image, source_image_view, render_extent, crop_rect); crop_rect = {0, 0, 1, 1}; - } else if (auto* sgsr = std::get_if(&sr_filter)) { + } else if (auto* sgsr = std::get_if(&sr_filter)) { source_image_view = sgsr->Draw(scheduler, image_index, source_image, source_image_view, render_extent, crop_rect); crop_rect = {0, 0, 1, 1}; } From b5cf2eaffd97b443399ca4266f6ae7f9fe32f6bc Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 24 Jan 2026 08:21:27 +0000 Subject: [PATCH 30/45] fixup sgsr for realsies --- .patch/sgsr/0001-fix-glsl.patch | 82 ++++++++++++++++ .patch/snapdragon_gsr/0001-fix-glsl.patch | 97 ------------------- CMakeLists.txt | 2 +- src/video_core/host_shaders/CMakeLists.txt | 6 +- .../renderer_vulkan/present/sgsr.cpp | 10 +- 5 files changed, 92 insertions(+), 105 deletions(-) create mode 100644 .patch/sgsr/0001-fix-glsl.patch delete mode 100644 .patch/snapdragon_gsr/0001-fix-glsl.patch diff --git a/.patch/sgsr/0001-fix-glsl.patch b/.patch/sgsr/0001-fix-glsl.patch new file mode 100644 index 0000000000..15a886dddd --- /dev/null +++ b/.patch/sgsr/0001-fix-glsl.patch @@ -0,0 +1,82 @@ +diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +index 7074999..b465126 100644 +--- a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag ++++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +@@ -1,4 +1,4 @@ +-#version 300 es ++#version 460 core + + //============================================================================================================ + // +@@ -34,11 +34,10 @@ precision highp int; + //////////////////////// + + #if defined(UseUniformBlock) +-layout (set=0, binding = 0) uniform UniformBlock +-{ +- highp vec4 ViewportInfo[1]; ++layout( push_constant ) uniform constants { ++ highp vec4 ViewportInfo[1]; + }; +-layout(set = 0, binding = 1) uniform mediump sampler2D ps0; ++layout(set = 0, binding = 0) uniform mediump sampler2D ps0; + #else + uniform highp vec4 ViewportInfo[1]; + uniform mediump sampler2D ps0; +@@ -63,15 +62,19 @@ vec2 weightY(float dx, float dy,float c, float std) + + void main() + { +- int mode = OperationMode; +- float edgeThreshold = EdgeThreshold; +- float edgeSharpness = EdgeSharpness; ++ const int mode = OperationMode; ++ const float edgeThreshold = EdgeThreshold; ++ const float edgeSharpness = EdgeSharpness; ++ ++ vec2 full_texsize = textureSize(ps0, 0); ++ vec2 recp_texsize = 1.0 / full_texsize; ++ vec2 resize_factor = ViewportInfo[0].zw / full_texsize; + + vec4 color; + if(mode == 1) +- color.xyz = textureLod(ps0,in_TEXCOORD0.xy,0.0).xyz; ++ color.xyz = textureLod(ps0, in_TEXCOORD0.xy * resize_factor, 0.0).xyz; + else +- color.xyzw = textureLod(ps0,in_TEXCOORD0.xy,0.0).xyzw; ++ color.xyzw = textureLod(ps0, in_TEXCOORD0.xy * resize_factor, 0.0).xyzw; + + highp float xCenter; + xCenter = abs(in_TEXCOORD0.x+-0.5); +@@ -82,21 +85,24 @@ void main() + //if ( mode!=4 && xCenter*xCenter+yCenter*yCenter<=0.4 * 0.4) + if ( mode!=4) + { +- highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo[0].zw)+vec2(-0.5,0.5)); ++ highp vec2 imgCoord = ((in_TEXCOORD0.xy * ViewportInfo[0].zw) + vec2(-0.5,0.5)); + highp vec2 imgCoordPixel = floor(imgCoord); +- highp vec2 coord = (imgCoordPixel*ViewportInfo[0].xy); +- vec2 pl = (imgCoord+(-imgCoordPixel)); +- vec4 left = textureGather(ps0,coord, mode); ++ highp vec2 coord = imgCoordPixel * ViewportInfo[0].xy; ++ vec2 pl = imgCoord - imgCoordPixel; ++ vec4 left = textureGather(ps0, coord * resize_factor, mode); + + float edgeVote = abs(left.z - left.y) + abs(color[mode] - left.y) + abs(color[mode] - left.z) ; + if(edgeVote > edgeThreshold) + { + coord.x += ViewportInfo[0].x; + +- vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), mode); ++ highp vec2 IR_highp_vec2_0 = coord + vec2(ViewportInfo[0].x, 0.0); ++ vec4 right = textureGather(ps0, IR_highp_vec2_0 * resize_factor, mode); + vec4 upDown; +- upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),mode).wz; +- upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), mode).yx; ++ highp vec2 IR_highp_vec2_1 = coord + vec2(0.0, -ViewportInfo[0].y); ++ upDown.xy = textureGather(ps0, IR_highp_vec2_1 * resize_factor, mode).wz; ++ highp vec2 IR_highp_vec2_2 = coord + vec2(0.0, ViewportInfo[0].y); ++ upDown.zw = textureGather(ps0, IR_highp_vec2_2 * resize_factor, mode).yx; + + float mean = (left.y+left.z+right.x+right.w)*0.25; + left = left - vec4(mean); diff --git a/.patch/snapdragon_gsr/0001-fix-glsl.patch b/.patch/snapdragon_gsr/0001-fix-glsl.patch deleted file mode 100644 index 89922f49c2..0000000000 --- a/.patch/snapdragon_gsr/0001-fix-glsl.patch +++ /dev/null @@ -1,97 +0,0 @@ -diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -index 7074999..cb1eea3 100644 ---- a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -+++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -@@ -1,4 +1,4 @@ --#version 300 es -+#version 460 core - - //============================================================================================================ - // -@@ -34,11 +34,10 @@ precision highp int; - //////////////////////// - - #if defined(UseUniformBlock) --layout (set=0, binding = 0) uniform UniformBlock --{ -- highp vec4 ViewportInfo[1]; -+layout( push_constant ) uniform constants { -+ highp vec4 ViewportInfo[1]; - }; --layout(set = 0, binding = 1) uniform mediump sampler2D ps0; -+layout(set = 0, binding = 0) uniform mediump sampler2D ps0; - #else - uniform highp vec4 ViewportInfo[1]; - uniform mediump sampler2D ps0; -@@ -63,9 +62,9 @@ vec2 weightY(float dx, float dy,float c, float std) - - void main() - { -- int mode = OperationMode; -- float edgeThreshold = EdgeThreshold; -- float edgeSharpness = EdgeSharpness; -+ const int mode = OperationMode; -+ const float edgeThreshold = EdgeThreshold; -+ const float edgeSharpness = EdgeSharpness; - - vec4 color; - if(mode == 1) -@@ -93,10 +92,13 @@ void main() - { - coord.x += ViewportInfo[0].x; - -- vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), mode); -+ highp vec2 IR_highp_vec2_0 = vec2(ViewportInfo[0].x, 0.0); -+ vec4 right = textureGather(ps0,coord + IR_highp_vec2_0, mode); - vec4 upDown; -- upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),mode).wz; -- upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), mode).yx; -+ highp vec2 IR_highp_vec2_1 = vec2(0.0, -ViewportInfo[0].y); -+ upDown.xy = textureGather(ps0,coord + IR_highp_vec2_1,mode).wz; -+ highp vec2 IR_highp_vec2_2 = vec2(0.0, ViewportInfo[0].y); -+ upDown.zw = textureGather(ps0,coord+ IR_highp_vec2_2, mode).yx; - - float mean = (left.y+left.z+right.x+right.w)*0.25; - left = left - vec4(mean); -diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -index d2df646..95d09cf 100644 ---- a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -+++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -@@ -1,4 +1,4 @@ --#version 300 es -+#version 460 core - - //============================================================================================================ - // -@@ -40,11 +40,10 @@ precision highp int; - //////////////////////// - - #if defined(UseUniformBlock) --layout (set=0, binding = 0) uniform UniformBlock --{ -- highp vec4 ViewportInfo[1]; -+layout( push_constant ) uniform constants { -+ highp vec4 ViewportInfo[1]; - }; --layout(set = 0, binding = 1) uniform mediump sampler2D ps0; -+layout(set = 0, binding = 0) uniform mediump sampler2D ps0; - #else - uniform highp vec4 ViewportInfo[1]; - uniform mediump sampler2D ps0; -@@ -124,10 +123,13 @@ void main() - { - coord.x += ViewportInfo[0].x; - -- vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), OperationMode); -+ highp vec2 IR_highp_vec2_0 = vec2(ViewportInfo[0].x, 0.0); -+ vec4 right = textureGather(ps0,coord + IR_highp_vec2_0, OperationMode); - vec4 upDown; -- upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),OperationMode).wz; -- upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), OperationMode).yx; -+ highp vec2 IR_highp_vec2_1 = vec2(0.0, -ViewportInfo[0].y); -+ upDown.xy = textureGather(ps0,coord + IR_highp_vec2_1,OperationMode).wz; -+ highp vec2 IR_highp_vec2_2 = vec2(0.0, ViewportInfo[0].y); -+ upDown.zw = textureGather(ps0,coord+ IR_highp_vec2_2, OperationMode).yx; - - float mean = (left.y+left.z+right.x+right.w)*0.25; - left = left - vec4(mean); diff --git a/CMakeLists.txt b/CMakeLists.txt index c071c6e1f5..75f02b5d09 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -233,7 +233,7 @@ endif() option(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" ${DEFAULT_YUZU_USE_BUNDLED_OPENSSL}) -AddJsonPackage(snapdragon_gsr) +AddJsonPackage(sgsr) # TODO(crueter): CPM this if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL) diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index c6158b4a2f..f2b4846db8 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -79,8 +79,8 @@ set(SHADER_FILES # Snapdragon Game Super Resolution ${CMAKE_CURRENT_SOURCE_DIR}/sgsr1_shader.vert - ${snapdragon_gsr_SOURCE_DIR}/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag - ${snapdragon_gsr_SOURCE_DIR}/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag + ${sgsr_SOURCE_DIR}/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag + ${sgsr_SOURCE_DIR}/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag ) if (PLATFORM_HAIKU) @@ -217,4 +217,4 @@ add_custom_target(host_shaders SOURCES ${SHADER_SOURCES} ) -#add_dependencies(host_shaders snapdragon_gsr::snapdragon_gsr) +#add_dependencies(host_shaders sgsr::sgsr) diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 25953090c0..804107cfda 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -116,11 +116,13 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ const f32 viewport_width = (crop_rect.right - crop_rect.left) * input_image_width; const f32 viewport_height = (crop_rect.bottom - crop_rect.top) * input_image_height; + // p = (tex * viewport) / input = [0,n] (normalized texcoords) + // p * input = [0,1024], [0,768] PushConstants viewport_con{}; - viewport_con[0] = std::bit_cast(1.f / output_image_width); - viewport_con[1] = std::bit_cast(1.f / output_image_height); - viewport_con[2] = std::bit_cast(output_image_width); - viewport_con[3] = std::bit_cast(output_image_height); + viewport_con[0] = std::bit_cast(1.f / viewport_width); + viewport_con[1] = std::bit_cast(1.f / viewport_height); + viewport_con[2] = std::bit_cast(viewport_width); + viewport_con[3] = std::bit_cast(viewport_height); UploadImages(scheduler); UpdateDescriptorSets(source_image_view, image_index); From cb822e68fc3a07f3556a60e021282c6fccec5576 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 24 Jan 2026 08:21:44 +0000 Subject: [PATCH 31/45] fix license --- src/video_core/renderer_opengl/gl_blit_screen.cpp | 2 +- src/video_core/renderer_vulkan/present/sgsr.cpp | 2 +- src/video_core/renderer_vulkan/present/sgsr.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/video_core/renderer_opengl/gl_blit_screen.cpp b/src/video_core/renderer_opengl/gl_blit_screen.cpp index b03fc3ecbd..c839d05c9a 100644 --- a/src/video_core/renderer_opengl/gl_blit_screen.cpp +++ b/src/video_core/renderer_opengl/gl_blit_screen.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 Torzu Emulator Project diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 804107cfda..457b1ddb02 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include "common/common_types.h" diff --git a/src/video_core/renderer_vulkan/present/sgsr.h b/src/video_core/renderer_vulkan/present/sgsr.h index 364500a159..ca48e4998d 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.h +++ b/src/video_core/renderer_vulkan/present/sgsr.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once From 00a657226107dbccfbf00a5f196c1c9a6377228a Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 24 Jan 2026 08:46:36 +0000 Subject: [PATCH 32/45] Add SGSR edge variant --- .patch/sgsr/0001-fix-glsl.patch | 75 ++++++++++++++++++- docs/user/Graphics.md | 1 + .../app/src/main/res/values/arrays.xml | 1 + .../app/src/main/res/values/strings.xml | 3 +- src/common/settings_enums.h | 2 +- src/qt_common/config/shared_translation.cpp | 1 + src/qt_common/config/shared_translation.h | 1 + src/video_core/host_shaders/sgsr1_shader.vert | 4 +- .../renderer_opengl/gl_blit_screen.cpp | 1 + .../renderer_vulkan/present/layer.cpp | 4 +- .../renderer_vulkan/present/sgsr.cpp | 31 ++------ src/video_core/renderer_vulkan/present/sgsr.h | 5 +- .../renderer_vulkan/vk_blit_screen.cpp | 1 + 13 files changed, 97 insertions(+), 33 deletions(-) diff --git a/.patch/sgsr/0001-fix-glsl.patch b/.patch/sgsr/0001-fix-glsl.patch index 15a886dddd..37bb823572 100644 --- a/.patch/sgsr/0001-fix-glsl.patch +++ b/.patch/sgsr/0001-fix-glsl.patch @@ -1,5 +1,5 @@ diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -index 7074999..b465126 100644 +index 7074999..9e2122e 100644 --- a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag @@ -1,4 +1,4 @@ @@ -8,7 +8,7 @@ index 7074999..b465126 100644 //============================================================================================================ // -@@ -34,11 +34,10 @@ precision highp int; +@@ -34,17 +34,16 @@ precision highp int; //////////////////////// #if defined(UseUniformBlock) @@ -23,6 +23,13 @@ index 7074999..b465126 100644 #else uniform highp vec4 ViewportInfo[1]; uniform mediump sampler2D ps0; + #endif + +-layout(location=0) in highp vec4 in_TEXCOORD0; ++layout(location=0) in highp vec2 in_TEXCOORD0; + layout(location=0) out vec4 out_Target0; + + float fastLanczos2(float x) @@ -63,15 +62,19 @@ vec2 weightY(float dx, float dy,float c, float std) void main() @@ -80,3 +87,67 @@ index 7074999..b465126 100644 float mean = (left.y+left.z+right.x+right.w)*0.25; left = left - vec4(mean); +diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +index d2df646..91a8d4d 100644 +--- a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag ++++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +@@ -1,4 +1,4 @@ +-#version 300 es ++#version 460 core + + //============================================================================================================ + // +@@ -50,7 +50,7 @@ uniform highp vec4 ViewportInfo[1]; + uniform mediump sampler2D ps0; + #endif + +-layout(location=0) in highp vec4 in_TEXCOORD0; ++layout(location=0) in highp vec2 in_TEXCOORD0; + layout(location=0) out vec4 out_Target0; + + float fastLanczos2(float x) +@@ -98,11 +98,15 @@ vec2 edgeDirection(vec4 left, vec4 right) + + void main() + { ++ vec2 full_texsize = textureSize(ps0, 0); ++ vec2 recp_texsize = 1.0 / full_texsize; ++ vec2 resize_factor = ViewportInfo[0].zw / full_texsize; ++ + vec4 color; + if(OperationMode == 1) +- color.xyz = textureLod(ps0,in_TEXCOORD0.xy,0.0).xyz; ++ color.xyz = textureLod(ps0,in_TEXCOORD0.xy * resize_factor,0.0).xyz; + else +- color.xyzw = textureLod(ps0,in_TEXCOORD0.xy,0.0).xyzw; ++ color.xyzw = textureLod(ps0,in_TEXCOORD0.xy * resize_factor,0.0).xyzw; + + highp float xCenter; + xCenter = abs(in_TEXCOORD0.x+-0.5); +@@ -116,18 +120,21 @@ void main() + highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo[0].zw)+vec2(-0.5,0.5)); + highp vec2 imgCoordPixel = floor(imgCoord); + highp vec2 coord = (imgCoordPixel*ViewportInfo[0].xy); +- vec2 pl = (imgCoord+(-imgCoordPixel)); +- vec4 left = textureGather(ps0,coord, OperationMode); ++ vec2 pl = imgCoord - imgCoordPixel; ++ vec4 left = textureGather(ps0, coord * resize_factor, OperationMode); + + float edgeVote = abs(left.z - left.y) + abs(color[OperationMode] - left.y) + abs(color[OperationMode] - left.z) ; + if(edgeVote > EdgeThreshold) + { + coord.x += ViewportInfo[0].x; + +- vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), OperationMode); ++ highp vec2 IR_highp_vec2_0 = coord + vec2(ViewportInfo[0].x, 0.0); ++ vec4 right = textureGather(ps0, IR_highp_vec2_0 * resize_factor, OperationMode); + vec4 upDown; +- upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),OperationMode).wz; +- upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), OperationMode).yx; ++ highp vec2 IR_highp_vec2_1 = coord + vec2(0.0, -ViewportInfo[0].y); ++ upDown.xy = textureGather(ps0, IR_highp_vec2_1 * resize_factor, OperationMode).wz; ++ highp vec2 IR_highp_vec2_2 = coord + vec2(0.0, ViewportInfo[0].y); ++ upDown.zw = textureGather(ps0, IR_highp_vec2_2 * resize_factor, OperationMode).yx; + + float mean = (left.y+left.z+right.x+right.w)*0.25; + left = left - vec4(mean); diff --git a/docs/user/Graphics.md b/docs/user/Graphics.md index 49ee0e68b2..4d3b1da3c7 100644 --- a/docs/user/Graphics.md +++ b/docs/user/Graphics.md @@ -47,6 +47,7 @@ Various graphical filters exist - each of them aimed at a specific target/image - **SGSR**: Uses Snapdragon Studios Game Super Resolution to enhance image quality (similar to FSR, but for Adreno devices). - **Pros**: Optimized for Adreno devices. - **Cons**: Doesn't play nicely with non-Adreno devices. +- **SGSR Edge**: Almost the same pipeline as SGSR, but with improved edge detection. ### Anisotropy values diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 0250066050..7d00dd23ad 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -241,6 +241,7 @@ @string/scaling_filter_mitchell @string/scaling_filter_spline1 @string/scaling_filter_sgsr + @string/scaling_filter_sgsr_edge diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 0e8807b405..399173cc3e 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -1076,7 +1076,8 @@ B-Spline Mitchell MMPX - Snapdragon Game Super Resolution + Snapdragon GSR + Snapdragon GSR EdgeDir None diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h index 389b16608f..60a194a35d 100644 --- a/src/common/settings_enums.h +++ b/src/common/settings_enums.h @@ -143,7 +143,7 @@ ENUM(ConfirmStop, Ask_Always, Ask_Based_On_Game, Ask_Never); ENUM(FullscreenMode, Borderless, Exclusive); ENUM(NvdecEmulation, Off, Cpu, Gpu); ENUM(ResolutionSetup, Res1_4X, Res1_2X, Res3_4X, Res1X, Res5_4X, Res3_2X, Res2X, Res3X, Res4X, Res5X, Res6X, Res7X, Res8X); -ENUM(ScalingFilter, NearestNeighbor, Bilinear, Bicubic, Gaussian, Lanczos, ScaleForce, Fsr, Area, ZeroTangent, BSpline, Mitchell, Spline1, Mmpx, Sgsr, MaxEnum); +ENUM(ScalingFilter, NearestNeighbor, Bilinear, Bicubic, Gaussian, Lanczos, ScaleForce, Fsr, Area, ZeroTangent, BSpline, Mitchell, Spline1, Mmpx, Sgsr, SgsrEdge, MaxEnum); ENUM(AntiAliasing, None, Fxaa, Smaa, MaxEnum); ENUM(AspectRatio, R16_9, R4_3, R21_9, R16_10, Stretch); ENUM(ConsoleMode, Handheld, Docked); diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index d925e71561..6e7966a84c 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -493,6 +493,7 @@ std::unique_ptr ComboboxEnumeration(QObject* parent) { PAIR(ScalingFilter, Mitchell, tr("Mitchell")), PAIR(ScalingFilter, Spline1, tr("Spline-1")), PAIR(ScalingFilter, Sgsr, tr("Snapdragon Game Super Resolution")), + PAIR(ScalingFilter, SgsrEdge, tr("Snapdragon Game Super Resolution EdgeDir")), }}); translations->insert({Settings::EnumMetadata::Index(), { diff --git a/src/qt_common/config/shared_translation.h b/src/qt_common/config/shared_translation.h index edadf5eb9b..c34b5162c4 100644 --- a/src/qt_common/config/shared_translation.h +++ b/src/qt_common/config/shared_translation.h @@ -54,6 +54,7 @@ static const std::map scaling_filter_texts_map {Settings::ScalingFilter::Area, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Area"))}, {Settings::ScalingFilter::Mmpx, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "MMPX"))}, {Settings::ScalingFilter::Sgsr, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "SGSR"))}, + {Settings::ScalingFilter::SgsrEdge, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "SGSR EdgeDir"))}, }; static const std::map use_docked_mode_texts_map = { diff --git a/src/video_core/host_shaders/sgsr1_shader.vert b/src/video_core/host_shaders/sgsr1_shader.vert index 8fa7ddff73..00649312fb 100644 --- a/src/video_core/host_shaders/sgsr1_shader.vert +++ b/src/video_core/host_shaders/sgsr1_shader.vert @@ -3,11 +3,11 @@ #version 450 -layout(location = 0) out highp vec4 texcoord; +layout(location = 0) out highp vec2 texcoord; void main() { float x = float((gl_VertexIndex & 1) << 2); float y = float((gl_VertexIndex & 2) << 1); gl_Position = vec4(x - 1.0f, y - 1.0f, 0.0, 1.0f); - texcoord = vec4(x, y, 0.f, 0.f) / 2.0; + texcoord = vec2(x, y) / 2.0; } diff --git a/src/video_core/renderer_opengl/gl_blit_screen.cpp b/src/video_core/renderer_opengl/gl_blit_screen.cpp index c839d05c9a..23e5eb7481 100644 --- a/src/video_core/renderer_opengl/gl_blit_screen.cpp +++ b/src/video_core/renderer_opengl/gl_blit_screen.cpp @@ -116,6 +116,7 @@ void BlitScreen::CreateWindowAdapt() { break; case Settings::ScalingFilter::Fsr: case Settings::ScalingFilter::Sgsr: + case Settings::ScalingFilter::SgsrEdge: case Settings::ScalingFilter::Bilinear: default: window_adapt = MakeBilinear(device); diff --git a/src/video_core/renderer_vulkan/present/layer.cpp b/src/video_core/renderer_vulkan/present/layer.cpp index b988e0862b..e20473d2af 100644 --- a/src/video_core/renderer_vulkan/present/layer.cpp +++ b/src/video_core/renderer_vulkan/present/layer.cpp @@ -66,7 +66,9 @@ Layer::Layer(const Device& device_, MemoryAllocator& memory_allocator_, Schedule if (filters.get_scaling_filter() == Settings::ScalingFilter::Fsr) { sr_filter.emplace(device, memory_allocator, image_count, output_size); } else if (filters.get_scaling_filter() == Settings::ScalingFilter::Sgsr) { - sr_filter.emplace(device, memory_allocator, image_count, output_size); + sr_filter.emplace(device, memory_allocator, image_count, output_size, false); + } else if (filters.get_scaling_filter() == Settings::ScalingFilter::SgsrEdge) { + sr_filter.emplace(device, memory_allocator, image_count, output_size, true); } } diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 457b1ddb02..e4cb5dbb4c 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -19,29 +19,27 @@ namespace Vulkan { using PushConstants = std::array; -SGSR::SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, VkExtent2D extent) +SGSR::SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, VkExtent2D extent, bool edge_dir) : m_device{device}, m_memory_allocator{memory_allocator} , m_image_count{image_count}, m_extent{extent} + , m_edge_dir{edge_dir} { // Not finished yet initializing at ctor time? m_dynamic_images.resize(m_image_count); for (auto& images : m_dynamic_images) { images.images[0] = CreateWrappedImage(m_memory_allocator, m_extent, VK_FORMAT_R16G16B16A16_SFLOAT); - images.images[1] = CreateWrappedImage(m_memory_allocator, m_extent, VK_FORMAT_R16G16B16A16_SFLOAT); images.image_views[0] = CreateWrappedImageView(m_device, images.images[0], VK_FORMAT_R16G16B16A16_SFLOAT); - images.image_views[1] = CreateWrappedImageView(m_device, images.images[1], VK_FORMAT_R16G16B16A16_SFLOAT); } m_renderpass = CreateWrappedRenderPass(m_device, VK_FORMAT_R16G16B16A16_SFLOAT); - for (auto& images : m_dynamic_images) { + for (auto& images : m_dynamic_images) images.framebuffers[0] = CreateWrappedFramebuffer(m_device, m_renderpass, images.image_views[0], m_extent); - images.framebuffers[1] = CreateWrappedFramebuffer(m_device, m_renderpass, images.image_views[1], m_extent); - } m_sampler = CreateBilinearSampler(m_device); m_vert_shader = BuildShader(m_device, SGSR1_SHADER_VERT_SPV); - m_stage_shader[0] = BuildShader(m_device, SGSR1_SHADER_MOBILE_FRAG_SPV); - m_stage_shader[1] = BuildShader(m_device, SGSR1_SHADER_MOBILE_EDGE_DIRECTION_FRAG_SPV); + m_stage_shader[0] = m_edge_dir + ? BuildShader(m_device, SGSR1_SHADER_MOBILE_EDGE_DIRECTION_FRAG_SPV) + : BuildShader(m_device, SGSR1_SHADER_MOBILE_FRAG_SPV); // 2 descriptors, 2 descriptor sets per invocation m_descriptor_pool = CreateWrappedDescriptorPool(m_device, 2 * m_image_count, 2 * m_image_count); m_descriptor_set_layout = CreateWrappedDescriptorSetLayout(m_device, {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER}); @@ -66,14 +64,13 @@ SGSR::SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image }; m_pipeline_layout = m_device.GetLogical().CreatePipelineLayout(ci); m_stage_pipeline[0] = CreateWrappedPipeline(m_device, m_renderpass, m_pipeline_layout, std::tie(m_vert_shader, m_stage_shader[0])); - m_stage_pipeline[1] = CreateWrappedPipeline(m_device, m_renderpass, m_pipeline_layout, std::tie(m_vert_shader, m_stage_shader[1])); } void SGSR::UpdateDescriptorSets(VkImageView image_view, size_t image_index) { Images& images = m_dynamic_images[image_index]; std::vector image_infos; std::vector updates; - image_infos.reserve(2); + image_infos.reserve(1); updates.push_back(CreateWriteDescriptorSet(image_infos, *m_sampler, image_view, images.descriptor_sets[0], 0)); updates.push_back(CreateWriteDescriptorSet(image_infos, *m_sampler, *images.image_views[0], images.descriptor_sets[1], 0)); m_device.GetLogical().UpdateDescriptorSets(updates, {}); @@ -84,7 +81,6 @@ void SGSR::UploadImages(Scheduler& scheduler) { scheduler.Record([&](vk::CommandBuffer cmdbuf) { for (auto& image : m_dynamic_images) { ClearColorImage(cmdbuf, *image.images[0]); - ClearColorImage(cmdbuf, *image.images[1]); } }); scheduler.Finish(); @@ -95,13 +91,9 @@ void SGSR::UploadImages(Scheduler& scheduler) { VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_image, VkImageView source_image_view, VkExtent2D input_image_extent, const Common::Rectangle& crop_rect) { Images& images = m_dynamic_images[image_index]; auto const stage0_image = *images.images[0]; - //auto const stage1_image = *images.images[1]; auto const stage0_descriptor_set = images.descriptor_sets[0]; - //auto const stage1_descriptor_set = images.descriptor_sets[1]; auto const stage0_framebuffer = *images.framebuffers[0]; - //auto const stage1_framebuffer = *images.framebuffers[1]; auto const stage0_pipeline = *m_stage_pipeline[0]; - //auto const stage1_pipeline = *m_stage_pipeline[1]; VkPipelineLayout pipeline_layout = *m_pipeline_layout; VkRenderPass renderpass = *m_renderpass; @@ -138,16 +130,7 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ cmdbuf.Draw(3, 1, 0, 0); cmdbuf.EndRenderPass(); TransitionImageLayout(cmdbuf, stage0_image, VK_IMAGE_LAYOUT_GENERAL); - // TransitionImageLayout(cmdbuf, stage1_image, VK_IMAGE_LAYOUT_GENERAL); - // BeginRenderPass(cmdbuf, renderpass, stage1_framebuffer, extent); - // cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, stage1_pipeline); - // cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, stage1_descriptor_set, {}); - // cmdbuf.PushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, viewport_con); - // cmdbuf.Draw(3, 1, 0, 0); - // cmdbuf.EndRenderPass(); - // TransitionImageLayout(cmdbuf, stage1_image, VK_IMAGE_LAYOUT_GENERAL); }); - //return *images.image_views[1]; return *images.image_views[0]; } diff --git a/src/video_core/renderer_vulkan/present/sgsr.h b/src/video_core/renderer_vulkan/present/sgsr.h index ca48e4998d..d6362c361d 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.h +++ b/src/video_core/renderer_vulkan/present/sgsr.h @@ -14,8 +14,8 @@ class Scheduler; class SGSR { public: - static constexpr size_t SGSR_STAGE_COUNT = 2; - explicit SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, VkExtent2D extent); + static constexpr size_t SGSR_STAGE_COUNT = 1; + explicit SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, VkExtent2D extent, bool edge_dir); VkImageView Draw(Scheduler& scheduler, size_t image_index, VkImage source_image, VkImageView source_image_view, VkExtent2D input_image_extent, const Common::Rectangle& crop_rect); private: void Initialize(); @@ -44,6 +44,7 @@ private: }; std::vector m_dynamic_images; bool m_images_ready{}; + bool m_edge_dir{}; }; } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp index c408928342..57f096db79 100644 --- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp +++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp @@ -78,6 +78,7 @@ void BlitScreen::SetWindowAdaptPass() { break; case Settings::ScalingFilter::Fsr: case Settings::ScalingFilter::Sgsr: + case Settings::ScalingFilter::SgsrEdge: case Settings::ScalingFilter::Bilinear: default: window_adapt = MakeBilinear(device, swapchain_view_format); From 9fcda5ff14431bef4058e93f589cf6e3ce267f95 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 24 Jan 2026 09:01:32 +0000 Subject: [PATCH 33/45] edgedir fix --- .patch/sgsr/0001-fix-glsl.patch | 21 +++++++++++++++---- .../renderer_vulkan/present/sgsr.cpp | 3 +-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.patch/sgsr/0001-fix-glsl.patch b/.patch/sgsr/0001-fix-glsl.patch index 37bb823572..3fd8c531a1 100644 --- a/.patch/sgsr/0001-fix-glsl.patch +++ b/.patch/sgsr/0001-fix-glsl.patch @@ -88,7 +88,7 @@ index 7074999..9e2122e 100644 float mean = (left.y+left.z+right.x+right.w)*0.25; left = left - vec4(mean); diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -index d2df646..91a8d4d 100644 +index d2df646..3e4f5cd 100644 --- a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag @@ -1,4 +1,4 @@ @@ -97,7 +97,20 @@ index d2df646..91a8d4d 100644 //============================================================================================================ // -@@ -50,7 +50,7 @@ uniform highp vec4 ViewportInfo[1]; +@@ -40,17 +40,16 @@ precision highp int; + //////////////////////// + + #if defined(UseUniformBlock) +-layout (set=0, binding = 0) uniform UniformBlock +-{ +- highp vec4 ViewportInfo[1]; ++layout( push_constant ) uniform constants { ++ highp vec4 ViewportInfo[1]; + }; +-layout(set = 0, binding = 1) uniform mediump sampler2D ps0; ++layout(set = 0, binding = 0) uniform mediump sampler2D ps0; + #else + uniform highp vec4 ViewportInfo[1]; uniform mediump sampler2D ps0; #endif @@ -106,7 +119,7 @@ index d2df646..91a8d4d 100644 layout(location=0) out vec4 out_Target0; float fastLanczos2(float x) -@@ -98,11 +98,15 @@ vec2 edgeDirection(vec4 left, vec4 right) +@@ -98,11 +97,15 @@ vec2 edgeDirection(vec4 left, vec4 right) void main() { @@ -124,7 +137,7 @@ index d2df646..91a8d4d 100644 highp float xCenter; xCenter = abs(in_TEXCOORD0.x+-0.5); -@@ -116,18 +120,21 @@ void main() +@@ -116,18 +119,21 @@ void main() highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo[0].zw)+vec2(-0.5,0.5)); highp vec2 imgCoordPixel = floor(imgCoord); highp vec2 coord = (imgCoordPixel*ViewportInfo[0].xy); diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index e4cb5dbb4c..3dda457b7f 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -41,7 +41,7 @@ SGSR::SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image ? BuildShader(m_device, SGSR1_SHADER_MOBILE_EDGE_DIRECTION_FRAG_SPV) : BuildShader(m_device, SGSR1_SHADER_MOBILE_FRAG_SPV); // 2 descriptors, 2 descriptor sets per invocation - m_descriptor_pool = CreateWrappedDescriptorPool(m_device, 2 * m_image_count, 2 * m_image_count); + m_descriptor_pool = CreateWrappedDescriptorPool(m_device, SGSR_STAGE_COUNT * m_image_count, SGSR_STAGE_COUNT * m_image_count); m_descriptor_set_layout = CreateWrappedDescriptorSetLayout(m_device, {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER}); std::vector layouts(SGSR_STAGE_COUNT, *m_descriptor_set_layout); @@ -72,7 +72,6 @@ void SGSR::UpdateDescriptorSets(VkImageView image_view, size_t image_index) { std::vector updates; image_infos.reserve(1); updates.push_back(CreateWriteDescriptorSet(image_infos, *m_sampler, image_view, images.descriptor_sets[0], 0)); - updates.push_back(CreateWriteDescriptorSet(image_infos, *m_sampler, *images.image_views[0], images.descriptor_sets[1], 0)); m_device.GetLogical().UpdateDescriptorSets(updates, {}); } From 7b5a2d313e6594911531d807233b72bde6e0d85f Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 24 Jan 2026 10:44:17 +0000 Subject: [PATCH 34/45] fuckyou --- src/video_core/renderer_vulkan/present/sgsr.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 3dda457b7f..07e9df4b97 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -100,10 +100,10 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ const f32 input_image_width = f32(input_image_extent.width); const f32 input_image_height = f32(input_image_extent.height); - const f32 output_image_width = f32(extent.width); - const f32 output_image_height = f32(extent.height); - const f32 viewport_x = crop_rect.left * input_image_width; - const f32 viewport_y = crop_rect.top * input_image_height; + //const f32 output_image_width = f32(extent.width); + //const f32 output_image_height = f32(extent.height); + //const f32 viewport_x = crop_rect.left * input_image_width; + //const f32 viewport_y = crop_rect.top * input_image_height; const f32 viewport_width = (crop_rect.right - crop_rect.left) * input_image_width; const f32 viewport_height = (crop_rect.bottom - crop_rect.top) * input_image_height; From 18c22b0640ef703c65523acd261374f98022e089 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 24 Jan 2026 10:53:02 +0000 Subject: [PATCH 35/45] STOP CRASHING ANDROID --- src/android/app/src/main/res/values/arrays.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 7d00dd23ad..f3a2a069e7 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -259,6 +259,7 @@ 11 12 13 + 14 From 0b961b629dd0b68d29428538f861ad183e6811bb Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 24 Jan 2026 11:02:16 +0000 Subject: [PATCH 36/45] force ci --- src/video_core/renderer_vulkan/present/sgsr.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 07e9df4b97..1991684920 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -100,10 +100,6 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ const f32 input_image_width = f32(input_image_extent.width); const f32 input_image_height = f32(input_image_extent.height); - //const f32 output_image_width = f32(extent.width); - //const f32 output_image_height = f32(extent.height); - //const f32 viewport_x = crop_rect.left * input_image_width; - //const f32 viewport_y = crop_rect.top * input_image_height; const f32 viewport_width = (crop_rect.right - crop_rect.left) * input_image_width; const f32 viewport_height = (crop_rect.bottom - crop_rect.top) * input_image_height; From a269112b19699fede684a9a32fcac64e38f0a2e8 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 24 Jan 2026 11:35:51 +0000 Subject: [PATCH 37/45] dont multiply shit randomly, just premult the texcoord to scale :) --- .patch/sgsr/0001-fix-glsl.patch | 58 ++++++------------- src/video_core/host_shaders/sgsr1_shader.vert | 6 +- .../renderer_vulkan/present/sgsr.cpp | 4 +- 3 files changed, 27 insertions(+), 41 deletions(-) diff --git a/.patch/sgsr/0001-fix-glsl.patch b/.patch/sgsr/0001-fix-glsl.patch index 3fd8c531a1..7f50bc210b 100644 --- a/.patch/sgsr/0001-fix-glsl.patch +++ b/.patch/sgsr/0001-fix-glsl.patch @@ -1,5 +1,5 @@ diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -index 7074999..9e2122e 100644 +index 7074999..c23aae4 100644 --- a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag @@ -1,4 +1,4 @@ @@ -8,7 +8,7 @@ index 7074999..9e2122e 100644 //============================================================================================================ // -@@ -34,17 +34,16 @@ precision highp int; +@@ -34,17 +34,17 @@ precision highp int; //////////////////////// #if defined(UseUniformBlock) @@ -17,6 +17,7 @@ index 7074999..9e2122e 100644 - highp vec4 ViewportInfo[1]; +layout( push_constant ) uniform constants { + highp vec4 ViewportInfo[1]; ++ highp vec2 ResizeFactor; }; -layout(set = 0, binding = 1) uniform mediump sampler2D ps0; +layout(set = 0, binding = 0) uniform mediump sampler2D ps0; @@ -30,7 +31,7 @@ index 7074999..9e2122e 100644 layout(location=0) out vec4 out_Target0; float fastLanczos2(float x) -@@ -63,15 +62,19 @@ vec2 weightY(float dx, float dy,float c, float std) +@@ -63,15 +63,15 @@ vec2 weightY(float dx, float dy,float c, float std) void main() { @@ -40,22 +41,18 @@ index 7074999..9e2122e 100644 + const int mode = OperationMode; + const float edgeThreshold = EdgeThreshold; + const float edgeSharpness = EdgeSharpness; -+ -+ vec2 full_texsize = textureSize(ps0, 0); -+ vec2 recp_texsize = 1.0 / full_texsize; -+ vec2 resize_factor = ViewportInfo[0].zw / full_texsize; vec4 color; if(mode == 1) - color.xyz = textureLod(ps0,in_TEXCOORD0.xy,0.0).xyz; -+ color.xyz = textureLod(ps0, in_TEXCOORD0.xy * resize_factor, 0.0).xyz; ++ color.xyz = textureLod(ps0, in_TEXCOORD0.xy, 0.0).xyz; else - color.xyzw = textureLod(ps0,in_TEXCOORD0.xy,0.0).xyzw; -+ color.xyzw = textureLod(ps0, in_TEXCOORD0.xy * resize_factor, 0.0).xyzw; ++ color.xyzw = textureLod(ps0, in_TEXCOORD0.xy, 0.0).xyzw; highp float xCenter; xCenter = abs(in_TEXCOORD0.x+-0.5); -@@ -82,21 +85,24 @@ void main() +@@ -82,21 +82,24 @@ void main() //if ( mode!=4 && xCenter*xCenter+yCenter*yCenter<=0.4 * 0.4) if ( mode!=4) { @@ -67,7 +64,7 @@ index 7074999..9e2122e 100644 - vec4 left = textureGather(ps0,coord, mode); + highp vec2 coord = imgCoordPixel * ViewportInfo[0].xy; + vec2 pl = imgCoord - imgCoordPixel; -+ vec4 left = textureGather(ps0, coord * resize_factor, mode); ++ vec4 left = textureGather(ps0, coord, mode); float edgeVote = abs(left.z - left.y) + abs(color[mode] - left.y) + abs(color[mode] - left.z) ; if(edgeVote > edgeThreshold) @@ -76,19 +73,19 @@ index 7074999..9e2122e 100644 - vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), mode); + highp vec2 IR_highp_vec2_0 = coord + vec2(ViewportInfo[0].x, 0.0); -+ vec4 right = textureGather(ps0, IR_highp_vec2_0 * resize_factor, mode); ++ vec4 right = textureGather(ps0, IR_highp_vec2_0, mode); vec4 upDown; - upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),mode).wz; - upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), mode).yx; + highp vec2 IR_highp_vec2_1 = coord + vec2(0.0, -ViewportInfo[0].y); -+ upDown.xy = textureGather(ps0, IR_highp_vec2_1 * resize_factor, mode).wz; ++ upDown.xy = textureGather(ps0, IR_highp_vec2_1, mode).wz; + highp vec2 IR_highp_vec2_2 = coord + vec2(0.0, ViewportInfo[0].y); -+ upDown.zw = textureGather(ps0, IR_highp_vec2_2 * resize_factor, mode).yx; ++ upDown.zw = textureGather(ps0, IR_highp_vec2_2, mode).yx; float mean = (left.y+left.z+right.x+right.w)*0.25; left = left - vec4(mean); diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -index d2df646..3e4f5cd 100644 +index d2df646..8b64497 100644 --- a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag @@ -1,4 +1,4 @@ @@ -97,7 +94,7 @@ index d2df646..3e4f5cd 100644 //============================================================================================================ // -@@ -40,17 +40,16 @@ precision highp int; +@@ -40,17 +40,17 @@ precision highp int; //////////////////////// #if defined(UseUniformBlock) @@ -106,6 +103,7 @@ index d2df646..3e4f5cd 100644 - highp vec4 ViewportInfo[1]; +layout( push_constant ) uniform constants { + highp vec4 ViewportInfo[1]; ++ highp vec2 ResizeFactor; }; -layout(set = 0, binding = 1) uniform mediump sampler2D ps0; +layout(set = 0, binding = 0) uniform mediump sampler2D ps0; @@ -119,32 +117,14 @@ index d2df646..3e4f5cd 100644 layout(location=0) out vec4 out_Target0; float fastLanczos2(float x) -@@ -98,11 +97,15 @@ vec2 edgeDirection(vec4 left, vec4 right) - - void main() - { -+ vec2 full_texsize = textureSize(ps0, 0); -+ vec2 recp_texsize = 1.0 / full_texsize; -+ vec2 resize_factor = ViewportInfo[0].zw / full_texsize; -+ - vec4 color; - if(OperationMode == 1) -- color.xyz = textureLod(ps0,in_TEXCOORD0.xy,0.0).xyz; -+ color.xyz = textureLod(ps0,in_TEXCOORD0.xy * resize_factor,0.0).xyz; - else -- color.xyzw = textureLod(ps0,in_TEXCOORD0.xy,0.0).xyzw; -+ color.xyzw = textureLod(ps0,in_TEXCOORD0.xy * resize_factor,0.0).xyzw; - - highp float xCenter; - xCenter = abs(in_TEXCOORD0.x+-0.5); -@@ -116,18 +119,21 @@ void main() +@@ -116,18 +116,21 @@ void main() highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo[0].zw)+vec2(-0.5,0.5)); highp vec2 imgCoordPixel = floor(imgCoord); highp vec2 coord = (imgCoordPixel*ViewportInfo[0].xy); - vec2 pl = (imgCoord+(-imgCoordPixel)); - vec4 left = textureGather(ps0,coord, OperationMode); + vec2 pl = imgCoord - imgCoordPixel; -+ vec4 left = textureGather(ps0, coord * resize_factor, OperationMode); ++ vec4 left = textureGather(ps0, coord, OperationMode); float edgeVote = abs(left.z - left.y) + abs(color[OperationMode] - left.y) + abs(color[OperationMode] - left.z) ; if(edgeVote > EdgeThreshold) @@ -153,14 +133,14 @@ index d2df646..3e4f5cd 100644 - vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), OperationMode); + highp vec2 IR_highp_vec2_0 = coord + vec2(ViewportInfo[0].x, 0.0); -+ vec4 right = textureGather(ps0, IR_highp_vec2_0 * resize_factor, OperationMode); ++ vec4 right = textureGather(ps0, IR_highp_vec2_0, OperationMode); vec4 upDown; - upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),OperationMode).wz; - upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), OperationMode).yx; + highp vec2 IR_highp_vec2_1 = coord + vec2(0.0, -ViewportInfo[0].y); -+ upDown.xy = textureGather(ps0, IR_highp_vec2_1 * resize_factor, OperationMode).wz; ++ upDown.xy = textureGather(ps0, IR_highp_vec2_1, OperationMode).wz; + highp vec2 IR_highp_vec2_2 = coord + vec2(0.0, ViewportInfo[0].y); -+ upDown.zw = textureGather(ps0, IR_highp_vec2_2 * resize_factor, OperationMode).yx; ++ upDown.zw = textureGather(ps0, IR_highp_vec2_2, OperationMode).yx; float mean = (left.y+left.z+right.x+right.w)*0.25; left = left - vec4(mean); diff --git a/src/video_core/host_shaders/sgsr1_shader.vert b/src/video_core/host_shaders/sgsr1_shader.vert index 00649312fb..1a07242fd6 100644 --- a/src/video_core/host_shaders/sgsr1_shader.vert +++ b/src/video_core/host_shaders/sgsr1_shader.vert @@ -3,11 +3,15 @@ #version 450 +layout( push_constant ) uniform constants { + highp vec4 ViewportInfo[1]; + highp vec2 ResizeFactor; +}; layout(location = 0) out highp vec2 texcoord; void main() { float x = float((gl_VertexIndex & 1) << 2); float y = float((gl_VertexIndex & 2) << 1); gl_Position = vec4(x - 1.0f, y - 1.0f, 0.0, 1.0f); - texcoord = vec2(x, y) / 2.0; + texcoord = vec2(x, y) * ResizeFactor * 0.5; } diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 1991684920..9442d81630 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -17,7 +17,7 @@ namespace Vulkan { -using PushConstants = std::array; +using PushConstants = std::array; SGSR::SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, VkExtent2D extent, bool edge_dir) : m_device{device}, m_memory_allocator{memory_allocator} @@ -110,6 +110,8 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ viewport_con[1] = std::bit_cast(1.f / viewport_height); viewport_con[2] = std::bit_cast(viewport_width); viewport_con[3] = std::bit_cast(viewport_height); + viewport_con[4] = std::bit_cast(viewport_width / input_image_width); + viewport_con[5] = std::bit_cast(viewport_height / input_image_height); UploadImages(scheduler); UpdateDescriptorSets(source_image_view, image_index); From a5b4c9374997ce5b87e53e8b3ec4067b7465dd66 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 24 Jan 2026 18:11:55 +0000 Subject: [PATCH 38/45] allow control sharpness from [0,2.0] --- .patch/sgsr/0001-fix-glsl.patch | 86 ++++++++++++++----- .../app/src/main/res/values/strings.xml | 4 +- src/qt_common/config/shared_translation.cpp | 2 +- src/video_core/host_shaders/sgsr1_shader.vert | 1 + .../renderer_vulkan/present/sgsr.cpp | 10 ++- src/yuzu/configuration/configure_graphics.cpp | 2 +- 6 files changed, 80 insertions(+), 25 deletions(-) diff --git a/.patch/sgsr/0001-fix-glsl.patch b/.patch/sgsr/0001-fix-glsl.patch index 7f50bc210b..48f5a123f2 100644 --- a/.patch/sgsr/0001-fix-glsl.patch +++ b/.patch/sgsr/0001-fix-glsl.patch @@ -1,5 +1,5 @@ diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -index 7074999..c23aae4 100644 +index 7074999..2db04b3 100644 --- a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag @@ -1,4 +1,4 @@ @@ -8,7 +8,16 @@ index 7074999..c23aae4 100644 //============================================================================================================ // -@@ -34,17 +34,17 @@ precision highp int; +@@ -25,7 +25,7 @@ precision highp int; + + #define EdgeThreshold 8.0/255.0 + +-#define EdgeSharpness 2.0 ++// #define EdgeSharpness 2.0 + + // #define UseUniformBlock + +@@ -34,17 +34,18 @@ precision highp int; //////////////////////// #if defined(UseUniformBlock) @@ -18,6 +27,7 @@ index 7074999..c23aae4 100644 +layout( push_constant ) uniform constants { + highp vec4 ViewportInfo[1]; + highp vec2 ResizeFactor; ++ highp float EdgeSharpness; }; -layout(set = 0, binding = 1) uniform mediump sampler2D ps0; +layout(set = 0, binding = 0) uniform mediump sampler2D ps0; @@ -31,20 +41,18 @@ index 7074999..c23aae4 100644 layout(location=0) out vec4 out_Target0; float fastLanczos2(float x) -@@ -63,15 +63,15 @@ vec2 weightY(float dx, float dy,float c, float std) +@@ -63,15 +64,11 @@ vec2 weightY(float dx, float dy,float c, float std) void main() { - int mode = OperationMode; - float edgeThreshold = EdgeThreshold; - float edgeSharpness = EdgeSharpness; -+ const int mode = OperationMode; -+ const float edgeThreshold = EdgeThreshold; -+ const float edgeSharpness = EdgeSharpness; - +- vec4 color; - if(mode == 1) +- if(mode == 1) - color.xyz = textureLod(ps0,in_TEXCOORD0.xy,0.0).xyz; ++ if(OperationMode == 1) + color.xyz = textureLod(ps0, in_TEXCOORD0.xy, 0.0).xyz; else - color.xyzw = textureLod(ps0,in_TEXCOORD0.xy,0.0).xyzw; @@ -52,9 +60,14 @@ index 7074999..c23aae4 100644 highp float xCenter; xCenter = abs(in_TEXCOORD0.x+-0.5); -@@ -82,21 +82,24 @@ void main() - //if ( mode!=4 && xCenter*xCenter+yCenter*yCenter<=0.4 * 0.4) - if ( mode!=4) +@@ -79,30 +76,33 @@ void main() + yCenter = abs(in_TEXCOORD0.y+-0.5); + + //todo: config the SR region based on needs +- //if ( mode!=4 && xCenter*xCenter+yCenter*yCenter<=0.4 * 0.4) +- if ( mode!=4) ++ //if ( OperationMode!=4 && xCenter*xCenter+yCenter*yCenter<=0.4 * 0.4) ++ if ( OperationMode!=4) { - highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo[0].zw)+vec2(-0.5,0.5)); + highp vec2 imgCoord = ((in_TEXCOORD0.xy * ViewportInfo[0].zw) + vec2(-0.5,0.5)); @@ -64,28 +77,46 @@ index 7074999..c23aae4 100644 - vec4 left = textureGather(ps0,coord, mode); + highp vec2 coord = imgCoordPixel * ViewportInfo[0].xy; + vec2 pl = imgCoord - imgCoordPixel; -+ vec4 left = textureGather(ps0, coord, mode); ++ vec4 left = textureGather(ps0, coord, OperationMode); - float edgeVote = abs(left.z - left.y) + abs(color[mode] - left.y) + abs(color[mode] - left.z) ; - if(edgeVote > edgeThreshold) +- float edgeVote = abs(left.z - left.y) + abs(color[mode] - left.y) + abs(color[mode] - left.z) ; +- if(edgeVote > edgeThreshold) ++ float edgeVote = abs(left.z - left.y) + abs(color[OperationMode] - left.y) + abs(color[OperationMode] - left.z) ; ++ if(edgeVote > EdgeThreshold) { coord.x += ViewportInfo[0].x; - vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), mode); + highp vec2 IR_highp_vec2_0 = coord + vec2(ViewportInfo[0].x, 0.0); -+ vec4 right = textureGather(ps0, IR_highp_vec2_0, mode); ++ vec4 right = textureGather(ps0, IR_highp_vec2_0, OperationMode); vec4 upDown; - upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),mode).wz; - upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), mode).yx; + highp vec2 IR_highp_vec2_1 = coord + vec2(0.0, -ViewportInfo[0].y); -+ upDown.xy = textureGather(ps0, IR_highp_vec2_1, mode).wz; ++ upDown.xy = textureGather(ps0, IR_highp_vec2_1, OperationMode).wz; + highp vec2 IR_highp_vec2_2 = coord + vec2(0.0, ViewportInfo[0].y); -+ upDown.zw = textureGather(ps0, IR_highp_vec2_2, mode).yx; ++ upDown.zw = textureGather(ps0, IR_highp_vec2_2, OperationMode).yx; float mean = (left.y+left.z+right.x+right.w)*0.25; left = left - vec4(mean); + right = right - vec4(mean); + upDown = upDown - vec4(mean); +- color.w =color[mode] - mean; ++ color.w =color[OperationMode] - mean; + + float sum = (((((abs(left.x)+abs(left.y))+abs(left.z))+abs(left.w))+(((abs(right.x)+abs(right.y))+abs(right.z))+abs(right.w)))+(((abs(upDown.x)+abs(upDown.y))+abs(upDown.z))+abs(upDown.w))); + float std = 2.181818/sum; +@@ -124,7 +124,7 @@ void main() + + float maxY = max(max(left.y,left.z),max(right.x,right.w)); + float minY = min(min(left.y,left.z),min(right.x,right.w)); +- finalY = clamp(edgeSharpness*finalY, minY, maxY); ++ finalY = clamp(EdgeSharpness*finalY, minY, maxY); + + float deltaY = finalY -color.w; + diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -index d2df646..8b64497 100644 +index d2df646..5a38589 100644 --- a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag @@ -1,4 +1,4 @@ @@ -94,7 +125,21 @@ index d2df646..8b64497 100644 //============================================================================================================ // -@@ -40,17 +40,17 @@ precision highp int; +@@ -27,11 +27,11 @@ precision highp int; + * If set, will use edge direction to improve visual quality + * Expect a minimal cost increase + */ +-// #define UseEdgeDirection ++#define UseEdgeDirection 1 + + #define EdgeThreshold 8.0/255.0 + +-#define EdgeSharpness 2.0 ++// #define EdgeSharpness 2.0 + + // #define UseUniformBlock + +@@ -40,17 +40,18 @@ precision highp int; //////////////////////// #if defined(UseUniformBlock) @@ -104,6 +149,7 @@ index d2df646..8b64497 100644 +layout( push_constant ) uniform constants { + highp vec4 ViewportInfo[1]; + highp vec2 ResizeFactor; ++ highp float EdgeSharpness; }; -layout(set = 0, binding = 1) uniform mediump sampler2D ps0; +layout(set = 0, binding = 0) uniform mediump sampler2D ps0; @@ -117,7 +163,7 @@ index d2df646..8b64497 100644 layout(location=0) out vec4 out_Target0; float fastLanczos2(float x) -@@ -116,18 +116,21 @@ void main() +@@ -116,18 +117,21 @@ void main() highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo[0].zw)+vec2(-0.5,0.5)); highp vec2 imgCoordPixel = floor(imgCoord); highp vec2 coord = (imgCoordPixel*ViewportInfo[0].xy); diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 399173cc3e..cf1e73499b 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -466,8 +466,8 @@ Resolution (Handheld/Docked) VSync mode Window adapting filter - FSR sharpness - Determines how sharpened the image will look while using FSR\'s dynamic contrast + FSR/SGSR sharpness + Determines how sharpened the image will look while using FSR or SGSR filters Anti-aliasing method Optimize SPIRV output Optimizes compiled shaders to improve GPU efficiency, but may introduce longer loading times and initial slowdowns. diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index 6e7966a84c..27810e38d3 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -149,7 +149,7 @@ std::unique_ptr InitializeTranslations(QObject* parent) { "Options lower than 1X can cause artifacts.")); INSERT(Settings, scaling_filter, tr("Window Adapting Filter:"), QString()); INSERT(Settings, fsr_sharpening_slider, tr("FSR Sharpness:"), - tr("Determines how sharpened the image will look using FSR's dynamic contrast.")); + tr("Determines how sharpened the image will look using FSR's or SGSR's dynamic contrast.")); INSERT(Settings, anti_aliasing, tr("Anti-Aliasing Method:"), tr("The anti-aliasing method to use.\nSMAA offers the best quality.\nFXAA " "can produce a more stable picture in lower resolutions.")); diff --git a/src/video_core/host_shaders/sgsr1_shader.vert b/src/video_core/host_shaders/sgsr1_shader.vert index 1a07242fd6..820beb26de 100644 --- a/src/video_core/host_shaders/sgsr1_shader.vert +++ b/src/video_core/host_shaders/sgsr1_shader.vert @@ -6,6 +6,7 @@ layout( push_constant ) uniform constants { highp vec4 ViewportInfo[1]; highp vec2 ResizeFactor; + highp float EdgeSharpness; }; layout(location = 0) out highp vec2 texcoord; diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 9442d81630..72d28f5e5c 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -17,7 +17,7 @@ namespace Vulkan { -using PushConstants = std::array; +using PushConstants = std::array; SGSR::SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, VkExtent2D extent, bool edge_dir) : m_device{device}, m_memory_allocator{memory_allocator} @@ -102,9 +102,16 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ const f32 input_image_height = f32(input_image_extent.height); const f32 viewport_width = (crop_rect.right - crop_rect.left) * input_image_width; const f32 viewport_height = (crop_rect.bottom - crop_rect.top) * input_image_height; + // expected [0, 2] + const f32 sharpening = f32(Settings::values.fsr_sharpening_slider.GetValue()) / 100.0f; // p = (tex * viewport) / input = [0,n] (normalized texcoords) // p * input = [0,1024], [0,768] + // layout( push_constant ) uniform constants { + // highp vec4 ViewportInfo[1]; + // highp vec2 ResizeFactor; + // highp float EdgeSharpness; + // }; PushConstants viewport_con{}; viewport_con[0] = std::bit_cast(1.f / viewport_width); viewport_con[1] = std::bit_cast(1.f / viewport_height); @@ -112,6 +119,7 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ viewport_con[3] = std::bit_cast(viewport_height); viewport_con[4] = std::bit_cast(viewport_width / input_image_width); viewport_con[5] = std::bit_cast(viewport_height / input_image_height); + viewport_con[6] = std::bit_cast(sharpening); UploadImages(scheduler); UpdateDescriptorSets(source_image_view, image_index); diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp index 54835aea5a..6ae71d2368 100644 --- a/src/yuzu/configuration/configure_graphics.cpp +++ b/src/yuzu/configuration/configure_graphics.cpp @@ -265,7 +265,7 @@ void ConfigureGraphics::Setup(const ConfigurationShared::Builder& builder) { // FSR needs a reversed slider and a 0.5 multiplier return builder.BuildWidget( setting, apply_funcs, ConfigurationShared::RequestType::ReverseSlider, true, - 0.5f, nullptr, tr("%", "FSR sharpening percentage (e.g. 50%)")); + 0.5f, nullptr, tr("%", "FSR/SGSR sharpening percentage (e.g. 50%)")); } else { return builder.BuildWidget(setting, apply_funcs); } From 17aa8dde685bf38eb27f0a47e0b5544fa8363deb Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 6 Feb 2026 01:58:59 +0000 Subject: [PATCH 39/45] fix cmake 2 --- cpmfile.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cpmfile.json b/cpmfile.json index b9a1110106..4af85428ea 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -102,13 +102,12 @@ "artifact": "android-binaries-%VERSION%.zip", "hash": "8812ae84cbe49e6a3418ade9c458d3be6d74a3dffd319d4502007b564d580998056e8190414368ec11b27bc83993c7a0dad713c31bcc3d9553b51243efee3753" }, - "snapdragon_gsr": { + "sgsr": { "repo": "SnapdragonStudios/snapdragon-gsr", - "package": "snapdragon_gsr", - "hash": "dsfsdfsd", + "hash": "3940df715189813ffeffa540f48673e999754d53a1dcadc16aab846ef03d57e395e2c8d8e89772bc162835e1686ff6bdb8cae108c1f84404e9e66d993107b76e", "sha": "d926f074bcb9d714e179f1ce0fcb9ee2eeb5074e", "patches": [ - "0001-glslang-fix.patch" + "0001-fix-glsl.patch" ] }, "quazip": { From 4f9b10458e0a9e62c06edc509e728822cd862684 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Sun, 8 Feb 2026 23:56:46 -0400 Subject: [PATCH 40/45] [vulkan, sgsr] Added missing stage bit --- src/video_core/renderer_vulkan/present/sgsr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 72d28f5e5c..080b5247fa 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -49,7 +49,7 @@ SGSR::SGSR(const Device& device, MemoryAllocator& memory_allocator, size_t image images.descriptor_sets = CreateWrappedDescriptorSets(m_descriptor_pool, layouts); const VkPushConstantRange range{ - .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT, + .stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, .offset = 0, .size = sizeof(PushConstants), }; From e6d55153c442b3a573aac03ff5a07d844d4a69ab Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Mon, 9 Feb 2026 00:25:29 -0400 Subject: [PATCH 41/45] [vulkan, sgsr] Adjusting vkCmdPushConstant to receive vertex and fragment stages --- src/video_core/renderer_vulkan/present/sgsr.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/present/sgsr.cpp b/src/video_core/renderer_vulkan/present/sgsr.cpp index 080b5247fa..3589083f00 100644 --- a/src/video_core/renderer_vulkan/present/sgsr.cpp +++ b/src/video_core/renderer_vulkan/present/sgsr.cpp @@ -131,7 +131,9 @@ VkImageView SGSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_ BeginRenderPass(cmdbuf, renderpass, stage0_framebuffer, extent); cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, stage0_pipeline); cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, stage0_descriptor_set, {}); - cmdbuf.PushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, viewport_con); + cmdbuf.PushConstants(pipeline_layout, + VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, + viewport_con); cmdbuf.Draw(3, 1, 0, 0); cmdbuf.EndRenderPass(); TransitionImageLayout(cmdbuf, stage0_image, VK_IMAGE_LAYOUT_GENERAL); From 568ff0c972ccf283114d0c121d1a27bbdc3602d1 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 9 Feb 2026 05:26:50 +0000 Subject: [PATCH 42/45] fx --- src/video_core/host_shaders/CMakeLists.txt | 33 +--------------------- 1 file changed, 1 insertion(+), 32 deletions(-) diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index f2b4846db8..88dce53b10 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -150,42 +150,11 @@ foreach(SOURCE_FILE IN ITEMS ${SHADER_FILES}) OUTPUT ${SPIRV_HEADER_FILE} COMMAND - ${GLSLANGVALIDATOR} -V ${QUIET_FLAG} -DUseUniformBlock=1 ${GLSL_FLAGS} --variable-name ${SPIRV_VARIABLE_NAME} -o ${SPIRV_HEADER_FILE} ${SOURCE_FILE} --target-env ${SPIR_V_VERSION} + ${GLSLANGVALIDATOR} -V ${QUIET_FLAG} -I"${FIDELITYFX_INCLUDE_DIR}" ${GLSL_FLAGS} --variable-name ${SPIRV_VARIABLE_NAME} -o ${SPIRV_HEADER_FILE} ${SOURCE_FILE} --target-env ${SPIR_V_VERSION} MAIN_DEPENDENCY ${SOURCE_FILE} ) set(SHADER_HEADERS ${SHADER_HEADERS} ${SPIRV_HEADER_FILE}) - else() - # Skip generating source headers on Vulkan exclusive files - if (NOT ${FILENAME} MATCHES "vulkan.*" AND NOT ${FILENAME} MATCHES "sgsr1.*") - set(SOURCE_HEADER_FILE ${SHADER_DIR}/${SHADER_NAME}.h) - add_custom_command( - OUTPUT - ${SOURCE_HEADER_FILE} - COMMAND - ${CMAKE_COMMAND} -P ${HEADER_GENERATOR} ${SOURCE_FILE} ${SOURCE_HEADER_FILE} ${INPUT_FILE} - MAIN_DEPENDENCY - ${SOURCE_FILE} - DEPENDS - ${INPUT_FILE} - # HEADER_GENERATOR should be included here but msbuild seems to assume it's always modified - ) - set(SHADER_HEADERS ${SHADER_HEADERS} ${SOURCE_HEADER_FILE}) - endif() - # Skip compiling to SPIR-V OpenGL exclusive files - if (NOT ${FILENAME} MATCHES "opengl.*") - string(TOUPPER ${SHADER_NAME}_SPV SPIRV_VARIABLE_NAME) - set(SPIRV_HEADER_FILE ${SHADER_DIR}/${SHADER_NAME}_spv.h) - add_custom_command( - OUTPUT - ${SPIRV_HEADER_FILE} - COMMAND - ${GLSLANGVALIDATOR} -V ${QUIET_FLAG} -I"${FIDELITYFX_INCLUDE_DIR}" ${GLSL_FLAGS} --variable-name ${SPIRV_VARIABLE_NAME} -o ${SPIRV_HEADER_FILE} ${SOURCE_FILE} --target-env ${SPIR_V_VERSION} - MAIN_DEPENDENCY - ${SOURCE_FILE} - ) - set(SHADER_HEADERS ${SHADER_HEADERS} ${SPIRV_HEADER_FILE}) - endif() endif() endforeach() From 0b1349b86a139fbcfb057700732d91ce7a77709a Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 9 Feb 2026 05:31:01 +0000 Subject: [PATCH 43/45] fx2 --- src/video_core/host_shaders/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index 88dce53b10..310baf118d 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -95,7 +95,7 @@ if ("${GLSLANGVALIDATOR}" STREQUAL "GLSLANGVALIDATOR-NOTFOUND") message(FATAL_ERROR "Required program `glslangValidator` not found.") endif() -set(GLSL_FLAGS "") +set(GLSL_FLAGS "-DUseUniformBlock=1") set(SPIR_V_VERSION "spirv1.3") set(QUIET_FLAG "--quiet") From 5f6008af8cf438ac25d35fdb39b9ebd528b1c3f0 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 5 Mar 2026 06:52:08 +0000 Subject: [PATCH 44/45] remove highp --- .patch/sgsr/0002-remove-highp.patch | 34 +++++++++++++++++++++++++++++ cpmfile.json | 3 ++- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 .patch/sgsr/0002-remove-highp.patch diff --git a/.patch/sgsr/0002-remove-highp.patch b/.patch/sgsr/0002-remove-highp.patch new file mode 100644 index 0000000000..9d6b65b6be --- /dev/null +++ b/.patch/sgsr/0002-remove-highp.patch @@ -0,0 +1,34 @@ +diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +index 2db04b3..056d177 100644 +--- a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag ++++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag +@@ -8,8 +8,10 @@ + // + //============================================================================================================ + +-precision mediump float; +-precision highp int; ++//precision mediump float; ++//precision highp int; ++#define highp ++#define mediump + + //////////////////////// + // USER CONFIGURATION // +diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +index 5a38589..5ed5f5e 100644 +--- a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag ++++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag +@@ -8,8 +8,10 @@ + // + //============================================================================================================ + +-precision mediump float; +-precision highp int; ++//precision mediump float; ++//precision highp int; ++#define highp ++#define mediump + + //////////////////////// + // USER CONFIGURATION // diff --git a/cpmfile.json b/cpmfile.json index 4af85428ea..babcf765ec 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -107,7 +107,8 @@ "hash": "3940df715189813ffeffa540f48673e999754d53a1dcadc16aab846ef03d57e395e2c8d8e89772bc162835e1686ff6bdb8cae108c1f84404e9e66d993107b76e", "sha": "d926f074bcb9d714e179f1ce0fcb9ee2eeb5074e", "patches": [ - "0001-fix-glsl.patch" + "0001-fix-glsl.patch", + "0002-remove-highp.patch" ] }, "quazip": { From ecf4fa69425306e01e4bb681e03a08b44f34313d Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 30 Mar 2026 07:39:00 +0000 Subject: [PATCH 45/45] move in tree, remove sgsr dep --- .patch/sgsr/0001-fix-glsl.patch | 192 ------------------ .patch/sgsr/0002-remove-highp.patch | 34 ---- CMakeLists.txt | 2 - cpmfile.json | 9 - src/video_core/host_shaders/CMakeLists.txt | 5 +- .../host_shaders/sgsr1_shader_mobile.frag | 116 +++++++++++ .../sgsr1_shader_mobile_edge_direction.frag | 149 ++++++++++++++ 7 files changed, 267 insertions(+), 240 deletions(-) delete mode 100644 .patch/sgsr/0001-fix-glsl.patch delete mode 100644 .patch/sgsr/0002-remove-highp.patch create mode 100644 src/video_core/host_shaders/sgsr1_shader_mobile.frag create mode 100644 src/video_core/host_shaders/sgsr1_shader_mobile_edge_direction.frag diff --git a/.patch/sgsr/0001-fix-glsl.patch b/.patch/sgsr/0001-fix-glsl.patch deleted file mode 100644 index 48f5a123f2..0000000000 --- a/.patch/sgsr/0001-fix-glsl.patch +++ /dev/null @@ -1,192 +0,0 @@ -diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -index 7074999..2db04b3 100644 ---- a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -+++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -@@ -1,4 +1,4 @@ --#version 300 es -+#version 460 core - - //============================================================================================================ - // -@@ -25,7 +25,7 @@ precision highp int; - - #define EdgeThreshold 8.0/255.0 - --#define EdgeSharpness 2.0 -+// #define EdgeSharpness 2.0 - - // #define UseUniformBlock - -@@ -34,17 +34,18 @@ precision highp int; - //////////////////////// - - #if defined(UseUniformBlock) --layout (set=0, binding = 0) uniform UniformBlock --{ -- highp vec4 ViewportInfo[1]; -+layout( push_constant ) uniform constants { -+ highp vec4 ViewportInfo[1]; -+ highp vec2 ResizeFactor; -+ highp float EdgeSharpness; - }; --layout(set = 0, binding = 1) uniform mediump sampler2D ps0; -+layout(set = 0, binding = 0) uniform mediump sampler2D ps0; - #else - uniform highp vec4 ViewportInfo[1]; - uniform mediump sampler2D ps0; - #endif - --layout(location=0) in highp vec4 in_TEXCOORD0; -+layout(location=0) in highp vec2 in_TEXCOORD0; - layout(location=0) out vec4 out_Target0; - - float fastLanczos2(float x) -@@ -63,15 +64,11 @@ vec2 weightY(float dx, float dy,float c, float std) - - void main() - { -- int mode = OperationMode; -- float edgeThreshold = EdgeThreshold; -- float edgeSharpness = EdgeSharpness; -- - vec4 color; -- if(mode == 1) -- color.xyz = textureLod(ps0,in_TEXCOORD0.xy,0.0).xyz; -+ if(OperationMode == 1) -+ color.xyz = textureLod(ps0, in_TEXCOORD0.xy, 0.0).xyz; - else -- color.xyzw = textureLod(ps0,in_TEXCOORD0.xy,0.0).xyzw; -+ color.xyzw = textureLod(ps0, in_TEXCOORD0.xy, 0.0).xyzw; - - highp float xCenter; - xCenter = abs(in_TEXCOORD0.x+-0.5); -@@ -79,30 +76,33 @@ void main() - yCenter = abs(in_TEXCOORD0.y+-0.5); - - //todo: config the SR region based on needs -- //if ( mode!=4 && xCenter*xCenter+yCenter*yCenter<=0.4 * 0.4) -- if ( mode!=4) -+ //if ( OperationMode!=4 && xCenter*xCenter+yCenter*yCenter<=0.4 * 0.4) -+ if ( OperationMode!=4) - { -- highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo[0].zw)+vec2(-0.5,0.5)); -+ highp vec2 imgCoord = ((in_TEXCOORD0.xy * ViewportInfo[0].zw) + vec2(-0.5,0.5)); - highp vec2 imgCoordPixel = floor(imgCoord); -- highp vec2 coord = (imgCoordPixel*ViewportInfo[0].xy); -- vec2 pl = (imgCoord+(-imgCoordPixel)); -- vec4 left = textureGather(ps0,coord, mode); -+ highp vec2 coord = imgCoordPixel * ViewportInfo[0].xy; -+ vec2 pl = imgCoord - imgCoordPixel; -+ vec4 left = textureGather(ps0, coord, OperationMode); - -- float edgeVote = abs(left.z - left.y) + abs(color[mode] - left.y) + abs(color[mode] - left.z) ; -- if(edgeVote > edgeThreshold) -+ float edgeVote = abs(left.z - left.y) + abs(color[OperationMode] - left.y) + abs(color[OperationMode] - left.z) ; -+ if(edgeVote > EdgeThreshold) - { - coord.x += ViewportInfo[0].x; - -- vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), mode); -+ highp vec2 IR_highp_vec2_0 = coord + vec2(ViewportInfo[0].x, 0.0); -+ vec4 right = textureGather(ps0, IR_highp_vec2_0, OperationMode); - vec4 upDown; -- upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),mode).wz; -- upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), mode).yx; -+ highp vec2 IR_highp_vec2_1 = coord + vec2(0.0, -ViewportInfo[0].y); -+ upDown.xy = textureGather(ps0, IR_highp_vec2_1, OperationMode).wz; -+ highp vec2 IR_highp_vec2_2 = coord + vec2(0.0, ViewportInfo[0].y); -+ upDown.zw = textureGather(ps0, IR_highp_vec2_2, OperationMode).yx; - - float mean = (left.y+left.z+right.x+right.w)*0.25; - left = left - vec4(mean); - right = right - vec4(mean); - upDown = upDown - vec4(mean); -- color.w =color[mode] - mean; -+ color.w =color[OperationMode] - mean; - - float sum = (((((abs(left.x)+abs(left.y))+abs(left.z))+abs(left.w))+(((abs(right.x)+abs(right.y))+abs(right.z))+abs(right.w)))+(((abs(upDown.x)+abs(upDown.y))+abs(upDown.z))+abs(upDown.w))); - float std = 2.181818/sum; -@@ -124,7 +124,7 @@ void main() - - float maxY = max(max(left.y,left.z),max(right.x,right.w)); - float minY = min(min(left.y,left.z),min(right.x,right.w)); -- finalY = clamp(edgeSharpness*finalY, minY, maxY); -+ finalY = clamp(EdgeSharpness*finalY, minY, maxY); - - float deltaY = finalY -color.w; - -diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -index d2df646..5a38589 100644 ---- a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -+++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -@@ -1,4 +1,4 @@ --#version 300 es -+#version 460 core - - //============================================================================================================ - // -@@ -27,11 +27,11 @@ precision highp int; - * If set, will use edge direction to improve visual quality - * Expect a minimal cost increase - */ --// #define UseEdgeDirection -+#define UseEdgeDirection 1 - - #define EdgeThreshold 8.0/255.0 - --#define EdgeSharpness 2.0 -+// #define EdgeSharpness 2.0 - - // #define UseUniformBlock - -@@ -40,17 +40,18 @@ precision highp int; - //////////////////////// - - #if defined(UseUniformBlock) --layout (set=0, binding = 0) uniform UniformBlock --{ -- highp vec4 ViewportInfo[1]; -+layout( push_constant ) uniform constants { -+ highp vec4 ViewportInfo[1]; -+ highp vec2 ResizeFactor; -+ highp float EdgeSharpness; - }; --layout(set = 0, binding = 1) uniform mediump sampler2D ps0; -+layout(set = 0, binding = 0) uniform mediump sampler2D ps0; - #else - uniform highp vec4 ViewportInfo[1]; - uniform mediump sampler2D ps0; - #endif - --layout(location=0) in highp vec4 in_TEXCOORD0; -+layout(location=0) in highp vec2 in_TEXCOORD0; - layout(location=0) out vec4 out_Target0; - - float fastLanczos2(float x) -@@ -116,18 +117,21 @@ void main() - highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo[0].zw)+vec2(-0.5,0.5)); - highp vec2 imgCoordPixel = floor(imgCoord); - highp vec2 coord = (imgCoordPixel*ViewportInfo[0].xy); -- vec2 pl = (imgCoord+(-imgCoordPixel)); -- vec4 left = textureGather(ps0,coord, OperationMode); -+ vec2 pl = imgCoord - imgCoordPixel; -+ vec4 left = textureGather(ps0, coord, OperationMode); - - float edgeVote = abs(left.z - left.y) + abs(color[OperationMode] - left.y) + abs(color[OperationMode] - left.z) ; - if(edgeVote > EdgeThreshold) - { - coord.x += ViewportInfo[0].x; - -- vec4 right = textureGather(ps0,coord + highp vec2(ViewportInfo[0].x, 0.0), OperationMode); -+ highp vec2 IR_highp_vec2_0 = coord + vec2(ViewportInfo[0].x, 0.0); -+ vec4 right = textureGather(ps0, IR_highp_vec2_0, OperationMode); - vec4 upDown; -- upDown.xy = textureGather(ps0,coord + highp vec2(0.0, -ViewportInfo[0].y),OperationMode).wz; -- upDown.zw = textureGather(ps0,coord+ highp vec2(0.0, ViewportInfo[0].y), OperationMode).yx; -+ highp vec2 IR_highp_vec2_1 = coord + vec2(0.0, -ViewportInfo[0].y); -+ upDown.xy = textureGather(ps0, IR_highp_vec2_1, OperationMode).wz; -+ highp vec2 IR_highp_vec2_2 = coord + vec2(0.0, ViewportInfo[0].y); -+ upDown.zw = textureGather(ps0, IR_highp_vec2_2, OperationMode).yx; - - float mean = (left.y+left.z+right.x+right.w)*0.25; - left = left - vec4(mean); diff --git a/.patch/sgsr/0002-remove-highp.patch b/.patch/sgsr/0002-remove-highp.patch deleted file mode 100644 index 9d6b65b6be..0000000000 --- a/.patch/sgsr/0002-remove-highp.patch +++ /dev/null @@ -1,34 +0,0 @@ -diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -index 2db04b3..056d177 100644 ---- a/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -+++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag -@@ -8,8 +8,10 @@ - // - //============================================================================================================ - --precision mediump float; --precision highp int; -+//precision mediump float; -+//precision highp int; -+#define highp -+#define mediump - - //////////////////////// - // USER CONFIGURATION // -diff --git a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -index 5a38589..5ed5f5e 100644 ---- a/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -+++ b/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag -@@ -8,8 +8,10 @@ - // - //============================================================================================================ - --precision mediump float; --precision highp int; -+//precision mediump float; -+//precision highp int; -+#define highp -+#define mediump - - //////////////////////// - // USER CONFIGURATION // diff --git a/CMakeLists.txt b/CMakeLists.txt index 75f02b5d09..6cdb79be4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -233,8 +233,6 @@ endif() option(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" ${DEFAULT_YUZU_USE_BUNDLED_OPENSSL}) -AddJsonPackage(sgsr) - # TODO(crueter): CPM this if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL) AddJsonPackage(vulkan-validation-layers) diff --git a/cpmfile.json b/cpmfile.json index babcf765ec..1bb29afae4 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -102,15 +102,6 @@ "artifact": "android-binaries-%VERSION%.zip", "hash": "8812ae84cbe49e6a3418ade9c458d3be6d74a3dffd319d4502007b564d580998056e8190414368ec11b27bc83993c7a0dad713c31bcc3d9553b51243efee3753" }, - "sgsr": { - "repo": "SnapdragonStudios/snapdragon-gsr", - "hash": "3940df715189813ffeffa540f48673e999754d53a1dcadc16aab846ef03d57e395e2c8d8e89772bc162835e1686ff6bdb8cae108c1f84404e9e66d993107b76e", - "sha": "d926f074bcb9d714e179f1ce0fcb9ee2eeb5074e", - "patches": [ - "0001-fix-glsl.patch", - "0002-remove-highp.patch" - ] - }, "quazip": { "package": "QuaZip-Qt6", "repo": "stachenov/quazip", diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index 310baf118d..9e8d76b104 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -79,8 +79,8 @@ set(SHADER_FILES # Snapdragon Game Super Resolution ${CMAKE_CURRENT_SOURCE_DIR}/sgsr1_shader.vert - ${sgsr_SOURCE_DIR}/sgsr/v1/include/glsl/sgsr1_shader_mobile.frag - ${sgsr_SOURCE_DIR}/sgsr/v1/include/glsl/sgsr1_shader_mobile_edge_direction.frag + ${CMAKE_CURRENT_SOURCE_DIR}/sgsr1_shader_mobile.frag + ${CMAKE_CURRENT_SOURCE_DIR}/sgsr1_shader_mobile_edge_direction.frag ) if (PLATFORM_HAIKU) @@ -186,4 +186,3 @@ add_custom_target(host_shaders SOURCES ${SHADER_SOURCES} ) -#add_dependencies(host_shaders sgsr::sgsr) diff --git a/src/video_core/host_shaders/sgsr1_shader_mobile.frag b/src/video_core/host_shaders/sgsr1_shader_mobile.frag new file mode 100644 index 0000000000..a03144f606 --- /dev/null +++ b/src/video_core/host_shaders/sgsr1_shader_mobile.frag @@ -0,0 +1,116 @@ +// SPDX-FileCopyrightText: Copyright (c) 2025, Qualcomm Innovation Center, Inc. All rights reserved. +// SPDX-License-Identifier: BSD-3-Clause + +#version 460 core + +//precision mediump float; +//precision highp int; +#define highp +#define mediump + +// Operation modes: RGBA -> 1, RGBY -> 3, LERP -> 4 +#define OperationMode 1 +#define EdgeThreshold 8.0/255.0 +// #define EdgeSharpness 2.0 +// #define UseUniformBlock + +#if defined(UseUniformBlock) +layout( push_constant ) uniform constants { + highp vec4 ViewportInfo[1]; + highp vec2 ResizeFactor; + highp float EdgeSharpness; +}; +layout(set = 0, binding = 0) uniform mediump sampler2D ps0; +#else +uniform highp vec4 ViewportInfo[1]; +uniform mediump sampler2D ps0; +#endif + +layout(location=0) in highp vec2 in_TEXCOORD0; +layout(location=0) out vec4 out_Target0; + +float fastLanczos2(float x) { + float wA = x-4.0; + float wB = x*wA-wA; + wA *= wA; + return wB*wA; +} + +vec2 weightY(float dx, float dy,float c, float std) { + float x = ((dx*dx)+(dy* dy))* 0.55 + clamp(abs(c)*std, 0.0, 1.0); + float w = fastLanczos2(x); + return vec2(w, w * c); +} + +void main() { + vec4 color; + if(OperationMode == 1) + color.xyz = textureLod(ps0, in_TEXCOORD0.xy, 0.0).xyz; + else + color.xyzw = textureLod(ps0, in_TEXCOORD0.xy, 0.0).xyzw; + + highp float xCenter = abs(in_TEXCOORD0.x + -0.5); + highp float yCenter = abs(in_TEXCOORD0.y + -0.5); + + //todo: config the SR region based on needs + //if ( OperationMode!=4 && xCenter*xCenter+yCenter*yCenter<=0.4 * 0.4) + if ( OperationMode!=4) { + highp vec2 imgCoord = ((in_TEXCOORD0.xy * ViewportInfo[0].zw) + vec2(-0.5, 0.5)); + highp vec2 imgCoordPixel = floor(imgCoord); + highp vec2 coord = imgCoordPixel * ViewportInfo[0].xy; + vec2 pl = imgCoord - imgCoordPixel; + vec4 left = textureGather(ps0, coord, OperationMode); + float edgeVote = abs(left.z - left.y) + abs(color[OperationMode] - left.y) + abs(color[OperationMode] - left.z) ; + if(edgeVote > EdgeThreshold) { + coord.x += ViewportInfo[0].x; + + highp vec2 IR_highp_vec2_0 = coord + vec2(ViewportInfo[0].x, 0.0); + vec4 right = textureGather(ps0, IR_highp_vec2_0, OperationMode); + vec4 upDown; + highp vec2 IR_highp_vec2_1 = coord + vec2(0.0, -ViewportInfo[0].y); + upDown.xy = textureGather(ps0, IR_highp_vec2_1, OperationMode).wz; + highp vec2 IR_highp_vec2_2 = coord + vec2(0.0, ViewportInfo[0].y); + upDown.zw = textureGather(ps0, IR_highp_vec2_2, OperationMode).yx; + + float mean = (left.y+left.z+right.x+right.w)*0.25; + left = left - vec4(mean); + right = right - vec4(mean); + upDown = upDown - vec4(mean); + color.w =color[OperationMode] - mean; + + float sum = (((((abs(left.x)+abs(left.y))+abs(left.z))+abs(left.w))+(((abs(right.x)+abs(right.y))+abs(right.z))+abs(right.w)))+(((abs(upDown.x)+abs(upDown.y))+abs(upDown.z))+abs(upDown.w))); + float std = 2.181818/sum; + + vec2 aWY = weightY(pl.x, pl.y+1.0, upDown.x,std); + aWY += weightY(pl.x-1.0, pl.y+1.0, upDown.y,std); + aWY += weightY(pl.x-1.0, pl.y-2.0, upDown.z,std); + aWY += weightY(pl.x, pl.y-2.0, upDown.w,std); + aWY += weightY(pl.x+1.0, pl.y-1.0, left.x,std); + aWY += weightY(pl.x, pl.y-1.0, left.y,std); + aWY += weightY(pl.x, pl.y, left.z,std); + aWY += weightY(pl.x+1.0, pl.y, left.w,std); + aWY += weightY(pl.x-1.0, pl.y-1.0, right.x,std); + aWY += weightY(pl.x-2.0, pl.y-1.0, right.y,std); + aWY += weightY(pl.x-2.0, pl.y, right.z,std); + aWY += weightY(pl.x-1.0, pl.y, right.w,std); + + float finalY = aWY.y/aWY.x; + + float maxY = max(max(left.y,left.z),max(right.x,right.w)); + float minY = min(min(left.y,left.z),min(right.x,right.w)); + finalY = clamp(EdgeSharpness*finalY, minY, maxY); + + float deltaY = finalY -color.w; + + //smooth high contrast input + deltaY = clamp(deltaY, -23.0 / 255.0, 23.0 / 255.0); + + color.x = clamp((color.x+deltaY),0.0,1.0); + color.y = clamp((color.y+deltaY),0.0,1.0); + color.z = clamp((color.z+deltaY),0.0,1.0); + } + } + + color.w = 1.0; //assume alpha channel is not used + out_Target0.xyzw = color; +} \ No newline at end of file diff --git a/src/video_core/host_shaders/sgsr1_shader_mobile_edge_direction.frag b/src/video_core/host_shaders/sgsr1_shader_mobile_edge_direction.frag new file mode 100644 index 0000000000..686e39a6d0 --- /dev/null +++ b/src/video_core/host_shaders/sgsr1_shader_mobile_edge_direction.frag @@ -0,0 +1,149 @@ +// SPDX-FileCopyrightText: Copyright (c) 2025, Qualcomm Innovation Center, Inc. All rights reserved. +// SPDX-License-Identifier: BSD-3-Clause + +#version 460 core + +//precision mediump float; +//precision highp int; +#define highp +#define mediump + +// Operation modes: RGBA -> 1, RGBY -> 3, LERP -> 4 +#define OperationMode 1 +// If set, will use edge direction to improve visual quality +// Expect a minimal cost increase +#define UseEdgeDirection 1 +#define EdgeThreshold 8.0/255.0 +// #define EdgeSharpness 2.0 +// #define UseUniformBlock + +#if defined(UseUniformBlock) +layout( push_constant ) uniform constants { + highp vec4 ViewportInfo[1]; + highp vec2 ResizeFactor; + highp float EdgeSharpness; +}; +layout(set = 0, binding = 0) uniform mediump sampler2D ps0; +#else +uniform highp vec4 ViewportInfo[1]; +uniform mediump sampler2D ps0; +#endif + +layout(location=0) in highp vec2 in_TEXCOORD0; +layout(location=0) out vec4 out_Target0; + +float fastLanczos2(float x) { + float wA = x-4.0; + float wB = x*wA-wA; + wA *= wA; + return wB*wA; +} + +#if defined(UseEdgeDirection) +vec2 weightY(float dx, float dy, float c, vec3 data) +#else +vec2 weightY(float dx, float dy, float c, float data) +#endif +{ +#if defined(UseEdgeDirection) + float std = data.x; + vec2 dir = data.yz; + + float edgeDis = ((dx*dir.y)+(dy*dir.x)); + float x = (((dx*dx)+(dy*dy))+((edgeDis*edgeDis)*((clamp(((c*c)*std),0.0,1.0)*0.7)+-1.0))); +#else + float std = data; + float x = ((dx*dx)+(dy* dy))* 0.55 + clamp(abs(c)*std, 0.0, 1.0); +#endif + + float w = fastLanczos2(x); + return vec2(w, w * c); +} + +vec2 edgeDirection(vec4 left, vec4 right) { + vec2 dir; + float RxLz = (right.x + (-left.z)); + float RwLy = (right.w + (-left.y)); + vec2 delta; + delta.x = (RxLz + RwLy); + delta.y = (RxLz + (-RwLy)); + float lengthInv = inversesqrt((delta.x * delta.x+ 3.075740e-05) + (delta.y * delta.y)); + dir.x = (delta.x * lengthInv); + dir.y = (delta.y * lengthInv); + return dir; +} + +void main() { + vec4 color; + if(OperationMode == 1) + color.xyz = textureLod(ps0, in_TEXCOORD0.xy, 0.0).xyz; + else + color.xyzw = textureLod(ps0, in_TEXCOORD0.xy, 0.0).xyzw; + + highp float xCenter = abs(in_TEXCOORD0.x + -0.5); + highp float yCenter = abs(in_TEXCOORD0.y + -0.5); + + //todo: config the SR region based on needs + //if ( OperationMode!=4 && xCenter*xCenter+yCenter*yCenter<=0.4 * 0.4) + if ( OperationMode!=4) { + highp vec2 imgCoord = ((in_TEXCOORD0.xy*ViewportInfo[0].zw)+vec2(-0.5,0.5)); + highp vec2 imgCoordPixel = floor(imgCoord); + highp vec2 coord = (imgCoordPixel*ViewportInfo[0].xy); + vec2 pl = imgCoord - imgCoordPixel; + vec4 left = textureGather(ps0, coord, OperationMode); + float edgeVote = abs(left.z - left.y) + abs(color[OperationMode] - left.y) + abs(color[OperationMode] - left.z) ; + if(edgeVote > EdgeThreshold) { + coord.x += ViewportInfo[0].x; + + highp vec2 IR_highp_vec2_0 = coord + vec2(ViewportInfo[0].x, 0.0); + vec4 right = textureGather(ps0, IR_highp_vec2_0, OperationMode); + vec4 upDown; + highp vec2 IR_highp_vec2_1 = coord + vec2(0.0, -ViewportInfo[0].y); + upDown.xy = textureGather(ps0, IR_highp_vec2_1, OperationMode).wz; + highp vec2 IR_highp_vec2_2 = coord + vec2(0.0, ViewportInfo[0].y); + upDown.zw = textureGather(ps0, IR_highp_vec2_2, OperationMode).yx; + + float mean = (left.y+left.z+right.x+right.w)*0.25; + left = left - vec4(mean); + right = right - vec4(mean); + upDown = upDown - vec4(mean); + color.w =color[OperationMode] - mean; + + float sum = (((((abs(left.x)+abs(left.y))+abs(left.z))+abs(left.w))+(((abs(right.x)+abs(right.y))+abs(right.z))+abs(right.w)))+(((abs(upDown.x)+abs(upDown.y))+abs(upDown.z))+abs(upDown.w))); + float sumMean = 1.014185e+01/sum; + float std = (sumMean*sumMean); + +#if defined(UseEdgeDirection) + vec3 data = vec3(std, edgeDirection(left, right)); +#else + float data = std; +#endif + vec2 aWY = weightY(pl.x, pl.y+1.0, upDown.x,data); + aWY += weightY(pl.x-1.0, pl.y+1.0, upDown.y,data); + aWY += weightY(pl.x-1.0, pl.y-2.0, upDown.z,data); + aWY += weightY(pl.x, pl.y-2.0, upDown.w,data); + aWY += weightY(pl.x+1.0, pl.y-1.0, left.x,data); + aWY += weightY(pl.x, pl.y-1.0, left.y,data); + aWY += weightY(pl.x, pl.y, left.z,data); + aWY += weightY(pl.x+1.0, pl.y, left.w,data); + aWY += weightY(pl.x-1.0, pl.y-1.0, right.x,data); + aWY += weightY(pl.x-2.0, pl.y-1.0, right.y,data); + aWY += weightY(pl.x-2.0, pl.y, right.z,data); + aWY += weightY(pl.x-1.0, pl.y, right.w,data); + + float finalY = aWY.y/aWY.x; + float maxY = max(max(left.y,left.z),max(right.x,right.w)); + float minY = min(min(left.y,left.z),min(right.x,right.w)); + float deltaY = clamp(EdgeSharpness*finalY, minY, maxY) -color.w; + + //smooth high contrast input + deltaY = clamp(deltaY, -23.0 / 255.0, 23.0 / 255.0); + + color.x = clamp((color.x+deltaY),0.0,1.0); + color.y = clamp((color.y+deltaY),0.0,1.0); + color.z = clamp((color.z+deltaY),0.0,1.0); + } + } + color.w = 1.0; //assume alpha channel is not used + out_Target0.xyzw = color; +} \ No newline at end of file