summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/thread.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2020-11-16 21:02:45 -0800
committerGravatar bunnei2020-12-06 00:03:24 -0800
commite18ee8d681bf05e8c1480dd1ad7133778ead773d (patch)
treefd319df94f2fd26d621d1b14fc5c57d7cb567d9e /src/core/hle/kernel/thread.cpp
parentMerge pull request #5133 from lioncash/video-shadow2 (diff)
downloadyuzu-e18ee8d681bf05e8c1480dd1ad7133778ead773d.tar.gz
yuzu-e18ee8d681bf05e8c1480dd1ad7133778ead773d.tar.xz
yuzu-e18ee8d681bf05e8c1480dd1ad7133778ead773d.zip
hle: kernel: Port KAffinityMask from Mesosphere.
Diffstat (limited to 'src/core/hle/kernel/thread.cpp')
-rw-r--r--src/core/hle/kernel/thread.cpp11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index 7d1eb2c6e..38b4a0987 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -191,7 +191,7 @@ ResultVal<std::shared_ptr<Thread>> Thread::Create(Core::System& system, ThreadTy
191 thread->last_running_ticks = 0; 191 thread->last_running_ticks = 0;
192 thread->processor_id = processor_id; 192 thread->processor_id = processor_id;
193 thread->ideal_core = processor_id; 193 thread->ideal_core = processor_id;
194 thread->affinity_mask = 1ULL << processor_id; 194 thread->affinity_mask.SetAffinity(processor_id, true);
195 thread->wait_objects = nullptr; 195 thread->wait_objects = nullptr;
196 thread->mutex_wait_address = 0; 196 thread->mutex_wait_address = 0;
197 thread->condvar_wait_address = 0; 197 thread->condvar_wait_address = 0;
@@ -479,15 +479,16 @@ ResultCode Thread::SetCoreAndAffinityMask(s32 new_core, u64 new_affinity_mask) {
479 } 479 }
480 if (use_override) { 480 if (use_override) {
481 ideal_core_override = new_core; 481 ideal_core_override = new_core;
482 affinity_mask_override = new_affinity_mask;
483 } else { 482 } else {
484 const u64 old_affinity_mask = std::exchange(affinity_mask, new_affinity_mask); 483 const auto old_affinity_mask = affinity_mask.GetAffinityMask();
484 affinity_mask.SetAffinityMask(new_affinity_mask);
485 ideal_core = new_core; 485 ideal_core = new_core;
486 if (old_affinity_mask != new_affinity_mask) { 486 if (old_affinity_mask != new_affinity_mask) {
487 const s32 old_core = processor_id; 487 const s32 old_core = processor_id;
488 if (processor_id >= 0 && ((affinity_mask >> processor_id) & 1) == 0) { 488 if (processor_id >= 0 && !affinity_mask.GetAffinity(processor_id)) {
489 if (static_cast<s32>(ideal_core) < 0) { 489 if (static_cast<s32>(ideal_core) < 0) {
490 processor_id = HighestSetCore(affinity_mask, Core::Hardware::NUM_CPU_CORES); 490 processor_id = HighestSetCore(affinity_mask.GetAffinityMask(),
491 Core::Hardware::NUM_CPU_CORES);
491 } else { 492 } else {
492 processor_id = ideal_core; 493 processor_id = ideal_core;
493 } 494 }