From b43dfff89418dfe7051b08564cc75bb6cb993688 Mon Sep 17 00:00:00 2001 From: Pavel Barabanov Date: Sun, 13 Apr 2025 14:43:51 +0300 Subject: [PATCH] =?UTF-8?q?Eden=E2=80=99s=20Veil=20setting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features/settings/model/IntSetting.kt | 5 + .../features/settings/model/Settings.kt | 3 +- .../settings/model/view/SettingsItem.kt | 40 +++++ .../settings/ui/SettingsFragmentPresenter.kt | 168 +++++++++++++++++- .../src/main/res/drawable/ic_eden_veil.xml | 85 +++++++++ .../app/src/main/res/values/arrays.xml | 66 +++++++ .../app/src/main/res/values/strings.xml | 38 ++++ 7 files changed, 399 insertions(+), 6 deletions(-) create mode 100644 src/android/app/src/main/res/drawable/ic_eden_veil.xml diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt index c6d83c346f..e5229133a7 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt @@ -11,6 +11,11 @@ enum class IntSetting(override val key: String) : AbstractIntSetting { REGION_INDEX("region_index"), LANGUAGE_INDEX("language_index"), RENDERER_BACKEND("backend"), + RENDERER_VRAM_USAGE_MODE("vram_usage_mode"), + RENDERER_SHADER_BACKEND("shader_backend"), + RENDERER_NVDEC_EMULATION("nvdec_emulation"), + RENDERER_ASTC_DECODE_METHOD("accelerate_astc"), + RENDERER_ASTC_RECOMPRESSION("astc_recompression"), RENDERER_ACCURACY("gpu_accuracy"), RENDERER_RESOLUTION("resolution_setup"), RENDERER_VSYNC("use_vsync"), diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt index eeeff1043e..0042fb2ea3 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt @@ -23,7 +23,8 @@ object Settings { SECTION_INPUT_PLAYER_SEVEN, SECTION_INPUT_PLAYER_EIGHT, SECTION_THEME(R.string.preferences_theme), - SECTION_DEBUG(R.string.preferences_debug); + SECTION_DEBUG(R.string.preferences_debug), + SECTION_EDEN_VEIL(R.string.eden_veil); } fun getPlayerString(player: Int): String = 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 4041998d74..afb24f0aad 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 @@ -289,6 +289,46 @@ abstract class SettingsItem( valuesId = R.array.rendererAccuracyValues ) ) + put( + SingleChoiceSetting( + IntSetting.RENDERER_SHADER_BACKEND, + titleId = R.string.shader_backend, + choicesId = R.array.rendererShaderNames, + valuesId = R.array.rendererShaderValues + ) + ) + put( + SingleChoiceSetting( + IntSetting.RENDERER_NVDEC_EMULATION, + titleId = R.string.nvdec_emulation, + choicesId = R.array.rendererNvdecNames, + valuesId = R.array.rendererNvdecValues + ) + ) + put( + SingleChoiceSetting( + IntSetting.RENDERER_ASTC_DECODE_METHOD, + titleId = R.string.accelerate_astc, + choicesId = R.array.astcDecodingMethodNames, + valuesId = R.array.astcDecodingMethodValues + ) + ) + put( + SingleChoiceSetting( + IntSetting.RENDERER_ASTC_RECOMPRESSION, + titleId = R.string.astc_recompression, + choicesId = R.array.astcRecompressionMethodNames, + valuesId = R.array.astcRecompressionMethodValues + ) + ) + put( + SingleChoiceSetting( + IntSetting.RENDERER_VRAM_USAGE_MODE, + titleId = R.string.vram_usage_mode, + choicesId = R.array.vramUsageMethodNames, + valuesId = R.array.vramUsageMethodValues + ) + ) put( SingleChoiceSetting( IntSetting.RENDERER_RESOLUTION, 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 ee359d21f1..e642de563f 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 @@ -100,6 +100,7 @@ class SettingsFragmentPresenter( MenuTag.SECTION_INPUT_PLAYER_EIGHT -> addInputPlayer(sl, 7) MenuTag.SECTION_THEME -> addThemeSettings(sl) MenuTag.SECTION_DEBUG -> addDebugSettings(sl) + MenuTag.SECTION_EDEN_VEIL -> addEdenVeilSettings(sl) } settingsList = sl adapter.submitList(settingsList) { @@ -143,6 +144,14 @@ class SettingsFragmentPresenter( menuKey = MenuTag.SECTION_DEBUG ) ) + add( + SubmenuSetting( + titleId = R.string.eden_veil, + descriptionId = R.string.eden_veil_description, + iconId = R.drawable.ic_eden_veil, + menuKey = MenuTag.SECTION_EDEN_VEIL + ) + ) add( RunnableSetting( titleId = R.string.reset_to_default, @@ -154,12 +163,92 @@ class SettingsFragmentPresenter( } } + private val InterpolationSetting = object : AbstractBooleanSetting { + override val key = BooleanSetting.FRAME_INTERPOLATION.key + + override fun getBoolean(needsGlobal: Boolean): Boolean { + return BooleanSetting.FRAME_INTERPOLATION.getBoolean(needsGlobal) + } + + override fun setBoolean(value: Boolean) { + BooleanSetting.FRAME_INTERPOLATION.setBoolean(value) + } + + override val defaultValue = BooleanSetting.FRAME_INTERPOLATION.defaultValue + + override fun getValueAsString(needsGlobal: Boolean): String = + BooleanSetting.FRAME_INTERPOLATION.getValueAsString(needsGlobal) + + override fun reset() = BooleanSetting.FRAME_INTERPOLATION.reset() + } + + private val syncCoreSpeedSetting = object : AbstractBooleanSetting { + override val key = BooleanSetting.CORE_SYNC_CORE_SPEED.key + + override fun getBoolean(needsGlobal: Boolean): Boolean { + return BooleanSetting.CORE_SYNC_CORE_SPEED.getBoolean(needsGlobal) + } + + override fun setBoolean(value: Boolean) { + BooleanSetting.CORE_SYNC_CORE_SPEED.setBoolean(value) + } + + override val defaultValue = BooleanSetting.CORE_SYNC_CORE_SPEED.defaultValue + + override fun getValueAsString(needsGlobal: Boolean): String = + BooleanSetting.CORE_SYNC_CORE_SPEED.getValueAsString(needsGlobal) + + override fun reset() = BooleanSetting.CORE_SYNC_CORE_SPEED.reset() + } + + private val frameSkippingSetting = object : AbstractBooleanSetting { + override val key = BooleanSetting.FRAME_SKIPPING.key + + override fun getBoolean(needsGlobal: Boolean): Boolean { + return BooleanSetting.FRAME_SKIPPING.getBoolean(needsGlobal) + } + + override fun setBoolean(value: Boolean) { + BooleanSetting.FRAME_SKIPPING.setBoolean(value) + } + + override val defaultValue = BooleanSetting.FRAME_SKIPPING.defaultValue + + override fun getValueAsString(needsGlobal: Boolean): String = + BooleanSetting.FRAME_SKIPPING.getValueAsString(needsGlobal) + + override fun reset() = BooleanSetting.FRAME_SKIPPING.reset() + } + + private fun addEdenVeilSubmenu(sl: ArrayList) { + sl.apply { + add( + SubmenuSetting( + titleId = R.string.eden_veil, + descriptionId = R.string.eden_veil_description, + iconId = R.drawable.ic_code, + menuKey = MenuTag.SECTION_EDEN_VEIL + ) + ) + addEdenVeilSettings(sl) + + add(BooleanSetting.FRAME_INTERPOLATION.key) + add(BooleanSetting.FRAME_SKIPPING.key) + add(BooleanSetting.CORE_SYNC_CORE_SPEED.key) + add(IntSetting.RENDERER_SHADER_BACKEND.key) + add(IntSetting.RENDERER_OPTIMIZE_SPIRV_OUTPUT.key) + add(IntSetting.RENDERER_NVDEC_EMULATION.key) + add(IntSetting.RENDERER_ASTC_DECODE_METHOD.key) + add(IntSetting.RENDERER_ASTC_RECOMPRESSION.key) + add(IntSetting.RENDERER_VRAM_USAGE_MODE.key) + } + } + private fun addSystemSettings(sl: ArrayList) { sl.apply { add(StringSetting.DEVICE_NAME.key) add(BooleanSetting.RENDERER_USE_SPEED_LIMIT.key) add(ShortSetting.RENDERER_SPEED_LIMIT.key) - add(BooleanSetting.CORE_SYNC_CORE_SPEED.key) add(BooleanSetting.USE_DOCKED_MODE.key) add(IntSetting.REGION_INDEX.key) add(IntSetting.LANGUAGE_INDEX.key) @@ -170,8 +259,6 @@ class SettingsFragmentPresenter( private fun addGraphicsSettings(sl: ArrayList) { sl.apply { - add(BooleanSetting.FRAME_INTERPOLATION.key) - add(BooleanSetting.FRAME_SKIPPING.key) add(IntSetting.RENDERER_ACCURACY.key) add(IntSetting.RENDERER_RESOLUTION.key) add(IntSetting.RENDERER_VSYNC.key) @@ -182,7 +269,6 @@ class SettingsFragmentPresenter( add(IntSetting.RENDERER_SCREEN_LAYOUT.key) add(IntSetting.RENDERER_ASPECT_RATIO.key) add(IntSetting.VERTICAL_ALIGNMENT.key) - add(IntSetting.RENDERER_OPTIMIZE_SPIRV_OUTPUT.key) add(BooleanSetting.PICTURE_IN_PICTURE.key) add(BooleanSetting.RENDERER_USE_DISK_SHADER_CACHE.key) add(BooleanSetting.RENDERER_FORCE_MAX_CLOCK.key) @@ -342,7 +428,79 @@ class SettingsFragmentPresenter( override val isSaveable = true } } - + private fun addEdenVeilSettings(sl: ArrayList) { + sl.apply { + add( + SwitchSetting( + InterpolationSetting, // The interpolation setting object you've created + titleId = R.string.frame_interpolation, // Use appropriate string resources for the title + descriptionId = R.string.frame_interpolation_description // Description resource for the interpolation setting + ) + ) + add( + SwitchSetting( + frameSkippingSetting, + titleId = R.string.frame_skipping, + descriptionId = R.string.frame_skipping_description + ) + ) + add( + SwitchSetting( + syncCoreSpeedSetting, + titleId = R.string.use_sync_core, + descriptionId = R.string.use_sync_core_description + ) + ) + add( + SingleChoiceSetting( + IntSetting.RENDERER_SHADER_BACKEND, + titleId = R.string.shader_backend, + choicesId = R.array.rendererShaderNames, + valuesId = R.array.rendererShaderValues + ) + ) + add( + SingleChoiceSetting( + IntSetting.RENDERER_NVDEC_EMULATION, + titleId = R.string.nvdec_emulation, + choicesId = R.array.rendererNvdecNames, + valuesId = R.array.rendererNvdecValues + ) + ) + add( + SingleChoiceSetting( + IntSetting.RENDERER_ASTC_DECODE_METHOD, + titleId = R.string.accelerate_astc, + choicesId = R.array.astcDecodingMethodNames, + valuesId = R.array.astcDecodingMethodValues + ) + ) + add( + SingleChoiceSetting( + IntSetting.RENDERER_ASTC_RECOMPRESSION, + titleId = R.string.astc_recompression, + choicesId = R.array.astcRecompressionMethodNames, + valuesId = R.array.astcRecompressionMethodValues + ) + ) + add( + SingleChoiceSetting( + IntSetting.RENDERER_VRAM_USAGE_MODE, + titleId = R.string.vram_usage_mode, + choicesId = R.array.vramUsageMethodNames, + valuesId = R.array.vramUsageMethodValues + ) + ) + add( + SingleChoiceSetting( + IntSetting.RENDERER_OPTIMIZE_SPIRV_OUTPUT, + titleId = R.string.renderer_optimize_spirv_output, + choicesId = R.array.optimizeSpirvOutputEntries, + valuesId = R.array.optimizeSpirvOutputValues + ) + ) + } +} private fun addInputPlayer(sl: ArrayList, playerIndex: Int) { sl.apply { val connectedSetting = object : AbstractBooleanSetting { diff --git a/src/android/app/src/main/res/drawable/ic_eden_veil.xml b/src/android/app/src/main/res/drawable/ic_eden_veil.xml new file mode 100644 index 0000000000..09f90d15da --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_eden_veil.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 056b74be7c..8cdefbe4b1 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -85,6 +85,72 @@ 2 + + @string/shader_backend_glsl + @string/shader_backend_glasm + @string/shader_backend_spirv + + + + 0 + 1 + 2 + + + + + @string/vram_usage_conservative + @string/vram_usage_aggressive + + + + + 0 + 1 + + + + + @string/accelerate_astc_cpu + @string/accelerate_astc_gpu + @string/accelerate_astc_async + + + + + 0 + 1 + 2 + + + + + @string/astc_recompression_uncompressed + @string/astc_recompression_bc1 + @string/astc_recompression_bc3 + + + + + 0 + 1 + 2 + + + + + @string/nvdec_emulation_none + @string/nvdec_emulation_cpu + @string/nvdec_emulation_gpu + + + + + 3 + 1 + 2 + + @string/resolution_half @string/resolution_three_quarter diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 477c766200..8b4c61475f 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -258,6 +258,9 @@ Reduces stuttering by locally storing and loading generated shaders. Anisotropic filtering Improves the quality of textures when viewed at oblique angles + NVDEC Emulation + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. + Shader Backend CPU @@ -361,6 +364,8 @@ Are you sure that you want to reset all mappings for this controller to default? This cannot be undone. + Eden’s Veil + Beyond default Default Saved settings Saved settings for %1$s @@ -571,11 +576,44 @@ Vulkan None + + GLSL + GLASM + SPIR-V + + + CPU + GPU + None + Normal High Extreme (Slow) + + ASTC Decoding Method + Choose ASTC decoding method: CPU (slow but safe), GPU (fast, recommended), or Async CPU (no stutter but may glitch). + + + CPU + GPU + CPU Asynchronously + + + ASTC Recompression Method + Low-end Android GPUs often lack ASTC support, forcing emulators to decompress textures to RGBA8. This option recompresses RGBA8 to BC1/BC3, saving VRAM but reducing quality. + + + Uncompressed + BC1 (Low Quality) + BC3 (Medium Quality) + + + VRAM Usage Mode + Conservative + Aggressive + 0.5X (360p/540p) 0.75X (540p/810p)