diff options
| author | 2020-03-31 13:52:07 -0400 | |
|---|---|---|
| committer | 2020-06-27 11:36:03 -0400 | |
| commit | 54e304fe2a38984ea27a7f2240c41a85931d7f6b (patch) | |
| tree | a05917e949a1da864c060aec6b874a58af87e244 /src/core/cpu_manager.cpp | |
| parent | HLE_IPC: Correct HLE Event behavior on timeout. (diff) | |
| download | yuzu-54e304fe2a38984ea27a7f2240c41a85931d7f6b.tar.gz yuzu-54e304fe2a38984ea27a7f2240c41a85931d7f6b.tar.xz yuzu-54e304fe2a38984ea27a7f2240c41a85931d7f6b.zip | |
Bootmanager/CPU_Manager: Correct shader caches and sync GPU on OpenGL.
Diffstat (limited to 'src/core/cpu_manager.cpp')
| -rw-r--r-- | src/core/cpu_manager.cpp | 15 |
1 files changed, 9 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} {} | |||
| 22 | CpuManager::~CpuManager() = default; | 22 | CpuManager::~CpuManager() = default; |
| 23 | 23 | ||
| 24 | void CpuManager::ThreadStart(CpuManager& cpu_manager, std::size_t core) { | 24 | void CpuManager::ThreadStart(CpuManager& cpu_manager, std::size_t core) { |
| 25 | if (!cpu_manager.is_async_gpu && !cpu_manager.is_multicore) { | ||
| 26 | cpu_manager.render_window->MakeCurrent(); | ||
| 27 | } | ||
| 28 | cpu_manager.RunThread(core); | 25 | cpu_manager.RunThread(core); |
| 29 | if (!cpu_manager.is_async_gpu && !cpu_manager.is_multicore) { | ||
| 30 | cpu_manager.render_window->DoneCurrent(); | ||
| 31 | } | ||
| 32 | } | 26 | } |
| 33 | 27 | ||
| 34 | void CpuManager::SetRenderWindow(Core::Frontend::EmuWindow& render_window) { | 28 | void CpuManager::SetRenderWindow(Core::Frontend::EmuWindow& render_window) { |
| @@ -353,10 +347,16 @@ void CpuManager::RunThread(std::size_t core) { | |||
| 353 | data.host_context = Common::Fiber::ThreadToFiber(); | 347 | data.host_context = Common::Fiber::ThreadToFiber(); |
| 354 | data.is_running = false; | 348 | data.is_running = false; |
| 355 | data.initialized = true; | 349 | data.initialized = true; |
| 350 | const bool sc_sync = !is_async_gpu && !is_multicore; | ||
| 351 | bool sc_sync_first_use = sc_sync; | ||
| 356 | /// Running | 352 | /// Running |
| 357 | while (running_mode) { | 353 | while (running_mode) { |
| 358 | data.is_running = false; | 354 | data.is_running = false; |
| 359 | data.enter_barrier->Wait(); | 355 | data.enter_barrier->Wait(); |
| 356 | if (sc_sync_first_use) { | ||
| 357 | render_window->MakeCurrent(); | ||
| 358 | sc_sync_first_use = false; | ||
| 359 | } | ||
| 360 | auto& scheduler = system.Kernel().CurrentScheduler(); | 360 | auto& scheduler = system.Kernel().CurrentScheduler(); |
| 361 | Kernel::Thread* current_thread = scheduler.GetCurrentThread(); | 361 | Kernel::Thread* current_thread = scheduler.GetCurrentThread(); |
| 362 | data.is_running = true; | 362 | data.is_running = true; |
| @@ -366,6 +366,9 @@ void CpuManager::RunThread(std::size_t core) { | |||
| 366 | data.exit_barrier->Wait(); | 366 | data.exit_barrier->Wait(); |
| 367 | data.is_paused = false; | 367 | data.is_paused = false; |
| 368 | } | 368 | } |
| 369 | if (sc_sync) { | ||
| 370 | render_window->DoneCurrent(); | ||
| 371 | } | ||
| 369 | /// Time to cleanup | 372 | /// Time to cleanup |
| 370 | data.host_context->Exit(); | 373 | data.host_context->Exit(); |
| 371 | data.enter_barrier.reset(); | 374 | data.enter_barrier.reset(); |