diff --git a/src/core/cpu_manager.cpp b/src/core/cpu_manager.cpp index d604aa4464..c0974ee383 100644 --- a/src/core/cpu_manager.cpp +++ b/src/core/cpu_manager.cpp @@ -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(); diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp index 6fad01d50b..6aa161e99b 100644 --- a/src/yuzu/bootmanager.cpp +++ b/src/yuzu/bootmanager.cpp @@ -56,6 +56,8 @@ void EmuThread::run() { Core::System::GetInstance().RegisterHostThread(); + context.MakeCurrent(); + Core::System::GetInstance().Renderer().Rasterizer().LoadDiskResources( stop_run, [this](VideoCore::LoadCallbackStage stage, std::size_t value, std::size_t total) { emit LoadProgress(stage, value, total); @@ -63,6 +65,8 @@ void EmuThread::run() { emit LoadProgress(VideoCore::LoadCallbackStage::Complete, 0, 0); + context.DoneCurrent(); + // Holds whether the cpu was running during the last iteration, // so that the DebugModeLeft signal can be emitted before the // next execution step