diff options
| author | 2020-11-16 21:02:45 -0800 | |
|---|---|---|
| committer | 2020-12-06 00:03:24 -0800 | |
| commit | e18ee8d681bf05e8c1480dd1ad7133778ead773d (patch) | |
| tree | fd319df94f2fd26d621d1b14fc5c57d7cb567d9e /src/core/hle/kernel/thread.cpp | |
| parent | Merge pull request #5133 from lioncash/video-shadow2 (diff) | |
| download | yuzu-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.cpp | 11 |
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 | } |