From c67f27e9141eaba17287e5dfc87278d853a5e468 Mon Sep 17 00:00:00 2001 From: Billy Laws Date: Sat, 24 Dec 2022 20:59:10 +0000 Subject: [PATCH] Add a setting to control the maximum number of accumulated GPU cmds This helps to keep the GPU fed when processing large command buffers which don't have any syncpoints to force a flush inbetween. --- app/src/main/cpp/skyline/common/android_settings.h | 1 + app/src/main/cpp/skyline/common/settings.h | 1 + .../cpp/skyline/gpu/interconnect/command_executor.cpp | 3 +++ app/src/main/java/emu/skyline/utils/NativeSettings.kt | 1 + app/src/main/java/emu/skyline/utils/PreferenceSettings.kt | 1 + app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/preferences.xml | 8 ++++++++ 7 files changed, 17 insertions(+) diff --git a/app/src/main/cpp/skyline/common/android_settings.h b/app/src/main/cpp/skyline/common/android_settings.h index 77f4ad0d..cc9e8df0 100644 --- a/app/src/main/cpp/skyline/common/android_settings.h +++ b/app/src/main/cpp/skyline/common/android_settings.h @@ -41,6 +41,7 @@ namespace skyline { gpuDriver = ktSettings.GetString("gpuDriver"); gpuDriverLibraryName = ktSettings.GetString("gpuDriverLibraryName"); executorSlotCountScale = ktSettings.GetInt("executorSlotCountScale"); + executorFlushThreshold = ktSettings.GetInt("executorFlushThreshold"); enableFastGpuReadbackHack = ktSettings.GetBool("enableFastGpuReadbackHack"); isAudioOutputDisabled = ktSettings.GetBool("isAudioOutputDisabled"); validationLayer = ktSettings.GetBool("validationLayer"); diff --git a/app/src/main/cpp/skyline/common/settings.h b/app/src/main/cpp/skyline/common/settings.h index ef181d1d..3d0bf17f 100644 --- a/app/src/main/cpp/skyline/common/settings.h +++ b/app/src/main/cpp/skyline/common/settings.h @@ -73,6 +73,7 @@ namespace skyline { Setting gpuDriver; //!< The label of the GPU driver to use Setting gpuDriverLibraryName; //!< The name of the GPU driver library to use Setting executorSlotCountScale; //!< Number of GPU executor slots that can be used concurrently + Setting executorFlushThreshold; //!< Number of commands that need to accumulate before they're flushed to the GPU // Hacks Setting enableFastGpuReadbackHack; //!< If the CPU texture readback skipping hack should be used diff --git a/app/src/main/cpp/skyline/gpu/interconnect/command_executor.cpp b/app/src/main/cpp/skyline/gpu/interconnect/command_executor.cpp index e4664842..29ee52d9 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/command_executor.cpp +++ b/app/src/main/cpp/skyline/gpu/interconnect/command_executor.cpp @@ -367,6 +367,9 @@ namespace skyline::gpu::interconnect { slot->nodes.emplace_back(std::in_place_type_t(), std::forward(function)); else slot->nodes.emplace_back(std::in_place_type_t(), std::forward(function)); + + if (slot->nodes.size() > *state.settings->executorFlushThreshold && !gotoNext) + Submit(); } void CommandExecutor::AddOutsideRpCommand(std::function &, GPU &)> &&function) { diff --git a/app/src/main/java/emu/skyline/utils/NativeSettings.kt b/app/src/main/java/emu/skyline/utils/NativeSettings.kt index 5d7777f7..78774001 100644 --- a/app/src/main/java/emu/skyline/utils/NativeSettings.kt +++ b/app/src/main/java/emu/skyline/utils/NativeSettings.kt @@ -27,6 +27,7 @@ class NativeSettings(context : Context, pref : PreferenceSettings) { var gpuDriver : String = if (pref.gpuDriver == PreferenceSettings.SYSTEM_GPU_DRIVER) "" else pref.gpuDriver var gpuDriverLibraryName : String = if (pref.gpuDriver == PreferenceSettings.SYSTEM_GPU_DRIVER) "" else GpuDriverHelper.getLibraryName(context, pref.gpuDriver) var executorSlotCountScale : Int = pref.executorSlotCountScale + var executorFlushThreshold : Int = pref.executorFlushThreshold // Hacks var enableFastGpuReadbackHack : Boolean = pref.enableFastGpuReadbackHack diff --git a/app/src/main/java/emu/skyline/utils/PreferenceSettings.kt b/app/src/main/java/emu/skyline/utils/PreferenceSettings.kt index f49ab807..24364de4 100644 --- a/app/src/main/java/emu/skyline/utils/PreferenceSettings.kt +++ b/app/src/main/java/emu/skyline/utils/PreferenceSettings.kt @@ -40,6 +40,7 @@ class PreferenceSettings @Inject constructor(@ApplicationContext private val con // GPU var gpuDriver by sharedPreferences(context, SYSTEM_GPU_DRIVER) var executorSlotCountScale by sharedPreferences(context, 6) + var executorFlushThreshold by sharedPreferences(context, 256) var forceMaxGpuClocks by sharedPreferences(context, false) // Hacks diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4a07a092..d4ca5cb9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -77,6 +77,8 @@ Allow UI elements to be drawn in the cutout area Executor Slot Count Scale Scale controlling the maximum number of simultaneous GPU executions (Higher may sometimes perform better but will use more RAM) + Executor Flush Threshold + Controls how frequently work is flushed to the GPU Force Maximum GPU Clocks Forces the GPU to run at its maximum possible clock speed (May cause excessive heating and power usage) Your device does not support forcing maximum GPU clocks diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index cef2284a..62b9a935 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -138,6 +138,14 @@ app:key="executor_slot_count_scale" app:title="@string/executor_slot_count_scale" app:showSeekBarValue="true" /> +