summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2021-08-14 11:14:19 +0200
committerbunnei <bunneidev@gmail.com>2021-08-14 11:14:19 +0200
commitaef0ca6f0d422623f46f47c15e9a4c9b5fd04dd0 (patch)
treef82819f5b1470345ea3aab20ba18eba67afe63e5
parentcore: hle: kernel: k_thread: Mark KScopedDisableDispatch as nodiscard. (diff)
downloadyuzu-aef0ca6f0d422623f46f47c15e9a4c9b5fd04dd0.tar
yuzu-aef0ca6f0d422623f46f47c15e9a4c9b5fd04dd0.tar.gz
yuzu-aef0ca6f0d422623f46f47c15e9a4c9b5fd04dd0.tar.bz2
yuzu-aef0ca6f0d422623f46f47c15e9a4c9b5fd04dd0.tar.lz
yuzu-aef0ca6f0d422623f46f47c15e9a4c9b5fd04dd0.tar.xz
yuzu-aef0ca6f0d422623f46f47c15e9a4c9b5fd04dd0.tar.zst
yuzu-aef0ca6f0d422623f46f47c15e9a4c9b5fd04dd0.zip
-rw-r--r--src/core/cpu_manager.cpp2
-rw-r--r--src/core/hle/kernel/k_thread.cpp4
-rw-r--r--src/core/hle/kernel/k_thread.h11
3 files changed, 12 insertions, 5 deletions
diff --git a/src/core/cpu_manager.cpp b/src/core/cpu_manager.cpp
index 35c1a6cbd..de2e5563e 100644
--- a/src/core/cpu_manager.cpp
+++ b/src/core/cpu_manager.cpp
@@ -33,7 +33,7 @@ void CpuManager::Initialize() {
core_data[core].host_thread = std::jthread(ThreadStart, std::ref(*this), core);
}
} else {
- core_data[0].host_thread = std::jthread(ThreadStart, std::ref(*this), -1);
+ core_data[0].host_thread = std::jthread(ThreadStart, std::ref(*this), 0);
}
}
diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp
index 89653e0cb..0f6808ade 100644
--- a/src/core/hle/kernel/k_thread.cpp
+++ b/src/core/hle/kernel/k_thread.cpp
@@ -14,6 +14,7 @@
#include "common/fiber.h"
#include "common/logging/log.h"
#include "common/scope_exit.h"
+#include "common/settings.h"
#include "common/thread_queue_list.h"
#include "core/core.h"
#include "core/cpu_manager.h"
@@ -215,9 +216,10 @@ ResultCode KThread::InitializeThread(KThread* thread, KThreadFunction func, uint
// Initialize the thread.
R_TRY(thread->Initialize(func, arg, user_stack_top, prio, core, owner, type));
- // Initialize host context.
+ // Initialize emulation parameters.
thread->host_context =
std::make_shared<Common::Fiber>(std::move(init_func), init_func_parameter);
+ thread->is_single_core = !Settings::values.use_multi_core.GetValue();
return ResultSuccess;
}
diff --git a/src/core/hle/kernel/k_thread.h b/src/core/hle/kernel/k_thread.h
index 8bbf66c52..e4c4c877d 100644
--- a/src/core/hle/kernel/k_thread.h
+++ b/src/core/hle/kernel/k_thread.h
@@ -454,8 +454,12 @@ public:
return GetActiveCore() == 3;
}
+ [[nodiscard]] bool IsDispatchTrackingDisabled() const {
+ return is_single_core || IsKernelThread();
+ }
+
[[nodiscard]] s32 GetDisableDispatchCount() const {
- if (IsKernelThread()) {
+ if (IsDispatchTrackingDisabled()) {
// TODO(bunnei): Until kernel threads are emulated, we cannot enable/disable dispatch.
return 1;
}
@@ -464,7 +468,7 @@ public:
}
void DisableDispatch() {
- if (IsKernelThread()) {
+ if (IsDispatchTrackingDisabled()) {
// TODO(bunnei): Until kernel threads are emulated, we cannot enable/disable dispatch.
return;
}
@@ -474,7 +478,7 @@ public:
}
void EnableDispatch() {
- if (IsKernelThread()) {
+ if (IsDispatchTrackingDisabled()) {
// TODO(bunnei): Until kernel threads are emulated, we cannot enable/disable dispatch.
return;
}
@@ -727,6 +731,7 @@ private:
// For emulation
std::shared_ptr<Common::Fiber> host_context{};
+ bool is_single_core{};
// For debugging
std::vector<KSynchronizationObject*> wait_objects_for_debugging;