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 d1702b8140..60e2a89564 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 @@ -67,7 +67,8 @@ enum class IntSetting(override val key: String) : AbstractIntSetting { MY_PAGE_APPLET("my_page_applet_mode"), INPUT_OVERLAY_AUTO_HIDE("input_overlay_auto_hide"), OVERLAY_GRID_SIZE("overlay_grid_size"), - GPU_LOG_RING_BUFFER_SIZE("gpu_log_ring_buffer_size") + GPU_LOG_RING_BUFFER_SIZE("gpu_log_ring_buffer_size"), + ANDROID_PIPELINE_WORKERS("pipeline_worker_count") ; override fun getInt(needsGlobal: Boolean): Int = NativeConfig.getInt(key, needsGlobal) 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 3a5f466f07..230390749e 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 @@ -582,6 +582,16 @@ abstract class SettingsItem( units = "%" ) ) + put( + SliderSetting( + IntSetting.ANDROID_PIPELINE_WORKERS, + titleId = R.string.pipeline_worker_cores, + descriptionId = R.string.pipeline_worker_cores_description, + min = 4, + max = 8, + units = "cores" + ) + ) put( SingleChoiceSetting( IntSetting.RENDERER_ANTI_ALIASING, 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 9f0e409cf4..4da218bfcc 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 @@ -295,6 +295,7 @@ class SettingsFragmentPresenter( add(BooleanSetting.EMULATE_BGR565.key) add(BooleanSetting.RESCALE_HACK.key) add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key) + add(IntSetting.ANDROID_PIPELINE_WORKERS.key) add(BooleanSetting.RENDERER_ASYNCHRONOUS_GPU_EMULATION.key) add(BooleanSetting.RENDERER_ASYNC_PRESENTATION.key) add(SettingsItem.GPU_UNSWIZZLE_COMBINED) diff --git a/src/android/app/src/main/jni/android_settings.h b/src/android/app/src/main/jni/android_settings.h index 37da651519..304ff62f07 100644 --- a/src/android/app/src/main/jni/android_settings.h +++ b/src/android/app/src/main/jni/android_settings.h @@ -147,6 +147,13 @@ namespace AndroidSettings { &show_performance_overlay}; + Settings::Setting pipeline_worker_count{linkage, 4, "pipeline_worker_count", + Settings::Category::Android, + Settings::Specialization::Default, + true, + true}; + + Settings::Setting show_input_overlay{linkage, true, "show_input_overlay", Settings::Category::Overlay}; Settings::Setting overlay_snap_to_grid{linkage, false, "overlay_snap_to_grid", diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index c7ecba7a58..7372fa5e34 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -71,6 +71,8 @@ Display current power draw and remaining capacity on battery Show Shaders Building Display current number of shaders being built + Pipeline Worker Threads + Manage the amount of cores used for building Vulkan pipelines, the higher value will improve pipeline compilation performance but temperatures will increase as well. Overlay Position Choose where the overlay is displayed on the screen Top Left diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 4a93e70a99..73a4409141 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -45,6 +45,10 @@ #include "video_core/vulkan_common/vulkan_wrapper.h" #include "video_core/gpu_logging/gpu_logging.h" +#ifdef ANDROID +#include "android_settings.h" +#endif + namespace Vulkan { namespace { @@ -325,12 +329,13 @@ size_t GetTotalPipelineWorkers() { const size_t max_core_threads = std::max(static_cast(std::thread::hardware_concurrency()), 2ULL) - 1ULL; #ifdef ANDROID - // Leave at least 3 cores free on Android to avoid stalling the system. - constexpr size_t free_cores = 3ULL; - if (max_core_threads <= free_cores) { + const int configured = AndroidSettings::values.pipeline_worker_count.GetValue(); + const int clamped = std::clamp(configured, 4, 8); + const size_t desired = static_cast(clamped); + if (desired == 0) { return 1ULL; } - return max_core_threads - free_cores; + return std::min(max_core_threads, desired); #else return max_core_threads; #endif