diff --git a/src/core/cpu_manager.cpp b/src/core/cpu_manager.cpp
index d604aa446..c0974ee38 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 6fad01d50..6aa161e99 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