mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-10-26 23:31:14 +01:00
Compare commits
44 commits
d619b851f7
...
ae3e86821d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ae3e86821d | ||
|
|
4f046ab80b | ||
|
|
2dba81c990 | ||
|
|
f8f6ae59c7 | ||
|
|
59e3fee6f2 | ||
|
|
24593544e8 | ||
|
|
2d90a0ffc6 | ||
|
|
886ab7691a | ||
|
|
828de65f6f | ||
|
|
d4e01a72c4 | ||
|
|
c693994ef1 | ||
|
|
e0d7543b2a | ||
|
|
8b7b7f5587 | ||
|
|
b56f7069eb | ||
|
|
ecdb3ed76a | ||
|
|
f4e6ae8e19 | ||
|
|
5b6d79beb2 | ||
|
|
73ab21b031 | ||
|
|
97f9eb9414 | ||
|
|
464ce4ad1d | ||
|
|
a143d53282 | ||
|
|
5604eb6e82 | ||
|
|
0fbbd706a8 | ||
|
|
9b815a1125 | ||
|
|
80bbeba430 | ||
|
|
c291decd7c | ||
|
|
9472fa6a93 | ||
|
|
9bdeb93949 | ||
|
|
5ef3ea9f8e | ||
|
|
ef91cfb881 | ||
|
|
1a8ea90ec6 | ||
|
|
e09fd9100c | ||
|
|
b6beecf7a9 | ||
|
|
af3e7c69f0 | ||
|
|
3bda843214 | ||
|
|
c554d58466 | ||
|
|
a315e02f5b | ||
|
|
6c76908ddb | ||
|
|
e6ad51e3d5 | ||
|
|
f11b69d6b7 | ||
|
|
27cadb24f3 | ||
|
|
a7ef19e028 | ||
|
|
2c1eff2e60 | ||
|
|
abb616c357 |
58 changed files with 8980 additions and 8109 deletions
|
|
@ -233,6 +233,7 @@ endif()
|
|||
|
||||
option(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" ${DEFAULT_YUZU_USE_BUNDLED_OPENSSL})
|
||||
|
||||
# TODO(crueter): CPM this
|
||||
if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL)
|
||||
AddJsonPackage(vulkan-validation-layers)
|
||||
|
||||
|
|
|
|||
650
dist/languages/ar.ts
vendored
650
dist/languages/ar.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/ca.ts
vendored
591
dist/languages/ca.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/cs.ts
vendored
591
dist/languages/cs.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/da.ts
vendored
591
dist/languages/da.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/de.ts
vendored
591
dist/languages/de.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/el.ts
vendored
591
dist/languages/el.ts
vendored
File diff suppressed because it is too large
Load diff
636
dist/languages/es.ts
vendored
636
dist/languages/es.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/fi.ts
vendored
591
dist/languages/fi.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/fr.ts
vendored
591
dist/languages/fr.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/hu.ts
vendored
591
dist/languages/hu.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/id.ts
vendored
591
dist/languages/id.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/it.ts
vendored
591
dist/languages/it.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/ja_JP.ts
vendored
591
dist/languages/ja_JP.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/ko_KR.ts
vendored
591
dist/languages/ko_KR.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/nb.ts
vendored
591
dist/languages/nb.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/nl.ts
vendored
591
dist/languages/nl.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/pl.ts
vendored
591
dist/languages/pl.ts
vendored
File diff suppressed because it is too large
Load diff
985
dist/languages/pt_BR.ts
vendored
985
dist/languages/pt_BR.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/pt_PT.ts
vendored
591
dist/languages/pt_PT.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/ru_RU.ts
vendored
591
dist/languages/ru_RU.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/sv.ts
vendored
591
dist/languages/sv.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/tr_TR.ts
vendored
591
dist/languages/tr_TR.ts
vendored
File diff suppressed because it is too large
Load diff
592
dist/languages/uk.ts
vendored
592
dist/languages/uk.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/vi.ts
vendored
591
dist/languages/vi.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/vi_VN.ts
vendored
591
dist/languages/vi_VN.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/zh_CN.ts
vendored
591
dist/languages/zh_CN.ts
vendored
File diff suppressed because it is too large
Load diff
591
dist/languages/zh_TW.ts
vendored
591
dist/languages/zh_TW.ts
vendored
File diff suppressed because it is too large
Load diff
|
|
@ -44,6 +44,10 @@ 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.
|
||||
- **SGSR Edge**: Almost the same pipeline as SGSR, but with improved edge detection.
|
||||
|
||||
### Anisotropy values
|
||||
|
||||
|
|
|
|||
|
|
@ -284,8 +284,6 @@ class SettingsFragmentPresenter(
|
|||
add(BooleanSetting.SYNC_MEMORY_OPERATIONS.key)
|
||||
add(BooleanSetting.RENDERER_USE_DISK_SHADER_CACHE.key)
|
||||
add(BooleanSetting.RENDERER_FORCE_MAX_CLOCK.key)
|
||||
add(BooleanSetting.RENDERER_ASYNCHRONOUS_GPU_EMULATION.key)
|
||||
add(BooleanSetting.RENDERER_ASYNC_PRESENTATION.key)
|
||||
add(BooleanSetting.RENDERER_REACTIVE_FLUSHING.key)
|
||||
add(BooleanSetting.ENABLE_BUFFER_HISTORY.key)
|
||||
add(BooleanSetting.USE_OPTIMIZED_VERTEX_BUFFERS.key)
|
||||
|
|
@ -296,6 +294,8 @@ class SettingsFragmentPresenter(
|
|||
add(BooleanSetting.SKIP_CPU_INNER_INVALIDATION.key)
|
||||
add(BooleanSetting.FIX_BLOOM_EFFECTS.key)
|
||||
add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key)
|
||||
add(BooleanSetting.RENDERER_ASYNCHRONOUS_GPU_EMULATION.key)
|
||||
add(BooleanSetting.RENDERER_ASYNC_PRESENTATION.key)
|
||||
add(SettingsItem.GPU_UNSWIZZLE_COMBINED)
|
||||
|
||||
add(HeaderSetting(R.string.extensions))
|
||||
|
|
|
|||
|
|
@ -291,13 +291,23 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||
// Game launched via intent (check for existing custom config)
|
||||
intentGame != null -> {
|
||||
game?.let { gameInstance ->
|
||||
runCatching { GameHelper.restoreContentForGame(gameInstance) }
|
||||
.onFailure {
|
||||
Log.warning(
|
||||
"[EmulationFragment] Failed to restore content for intent launch: ${it.message}"
|
||||
)
|
||||
}
|
||||
|
||||
val customConfigFile = SettingsFile.getCustomSettingsFile(gameInstance)
|
||||
if (customConfigFile.exists()) {
|
||||
shouldUseCustom = true
|
||||
Log.info(
|
||||
"[EmulationFragment] Found existing custom settings for ${gameInstance.title}, loading them"
|
||||
)
|
||||
SettingsFile.loadCustomConfig(gameInstance)
|
||||
NativeConfig.unloadPerGameConfig()
|
||||
} else {
|
||||
shouldUseCustom = false
|
||||
Log.info(
|
||||
"[EmulationFragment] No custom settings found for ${gameInstance.title}, using global settings"
|
||||
)
|
||||
|
|
@ -871,7 +881,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||
if (drawerView == binding.quickSettingsSheet) {
|
||||
isQuickSettingsMenuOpen = true
|
||||
if (shouldUseCustom) {
|
||||
SettingsFile.loadCustomConfig(args.game!!)
|
||||
SettingsFile.loadCustomConfig(game!!)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2499,7 +2509,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||
|
||||
fun toggleOverlay(enable: Boolean) {
|
||||
if (!isAdded || _binding == null) return
|
||||
if (enable && hasPhysicalControllerConnected && !args.overlayGamelessEditMode) return
|
||||
if (enable == !BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) {
|
||||
// Reset controller input flag so controller can hide overlay again
|
||||
if (!enable) {
|
||||
|
|
@ -2537,7 +2546,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||
if (binding.surfaceInputOverlay.isGamelessMode()) return
|
||||
|
||||
if (hasConnectedControllers) {
|
||||
if (BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) {
|
||||
if (BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean() &&
|
||||
BooleanSetting.HIDE_OVERLAY_ON_CONTROLLER_INPUT.getBoolean()) {
|
||||
overlayHiddenByPhysicalController = true
|
||||
toggleOverlay(false)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ namespace AndroidSettings {
|
|||
Settings::Setting<u32> input_overlay_auto_hide{linkage, 5, "input_overlay_auto_hide",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true, true, &enable_input_overlay_auto_hide};
|
||||
Settings::Setting<bool> hide_overlay_on_controller_input{linkage, false,
|
||||
Settings::Setting<bool> hide_overlay_on_controller_input{linkage, true,
|
||||
"hide_overlay_on_controller_input",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true,
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
<string name="hide_overlay_on_controller_input">إخفاء الطبقة عند إدخال ذراع التحكم</string>
|
||||
<string name="hide_overlay_on_controller_input_description">إخفاء تلقائي لطبقة عناصر التحكم باللمس عند استخدام ذراع تحكم فعلية. تظهر الطبقة مرة أخرى عند فصل ذراع التحكم.</string>
|
||||
<string name="invert_confirm_back_controller_buttons">عكس أزرار التأكيد/الرجوع في وحدة التحكم</string>
|
||||
<string name="invert_confirm_back_controller_buttons_description">قم بتبديل طريقة عمل زري التأكيد والرجوع في نظام Android لتتوافق مع أنماط Switch و Xbox أثناء استخدام واجهة المستخدم الخاصة بالتطبيق.</string>
|
||||
<string name="invert_confirm_back_controller_buttons_description">تبديل طريقة التعامل مع زري «تأكيد» و«رجوع» في نظام Android لتتوافق مع أنماط أجهزة Switch وXbox أثناء استخدام واجهة المستخدم الخاصة بالتطبيق.</string>
|
||||
|
||||
<string name="input_overlay_options">طبقة الإدخال</string>
|
||||
<string name="input_overlay_options_description">ضبط ذراع التحكم على الشاشة</string>
|
||||
|
|
@ -268,7 +268,7 @@
|
|||
<string name="product">المنتج</string>
|
||||
<string name="android_version">إصدار Android</string>
|
||||
<string name="android_security_patch">تصحيح الأمان</string>
|
||||
<string name="build_id">معرف البناء</string>
|
||||
<string name="build_id">معرف الإصدار</string>
|
||||
<string name="general_information">معلومات عامة</string>
|
||||
<string name="hardware">الأجهزة</string>
|
||||
<string name="supported_abis">واجهات برمجة التطبيقات المدعومة</string>
|
||||
|
|
@ -287,7 +287,7 @@
|
|||
<string name="install_amiibo_keys">تثبيت مفاتيح أميبو</string>
|
||||
<string name="install_amiibo_keys_description">مطلوب لاستخدام أميبو في اللعبة</string>
|
||||
<string name="gpu_driver_fetcher">أداة جلب برامج تشغيل وحدة المعالجة الرسومية</string>
|
||||
<string name="gpu_driver_manager">مدير برامج تشغيل وحدة معالجة الرسومات</string>
|
||||
<string name="gpu_driver_manager">إدارة برامج تشغيل وحدة معالجة الرسومات</string>
|
||||
<string name="install_gpu_driver_description">تثبيت برامج تشغيل بديلة لأداء أو دقة أفضل</string>
|
||||
<string name="advanced_settings">الإعدادات المتقدمة</string>
|
||||
<string name="settings_description">ضبط إعدادات المحاكي</string>
|
||||
|
|
@ -403,7 +403,7 @@
|
|||
<string name="contributors">المساهمين</string>
|
||||
<string name="contributors_description">الأشخاص الذين جعلوا تطبيق Eden لنظام Android ممكنًا</string>
|
||||
<string name="licenses_description">المشاريع التي تجعل Eden لأجهزة Android ممكنة</string>
|
||||
<string name="build">البناء</string>
|
||||
<string name="build">الإصدار</string>
|
||||
<string name="user_data">بيانات المستخدم</string>
|
||||
<string name="user_data_description">استيراد/تصدير جميع بيانات التطبيق.\nعند استيراد بيانات المستخدم، سيتم حذف جميع بيانات المستخدم الموجودة!\nقد يُسبب استيراد البيانات من Citron بعض المشاكل. يُنصح باستيراد جميع البيانات المطلوبة يدويًا.</string>
|
||||
<string name="exporting_user_data">جارٍ تصدير بيانات المستخدم...</string>
|
||||
|
|
@ -486,6 +486,10 @@
|
|||
<string name="use_disk_shader_cache_description">يقلل من التأتأة عن طريق تخزين وتحميل التظليلات التي تم إنشاؤها محليًا.</string>
|
||||
<string name="renderer_force_max_clock">إجبار السرعة القصوى (لأجهزة Adreno فقط)</string>
|
||||
<string name="renderer_force_max_clock_description">يجبر وحدة معالجة الرسومات على العمل بأقصى سرعة ممكنة (سيظل يتم تطبيق القيود الحرارية).</string>
|
||||
<string name="renderer_asynchronous_gpu_emulation">محاكاة غير متزامنة لوحدة معالجة الرسومات</string>
|
||||
<string name="renderer_asynchronous_gpu_emulation_description">يُشغّل هذا الخيار محاكاة وحدة معالجة الرسومات بشكل غير متزامن لتقليل توقف وحدة المعالجة المركزية وتحسين الإنتاجية. عطّل هذا الخيار فقط في حال واجهت مشاكل متعلقة بالتوقيت.</string>
|
||||
<string name="renderer_async_presentation">عرض غير متزامن</string>
|
||||
<string name="renderer_async_presentation_description">يحسّن الأداء بشكل طفيف عن طريق نقل عملية العرض إلى خيط معالجة منفصل لوحدة المعالجة المركزية.</string>
|
||||
<string name="renderer_reactive_flushing">استخدم التنظيف التفاعلي</string>
|
||||
<string name="renderer_reactive_flushing_description">يحسن دقة العرض في بعض الألعاب على حساب الأداء.</string>
|
||||
<string name="enable_buffer_history">تمكين سجل التخزين المؤقت</string>
|
||||
|
|
@ -627,10 +631,10 @@
|
|||
<string name="gamecube_controller">ذراع تحكم GameCube</string>
|
||||
<string name="invert_axis">عكس المحور</string>
|
||||
<string name="invert_button">عكس الزر</string>
|
||||
<string name="toggle_button">زر التبديل</string>
|
||||
<string name="toggle_button">زر تشغيل/إيقاف</string>
|
||||
<string name="turbo_button">زر التوربو</string>
|
||||
<string name="set_threshold">تعيين الحد الفاصل</string>
|
||||
<string name="toggle_axis">تبديل المحور</string>
|
||||
<string name="toggle_axis">تشغيل/إيقاف المحور</string>
|
||||
<string name="connected">متصل</string>
|
||||
<string name="use_system_vibrator">استخدم هزاز النظام</string>
|
||||
<string name="input_overlay">طبقة الإدخال</string>
|
||||
|
|
@ -656,7 +660,7 @@
|
|||
|
||||
<!-- Miscellaneous -->
|
||||
<string name="slider_default">افتراضي</string>
|
||||
<string name="default_string">الافتراضي</string>
|
||||
<string name="default_string">افتراضي</string>
|
||||
<string name="loading">جارٍ التحميل…</string>
|
||||
<string name="shutting_down">جارٍ إيقاف التشغيل...</string>
|
||||
<string name="reset_setting_confirmation">هل تريد إعادة تعيين هذا الإعداد إلى قيمته الافتراضية؟</string>
|
||||
|
|
@ -682,8 +686,8 @@
|
|||
<string name="import_success">تم الاستيراد بنجاح</string>
|
||||
<string name="export_success">تم التصدير بنجاح</string>
|
||||
<string name="start">بدء</string>
|
||||
<string name="global">المتغيرات العامة</string>
|
||||
<string name="custom">مخصص</string>
|
||||
<string name="global">الإعدادات العامة</string>
|
||||
<string name="custom">الإعدادات المخصصة للعبة</string>
|
||||
<string name="import_complete">اكتمل الاستيراد</string>
|
||||
<string name="use_global_setting">استخدام الإعداد العام</string>
|
||||
<string name="operation_completed_successfully">اكتملت العملية بنجاح</string>
|
||||
|
|
@ -762,7 +766,7 @@
|
|||
<string name="info_description">معرف العنوان، المطور، الإصدار</string>
|
||||
<string name="per_game_settings">الإعدادات الخاصة للعبة</string>
|
||||
<string name="per_game_settings_description">تعديل الإعدادات الخاصة بهذه اللعبة</string>
|
||||
<string name="launch_options">تشغيل الإعدادات</string>
|
||||
<string name="launch_options">إعدادات التشغيل</string>
|
||||
<string name="path">المسار</string>
|
||||
<string name="program_id">معرف العنوان</string>
|
||||
<string name="developer">المطور</string>
|
||||
|
|
@ -874,13 +878,13 @@
|
|||
<!-- Emulation Menu -->
|
||||
<string name="emulation_exit">خروج من المحاكاة</string>
|
||||
<string name="emulation_done">إنهاء</string>
|
||||
<string name="emulation_toggle_controls">تبديل أزرار التحكم</string>
|
||||
<string name="emulation_toggle_controls">تشغيل/إيقاف أزرار التحكم</string>
|
||||
<string name="emulation_rel_stick_center">مركز العصا النسبي</string>
|
||||
<string name="emulation_dpad_slide">انزلاق الأسهم</string>
|
||||
<string name="emulation_haptics">الاهتزازات الديناميكية</string>
|
||||
<string name="emulation_show_overlay">عرض ذراع التحكم</string>
|
||||
<string name="emulation_hide_overlay">إخفاء ذراع التحكم</string>
|
||||
<string name="emulation_toggle_all">تبديل الكل</string>
|
||||
<string name="emulation_toggle_all">تشغيل/إيقاف الكل</string>
|
||||
<string name="emulation_control_adjust">ضبط الطبقة</string>
|
||||
<string name="emulation_control_scale">الحجم</string>
|
||||
<string name="emulation_control_opacity">الشفافية</string>
|
||||
|
|
@ -1122,7 +1126,7 @@
|
|||
<string name="enable_overlay_description">تمكين التطبيق الصغير المدمج في Horizon. اضغط مع الاستمرار على زر الشاشة الرئيسية لمدة 1 ثانية لإظهاره.</string>
|
||||
|
||||
<!-- Profile Management -->
|
||||
<string name="profile_manager">مدير الملف الشخصي</string>
|
||||
<string name="profile_manager">إدارة ملف التعريف</string>
|
||||
<string name="profile_manager_description">إدارة ملفات تعريف المستخدمين</string>
|
||||
<string name="profile_add_user">إضافة مستخدم</string>
|
||||
<string name="profile_new_user">مستخدم جديد</string>
|
||||
|
|
|
|||
|
|
@ -272,7 +272,7 @@
|
|||
<string name="general_information">Información general</string>
|
||||
<string name="hardware">Hardware</string>
|
||||
<string name="supported_abis">ABIs soportadas</string>
|
||||
<string name="cpu_info">Información de la CPU</string>
|
||||
<string name="cpu_info">Información del procesador</string>
|
||||
<string name="gpu_information">Información de la GPU</string>
|
||||
<string name="vulkan_driver_version">Versión del controlador de Vulkan</string>
|
||||
<string name="error_getting_emulator_info">Error al obtener la información del emulador</string>
|
||||
|
|
@ -351,7 +351,7 @@
|
|||
<item quantity="other">%d archivos de guardado importados con éxito.</item>
|
||||
</plurals>
|
||||
<string name="no_save_data_found">No se encontraron datos de guardado</string>
|
||||
<string name="verify_installed_content">Verificar contenido instalado</string>
|
||||
<string name="verify_installed_content">Verificar los contenidos instalados</string>
|
||||
<string name="verify_installed_content_description">Comprueba todo el contenido instalado por si hubiese alguno corrupto</string>
|
||||
|
||||
<string name="keys_missing">Faltan las claves de encriptación</string>
|
||||
|
|
@ -416,8 +416,8 @@
|
|||
<string name="turbo_speed_limit_description">Cuando el modo turbo esté activado, la emulación se ejecutará a esta velocidad.</string>
|
||||
<string name="slow_speed_limit">Velocidad lenta</string>
|
||||
<string name="slow_speed_limit_description">Cuando el modo lento esté activado, la emulación se ejecutará a esta velocidad.</string>
|
||||
<string name="cpu_backend">Motor de la CPU</string>
|
||||
<string name="cpu_accuracy">Precisión de la CPU</string>
|
||||
<string name="cpu_backend">Motor del procesador</string>
|
||||
<string name="cpu_accuracy">Precisión del procesador</string>
|
||||
<string name="value_with_units">%1$s%2$s</string>
|
||||
|
||||
<!-- System settings strings -->
|
||||
|
|
@ -433,7 +433,7 @@
|
|||
<string name="set_custom_rtc">Configurar RTC personalizado</string>
|
||||
|
||||
<!-- CPU -->
|
||||
<string name="fast_cpu_time">Overclock de la CPU</string>
|
||||
<string name="fast_cpu_time">Overclock del procesador</string>
|
||||
<string name="fast_cpu_time_description">Fuerza a la CPU emulada a ejecutarser a una velocidad de reloj más alta, lo cual reduce ciertos limitadores de fotogramas por segundo. Usa Boost (1700 MHz) para ejecutar a la velocidad de reloj nativa más alta de la Switch, o Fast (2000 MHz) para ejecutar a una velocidad doble de reloj.</string>
|
||||
<string name="custom_cpu_ticks">Ticks de CPU personalizados</string>
|
||||
<string name="custom_cpu_ticks_description">Establezca un valor personalizado de los ciclos de la CPU. Los valores más altos pueden aumentar el rendimiento, pero también pueden hacer que el juego se congele. Se recomienda un rango de 77–21000.</string>
|
||||
|
|
@ -480,6 +480,10 @@
|
|||
<string name="use_disk_shader_cache_description">Reduce los tirones almacenando y cargando los sombreadores generados.</string>
|
||||
<string name="renderer_force_max_clock">Forzar velocidad al máximo (solo Adreno)</string>
|
||||
<string name="renderer_force_max_clock_description">Fuerza a la GPU a ejecutarse a la velocidad máxima de reloj posible (se seguirán aplicando restricciones térmicas).</string>
|
||||
<string name="renderer_asynchronous_gpu_emulation">Emulación de GPU asíncrona</string>
|
||||
<string name="renderer_asynchronous_gpu_emulation_description">Ejecuta la emulación de la GPU de forma asíncrona para reducir los bloqueos de la CPU y mejorar el rendimiento. Desactiva esta opción solo si experimentas problemas de sincronización.</string>
|
||||
<string name="renderer_async_presentation">Presentación asíncrona</string>
|
||||
<string name="renderer_async_presentation_description">Mejora ligeramente el rendimiento al mover la presentación a un hilo independiente de la CPU.</string>
|
||||
<string name="renderer_reactive_flushing">Usar limpieza reactiva</string>
|
||||
<string name="renderer_reactive_flushing_description">Mejora la precisión de renderizado en algunos juegos, pero reduce el rendimiento.</string>
|
||||
<string name="enable_buffer_history">Activar el historial del búfer</string>
|
||||
|
|
@ -532,7 +536,7 @@
|
|||
<string name="warning_resolution">Escalar la resolución a 2x o más puede causar problemas y ralentizar significativamente su dispositivo.</string>
|
||||
|
||||
<!-- Debug settings strings -->
|
||||
<string name="cpu">CPU</string>
|
||||
<string name="cpu">Procesador</string>
|
||||
<string name="use_auto_stub">Usar Auto Stub</string>
|
||||
<string name="use_auto_stub_description">Rellena automáticamente servicios y funciones ausentes. Puede mejorar la compatibilidad pero puede causar cierres inesperados.</string>
|
||||
|
||||
|
|
|
|||
|
|
@ -482,6 +482,10 @@
|
|||
<string name="use_disk_shader_cache_description">Уменьшение зависаний за счет хранения и загрузки сгенерированных шейдеров.</string>
|
||||
<string name="renderer_force_max_clock">Принудительная максимальная тактовая частота (только для Adreno)</string>
|
||||
<string name="renderer_force_max_clock_description">Заставляет ГПУ работать на максимально возможных тактовых частотах (тепловые ограничения все равно будут применяться).</string>
|
||||
<string name="renderer_asynchronous_gpu_emulation">Асинхронная эмуляция ГПУ</string>
|
||||
<string name="renderer_asynchronous_gpu_emulation_description">Выполняет эмуляцию ГПУ асинхронно для снижения задержек ЦП и увеличения производительности. Отключайте только при возникновении проблем с таймингами.</string>
|
||||
<string name="renderer_async_presentation">Асинхронная презентация</string>
|
||||
<string name="renderer_async_presentation_description">Немного улучшает производительность, перемещая презентацию в отдельный поток ЦП.</string>
|
||||
<string name="renderer_reactive_flushing">Реактивная очистка</string>
|
||||
<string name="renderer_reactive_flushing_description">Повышение точности рендеринга в некоторых играх за счет снижения производительности.</string>
|
||||
<string name="enable_buffer_history">Включить историю буфера</string>
|
||||
|
|
@ -1080,6 +1084,7 @@
|
|||
<string name="app_language_system">Следовать системе</string>
|
||||
<!-- Static Themes -->
|
||||
<string name="static_theme_color">Цвет темы</string>
|
||||
<string name="eden_theme">Eden</string>
|
||||
<string name="violet">Фиолетовый </string>
|
||||
<string name="blue">Синий</string>
|
||||
<string name="cyan">Циановый</string>
|
||||
|
|
|
|||
|
|
@ -482,6 +482,10 @@
|
|||
<string name="use_disk_shader_cache_description">Зменшує затримки шляхом збереження шейдерів.</string>
|
||||
<string name="renderer_force_max_clock">Максимальна тактова частота (тільки Adreno)</string>
|
||||
<string name="renderer_force_max_clock_description">Змушує GPU працювати на максимальній тактовій частоті.</string>
|
||||
<string name="renderer_asynchronous_gpu_emulation">Асинхронна емуляція ГП</string>
|
||||
<string name="renderer_asynchronous_gpu_emulation_description">Емуляція ГП виконується асинхронно для зменшення затримок ЦП й покращення пропускної здатності. Вимкніть лише у випадку виникнення проблем із таймінгами.</string>
|
||||
<string name="renderer_async_presentation">Асинхронне подання</string>
|
||||
<string name="renderer_async_presentation_description">Трохи покращує продуктивність завдяки переміщенню подання на окремий потік ЦП.</string>
|
||||
<string name="renderer_reactive_flushing">Реактивне очищення</string>
|
||||
<string name="renderer_reactive_flushing_description">Покращує точність рендерингу в деяких іграх.</string>
|
||||
<string name="enable_buffer_history">Увімкнути історію буфера</string>
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@
|
|||
<string name="stats_overlay_options_description">配置性能统计叠加层中显示的信息</string>
|
||||
<string name="show_fps">显示帧率</string>
|
||||
<string name="show_fps_description">显示当前帧率</string>
|
||||
<string name="show_frametime">显示帧时间</string>
|
||||
<string name="show_frametime">显示 Frametime</string>
|
||||
<string name="show_app_ram_usage">显示应用内存使用情况</string>
|
||||
<string name="show_app_ram_usage_description">显示模拟器内存用量</string>
|
||||
<string name="show_system_ram_usage">显示系统内存使用情况</string>
|
||||
|
|
|
|||
|
|
@ -240,6 +240,8 @@
|
|||
<item>@string/scaling_filter_bspline</item>
|
||||
<item>@string/scaling_filter_mitchell</item>
|
||||
<item>@string/scaling_filter_spline1</item>
|
||||
<item>@string/scaling_filter_sgsr</item>
|
||||
<item>@string/scaling_filter_sgsr_edge</item>
|
||||
</string-array>
|
||||
|
||||
<integer-array name="rendererScalingFilterValues">
|
||||
|
|
@ -256,6 +258,8 @@
|
|||
<item>10</item>
|
||||
<item>11</item>
|
||||
<item>12</item>
|
||||
<item>13</item>
|
||||
<item>14</item>
|
||||
</integer-array>
|
||||
|
||||
<string-array name="rendererAntiAliasingNames">
|
||||
|
|
|
|||
|
|
@ -466,8 +466,8 @@
|
|||
<string name="renderer_resolution">Resolution (Handheld/Docked)</string>
|
||||
<string name="renderer_vsync">VSync mode</string>
|
||||
<string name="renderer_scaling_filter">Window adapting filter</string>
|
||||
<string name="fsr_sharpness">FSR sharpness</string>
|
||||
<string name="fsr_sharpness_description">Determines how sharpened the image will look while using FSR\'s dynamic contrast</string>
|
||||
<string name="fsr_sharpness">FSR/SGSR sharpness</string>
|
||||
<string name="fsr_sharpness_description">Determines how sharpened the image will look while using FSR or SGSR filters</string>
|
||||
<string name="renderer_anti_aliasing">Anti-aliasing method</string>
|
||||
<string name="renderer_optimize_spirv_output">Optimize SPIRV output</string>
|
||||
<string name="renderer_optimize_spirv_output_description">Optimizes compiled shaders to improve GPU efficiency, but may introduce longer loading times and initial slowdowns.</string>
|
||||
|
|
@ -1074,6 +1074,8 @@
|
|||
<string name="scaling_filter_bspline" translatable="false">B-Spline</string>
|
||||
<string name="scaling_filter_mitchell" translatable="false">Mitchell</string>
|
||||
<string name="scaling_filter_mmpx" translatable="false">MMPX</string>
|
||||
<string name="scaling_filter_sgsr" translatable="false">Snapdragon GSR</string>
|
||||
<string name="scaling_filter_sgsr_edge" translatable="false">Snapdragon GSR EdgeDir</string>
|
||||
|
||||
<!-- Anti-Aliasing -->
|
||||
<string name="anti_aliasing_none">None</string>
|
||||
|
|
|
|||
|
|
@ -636,8 +636,8 @@ struct Values {
|
|||
Category::System};
|
||||
SwitchableSetting<Region, true> region_index{linkage, Region::Usa, "region_index", Category::System};
|
||||
SwitchableSetting<TimeZone, true> time_zone_index{linkage, TimeZone::Auto, "time_zone_index", Category::System};
|
||||
Setting<u32> serial_battery{linkage, 0, "serial_battery", Category::System};
|
||||
Setting<u32> serial_unit{linkage, 0, "serial_unit", Category::System};
|
||||
Setting<u32> serial_battery{linkage, 0, "serial_battery", Category::Debugging};
|
||||
Setting<u32> serial_unit{linkage, 0, "serial_unit", Category::Debugging};
|
||||
// Measured in seconds since epoch
|
||||
SwitchableSetting<bool> custom_rtc_enabled{linkage, false, "custom_rtc_enabled", Category::System, Specialization::Paired, true, true};
|
||||
SwitchableSetting<s64> custom_rtc{
|
||||
|
|
@ -807,7 +807,7 @@ struct Values {
|
|||
0,
|
||||
65535,
|
||||
"debug_knobs",
|
||||
Category::Core,
|
||||
Category::Debugging,
|
||||
Specialization::Countable,
|
||||
true,
|
||||
true};
|
||||
|
|
|
|||
|
|
@ -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, SgsrEdge, MaxEnum);
|
||||
ENUM(AntiAliasing, None, Fxaa, Smaa, MaxEnum);
|
||||
ENUM(AspectRatio, R16_9, R4_3, R21_9, R16_10, Stretch);
|
||||
ENUM(ConsoleMode, Handheld, Docked);
|
||||
|
|
|
|||
|
|
@ -149,7 +149,7 @@ std::unique_ptr<TranslationMap> 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."));
|
||||
|
|
@ -169,6 +169,8 @@ std::unique_ptr<TranslationMap> InitializeTranslations(QObject* parent) {
|
|||
tr("Runs an additional optimization pass over generated SPIRV shaders.\n"
|
||||
"Will increase time required for shader compilation.\nMay slightly improve "
|
||||
"performance.\nThis feature is experimental."));
|
||||
INSERT(Settings, use_asynchronous_gpu_emulation, tr("Use asynchronous GPU emulation"),
|
||||
tr("Uses an extra CPU thread for rendering.\nThis option should always remain enabled."));
|
||||
INSERT(Settings, nvdec_emulation, tr("NVDEC emulation:"),
|
||||
tr("Specifies how videos should be decoded.\nIt can either use the CPU or the GPU for "
|
||||
"decoding, or perform no decoding at all (black screen on videos).\n"
|
||||
|
|
@ -315,9 +317,6 @@ std::unique_ptr<TranslationMap> InitializeTranslations(QObject* parent) {
|
|||
"their resolution, details and supported controllers and depending on this setting.\n"
|
||||
"Setting to Handheld can help improve performance for low end systems."));
|
||||
INSERT(Settings, current_user, QString(), QString());
|
||||
INSERT(Settings, serial_unit, tr("Unit Serial"), QString());
|
||||
INSERT(Settings, serial_battery, tr("Battery Serial"), QString());
|
||||
INSERT(Settings, debug_knobs, tr("Debug knobs"), QString());
|
||||
|
||||
// Controls
|
||||
|
||||
|
|
@ -493,6 +492,8 @@ std::unique_ptr<ComboboxTranslationMap> 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")),
|
||||
PAIR(ScalingFilter, SgsrEdge, tr("Snapdragon Game Super Resolution EdgeDir")),
|
||||
}});
|
||||
translations->insert({Settings::EnumMetadata<Settings::AntiAliasing>::Index(),
|
||||
{
|
||||
|
|
|
|||
|
|
@ -53,6 +53,8 @@ static const std::map<Settings::ScalingFilter, QString> 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"))},
|
||||
{Settings::ScalingFilter::SgsrEdge, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "SGSR EdgeDir"))},
|
||||
};
|
||||
|
||||
static const std::map<Settings::ConsoleMode, QString> use_docked_mode_texts_map = {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -76,6 +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 Game Super Resolution
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/sgsr1_shader.vert
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/sgsr1_shader_mobile.frag
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/sgsr1_shader_mobile_edge_direction.frag
|
||||
)
|
||||
|
||||
if (PLATFORM_HAIKU)
|
||||
|
|
@ -90,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")
|
||||
|
||||
|
|
|
|||
18
src/video_core/host_shaders/sgsr1_shader.vert
Normal file
18
src/video_core/host_shaders/sgsr1_shader.vert
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#version 450
|
||||
|
||||
layout( push_constant ) uniform constants {
|
||||
highp vec4 ViewportInfo[1];
|
||||
highp vec2 ResizeFactor;
|
||||
highp float EdgeSharpness;
|
||||
};
|
||||
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) * ResizeFactor * 0.5;
|
||||
}
|
||||
116
src/video_core/host_shaders/sgsr1_shader_mobile.frag
Normal file
116
src/video_core/host_shaders/sgsr1_shader_mobile.frag
Normal file
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -115,6 +115,8 @@ void BlitScreen::CreateWindowAdapt() {
|
|||
window_adapt = MakeMmpx(device);
|
||||
break;
|
||||
case Settings::ScalingFilter::Fsr:
|
||||
case Settings::ScalingFilter::Sgsr:
|
||||
case Settings::ScalingFilter::SgsrEdge:
|
||||
case Settings::ScalingFilter::Bilinear:
|
||||
default:
|
||||
window_adapt = MakeBilinear(device);
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
@ -63,7 +64,11 @@ 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<FSR>(device, memory_allocator, image_count, output_size);
|
||||
} else if (filters.get_scaling_filter() == Settings::ScalingFilter::Sgsr) {
|
||||
sr_filter.emplace<SGSR>(device, memory_allocator, image_count, output_size, false);
|
||||
} else if (filters.get_scaling_filter() == Settings::ScalingFilter::SgsrEdge) {
|
||||
sr_filter.emplace<SGSR>(device, memory_allocator, image_count, output_size, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -114,9 +119,12 @@ void Layer::ConfigureDraw(PresentPushConstants* out_push_constants,
|
|||
.height = scaled_height,
|
||||
};
|
||||
|
||||
if (fsr) {
|
||||
if (auto* fsr = std::get_if<FSR>(&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<SGSR>(&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};
|
||||
}
|
||||
|
||||
SetMatrixData(*out_push_constants, layout);
|
||||
|
|
|
|||
|
|
@ -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,7 +96,7 @@ private:
|
|||
|
||||
Settings::AntiAliasing anti_alias_setting{};
|
||||
std::variant<std::monostate, FXAA, SMAA> anti_alias{};
|
||||
std::optional<FSR> fsr{};
|
||||
std::variant<std::monostate, SGSR, FSR> sr_filter{};
|
||||
std::vector<u64> resource_ticks{};
|
||||
};
|
||||
|
||||
|
|
|
|||
144
src/video_core/renderer_vulkan/present/sgsr.cpp
Normal file
144
src/video_core/renderer_vulkan/present/sgsr.cpp
Normal file
|
|
@ -0,0 +1,144 @@
|
|||
// SPDX-FileCopyrightText: Copyright 2026 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/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/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 PushConstants = std::array<u32, 4 + 2 + 1>;
|
||||
|
||||
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.image_views[0] = CreateWrappedImageView(m_device, images.images[0], 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);
|
||||
|
||||
m_sampler = CreateBilinearSampler(m_device);
|
||||
m_vert_shader = BuildShader(m_device, SGSR1_SHADER_VERT_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, 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<VkDescriptorSetLayout> layouts(SGSR_STAGE_COUNT, *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_VERTEX_BIT | 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]));
|
||||
}
|
||||
|
||||
void SGSR::UpdateDescriptorSets(VkImageView image_view, size_t image_index) {
|
||||
Images& images = m_dynamic_images[image_index];
|
||||
std::vector<VkDescriptorImageInfo> image_infos;
|
||||
std::vector<VkWriteDescriptorSet> updates;
|
||||
image_infos.reserve(1);
|
||||
updates.push_back(CreateWriteDescriptorSet(image_infos, *m_sampler, image_view, images.descriptor_sets[0], 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]);
|
||||
}
|
||||
});
|
||||
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<f32>& crop_rect) {
|
||||
Images& images = m_dynamic_images[image_index];
|
||||
auto const stage0_image = *images.images[0];
|
||||
auto const stage0_descriptor_set = images.descriptor_sets[0];
|
||||
auto const stage0_framebuffer = *images.framebuffers[0];
|
||||
auto const stage0_pipeline = *m_stage_pipeline[0];
|
||||
|
||||
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_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<u32>(1.f / viewport_width);
|
||||
viewport_con[1] = std::bit_cast<u32>(1.f / viewport_height);
|
||||
viewport_con[2] = std::bit_cast<u32>(viewport_width);
|
||||
viewport_con[3] = std::bit_cast<u32>(viewport_height);
|
||||
viewport_con[4] = std::bit_cast<u32>(viewport_width / input_image_width);
|
||||
viewport_con[5] = std::bit_cast<u32>(viewport_height / input_image_height);
|
||||
viewport_con[6] = std::bit_cast<u32>(sharpening);
|
||||
|
||||
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, stage0_pipeline);
|
||||
cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, stage0_descriptor_set, {});
|
||||
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);
|
||||
});
|
||||
return *images.image_views[0];
|
||||
}
|
||||
|
||||
} // namespace Vulkan
|
||||
50
src/video_core/renderer_vulkan/present/sgsr.h
Normal file
50
src/video_core/renderer_vulkan/present/sgsr.h
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
// SPDX-FileCopyrightText: Copyright 2026 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:
|
||||
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<f32>& crop_rect);
|
||||
private:
|
||||
void Initialize();
|
||||
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;
|
||||
std::array<vk::ShaderModule, SGSR_STAGE_COUNT> m_stage_shader;
|
||||
std::array<vk::Pipeline, SGSR_STAGE_COUNT> m_stage_pipeline;
|
||||
vk::RenderPass m_renderpass;
|
||||
vk::Sampler m_sampler;
|
||||
|
||||
struct Images {
|
||||
vk::DescriptorSets descriptor_sets;
|
||||
std::array<vk::Image, SGSR_STAGE_COUNT> images;
|
||||
std::array<vk::ImageView, SGSR_STAGE_COUNT> image_views;
|
||||
std::array<vk::Framebuffer, SGSR_STAGE_COUNT> framebuffers;
|
||||
};
|
||||
std::vector<Images> m_dynamic_images;
|
||||
bool m_images_ready{};
|
||||
bool m_edge_dir{};
|
||||
};
|
||||
|
||||
} // namespace Vulkan
|
||||
|
|
@ -73,6 +73,8 @@ void BlitScreen::SetWindowAdaptPass() {
|
|||
window_adapt = MakeMmpx(device, swapchain_view_format);
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -65,8 +65,10 @@ static VkPresentModeKHR ChooseSwapPresentMode(bool has_imm, bool has_mailbox,
|
|||
return mode;
|
||||
}
|
||||
}();
|
||||
if (setting == Settings::VSyncMode::Immediate && !has_imm) {
|
||||
setting = Settings::VSyncMode::Mailbox;
|
||||
}
|
||||
if ((setting == Settings::VSyncMode::Mailbox && !has_mailbox) ||
|
||||
(setting == Settings::VSyncMode::Immediate && !has_imm) ||
|
||||
(setting == Settings::VSyncMode::FifoRelaxed && !has_fifo_relaxed)) {
|
||||
setting = Settings::VSyncMode::Fifo;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,6 +51,8 @@ void ConfigureDebug::SetConfiguration() {
|
|||
ui->enable_all_controllers->setChecked(Settings::values.enable_all_controllers.GetValue());
|
||||
ui->extended_logging->setChecked(Settings::values.extended_logging.GetValue());
|
||||
ui->perform_vulkan_check->setChecked(Settings::values.perform_vulkan_check.GetValue());
|
||||
ui->serial_battery_edit->setText(QString::fromStdString(std::to_string(Settings::values.serial_battery.GetValue())));
|
||||
ui->serial_board_edit->setText(QString::fromStdString(std::to_string(Settings::values.serial_unit.GetValue())));
|
||||
#ifdef YUZU_USE_QT_WEB_ENGINE
|
||||
ui->disable_web_applet->setChecked(Settings::values.disable_web_applet.GetValue());
|
||||
#else
|
||||
|
|
@ -126,6 +128,8 @@ void ConfigureDebug::ApplyConfiguration() {
|
|||
Settings::values.extended_logging = ui->extended_logging->isChecked();
|
||||
Settings::values.perform_vulkan_check = ui->perform_vulkan_check->isChecked();
|
||||
Settings::values.disable_web_applet = ui->disable_web_applet->isChecked();
|
||||
Settings::values.serial_battery = ui->serial_battery_edit->text().toUInt();
|
||||
Settings::values.serial_unit = ui->serial_board_edit->text().toUInt();
|
||||
Settings::values.debug_knobs = ui->debug_knobs_spinbox->value();
|
||||
Debugger::ToggleConsole();
|
||||
Common::Log::Filter filter;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue