From 815695ad3aaed43a921577836dcff6ba6ed6a15b Mon Sep 17 00:00:00 2001 From: MaranBr Date: Tue, 2 Dec 2025 14:19:33 -0400 Subject: [PATCH 01/12] Remove dark hack from GPU Accuracy Normal --- .../features/settings/model/BooleanSetting.kt | 1 - .../settings/model/view/SettingsItem.kt | 7 --- .../settings/ui/SettingsFragmentPresenter.kt | 1 - .../app/src/main/res/values-ar/strings.xml | 2 - .../app/src/main/res/values-ckb/strings.xml | 2 - .../app/src/main/res/values-cs/strings.xml | 2 - .../app/src/main/res/values-de/strings.xml | 2 - .../app/src/main/res/values-es/strings.xml | 2 - .../app/src/main/res/values-fa/strings.xml | 2 - .../app/src/main/res/values-fr/strings.xml | 2 - .../app/src/main/res/values-he/strings.xml | 2 - .../app/src/main/res/values-hu/strings.xml | 2 - .../app/src/main/res/values-id/strings.xml | 2 - .../app/src/main/res/values-it/strings.xml | 2 - .../app/src/main/res/values-ja/strings.xml | 2 - .../app/src/main/res/values-ko/strings.xml | 2 - .../app/src/main/res/values-nb/strings.xml | 2 - .../app/src/main/res/values-pl/strings.xml | 2 - .../src/main/res/values-pt-rBR/strings.xml | 2 - .../src/main/res/values-pt-rPT/strings.xml | 2 - .../app/src/main/res/values-ru/strings.xml | 2 - .../app/src/main/res/values-sr/strings.xml | 2 - .../app/src/main/res/values-uk/strings.xml | 2 - .../app/src/main/res/values-vi/strings.xml | 2 - .../src/main/res/values-zh-rCN/strings.xml | 2 - .../src/main/res/values-zh-rTW/strings.xml | 2 - .../app/src/main/res/values/strings.xml | 2 - src/common/settings.h | 9 --- src/video_core/fence_manager.h | 58 +++---------------- 29 files changed, 9 insertions(+), 115 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 6eb828ec8c..cd09824ab4 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 @@ -25,7 +25,6 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders"), RENDERER_FAST_GPU("use_fast_gpu_time"), RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"), - RENDERER_EARLY_RELEASE_FENCES("early_release_fences"), SYNC_MEMORY_OPERATIONS("sync_memory_operations"), BUFFER_REORDER_DISABLE("disable_buffer_reorder"), RENDERER_DEBUG("debug"), 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 b2f23fb678..9bb744c996 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 @@ -704,13 +704,6 @@ abstract class SettingsItem( descriptionId = R.string.renderer_reactive_flushing_description ) ) - put( - SwitchSetting( - BooleanSetting.RENDERER_EARLY_RELEASE_FENCES, - titleId = R.string.renderer_early_release_fences, - descriptionId = R.string.renderer_early_release_fences_description - ) - ) put( SwitchSetting( BooleanSetting.SYNC_MEMORY_OPERATIONS, 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 1e58fd5223..1dfca5310b 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 @@ -460,7 +460,6 @@ class SettingsFragmentPresenter( add(IntSetting.RENDERER_SAMPLE_SHADING_FRACTION.key) add(HeaderSetting(R.string.veil_renderer)) - add(BooleanSetting.RENDERER_EARLY_RELEASE_FENCES.key) add(IntSetting.DMA_ACCURACY.key) add(BooleanSetting.BUFFER_REORDER_DISABLE.key) add(BooleanSetting.FRAME_INTERPOLATION.key) diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index deeff43fda..904bda3a50 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -101,8 +101,6 @@ العارض تحسين سرعة الإطارات يضمن تسليمًا سلسًا ومتناسقًا للإطارات من خلال مزامنة التوقيت بينها، مما يقلل من التقطيع وعدم انتظام الحركة. مثالي للألعاب التي تعاني من عدم استقرار في توقيت الإطارات أو تقطع دقيق أثناء اللعب. - إطلاق الأسوار مبكرًا - يساعد في إصلاح مشكلة 0 إطار في الثانية في ألعاب مثل DKCR:HD وSubnautica Below Zero وOri 2، ولكن قد يتسبب في تعطيل التحميل أو الأداء في ألعاب Unreal Engine. مزامنة عمليات الذاكرة يضمن اتساق البيانات بين عمليات الحوسبة والذاكرة. هذا الخيار قد يحل المشكلات في بعض الألعاب، ولكن قد يقلل الأداء في بعض الحالات. يبدو أن الألعاب التي تستخدم Unreal Engine 4 هي الأكثر تأثرًا. تعطيل إعادة ترتيب المخزن المؤقت diff --git a/src/android/app/src/main/res/values-ckb/strings.xml b/src/android/app/src/main/res/values-ckb/strings.xml index 4c6bc8d2db..39815700ee 100644 --- a/src/android/app/src/main/res/values-ckb/strings.xml +++ b/src/android/app/src/main/res/values-ckb/strings.xml @@ -79,8 +79,6 @@ رێندرەر تحسين توقيت الإطارات يضمن تسليمًا سلسًا ومتناسقًا للإطارات من خلال مزامنة التوقيت بينها، مما يقلل من التقطيع وعدم انتظام الحركة. مثالي للألعاب التي تعاني من عدم استقرار في توقيت الإطارات أو تقطع دقيق أثناء اللعب. - زێدەکردنی پەرستارەکان زووتر - یارمەتی دەدات لە چارەسەری 0 FPS لە یارییەکانی وەک DKCR:HD، Subnautica Below Zero و Ori 2، بەڵام ڕەنگە بارکردن یان کارایی لە یارییەکانی Unreal Engine تێکبدات. هاوبەشیی کردارەکانی بیرگە دڵنیایی داتا لە نێوان کردارەکانی کۆمپیوتەر و بیرگە. ئەم هەڵبژاردە کێشەکان لە هەندێک یاری چارەسەر دەکات، بەڵام لە هەندێک حاڵەت کارایی کەم دەکاتەوە. وا دیارە یارییەکانی Unreal Engine 4 زۆرترین کاریگەریان هەیە. ڕێکخستنەوەی بافر ناچالاک بکە diff --git a/src/android/app/src/main/res/values-cs/strings.xml b/src/android/app/src/main/res/values-cs/strings.xml index 9763895732..0bdabf1799 100644 --- a/src/android/app/src/main/res/values-cs/strings.xml +++ b/src/android/app/src/main/res/values-cs/strings.xml @@ -79,8 +79,6 @@ Renderer Vylepšené časování snímků Zajišťuje plynulé a konzistentní zobrazování snímků synchronizací jejich časování, čímž snižuje trhání a nerovnoměrné animace. Ideální pro hry, které trpí nestabilitou časování snímků nebo mikrotrháním během hraní. - Uvolnit ploty brzy - Pomáhá opravit 0 FPS v hrách jako DKCR:HD, Subnautica Below Zero a Ori 2, ale může narušit načítání nebo výkon v hrách na Unreal Engine. Synchronizace paměťových operací Zajišťuje konzistenci dat mezi výpočetními a paměťovými operacemi. Tato volba by měla opravit problémy v některých hrách, ale může v některých případech snížit výkon. Nejvíce postižené se zdají být hry s Unreal Engine 4. Zakázat přeřazování vyrovnávací paměti diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index 102e1a8566..8acedeabc4 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -87,8 +87,6 @@ Renderer Erweiterte Frame-Synchronisation Sorgt für eine gleichmäßige und konsistente Frame-Wiedergabe durch Synchronisierung der Frame-Zeiten, was Ruckeln und ungleichmäßige Animationen reduziert. Ideal für Spiele, die unter instabilen Frame-Zeiten oder Mikrorucklern leiden. - Zäune früher freigeben - Behebt 0 FPS in Spielen wie DKCR:HD, Subnautica Below Zero und Ori 2, kann aber Ladezeiten oder Performance in Unreal Engine-Spielen beeinträchtigen. Speicheroperationen synchronisieren Stellt die Datenkonsistenz zwischen Compute- und Speicheroperationen sicher. Diese Option sollte Probleme in einigen Spielen beheben, kann aber in einigen Fällen die Leistung verringern. Spiele mit Unreal Engine 4 scheinen am stärksten betroffen zu sein. Puffer-Neuanordnung deaktivieren diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index ea77c8c4d6..06abf23fc1 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -101,8 +101,6 @@ Renderizador Ritmo de fotogramas mejorado Garantiza una entrega de fotogramas fluida y consistente al sincronizar el tiempo entre fotogramas, reduciendo la tartamudez y la animación desigual. Ideal para juegos que experimentan inestabilidad en el tiempo de fotogramas o microtartamudeos durante el juego. - Liberar las vallas antes - Ayuda a arreglar 0 FPS en juegos como DKCR:HD, Subnautica Below Zero y Ori 2, pero puede romper la carga o el rendimiento en juegos de Unreal Engine. Sincronizar operaciones de memoria Garantiza la consistencia de los datos entre las operaciones de computación y memoria. Esta opción debería solucionar problemas en algunos juegos, pero también puede reducir el rendimiento en algunos casos. Los juegos de Unreal Engine 4 a menudo ven los cambios más significativos de los mismos. Desactivar reordenamiento de búfer diff --git a/src/android/app/src/main/res/values-fa/strings.xml b/src/android/app/src/main/res/values-fa/strings.xml index 345230bbe2..94b961ed55 100644 --- a/src/android/app/src/main/res/values-fa/strings.xml +++ b/src/android/app/src/main/res/values-fa/strings.xml @@ -70,8 +70,6 @@ با فعال کردن رد کردن فریم‌ها، عملکرد را با کاهش تعداد فریم‌های رندر شده بهبود دهید. این قابلیت در حال توسعه است و در نسخه‌های آینده فعال خواهد شد. زمان‌بندی پیشرفته فریم‌ها ارسال یکنواخت و پایدار فریم‌ها را با همگام‌سازی زمان بین آن‌ها تضمین می‌کند، که منجر به کاهش لرزش و انیمیشن‌های ناهموار می‌شود. برای بازی‌هایی که ناپایداری در زمان‌بندی فریم‌ها یا میکرو لرزش در حین بازی دارند ایده‌آل است - رهاسازی حصارها زودتر - به رفع مشکل 0 فریم بر ثانیه در بازی‌هایی مانند DKCR:HD، Subnautica Below Zero و Ori 2 کمک می‌کند، اما ممکن است بارگذاری یا عملکرد بازی‌های Unreal Engine را مختل کند. همگام‌سازی عملیات حافظه اطمینان از سازگاری داده‌ها بین عملیات محاسباتی و حافظه. این گزینه ممکن است مشکلات برخی بازی‌ها را رفع کند، اما در برخی موارد ممکن است عملکرد را کاهش دهد. به نظر می‌رسد بازی‌های با Unreal Engine 4 بیشترین تأثیر را داشته باشند. غیرفعال کردن مرتب‌سازی مجدد بافر diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml index 7a421103b2..2a4379e78f 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -101,8 +101,6 @@ Rendu Synchronisation avancée des frames Assure une diffusion fluide et régulière des frames en synchronisant leur timing, réduisant ainsi les saccades et les animations irrégulières. Idéal pour les jeux souffrant d`instabilité de timing des frames ou de micro-saccades pendant le jeu. - Libérer les barrières plus tôt - Résout les problèmes de 0 FPS dans des jeux comme DKCR:HD, Subnautica Below Zero et Ori 2, mais peut perturber le chargement ou les performances des jeux Unreal Engine. Synchroniser les opérations mémoire Garantit la cohérence des données entre les opérations de calcul et de mémoire. Cette option devrait résoudre les problèmes dans certains jeux, mais peut réduire les performances dans certains cas. Les jeux utilisant Unreal Engine 4 semblent être les plus affectés. Désactiver le réordonnancement du tampon diff --git a/src/android/app/src/main/res/values-he/strings.xml b/src/android/app/src/main/res/values-he/strings.xml index 5119e47493..6a8cc5a30b 100644 --- a/src/android/app/src/main/res/values-he/strings.xml +++ b/src/android/app/src/main/res/values-he/strings.xml @@ -79,8 +79,6 @@ רנדרר סנכרון פריימים מתקדם מבטיח אספקה חלקה ועקבית של פריימים על ידי סנכרון התזמון ביניהם, מפחית קפיצות ואנימציה לא אחידה. אידיאלי למשחקים עם בעיות בתזמון פריימים או מיקרו-קפיצות במהלך המשחק. - שחרר גדרות מוקדם - עוזר לתקן 0 FPS במשחקים כמו DKCR:HD, Subnautica Below Zero ו-Ori 2, אך עלול לפגוע בטעינה או בביצועים במשחקי Unreal Engine. סנכרון פעולות זיכרון מבטיח עקביות נתונים בין פעולות חישוב וזיכרון. אפשרות זו אמורה לתקן בעיות במשחקים מסוימים, אך עלולה להפחית ביצועים במקרים מסוימים. נראה שהמשחקים עם Unreal Engine 4 הם המושפעים ביותר. השבת סידור מחדש של חוצץ diff --git a/src/android/app/src/main/res/values-hu/strings.xml b/src/android/app/src/main/res/values-hu/strings.xml index 5db3416c62..2430340cde 100644 --- a/src/android/app/src/main/res/values-hu/strings.xml +++ b/src/android/app/src/main/res/values-hu/strings.xml @@ -79,8 +79,6 @@ Megjelenítő Továbbfejlesztett Képkocka-időzítés Biztosítja a képkockák sima és egyenletes kézbesítését azok időzítésének szinkronizálásával, csökkentve a megakadásokat és egyenetlen animációkat. Ideális azokhoz a játékokhoz, amelyek képkocka-időzítési instabilitást vagy mikro-reccsenést tapasztalnak játék közben. - Korai kerítés-felszabadítás - Segít javítani a 0 FPS-t olyan játékokban, mint a DKCR:HD, Subnautica Below Zero és az Ori 2, de ronthatja az Unreal Engine játékok betöltését vagy teljesítményét. Memória-műveletek szinkronizálása Biztosítja az adatok konzisztenciáját a számítási és memória-műveletek között. Ez az opciónak javítania kell néhány játékban előforduló problémát, de bizonyos esetekben csökkentheti a teljesítményt. Az Unreal Engine 4-et használó játékok látszanak a legérintettebbek. Puffer újrarendezés letiltása diff --git a/src/android/app/src/main/res/values-id/strings.xml b/src/android/app/src/main/res/values-id/strings.xml index 0240520a93..923d97ac88 100644 --- a/src/android/app/src/main/res/values-id/strings.xml +++ b/src/android/app/src/main/res/values-id/strings.xml @@ -101,8 +101,6 @@ Renderer Penyelarasan Frame Tingkat Lanjut Memastikan pengiriman frame yang halus dan konsisten dengan menyinkronkan waktu antar frame, mengurangi stuttering dan animasi tidak rata. Ideal untuk game yang mengalami ketidakstabilan waktu frame atau micro-stutter selama gameplay. - Lepas Pagar Lebih Awal - Membantu memperbaiki 0 FPS di game seperti DKCR:HD, Subnautica Below Zero dan Ori 2, tapi mungkin mengganggu loading atau performa di game Unreal Engine. Sinkronisasi Operasi Memori Memastikan konsistensi data antara operasi komputasi dan memori. Opsi ini seharusnya memperbaiki masalah di beberapa game, tetapi mungkin mengurangi performa dalam beberapa kasus. Game dengan Unreal Engine 4 tampaknya yang paling terpengaruh. Nonaktifkan Penyusunan Ulang Buffer diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml index 3b6a0e23c8..9399f2c188 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -101,8 +101,6 @@ Renderer Sincronizzazione avanzata fotogrammi Garantisce una consegna fluida e costante dei fotogrammi sincronizzandone i tempi, riducendo scatti e animazioni irregolari. Ideale per giochi che presentano instabilità nei tempi dei fotogrammi o micro-scatti durante il gameplay. - Rilascia le barriere prima - Risolve problemi di 0 FPS in giochi come DKCR:HD, Subnautica Below Zero e Ori 2, ma potrebbe compromettere caricamento o prestazioni in giochi Unreal Engine. Sincronizza operazioni di memoria Garantisce la coerenza dei dati tra le operazioni di calcolo e memoria. Questa opzione dovrebbe risolvere problemi in alcuni giochi, ma potrebbe ridurre le prestazioni in alcuni casi. I giochi con Unreal Engine 4 sembrano essere i più colpiti. Disabilita riordino buffer diff --git a/src/android/app/src/main/res/values-ja/strings.xml b/src/android/app/src/main/res/values-ja/strings.xml index 01a2bd2cae..c7c3aa6906 100644 --- a/src/android/app/src/main/res/values-ja/strings.xml +++ b/src/android/app/src/main/res/values-ja/strings.xml @@ -79,8 +79,6 @@ レンダラー 高度なフレーム同期 フレーム間のタイミングを同期させることで、スムーズで一貫したフレーム配信を確保し、カクつきや不均一なアニメーションを軽減します。フレームタイミングの不安定さやマイクロスタッターが発生するゲームに最適です。 - フェンスを早期に解放 - DKCR:HD、Subnautica Below Zero、Ori 2などのゲームで0 FPSを修正しますが、Unreal Engineゲームの読み込みやパフォーマンスに影響する可能性があります。 メモリ操作の同期 計算処理とメモリ操作間のデータ一貫性を保証します。 このオプションは一部のゲームの問題を修正しますが、場合によってはパフォーマンスが低下する可能性があります。 Unreal Engine 4のゲームが最も影響を受けるようです。 バッファの再並べ替えを無効化 diff --git a/src/android/app/src/main/res/values-ko/strings.xml b/src/android/app/src/main/res/values-ko/strings.xml index af02f19c3c..aa72e142ef 100644 --- a/src/android/app/src/main/res/values-ko/strings.xml +++ b/src/android/app/src/main/res/values-ko/strings.xml @@ -79,8 +79,6 @@ 렌더러 향상된 프레임 페이싱 프레임 간 타이밍을 동기화하여 부드럽고 일관된 프레임 전달을 보장하며, 끊김과 불균일한 애니메이션을 줄입니다. 프레임 타이밍 불안정이나 게임 플레이 중 미세 끊김이 발생하는 게임에 이상적입니다. - 펜스 조기 해제 - DKCR:HD, Subnautica Below Zero, Ori 2 등의 게임에서 0 FPS 현상을 해결하지만, Unreal Engine 게임의 로딩이나 성능에 문제를 일으킬 수 있습니다. 메모리 작업 동기화 컴퓨팅 및 메모리 작업 간 데이터 일관성을 보장합니다. 이 옵션은 일부 게임의 문제를 해결할 수 있지만 경우에 따라 성능이 저하될 수 있습니다. Unreal Engine 4 게임이 가장 큰 영향을 받는 것으로 보입니다. 버퍼 재정렬 비활성화 diff --git a/src/android/app/src/main/res/values-nb/strings.xml b/src/android/app/src/main/res/values-nb/strings.xml index e691f6b233..a924acf15c 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -79,8 +79,6 @@ Renderer Avansert bildevindu-synkronisering Sikrer jevn og konsekvent bildelevering ved å synkronisere tiden mellom bilder, noe som reduserer hakking og ujevn animasjon. Ideelt for spill som opplever ustabil bildetid eller mikro-hakk under spilling. - Frigjør gjerder tidlig - Løser 0 FPS i spill som DKCR:HD, Subnautica Below Zero og Ori 2, men kan forårsake problemer med lasting eller ytelse i Unreal Engine-spill. Synkroniser minneoperasjoner Sikrer datakonsistens mellom beregnings- og minneoperasjoner. Dette alternativet bør fikse problemer i noen spill, men kan redusere ytelsen i noen tilfeller. Spill med Unreal Engine 4 ser ut til å være de mest berørte. Deaktiver bufferomorganisering diff --git a/src/android/app/src/main/res/values-pl/strings.xml b/src/android/app/src/main/res/values-pl/strings.xml index dca27f67f3..d75dad8632 100644 --- a/src/android/app/src/main/res/values-pl/strings.xml +++ b/src/android/app/src/main/res/values-pl/strings.xml @@ -101,8 +101,6 @@ Renderer Zaawansowana synchronizacja klatek Zapewnia płynne i spójne wyświetlanie klatek poprzez synchronizację ich czasu, redukując zacinanie i nierówną animację. Idealne dla gier z niestabilnym czasem klatek lub mikro-zacinaniem podczas rozgrywki. - Wcześniejsze zwalnianie zabezpieczeń - Pomaga naprawić 0 FPS w grach takich jak DKCR:HD, Subnautica Below Zero i Ori 2, ale może zaburzyć ładowanie lub wydajność w grach Unreal Engine. Synchronizuj operacje pamięci Zapewnia spójność danych między operacjami obliczeniowymi i pamięciowymi. Ta opcja powinna naprawiać problemy w niektórych grach, ale może zmniejszyć wydajność w niektórych przypadkach. Gry z Unreal Engine 4 wydają się być najbardziej dotknięte. Wyłącz przestawianie bufora diff --git a/src/android/app/src/main/res/values-pt-rBR/strings.xml b/src/android/app/src/main/res/values-pt-rBR/strings.xml index 1d85e663b5..a76f67b881 100644 --- a/src/android/app/src/main/res/values-pt-rBR/strings.xml +++ b/src/android/app/src/main/res/values-pt-rBR/strings.xml @@ -101,8 +101,6 @@ Renderizador Enhanced Frame Pacing Sincronização Melhorada de Quadros: Sincroniza o tempo entre os quadros para uma entrega mais uniforme, reduzindo travamentos e animações irregulares. Útil em jogos que sofrem com microtravamentos ou instabilidade na taxa de frames. - Release Fences Early - Liberar Cercas Antecipadamente: Ajuda a corrigir 0 FPS em jogos como DKCR:HD, Subnautica Below Zero e Ori 2, mas pode prejudicar o carregamento ou o desempenho em jogos feitos com Unreal Engine. Sincronizar Operações de Memória Garante a consistência de dados entre operações de computação e memória. Esta opção pode corrigir problemas em alguns jogos, mas também pode reduzir o desempenho, sendo os jogos da Unreal Engine 4 os mais afetados. Desativar Reordenação de Buffers diff --git a/src/android/app/src/main/res/values-pt-rPT/strings.xml b/src/android/app/src/main/res/values-pt-rPT/strings.xml index b45ec0f87e..be0adcf05a 100644 --- a/src/android/app/src/main/res/values-pt-rPT/strings.xml +++ b/src/android/app/src/main/res/values-pt-rPT/strings.xml @@ -79,8 +79,6 @@ Renderizador Sincronização avançada de frames Garante uma entrega suave e consistente de frames sincronizando o seu tempo, reduzindo engasgadelas e animações irregulares. Ideal para jogos que experienciam instabilidade no tempo de frames ou micro-engasgadelas durante o jogo. - Libertar barreiras antecipadamente - Ajuda a corrigir 0 FPS em jogos como DKCR:HD, Subnautica Below Zero e Ori 2, mas pode afetar carregamento ou desempenho em jogos Unreal Engine. Sincronizar Operações de Memória Garante a consistência dos dados entre operações de computação e memória. Esta opção deve corrigir problemas em alguns jogos, mas pode reduzir o desempenho nalguns casos. Os jogos com Unreal Engine 4 parecem ser os mais afectados. Desativar reordenação de buffer diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index e73391f980..13fb94263c 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -101,8 +101,6 @@ Рендеринг Улучшенная синхронизация кадров Обеспечивает плавную и стабильную подачу кадров за счет синхронизации их времени, уменьшая подтормаживания и неравномерную анимацию. Идеально для игр с нестабильным временем кадров или микро-подтормаживаниями во время игры. - Ранний релиз ограждений - Помогает исправить 0 FPS в играх типа DKCR:HD, Subnautica Below Zero и Ori 2, но может нарушить загрузку или производительность в играх на Unreal Engine. Синхронизация операций с памятью Обеспечивает согласованность данных между вычислительными операциями и операциями с памятью. Эта опция должна исправлять проблемы в некоторых играх, но может снижать производительность в некоторых случаях. Наиболее сильно это затрагивает игры на Unreal Engine 4. Отключить переупорядочивание буфера diff --git a/src/android/app/src/main/res/values-sr/strings.xml b/src/android/app/src/main/res/values-sr/strings.xml index 4c1ca2f024..4a96c42a85 100644 --- a/src/android/app/src/main/res/values-sr/strings.xml +++ b/src/android/app/src/main/res/values-sr/strings.xml @@ -78,8 +78,6 @@ Рендерер Побољшани оквирни пејсинг Осигурава глатку и доследан испоруку оквира синхронизацијом времена између оквира, смањење муцања и неуједначене анимације. Идеално за игре које доживљавају временски оквир нестабилност или микро-штитнике током играња. - Ranije oslobađanje ograda - Pomaže u popravci 0 FPS u igrama kao što su DKCR:HD, Subnautica Below Zero i Ori 2, ali može oštetiti učitavanje ili performanse u Unreal Engine igrama. Синхронизација меморијских операција Осигурава конзистентност података између рачунских и меморијских операција. Ова опција би требало да поправи проблеме у неким играма, али може смањити перформансе у неким случајевима. Чини се да су игре са Unreal Engine 4 највише погођене. Онемогући преуређивање бафера diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml index aca7e399e6..2b02b21da7 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -101,8 +101,6 @@ Візуалізатор Покращена синхронізація кадрів Забезпечує плавну та стабільну подачу кадрів шляхом синхронізації їх часу, зменшуючи підвисання та нерівномірну анімацію. Ідеально для ігор з нестабільним часом кадрів або мікро-підвисаннями під час гри. - Release fences early - Це налаштування може бути необхідним для виправлення помилок 0FPS у деяких іграх (зокрема DKCR:HD, Subnautica та Ori 2). Водночас інші ігри, особливо створені на рушії Unreal Engine, можуть працювати некоректно або взагалі не запускатися. Синхронізація операцій з пам\'яттю Забезпечує узгодженість даних між обчислювальними операціями та операціями з пам\'яттю. Ця опція має виправляти проблеми в деяких іграх, але може знижувати продуктивність у деяких випадках. Ігри на Unreal Engine 4, здається, найбільш постраждалі. Вимкнути переупорядкування буфера diff --git a/src/android/app/src/main/res/values-vi/strings.xml b/src/android/app/src/main/res/values-vi/strings.xml index b54c416737..ebf50780ca 100644 --- a/src/android/app/src/main/res/values-vi/strings.xml +++ b/src/android/app/src/main/res/values-vi/strings.xml @@ -79,8 +79,6 @@ Trình kết xuất Đồng bộ khung hình nâng cao Đảm bảo cung cấp khung hình mượt mà và ổn định bằng cách đồng bộ hóa thời gian giữa các khung hình, giảm giật lag và hoạt ảnh không đồng đều. Lý tưởng cho các trò chơi gặp vấn đề về thời gian khung hình không ổn định hoặc giật lag nhẹ trong khi chơi. - Giải phóng rào chắn sớm - Giúp sửa lỗi 0 FPS trong các trò chơi như DKCR:HD, Subnautica Below Zero và Ori 2, nhưng có thể ảnh hưởng đến tải hoặc hiệu suất trong trò chơi Unreal Engine. Đồng bộ hoá thao tác bộ nhớ Đảm bảo tính nhất quán dữ liệu giữa các thao tác tính toán và bộ nhớ. Tùy chọn này nên khắc phục sự cố trong một số trò chơi, nhưng có thể làm giảm hiệu suất trong một số trường hợp. Các trò chơi với Unreal Engine 4 có vẻ bị ảnh hưởng nhiều nhất. Tắt sắp xếp lại bộ đệm 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 b5240a2c74..26d4bfd73b 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 @@ -101,8 +101,6 @@ 渲染器 增强帧同步 通过同步帧间时间确保流畅一致的帧交付,减少卡顿和不均匀动画。适合存在帧时间不稳定或游戏过程中出现微卡顿的游戏。 - 提前释放围栏 - 可修复《大金刚国度:热带寒流》《深海迷航:零度之下》和《奥日2》等游戏中的0 FPS问题,但可能影响Unreal Engine游戏的加载或性能。 同步内存操作 确保计算和内存操作之间的数据一致性。 此选项应能修复某些游戏中的问题,但在某些情况下可能会降低性能。 使用Unreal Engine 4的游戏似乎受影响最大。 禁用缓冲重排序 diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index d42a7f64c9..66b1ec2470 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -101,8 +101,6 @@ 渲染器 增強幀同步 通過同步幀間時間確保幀傳輸流暢一致,減少卡頓和不均勻動畫。適合存在幀時間不穩定或遊戲過程中出現些微卡頓的遊戲。 - 提前釋放圍欄 - 可修復《咚奇剛歸來HD》、《深海迷航:冰點之下》和《聖靈之光2》等遊戲中的0 FPS問題,但可能影響Unreal Engine遊戲的載入或效能。 同步記憶體操作 確保計算和記憶體操作之間的資料一致性。 此選項應能修復某些遊戲中的問題,但在某些情況下可能會降低效能。 使用Unreal Engine 4的遊戲似乎受影響最大。 停用緩衝區重新排序 diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 19554e7fe9..0a6b84dc13 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -108,8 +108,6 @@ Renderer Enhanced Frame Pacing Ensures smooth and consistent frame delivery by synchronizing the timing between frames, reducing stuttering and uneven animation. Ideal for games that experience frame timing instability or micro-stutters during gameplay. - Release Fences Early - Helps fix 0 FPS in games like DKCR:HD, Subnautica Below Zero and Ori 2, but may break loading or performance in Unreal Engine games. Sync Memory Operations Ensures data consistency between compute and memory operations. This option should fix issues in some games, but may also reduce performance in some cases. Unreal Engine 4 games often see the most significant changes thereof. Disable Buffer Reorder diff --git a/src/common/settings.h b/src/common/settings.h index 674813452e..32d5de890b 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -462,15 +462,6 @@ struct Values { Specialization::Default, true, true}; -#ifdef ANDROID - SwitchableSetting early_release_fences{linkage, - false, - "early_release_fences", - Category::RendererAdvanced, - Specialization::Default, - true, - true}; -#endif SwitchableSetting sync_memory_operations{linkage, false, "sync_memory_operations", diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h index b77235f438..416925ef5e 100644 --- a/src/video_core/fence_manager.h +++ b/src/video_core/fence_manager.h @@ -72,66 +72,26 @@ public: } void SignalFence(std::function&& func) { - const bool delay_fence = Settings::IsGPULevelHigh(); - - #ifdef __ANDROID__ - const bool use_optimized = Settings::values.early_release_fences.GetValue(); - #else - constexpr bool use_optimized = false; - #endif - + if constexpr (!can_async_check) { + TryReleasePendingFences(); + } const bool should_flush = ShouldFlush(); CommitAsyncFlushes(); TFence new_fence = CreateFence(!should_flush); - - if (use_optimized) { - if (!delay_fence) { - TryReleasePendingFences(); - } - - if (delay_fence) { - guard.lock(); - uncommitted_operations.emplace_back(std::move(func)); - } - } else { - if constexpr (!can_async_check) { - TryReleasePendingFences(); - } - - if constexpr (can_async_check) { - guard.lock(); - } - - if (delay_fence) { - uncommitted_operations.emplace_back(std::move(func)); - } + if constexpr (can_async_check) { + guard.lock(); } - + uncommitted_operations.emplace_back(std::move(func)); pending_operations.emplace_back(std::move(uncommitted_operations)); QueueFence(new_fence); - - if (!delay_fence) { - func(); - } - fences.push(std::move(new_fence)); - if (should_flush) { rasterizer.FlushCommands(); } - - if (use_optimized) { - if (delay_fence) { - guard.unlock(); - cv.notify_all(); - } - } else { - if constexpr (can_async_check) { - guard.unlock(); - cv.notify_all(); - } + if constexpr (can_async_check) { + guard.unlock(); + cv.notify_all(); } - rasterizer.InvalidateGPUCache(); } From 2a0754d6b817cd52d0a9a00c6af6196ba2ae2bf2 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Wed, 3 Dec 2025 01:08:40 +0100 Subject: [PATCH 02/12] Fix performance loss --- src/video_core/fence_manager.h | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h index 416925ef5e..d9aaaf7015 100644 --- a/src/video_core/fence_manager.h +++ b/src/video_core/fence_manager.h @@ -67,11 +67,8 @@ public: SignalFence(std::move(do_nothing)); } - void SyncOperation(std::function&& func) { - uncommitted_operations.emplace_back(std::move(func)); - } - void SignalFence(std::function&& func) { + bool delay_fence = Settings::IsGPULevelHigh(); if constexpr (!can_async_check) { TryReleasePendingFences(); } @@ -81,8 +78,15 @@ public: if constexpr (can_async_check) { guard.lock(); } - uncommitted_operations.emplace_back(std::move(func)); - pending_operations.emplace_back(std::move(uncommitted_operations)); + if (!delay_fence && !should_flush) { + func(); + } else { + uncommitted_operations.emplace_back(std::move(func)); + } + if (!uncommitted_operations.empty()) { + pending_operations.emplace_back(std::move(uncommitted_operations)); + uncommitted_operations.clear(); + } QueueFence(new_fence); fences.push(std::move(new_fence)); if (should_flush) { From ac97392f69536967216a896fb2ec6ec155086bdc Mon Sep 17 00:00:00 2001 From: MaranBr Date: Wed, 3 Dec 2025 01:29:26 +0100 Subject: [PATCH 03/12] Fix build --- src/video_core/fence_manager.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h index d9aaaf7015..b391654845 100644 --- a/src/video_core/fence_manager.h +++ b/src/video_core/fence_manager.h @@ -67,6 +67,10 @@ public: SignalFence(std::move(do_nothing)); } + void SyncOperation(std::function&& func) { + uncommitted_operations.emplace_back(std::move(func)); + } + void SignalFence(std::function&& func) { bool delay_fence = Settings::IsGPULevelHigh(); if constexpr (!can_async_check) { From d25bb924895a110542d29350dbb714f8f814eb2a Mon Sep 17 00:00:00 2001 From: MaranBr Date: Wed, 3 Dec 2025 13:43:03 -0400 Subject: [PATCH 04/12] Replace old GPU accuracy modes with new ones --- src/common/settings.cpp | 11 +++++++---- src/common/settings.h | 9 +++++---- src/common/settings_enums.h | 2 +- src/qt_common/config/shared_translation.cpp | 4 ++-- src/qt_common/config/shared_translation.h | 4 ++-- src/video_core/dma_pusher.cpp | 2 +- src/video_core/engines/maxwell_3d.cpp | 2 +- src/video_core/fence_manager.h | 3 +-- src/video_core/gpu_thread.cpp | 9 +-------- src/video_core/query_cache/query_cache.h | 4 ++-- .../renderer_opengl/gl_rasterizer.cpp | 7 ++----- .../renderer_vulkan/vk_query_cache.cpp | 13 ++++--------- .../renderer_vulkan/vk_rasterizer.cpp | 5 +---- src/yuzu/main_window.cpp | 18 +++++++----------- 14 files changed, 37 insertions(+), 56 deletions(-) diff --git a/src/common/settings.cpp b/src/common/settings.cpp index d3f7d9afea..fcee1750a4 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -149,13 +149,16 @@ void UpdateGPUAccuracy() { values.current_gpu_accuracy = values.gpu_accuracy.GetValue(); } -bool IsGPULevelExtreme() { - return values.current_gpu_accuracy == GpuAccuracy::Extreme; +bool IsGPULevelLow() { + return values.current_gpu_accuracy == GpuAccuracy::Low; +} + +bool IsGPULevelMedium() { + return values.current_gpu_accuracy == GpuAccuracy::Medium; } bool IsGPULevelHigh() { - return values.current_gpu_accuracy == GpuAccuracy::Extreme || - values.current_gpu_accuracy == GpuAccuracy::High; + return values.current_gpu_accuracy == GpuAccuracy::High; } bool IsDMALevelDefault() { diff --git a/src/common/settings.h b/src/common/settings.h index 32d5de890b..34783d6d1c 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -419,9 +419,9 @@ struct Values { SwitchableSetting gpu_accuracy{linkage, #ifdef ANDROID - GpuAccuracy::Normal, + GpuAccuracy::Low, #else - GpuAccuracy::High, + GpuAccuracy::Medium, #endif "gpu_accuracy", Category::RendererAdvanced, @@ -429,7 +429,7 @@ struct Values { true, true}; - GpuAccuracy current_gpu_accuracy{GpuAccuracy::High}; + GpuAccuracy current_gpu_accuracy{GpuAccuracy::Medium}; SwitchableSetting dma_accuracy{linkage, DmaAccuracy::Default, @@ -774,7 +774,8 @@ extern Values values; bool getDebugKnobAt(u8 i); void UpdateGPUAccuracy(); -bool IsGPULevelExtreme(); +bool IsGPULevelLow(); +bool IsGPULevelMedium(); bool IsGPULevelHigh(); bool IsDMALevelDefault(); diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h index c2d443ce1c..5090349270 100644 --- a/src/common/settings_enums.h +++ b/src/common/settings_enums.h @@ -133,7 +133,7 @@ ENUM(VSyncMode, Immediate, Mailbox, Fifo, FifoRelaxed); ENUM(VramUsageMode, Conservative, Aggressive); ENUM(RendererBackend, OpenGL, Vulkan, Null); ENUM(ShaderBackend, Glsl, Glasm, SpirV); -ENUM(GpuAccuracy, Normal, High, Extreme); +ENUM(GpuAccuracy, Low, Medium, High); ENUM(DmaAccuracy, Default, Unsafe, Safe); ENUM(CpuBackend, Dynarmic, Nce); ENUM(CpuAccuracy, Auto, Accurate, Unsafe, Paranoid, Debugging); diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index c601d25d80..33ce188610 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -507,9 +507,9 @@ std::unique_ptr ComboboxEnumeration(QObject* parent) }}); translations->insert({Settings::EnumMetadata::Index(), { - PAIR(GpuAccuracy, Normal, tr("Normal")), + PAIR(GpuAccuracy, Low, tr("Low")), + PAIR(GpuAccuracy, Medium, tr("Medium")), PAIR(GpuAccuracy, High, tr("High")), - PAIR(GpuAccuracy, Extreme, tr("Extreme")), }}); translations->insert({Settings::EnumMetadata::Index(), { diff --git a/src/qt_common/config/shared_translation.h b/src/qt_common/config/shared_translation.h index 8cc54644af..f2464319f8 100644 --- a/src/qt_common/config/shared_translation.h +++ b/src/qt_common/config/shared_translation.h @@ -61,9 +61,9 @@ static const std::map use_docked_mode_texts_map }; static const std::map gpu_accuracy_texts_map = { - {Settings::GpuAccuracy::Normal, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Normal"))}, + {Settings::GpuAccuracy::Low, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Low"))}, + {Settings::GpuAccuracy::Medium, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Medium"))}, {Settings::GpuAccuracy::High, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "High"))}, - {Settings::GpuAccuracy::Extreme, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Extreme"))}, }; static const std::map renderer_backend_texts_map = { diff --git a/src/video_core/dma_pusher.cpp b/src/video_core/dma_pusher.cpp index 7c3776f44d..af41773282 100644 --- a/src/video_core/dma_pusher.cpp +++ b/src/video_core/dma_pusher.cpp @@ -103,7 +103,7 @@ bool DmaPusher::Step() { ProcessCommands(headers); }; - const bool use_safe = Settings::IsDMALevelDefault() ? Settings::IsGPULevelHigh() : Settings::IsDMALevelSafe(); + const bool use_safe = Settings::IsDMALevelDefault() ? (Settings::IsGPULevelMedium() || Settings::IsGPULevelHigh()) : Settings::IsDMALevelSafe(); if (use_safe) { safe_process(); diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index 77729fd5b6..be90203a87 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp @@ -224,7 +224,7 @@ void Maxwell3D::ProcessMacro(u32 method, const u32* base_start, u32 amount, bool } void Maxwell3D::RefreshParametersImpl() { - if (!Settings::IsGPULevelHigh()) { + if (!Settings::IsGPULevelMedium() && !Settings::IsGPULevelHigh()) { return; } size_t current_index = 0; diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h index b391654845..61e4da9609 100644 --- a/src/video_core/fence_manager.h +++ b/src/video_core/fence_manager.h @@ -72,7 +72,6 @@ public: } void SignalFence(std::function&& func) { - bool delay_fence = Settings::IsGPULevelHigh(); if constexpr (!can_async_check) { TryReleasePendingFences(); } @@ -82,7 +81,7 @@ public: if constexpr (can_async_check) { guard.lock(); } - if (!delay_fence && !should_flush) { + if (Settings::IsGPULevelLow() || (Settings::IsGPULevelMedium() && !should_flush)) { func(); } else { uncommitted_operations.emplace_back(std::move(func)); diff --git a/src/video_core/gpu_thread.cpp b/src/video_core/gpu_thread.cpp index af09365ec6..8d8d857a02 100644 --- a/src/video_core/gpu_thread.cpp +++ b/src/video_core/gpu_thread.cpp @@ -79,15 +79,8 @@ void ThreadManager::FlushRegion(DAddr addr, u64 size) { if (!is_async) { // Always flush with synchronous GPU mode PushCommand(FlushRegionCommand(addr, size)); - return; } - if (!Settings::IsGPULevelExtreme()) { - return; - } - auto& gpu = system.GPU(); - u64 fence = gpu.RequestFlush(addr, size); - TickGPU(); - gpu.WaitForSyncOperation(fence); + return; } void ThreadManager::TickGPU() { diff --git a/src/video_core/query_cache/query_cache.h b/src/video_core/query_cache/query_cache.h index 6e084cc079..ccabfec429 100644 --- a/src/video_core/query_cache/query_cache.h +++ b/src/video_core/query_cache/query_cache.h @@ -260,7 +260,7 @@ void QueryCacheBase::CounterReport(GPUVAddr addr, QueryType counter_type }; u8* pointer = impl->device_memory.template GetPointer(cpu_addr); u8* pointer_timestamp = impl->device_memory.template GetPointer(cpu_addr + 8); - bool is_synced = !Settings::IsGPULevelHigh() && is_fence; + bool is_synced = (!Settings::IsGPULevelMedium() && !Settings::IsGPULevelHigh()) && is_fence; std::function operation([this, is_synced, streamer, query_base = query, query_location, pointer, pointer_timestamp] { if (True(query_base->flags & QueryFlagBits::IsInvalidated)) { @@ -294,7 +294,7 @@ void QueryCacheBase::CounterReport(GPUVAddr addr, QueryType counter_type if (is_fence) { impl->rasterizer.SignalFence(std::move(operation)); } else { - if (!Settings::IsGPULevelHigh() && counter_type == QueryType::Payload) { + if ((!Settings::IsGPULevelMedium() && !Settings::IsGPULevelHigh()) && counter_type == QueryType::Payload) { if (has_timestamp) { u64 timestamp = impl->gpu.GetTicks(); u64 value = static_cast(payload); diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index d5ad363a5b..b1a182e249 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -500,7 +500,7 @@ bool RasterizerOpenGL::MustFlushRegion(DAddr addr, u64 size, VideoCommon::CacheT return true; } } - if (!Settings::IsGPULevelHigh()) { + if (!Settings::IsGPULevelMedium() && !Settings::IsGPULevelHigh()) { return false; } if (True(which & VideoCommon::CacheType::TextureCache)) { @@ -629,9 +629,6 @@ void RasterizerOpenGL::ReleaseFences(bool force) { void RasterizerOpenGL::FlushAndInvalidateRegion(DAddr addr, u64 size, VideoCommon::CacheType which) { - if (Settings::IsGPULevelExtreme()) { - FlushRegion(addr, size, which); - } InvalidateRegion(addr, size, which); } @@ -682,7 +679,7 @@ void RasterizerOpenGL::TickFrame() { bool RasterizerOpenGL::AccelerateConditionalRendering() { gpu_memory->FlushCaching(); - if (Settings::IsGPULevelHigh()) { + if (Settings::IsGPULevelMedium() || Settings::IsGPULevelHigh()) { // Reimplement Host conditional rendering. return false; } diff --git a/src/video_core/renderer_vulkan/vk_query_cache.cpp b/src/video_core/renderer_vulkan/vk_query_cache.cpp index 89e0b1114e..229ade180b 100644 --- a/src/video_core/renderer_vulkan/vk_query_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_query_cache.cpp @@ -1415,14 +1415,10 @@ bool QueryCacheRuntime::HostConditionalRenderingCompareValues(VideoCommon::Looku return false; } - const bool is_gpu_high = Settings::IsGPULevelHigh(); - if (!is_gpu_high && impl->device.GetDriverID() == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS) { - return true; - } - auto driver_id = impl->device.GetDriverID(); - if (driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY || - driver_id == VK_DRIVER_ID_ARM_PROPRIETARY || driver_id == VK_DRIVER_ID_MESA_TURNIP) { + const bool is_gpu_medium_or_high = (Settings::IsGPULevelMedium() || Settings::IsGPULevelHigh()); + + if ((!is_gpu_medium_or_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) { return true; } @@ -1438,12 +1434,11 @@ bool QueryCacheRuntime::HostConditionalRenderingCompareValues(VideoCommon::Looku } } - if (!is_gpu_high) { + if (!is_gpu_medium_or_high) { return true; } if (!is_in_bc[0] && !is_in_bc[1]) { - // Both queries are in query cache, it's best to just flush. return true; } HostConditionalRenderingCompareBCImpl(object_1.address, equal_check); diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index b66f5a0502..7d5381b3c6 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -586,7 +586,7 @@ bool RasterizerVulkan::MustFlushRegion(DAddr addr, u64 size, VideoCommon::CacheT return true; } } - if (!Settings::IsGPULevelHigh()) { + if (!Settings::IsGPULevelMedium() && !Settings::IsGPULevelHigh()) { return false; } if (True(which & VideoCommon::CacheType::TextureCache)) { @@ -730,9 +730,6 @@ void RasterizerVulkan::ReleaseFences(bool force) { void RasterizerVulkan::FlushAndInvalidateRegion(DAddr addr, u64 size, VideoCommon::CacheType which) { - if (Settings::IsGPULevelExtreme()) { - FlushRegion(addr, size, which); - } InvalidateRegion(addr, size, which); } diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index d0ece67028..df35ba7a6c 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -1271,9 +1271,6 @@ void MainWindow::InitializeWidgets() { QMenu context_menu; for (auto const& gpu_accuracy_pair : ConfigurationShared::gpu_accuracy_texts_map) { - if (gpu_accuracy_pair.first == Settings::GpuAccuracy::Extreme) { - continue; - } context_menu.addAction(gpu_accuracy_pair.second, [this, gpu_accuracy_pair] { Settings::values.gpu_accuracy.SetValue(gpu_accuracy_pair.first); UpdateGPUAccuracyButton(); @@ -3580,16 +3577,15 @@ void MainWindow::OnToggleDockedMode() { void MainWindow::OnToggleGpuAccuracy() { switch (Settings::values.gpu_accuracy.GetValue()) { - case Settings::GpuAccuracy::High: { - Settings::values.gpu_accuracy.SetValue(Settings::GpuAccuracy::Normal); + case Settings::GpuAccuracy::Low: + Settings::values.gpu_accuracy.SetValue(Settings::GpuAccuracy::Medium); break; - } - case Settings::GpuAccuracy::Normal: - case Settings::GpuAccuracy::Extreme: - default: { + case Settings::GpuAccuracy::Medium: Settings::values.gpu_accuracy.SetValue(Settings::GpuAccuracy::High); break; - } + case Settings::GpuAccuracy::High: + Settings::values.gpu_accuracy.SetValue(Settings::GpuAccuracy::Low); + break; } QtCommon::system->ApplySettings(); @@ -4277,7 +4273,7 @@ void MainWindow::UpdateGPUAccuracyButton() { const auto gpu_accuracy_text = ConfigurationShared::gpu_accuracy_texts_map.find(gpu_accuracy)->second; gpu_accuracy_button->setText(gpu_accuracy_text.toUpper()); - gpu_accuracy_button->setChecked(gpu_accuracy != Settings::GpuAccuracy::Normal); + gpu_accuracy_button->setChecked(gpu_accuracy != Settings::GpuAccuracy::Low); } void MainWindow::UpdateDockedButton() { From 16e964480c99dabe7e8ff6f6ed5cbc6b34088759 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Wed, 3 Dec 2025 21:18:27 -0400 Subject: [PATCH 05/12] Reduce precision of Medium a little bit --- src/video_core/dma_pusher.cpp | 2 +- src/video_core/engines/maxwell_3d.cpp | 2 +- src/video_core/query_cache/query_cache.h | 4 ++-- src/video_core/renderer_opengl/gl_rasterizer.cpp | 4 ++-- src/video_core/renderer_vulkan/vk_query_cache.cpp | 6 +++--- src/video_core/renderer_vulkan/vk_rasterizer.cpp | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/video_core/dma_pusher.cpp b/src/video_core/dma_pusher.cpp index af41773282..7c3776f44d 100644 --- a/src/video_core/dma_pusher.cpp +++ b/src/video_core/dma_pusher.cpp @@ -103,7 +103,7 @@ bool DmaPusher::Step() { ProcessCommands(headers); }; - const bool use_safe = Settings::IsDMALevelDefault() ? (Settings::IsGPULevelMedium() || Settings::IsGPULevelHigh()) : Settings::IsDMALevelSafe(); + const bool use_safe = Settings::IsDMALevelDefault() ? Settings::IsGPULevelHigh() : Settings::IsDMALevelSafe(); if (use_safe) { safe_process(); diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index be90203a87..77729fd5b6 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp @@ -224,7 +224,7 @@ void Maxwell3D::ProcessMacro(u32 method, const u32* base_start, u32 amount, bool } void Maxwell3D::RefreshParametersImpl() { - if (!Settings::IsGPULevelMedium() && !Settings::IsGPULevelHigh()) { + if (!Settings::IsGPULevelHigh()) { return; } size_t current_index = 0; diff --git a/src/video_core/query_cache/query_cache.h b/src/video_core/query_cache/query_cache.h index ccabfec429..6e084cc079 100644 --- a/src/video_core/query_cache/query_cache.h +++ b/src/video_core/query_cache/query_cache.h @@ -260,7 +260,7 @@ void QueryCacheBase::CounterReport(GPUVAddr addr, QueryType counter_type }; u8* pointer = impl->device_memory.template GetPointer(cpu_addr); u8* pointer_timestamp = impl->device_memory.template GetPointer(cpu_addr + 8); - bool is_synced = (!Settings::IsGPULevelMedium() && !Settings::IsGPULevelHigh()) && is_fence; + bool is_synced = !Settings::IsGPULevelHigh() && is_fence; std::function operation([this, is_synced, streamer, query_base = query, query_location, pointer, pointer_timestamp] { if (True(query_base->flags & QueryFlagBits::IsInvalidated)) { @@ -294,7 +294,7 @@ void QueryCacheBase::CounterReport(GPUVAddr addr, QueryType counter_type if (is_fence) { impl->rasterizer.SignalFence(std::move(operation)); } else { - if ((!Settings::IsGPULevelMedium() && !Settings::IsGPULevelHigh()) && counter_type == QueryType::Payload) { + if (!Settings::IsGPULevelHigh() && counter_type == QueryType::Payload) { if (has_timestamp) { u64 timestamp = impl->gpu.GetTicks(); u64 value = static_cast(payload); diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index b1a182e249..602509bfdb 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -500,7 +500,7 @@ bool RasterizerOpenGL::MustFlushRegion(DAddr addr, u64 size, VideoCommon::CacheT return true; } } - if (!Settings::IsGPULevelMedium() && !Settings::IsGPULevelHigh()) { + if (!Settings::IsGPULevelHigh()) { return false; } if (True(which & VideoCommon::CacheType::TextureCache)) { @@ -679,7 +679,7 @@ void RasterizerOpenGL::TickFrame() { bool RasterizerOpenGL::AccelerateConditionalRendering() { gpu_memory->FlushCaching(); - if (Settings::IsGPULevelMedium() || Settings::IsGPULevelHigh()) { + if (Settings::IsGPULevelHigh()) { // Reimplement Host conditional rendering. return false; } diff --git a/src/video_core/renderer_vulkan/vk_query_cache.cpp b/src/video_core/renderer_vulkan/vk_query_cache.cpp index 229ade180b..2b47ea7dd7 100644 --- a/src/video_core/renderer_vulkan/vk_query_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_query_cache.cpp @@ -1416,9 +1416,9 @@ bool QueryCacheRuntime::HostConditionalRenderingCompareValues(VideoCommon::Looku } auto driver_id = impl->device.GetDriverID(); - const bool is_gpu_medium_or_high = (Settings::IsGPULevelMedium() || Settings::IsGPULevelHigh()); + const bool is_gpu_high = Settings::IsGPULevelHigh(); - if ((!is_gpu_medium_or_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_QUALCOMM_PROPRIETARY || driver_id == VK_DRIVER_ID_ARM_PROPRIETARY || driver_id == VK_DRIVER_ID_MESA_TURNIP) { return true; } @@ -1434,7 +1434,7 @@ bool QueryCacheRuntime::HostConditionalRenderingCompareValues(VideoCommon::Looku } } - if (!is_gpu_medium_or_high) { + if (!is_gpu_high) { return true; } diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 7d5381b3c6..da101fc4b7 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -586,7 +586,7 @@ bool RasterizerVulkan::MustFlushRegion(DAddr addr, u64 size, VideoCommon::CacheT return true; } } - if (!Settings::IsGPULevelMedium() && !Settings::IsGPULevelHigh()) { + if (!Settings::IsGPULevelHigh()) { return false; } if (True(which & VideoCommon::CacheType::TextureCache)) { From f7400a11a84012e40aba3fd0ccd0ee6f76a9c826 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Thu, 4 Dec 2025 09:36:22 -0400 Subject: [PATCH 06/12] Try to fix deadlocks on Android --- src/video_core/fence_manager.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h index 61e4da9609..5c5b110ea7 100644 --- a/src/video_core/fence_manager.h +++ b/src/video_core/fence_manager.h @@ -77,7 +77,11 @@ public: } const bool should_flush = ShouldFlush(); CommitAsyncFlushes(); +#ifdef __ANDROID__ + TFence new_fence = CreateFence(true); +#else TFence new_fence = CreateFence(!should_flush); +#endif if constexpr (can_async_check) { guard.lock(); } @@ -199,13 +203,21 @@ private: TFence current_fence; std::deque> current_operations; + while (!stop_token.stop_requested()) { { std::unique_lock lock(guard); +#ifdef __ANDROID__ + cv.wait_for(lock, std::chrono::milliseconds(5), [&] { return stop_token.stop_requested() || !fences.empty(); }); +#else cv.wait(lock, [&] { return stop_token.stop_requested() || !fences.empty(); }); +#endif if (stop_token.stop_requested()) [[unlikely]] { return; } + if (fences.empty()) { + continue; + } current_fence = std::move(fences.front()); current_operations = std::move(pending_operations.front()); fences.pop(); From c45ac5c6a59aa6e280146fa9bdfd32921df16196 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Thu, 4 Dec 2025 10:20:38 -0400 Subject: [PATCH 07/12] Update GPU accuracy modes on Android --- src/android/app/src/main/res/values-ar/strings.xml | 5 ----- src/android/app/src/main/res/values-ckb/strings.xml | 3 --- src/android/app/src/main/res/values-cs/strings.xml | 3 --- src/android/app/src/main/res/values-de/strings.xml | 3 --- src/android/app/src/main/res/values-es/strings.xml | 5 ----- src/android/app/src/main/res/values-fa/strings.xml | 5 ----- src/android/app/src/main/res/values-fr/strings.xml | 5 ----- src/android/app/src/main/res/values-he/strings.xml | 3 --- src/android/app/src/main/res/values-hu/strings.xml | 3 --- src/android/app/src/main/res/values-id/strings.xml | 3 --- src/android/app/src/main/res/values-it/strings.xml | 5 ----- src/android/app/src/main/res/values-ja/strings.xml | 3 --- src/android/app/src/main/res/values-ko/strings.xml | 3 --- src/android/app/src/main/res/values-nb/strings.xml | 3 --- src/android/app/src/main/res/values-pl/strings.xml | 5 ----- src/android/app/src/main/res/values-pt-rBR/strings.xml | 5 ----- src/android/app/src/main/res/values-pt-rPT/strings.xml | 3 --- src/android/app/src/main/res/values-ru/strings.xml | 5 ----- src/android/app/src/main/res/values-sr/strings.xml | 3 --- src/android/app/src/main/res/values-uk/strings.xml | 5 ----- src/android/app/src/main/res/values-vi/strings.xml | 3 --- src/android/app/src/main/res/values-zh-rCN/strings.xml | 5 ----- src/android/app/src/main/res/values-zh-rTW/strings.xml | 5 ----- src/android/app/src/main/res/values/arrays.xml | 4 ++-- src/android/app/src/main/res/values/strings.xml | 4 ++-- 25 files changed, 4 insertions(+), 95 deletions(-) diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index 904bda3a50..04b97917fe 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -889,11 +889,6 @@ Vulkan لاشيء - - عادي - عالي - أقصى - افتراضي غير آمن diff --git a/src/android/app/src/main/res/values-ckb/strings.xml b/src/android/app/src/main/res/values-ckb/strings.xml index 39815700ee..74a68d701f 100644 --- a/src/android/app/src/main/res/values-ckb/strings.xml +++ b/src/android/app/src/main/res/values-ckb/strings.xml @@ -634,9 +634,6 @@ ڤوڵکان هیچ - - ئاسایی - بەرز بنەڕەتی diff --git a/src/android/app/src/main/res/values-cs/strings.xml b/src/android/app/src/main/res/values-cs/strings.xml index 0bdabf1799..0b4dcde904 100644 --- a/src/android/app/src/main/res/values-cs/strings.xml +++ b/src/android/app/src/main/res/values-cs/strings.xml @@ -621,9 +621,6 @@ Vulkan Žádné - - Normální - Vysoká Výchozí diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index 8acedeabc4..cc3f2a421a 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -803,9 +803,6 @@ Wirklich fortfahren? Vulkan Keiner - - Normal - Hoch Standard diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index 06abf23fc1..29fd504da8 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -848,11 +848,6 @@ Vulkan Ninguno - - Normal - Alto - Extremo - Predeterminado Inseguro diff --git a/src/android/app/src/main/res/values-fa/strings.xml b/src/android/app/src/main/res/values-fa/strings.xml index 94b961ed55..2216bc82f7 100644 --- a/src/android/app/src/main/res/values-fa/strings.xml +++ b/src/android/app/src/main/res/values-fa/strings.xml @@ -769,11 +769,6 @@ Vulkan هیچ - - معمولی - زیاد - افراطی (کند) - پیش فرض ناایمن (سریع) diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml index 2a4379e78f..aa300b6400 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -861,11 +861,6 @@ Vulkan Aucune - - Normal - Haut - Extrême - Défaut Dangereux diff --git a/src/android/app/src/main/res/values-he/strings.xml b/src/android/app/src/main/res/values-he/strings.xml index 6a8cc5a30b..e1305e0239 100644 --- a/src/android/app/src/main/res/values-he/strings.xml +++ b/src/android/app/src/main/res/values-he/strings.xml @@ -675,9 +675,6 @@ Vulkan אין שום דבר - - רגיל - גבוה ברירת מחדל diff --git a/src/android/app/src/main/res/values-hu/strings.xml b/src/android/app/src/main/res/values-hu/strings.xml index 2430340cde..ef18ce004c 100644 --- a/src/android/app/src/main/res/values-hu/strings.xml +++ b/src/android/app/src/main/res/values-hu/strings.xml @@ -770,9 +770,6 @@ Vulkan Nincs - - Normál - Magas Alapértelmezett diff --git a/src/android/app/src/main/res/values-id/strings.xml b/src/android/app/src/main/res/values-id/strings.xml index 923d97ac88..f157c6cb05 100644 --- a/src/android/app/src/main/res/values-id/strings.xml +++ b/src/android/app/src/main/res/values-id/strings.xml @@ -820,9 +820,6 @@ Vulkan Tak ada - - Normal - Tinggi Bawaan diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml index 9399f2c188..b0c2b3f581 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -861,11 +861,6 @@ Vulkan Nessuna - - Normale - Alta - Estrema - Predefinito Non sicura diff --git a/src/android/app/src/main/res/values-ja/strings.xml b/src/android/app/src/main/res/values-ja/strings.xml index c7c3aa6906..2891c18d62 100644 --- a/src/android/app/src/main/res/values-ja/strings.xml +++ b/src/android/app/src/main/res/values-ja/strings.xml @@ -675,9 +675,6 @@ Vulkan なし - - 標準 - デフォルト diff --git a/src/android/app/src/main/res/values-ko/strings.xml b/src/android/app/src/main/res/values-ko/strings.xml index aa72e142ef..5fd9fabe3f 100644 --- a/src/android/app/src/main/res/values-ko/strings.xml +++ b/src/android/app/src/main/res/values-ko/strings.xml @@ -729,9 +729,6 @@ Vulcan 없음 - - 보통 - 높음 기본값 diff --git a/src/android/app/src/main/res/values-nb/strings.xml b/src/android/app/src/main/res/values-nb/strings.xml index a924acf15c..23e9019042 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -647,9 +647,6 @@ Vulkan Ingen - - Normal - Høy Standard diff --git a/src/android/app/src/main/res/values-pl/strings.xml b/src/android/app/src/main/res/values-pl/strings.xml index d75dad8632..a24a30ace5 100644 --- a/src/android/app/src/main/res/values-pl/strings.xml +++ b/src/android/app/src/main/res/values-pl/strings.xml @@ -885,11 +885,6 @@ Vulkan Żadny - - Normalny - Wysoki - Ekstremalne - 預設 Niezalecane diff --git a/src/android/app/src/main/res/values-pt-rBR/strings.xml b/src/android/app/src/main/res/values-pt-rBR/strings.xml index a76f67b881..16f1e5c739 100644 --- a/src/android/app/src/main/res/values-pt-rBR/strings.xml +++ b/src/android/app/src/main/res/values-pt-rBR/strings.xml @@ -849,11 +849,6 @@ uma tentativa de mapeamento automático Vulkan Nenhum - - Normal - Alta - Extrema - Padrão Insegura diff --git a/src/android/app/src/main/res/values-pt-rPT/strings.xml b/src/android/app/src/main/res/values-pt-rPT/strings.xml index be0adcf05a..f70ffd6397 100644 --- a/src/android/app/src/main/res/values-pt-rPT/strings.xml +++ b/src/android/app/src/main/res/values-pt-rPT/strings.xml @@ -782,9 +782,6 @@ uma tentativa de mapeamento automático Vulcano Nenhum - - Normal - Alto Predefinido diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index 13fb94263c..bbead0be45 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -883,11 +883,6 @@ Vulkan Никакой - - Нормальная - Высокая - Экстрим - По умолчанию Небезопасно diff --git a/src/android/app/src/main/res/values-sr/strings.xml b/src/android/app/src/main/res/values-sr/strings.xml index 4a96c42a85..d4b6f9be3a 100644 --- a/src/android/app/src/main/res/values-sr/strings.xml +++ b/src/android/app/src/main/res/values-sr/strings.xml @@ -780,9 +780,6 @@ Вулкан Ниједан - - Нормалан - Високо Подразумевано diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml index 2b02b21da7..572435d8d8 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -885,11 +885,6 @@ Vulkan Вимкнено - - Нормальна - Висока - Екстремально - Типово Небезпечно diff --git a/src/android/app/src/main/res/values-vi/strings.xml b/src/android/app/src/main/res/values-vi/strings.xml index ebf50780ca..1b45fcfadb 100644 --- a/src/android/app/src/main/res/values-vi/strings.xml +++ b/src/android/app/src/main/res/values-vi/strings.xml @@ -647,9 +647,6 @@ Vulkan Trống - - Trung bình - Khỏe Mặc định 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 26d4bfd73b..7709710ad9 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 @@ -857,11 +857,6 @@ Vulkan - - 正常 - - 极致 - 默认 不安全 diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index 66b1ec2470..b9c32dad8e 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -857,11 +857,6 @@ Vulkan - - 標準 - - 極高 - 預設 不安全 diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index b1aab5351d..93fd4ff780 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -98,9 +98,9 @@ - @string/renderer_accuracy_normal + @string/renderer_accuracy_low + @string/renderer_accuracy_medium @string/renderer_accuracy_high - @string/renderer_accuracy_extreme diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 0a6b84dc13..43f6bd845a 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -933,9 +933,9 @@ None - Normal + Low + Medium High - Extreme Default From 38996cb443703bb8065728ab1e125b9a43a14a52 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Thu, 4 Dec 2025 11:06:27 -0400 Subject: [PATCH 08/12] Revert "Try to fix deadlocks on Android" This reverts commit f7400a11a84012e40aba3fd0ccd0ee6f76a9c826. --- src/video_core/fence_manager.h | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h index 5c5b110ea7..61e4da9609 100644 --- a/src/video_core/fence_manager.h +++ b/src/video_core/fence_manager.h @@ -77,11 +77,7 @@ public: } const bool should_flush = ShouldFlush(); CommitAsyncFlushes(); -#ifdef __ANDROID__ - TFence new_fence = CreateFence(true); -#else TFence new_fence = CreateFence(!should_flush); -#endif if constexpr (can_async_check) { guard.lock(); } @@ -203,21 +199,13 @@ private: TFence current_fence; std::deque> current_operations; - while (!stop_token.stop_requested()) { { std::unique_lock lock(guard); -#ifdef __ANDROID__ - cv.wait_for(lock, std::chrono::milliseconds(5), [&] { return stop_token.stop_requested() || !fences.empty(); }); -#else cv.wait(lock, [&] { return stop_token.stop_requested() || !fences.empty(); }); -#endif if (stop_token.stop_requested()) [[unlikely]] { return; } - if (fences.empty()) { - continue; - } current_fence = std::move(fences.front()); current_operations = std::move(pending_operations.front()); fences.pop(); From a921b2e29ebdeb52265308d11bfff74e60408e95 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Fri, 5 Dec 2025 02:43:15 +0300 Subject: [PATCH 09/12] [vk_master_semaphore] Fix Android fence deadlock with polling --- .../renderer_vulkan/vk_master_semaphore.cpp | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_master_semaphore.cpp b/src/video_core/renderer_vulkan/vk_master_semaphore.cpp index e65755de64..a82e2c73fa 100644 --- a/src/video_core/renderer_vulkan/vk_master_semaphore.cpp +++ b/src/video_core/renderer_vulkan/vk_master_semaphore.cpp @@ -80,7 +80,9 @@ void MasterSemaphore::Wait(u64 tick) { if (!semaphore) { // If we don't support timeline semaphores, wait for the value normally std::unique_lock lk{free_mutex}; - free_cv.wait(lk, [&] { return gpu_tick.load(std::memory_order_relaxed) >= tick; }); + free_cv.wait(lk, [&] { + return gpu_tick.load(std::memory_order_acquire) >= tick; + }); return; } @@ -216,15 +218,32 @@ void MasterSemaphore::WaitThread(std::stop_token token) { wait_queue.pop(); } +#ifdef ANDROID + VkResult status; + do { + status = fence.GetStatus(); + if (status == VK_NOT_READY) { + std::this_thread::sleep_for(std::chrono::microseconds(100)); + } + } while (status == VK_NOT_READY); + + if (status == VK_SUCCESS) { + fence.Reset(); + } else { + vk::Check(status); + continue; + } +#else fence.Wait(); fence.Reset(); +#endif { std::scoped_lock lock{free_mutex}; free_queue.push_front(std::move(fence)); - gpu_tick.store(host_tick); + gpu_tick.store(host_tick, std::memory_order_release); } - free_cv.notify_one(); + free_cv.notify_all(); } } From b3f64de04b7393c97afe52f63ea3daf48dcbec20 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Mon, 8 Dec 2025 09:50:14 -0400 Subject: [PATCH 10/12] Use DMA Safe as Default on GPU Medium --- src/video_core/dma_pusher.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/dma_pusher.cpp b/src/video_core/dma_pusher.cpp index 7c3776f44d..af41773282 100644 --- a/src/video_core/dma_pusher.cpp +++ b/src/video_core/dma_pusher.cpp @@ -103,7 +103,7 @@ bool DmaPusher::Step() { ProcessCommands(headers); }; - const bool use_safe = Settings::IsDMALevelDefault() ? Settings::IsGPULevelHigh() : Settings::IsDMALevelSafe(); + const bool use_safe = Settings::IsDMALevelDefault() ? (Settings::IsGPULevelMedium() || Settings::IsGPULevelHigh()) : Settings::IsDMALevelSafe(); if (use_safe) { safe_process(); From 2bcdf398927ab859f987c0f433d189b1336d0552 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Mon, 8 Dec 2025 20:54:55 +0300 Subject: [PATCH 11/12] rename the accuracy levels --- src/android/app/src/main/res/values/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 43f6bd845a..354fc57fb9 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -933,9 +933,9 @@ None - Low - Medium - High + Performance + Balanced + Accurate Default From 82bb0a3294a5ec9396a27e1f70b3472e5156768d Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Mon, 8 Dec 2025 21:07:09 +0300 Subject: [PATCH 12/12] rename GpuAccuracy for PC --- src/qt_common/config/shared_translation.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qt_common/config/shared_translation.h b/src/qt_common/config/shared_translation.h index f2464319f8..299c31eaf8 100644 --- a/src/qt_common/config/shared_translation.h +++ b/src/qt_common/config/shared_translation.h @@ -61,9 +61,9 @@ static const std::map use_docked_mode_texts_map }; static const std::map gpu_accuracy_texts_map = { - {Settings::GpuAccuracy::Low, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Low"))}, - {Settings::GpuAccuracy::Medium, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Medium"))}, - {Settings::GpuAccuracy::High, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "High"))}, + {Settings::GpuAccuracy::Low, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Performance"))}, + {Settings::GpuAccuracy::Medium, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Balanced"))}, + {Settings::GpuAccuracy::High, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Accurate"))}, }; static const std::map renderer_backend_texts_map = {