diff options
| author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-03-31 13:52:07 -0400 | 
|---|---|---|
| committer | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-06-27 11:36:03 -0400 | 
| commit | 54e304fe2a38984ea27a7f2240c41a85931d7f6b (patch) | |
| tree | a05917e949a1da864c060aec6b874a58af87e244 | |
| parent | 19165cd859dcbb1f7d5e2c74c831e5196c2d1c41 (diff) | |
Bootmanager/CPU_Manager: Correct shader caches and sync GPU on OpenGL.
| -rw-r--r-- | src/core/cpu_manager.cpp | 15 | ||||
| -rw-r--r-- | src/yuzu/bootmanager.cpp | 4 | 
2 files changed, 13 insertions, 6 deletions
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  | 
