|
|
|
@ -22,13 +22,7 @@ CpuManager::CpuManager(System& system) : system{system} {} |
|
|
|
CpuManager::~CpuManager() = default; |
|
|
|
|
|
|
|
void CpuManager::ThreadStart(CpuManager& cpu_manager, std::size_t core) { |
|
|
|
if (!cpu_manager.is_async_gpu && !cpu_manager.is_multicore) { |
|
|
|
cpu_manager.render_window->MakeCurrent(); |
|
|
|
} |
|
|
|
cpu_manager.RunThread(core); |
|
|
|
if (!cpu_manager.is_async_gpu && !cpu_manager.is_multicore) { |
|
|
|
cpu_manager.render_window->DoneCurrent(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void CpuManager::SetRenderWindow(Core::Frontend::EmuWindow& render_window) { |
|
|
|
@ -353,10 +347,16 @@ void CpuManager::RunThread(std::size_t core) { |
|
|
|
data.host_context = Common::Fiber::ThreadToFiber(); |
|
|
|
data.is_running = false; |
|
|
|
data.initialized = true; |
|
|
|
const bool sc_sync = !is_async_gpu && !is_multicore; |
|
|
|
bool sc_sync_first_use = sc_sync; |
|
|
|
/// Running
|
|
|
|
while (running_mode) { |
|
|
|
data.is_running = false; |
|
|
|
data.enter_barrier->Wait(); |
|
|
|
if (sc_sync_first_use) { |
|
|
|
render_window->MakeCurrent(); |
|
|
|
sc_sync_first_use = false; |
|
|
|
} |
|
|
|
auto& scheduler = system.Kernel().CurrentScheduler(); |
|
|
|
Kernel::Thread* current_thread = scheduler.GetCurrentThread(); |
|
|
|
data.is_running = true; |
|
|
|
@ -366,6 +366,9 @@ void CpuManager::RunThread(std::size_t core) { |
|
|
|
data.exit_barrier->Wait(); |
|
|
|
data.is_paused = false; |
|
|
|
} |
|
|
|
if (sc_sync) { |
|
|
|
render_window->DoneCurrent(); |
|
|
|
} |
|
|
|
/// Time to cleanup
|
|
|
|
data.host_context->Exit(); |
|
|
|
data.enter_barrier.reset(); |
|
|
|
|