From ad854018df5b798d58c8d9498d922596256e64e8 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Thu, 6 Aug 2026 02:17:29 -0400 Subject: [PATCH] [TEST] Other pair of tests on adpf affinity threads --- src/common/thread.cpp | 26 +++++-------------- src/core/hle/service/vi/conductor.cpp | 2 +- .../renderer_vulkan/vk_scheduler.cpp | 2 +- src/video_core/textures/workers.cpp | 4 +-- 4 files changed, 10 insertions(+), 24 deletions(-) diff --git a/src/common/thread.cpp b/src/common/thread.cpp index 383f033cf7..27ac7b84d4 100644 --- a/src/common/thread.cpp +++ b/src/common/thread.cpp @@ -96,6 +96,9 @@ int NiceValueForPriority(Common::ThreadPriority priority) { namespace { constexpr size_t ANDROID_MINIMUM_PERFORMANCE_CORES = 4; +// A core counts as a performance core while it is within this much of the fastest one. +constexpr long ANDROID_PERFORMANCE_CAPACITY_PERCENT = 50; + constexpr std::chrono::nanoseconds ANDROID_POLICY_POLL_INTERVAL = std::chrono::milliseconds{500}; enum class CoreGroup { @@ -279,27 +282,12 @@ void ComputeTopologyLocked() { return lhs.cpu < rhs.cpu; }); - const bool midr_known = std::none_of(cores.begin(), cores.end(), - [](const CoreInfo& core) { return core.midr == 0; }); - - const size_t allowed_count = static_cast(CPU_COUNT(&g_topology.allowed)); - const size_t maximum = - allowed_count > 2 * ANDROID_MINIMUM_PERFORMANCE_CORES - ? allowed_count - ANDROID_MINIMUM_PERFORMANCE_CORES - : ANDROID_MINIMUM_PERFORMANCE_CORES; - + const long fastest = cores.front().weight; size_t taken = 0; - long cluster_weight = cores.front().weight; - u64 cluster_midr = cores.front().midr; for (const auto& core : cores) { - if (core.weight != cluster_weight || (midr_known && core.midr != cluster_midr)) { - if (taken >= ANDROID_MINIMUM_PERFORMANCE_CORES) { - break; - } - cluster_weight = core.weight; - cluster_midr = core.midr; - } - if (taken >= maximum) { + const bool fast_enough = + core.weight * 100 >= fastest * ANDROID_PERFORMANCE_CAPACITY_PERCENT; + if (!fast_enough && taken >= ANDROID_MINIMUM_PERFORMANCE_CORES) { break; } CPU_SET(core.cpu, &g_topology.performance); diff --git a/src/core/hle/service/vi/conductor.cpp b/src/core/hle/service/vi/conductor.cpp index 52773b339d..748d39f27e 100644 --- a/src/core/hle/service/vi/conductor.cpp +++ b/src/core/hle/service/vi/conductor.cpp @@ -83,7 +83,7 @@ void Conductor::ProcessVsync() { void Conductor::VsyncThread(std::stop_token token) { Common::SetCurrentThreadName("VSyncThread"); - Common::SetCurrentThreadPriority(Common::ThreadPriority::High); + Common::SetCurrentThreadPriority(Common::ThreadPriority::VeryHigh); Common::SetCurrentThreadToPerformanceCores(); while (!token.stop_requested()) { diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index adc1d2fbdb..3601a3e891 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -258,7 +258,7 @@ bool Scheduler::UpdateDescriptorBufferChunk(u32 descriptor_chunk) { void Scheduler::WorkerThread(std::stop_token stop_token) { Common::SetCurrentThreadName("VulkanWorker"); - Common::SetCurrentThreadPriority(Common::ThreadPriority::VeryHigh); + Common::SetCurrentThreadPriority(Common::ThreadPriority::Critical); Common::SetCurrentThreadToPerformanceCores(); const auto TryPopQueue{[this](auto& work) -> bool { diff --git a/src/video_core/textures/workers.cpp b/src/video_core/textures/workers.cpp index 9f37dfc48e..a1953c4bf4 100644 --- a/src/video_core/textures/workers.cpp +++ b/src/video_core/textures/workers.cpp @@ -10,9 +10,7 @@ namespace Tegra::Texture { Common::ThreadWorker& GetThreadWorkers() { static Common::ThreadWorker workers{(std::max)(std::thread::hardware_concurrency(), 2U) / 2, - "ImageTranscode", {}, - Common::ThreadPlacement::Efficiency}; - + "ImageTranscode"}; return workers; }